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