Я пытаюсь использовать импортированный ключ хранилища ключей, чтобы подписать часть данных:
Мой ключ сначала создается вне AndroidKeyStore (это специально), а затем импортируется в AndroidKeyStore
используя следующий способ:
val keyGen = KeyPairGenerator.getInstance("RSA")
keyGen.initialize(2048)
val keyPair = keyGen.generateKeyPair()
val keyProtectionSign = KeyProtection.Builder(KeyProperties.PURPOSE_SIGN or //
KeyProperties.PURPOSE_VERIFY).setDigests(KeyProperties.DIGEST_SHA256) //
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) //
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
.build()
keyStore.setEntry(signatureAlias,
KeyStore.PrivateKeyEntry(keyPair.private, arrayOf(certificate)),
keyProtectionSign)
После этого я пытаюсь использовать ключ для подписи:
val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)
val privateKey = keyStore.getKey(signatureAlias,null)
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey)
signature.update(data)
val sign = signature.sign()
Однако строка signature.initSign(privateKey)
вызывает исключение: java.security.InvalidKeyException: Supplied key (android.security.keystore.AndroidKeyStoreRSAPrivateKey) is not a RSAPrivateKey instance
Если я не импортирую ключ в хранилище ключей Android и пытаюсь подписать его, он работает.
Если я генерирую ключ непосредственно в AndroidKeyStore, он также завершается с той же ошибкой.
Что не так с моим кодом? Почему я не могу подписать ключ RSA?