Закодируйте из PrivateKey в KeyPair, созданном AndroidKeyStore

Мне нужно использовать 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

Вы знаете, как мне справиться с этой проблемой?

0 ответов

Другие вопросы по тегам