Закодируйте из 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
Вы знаете, как мне справиться с этой проблемой?