Я пытаюсь безопасно импортировать ключи AES в StrongBox (аппаратный TEE) телефона pixel 3, работающего Android 10.
Ключи импортируются упакованными и зашифрованными с помощью ключа-обертки (с сильной коробкой) как описано здесь: https://developer.android.com/training/articles/keystore#ImportingEncryptedKeys
Обертывание ключа немного сложное, но следующий тестовый класс android дает хороший пример: https://android.googlesource.com/platform/cts/+/master/tests/tests/keystore/src/android/keystore/cts/ImportWrappedKeyTest.java
Я могу правильно выполнять операции шифрования с помощью ключей AES , импортированных с аттестациями ключей, указывающими, что для использования ключа не требуется аутентификация пользователя (путем установки флага '503' (Tag :: NO_AUTH_REQUIRED) в ключе часть описания структуры аттестации ASN1).
Но как только я захочу защитить использование этих ключей с помощью аутентификации пользователя , (установив флаги '504' (Tag :: USER_AUTH_TYPE) ) или / и '505' (Tag :: AUTH_TIMEOUT) в описании ключа) импорт ключа все еще успешен, но любой вызов Cipher # init с использованием одного из этих ключей вызывает следующее исключение :
android .security.keystore.KeyPermanentlyInvalidatedException: ключ окончательно признан недействительным
Тот же Cipher # init вызов с использованием ключей настроен с той же защитой, но напрямую сгенерирован в Android Keystore с помощью:
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
KeyGenParameterSpec specs = new KeyGenParameterSpec.Builder("test", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setIsStrongBoxBacked(true)
.setUserAuthenticationRequired(true)
.setKeySize(256)
.build();
keyGenerator.init(specs);
keyGenerator.generateKey();
не выдает никаких исключений, и операции шифрования могут выполняться после аутентификации клиента.
Я открыл тикет в системе отслеживания проблем Google: https://issuetracker.google.com/issues/134205183 с дополнительной информацией о Android внутренних классах хранилища ключей, в которые я копался, но он вообще не активен.