# Мастер-лицензия для Android

Мастер-лицензия – это оффлайн-лицензия, с которой можно использовать мобильные SDK без ограничений по `bundle_id`, в отличие от обычных лицензий. Для получения мастер-лицензии нужно создать пару ключей, как описано ниже. Отправьте нам публичный ключ по электронной почте, и вскоре после этого мы отправим вам мастер-лицензию.\
Вашему приложению нужно будет подписать свой `bundle_id` приватным ключом. Мобильные SDK проверяют подпись с помощью публичного ключа из мастер-лицензии. Действие таких лицензий ограничено по времени.

## Генерация ключей

В этом разделе описано, как создавать приватный и публичный ключи.

### Создание приватного ключа

Чтобы создать приватный ключ, последовательно запустите следующие команды:

```bash
openssl genpkey -algorithm RSA -outform DER -out privateKey.der -pkeyopt rsa_keygen_bits:2048
# for MacOS
base64 -i privateKey.der -o privateKey.txt
# for Linux 
base64 -w 0 privateKey.der > privateKey.txt
```

Вы получите два файла:

* *privateKey.der* – приватный ключ .der;
* *privateKey.txt* – *privateKey.der* в кодировке *base64*. Содержимое этого файла используется в качестве подписи *bundle\_id* хостового приложения.

{% file src="/files/UilufBsCBulOaVSKN5TV" %}

{% file src="/files/qKa79RD7bfm1iKVGVYVE" %}

Спецификация команд OpenSSL: <https://www.openssl.org/docs/man1.1.1/man1/openssl-pkcs8.html>

### Создание публичного ключа

Чтобы создать публичный ключ, запустите команду:

```sh
openssl rsa -pubout -in privateKey.der -out publicKey.pub
```

Вы получите публичный ключ *publicKey.pub*. Отправьте его нам по электронной почте. В ответ мы пришлем вам лицензию.

{% file src="/files/hgGlzQzutucGt5Cklmk9" %}

## Интеграция SDK

Инициализация SDK:

```kotlin
fun init(
    context: Context,
    licenseSources: List<LicenseSource>,
    masterLicenseSignature: String,
    statusListener: StatusListener<LicensePayload>? = null,
 )
```

{% hint style="info" %}
Для Android 6.0 (API 23) и старше:

1. Добавьте зависимость `implementation 'com.madgag.spongycastle:prov:1.58.0.0'`;
2. Перед созданием подписи вызовите `Security.insertProviderAt(org.spongycastle.jce.provider.BouncyCastleProvider(), 1)`
   {% endhint %}

Перед инициализацией SDK создайте закодированную base64 подпись для `bundle_id` хостового приложения с помощью приватного ключа.

Пример создания подписи:

```kotlin
private fun getMasterSignature(): String {
    Security.insertProviderAt(org.spongycastle.jce.provider.BouncyCastleProvider(), 1)

    val privateKeyBase64String = "содержимое файла privateKey.txt"

    val sig = Signature.getInstance("SHA512WithRSA")
    val keySpec = PKCS8EncodedKeySpec(Base64.decode(privateKeyBase64String, Base64.DEFAULT))
    val keyFactory = KeyFactory.getInstance("RSA")
    sig.initSign(keyFactory.generatePrivate(keySpec))
    sig.update(packageName.toByteArray(Charsets.UTF_8))
    return Base64.encodeToString(sig.sign(), Base64.DEFAULT).replace("\n", "")
 }
```

<details>

<summary>Пример подписи для <code>com.ozforensics.liveness.demo</code></summary>

Внимание: данная подпись не соответствует паре ключей, приведенной выше.

```
KohJ1rsUgLMzZHpHGAZDK2efHPnMj9tw9VIedBLvyZt0B2JH3SWfJLJ8X6JNz3bR2sce6PR2wdEIFln0r1pUnD+6WBCgexKIHAv7esiRVQZoZOEANDBwDvJVv73H/0qL2LGlhxKzbBg5CxGPClTBQdLo1P+7HsTXHHG/Hf6m3rdu1OUeGXVPoaS2NzE8kiRH6gb8Nhr7PBLTUeMKTeLoiX13hvwjOqhV1ANhgS97T4hC2+ZilZt4RektgRY/+fGmWnOqErNeYuz/WSInfaJS0YEWhJW3gXKPjdCzNGIBIqbxaFSjU46wu/alh2+tBRFnrYFl1dRQVcTlW0VwwZHcug==
```

</details>

Передайте подпись как параметр `masterLicenseSignature` во время инициализации SDK.

Если подпись невалидна, инициализация продолжится по стандартной схеме: проверка включенных в лицензию `bundle_id`.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.ozforensics.com/oz-knowledge-ru/rukovodstva/rukovodstvo-razrabotchika/sdk/oz-mobile-sdk/android/poluchenie-licenzii/master-licenziya-dlya-android.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
