Получите закодированный из PrivateKey в KeyPair, сгенерированном AndroidKeyStore - PullRequest
0 голосов
/ 24 февраля 2020

Мне нужно использовать KeyPair, созданный поставщиком AndroidKeyStore, в коде C ++, используемом NDK в проекте. Я генерирую его по следующему коду:

    private val keyStore = lazy {
        KeyStore.getInstance("AndroidKeyStore").apply {
            load(null)
        }
    }

    private fun createKeyPair(alias: String): KeyPair {
        val keyPairGenerator = KeyPairGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_EC,
            "AndroidKeyStore"
        )
        val parameterSpec = KeyGenParameterSpec.Builder(
            alias,
            KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
        ).apply {
            setKeySize(2048)
            setDigests(KeyProperties.DIGEST_SHA1)
            setAlgorithmParameterSpec(ECGenParameterSpec("secp256r1"))
            setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        }.build()

        keyPairGenerator.initialize(parameterSpec)
        return keyPairGenerator.genKeyPair()
    }

И извлекаю его так:

    private fun getKeyPair(alias: String): KeyPair? {
        val entry = keyStore.value.getEntry(alias, null) ?: return null
        val privateKey: PrivateKey =
            (entry as KeyStore.PrivateKeyEntry).privateKey
        val publicKey: PublicKey = keyStore.value.getCertificate(alias).publicKey
        return KeyPair(publicKey, privateKey)
    }

После этого я пытаюсь получить закрытый ключ из выбранной пары ключей и использовать его в код C ++, поэтому я обнаружил функцию getEncoded(), но кажется, что извлеченный закрытый ключ не поддерживает кодирование, поэтому я получаю null, вызывая getEncoded(). Это должно быть PKCS # 8, по-видимому.

val encodedPrivateKey = getKeyPair("my_pk").private.getEncoded() // getEncoded() returns null here

Вы знаете, как я могу решить эту проблему?

...