2012-06-29 6 views
3

Я использую 4.1 брелок для Android и следующий код работает отлично под 4.0, но теперь дает мне исключение NullPointer (Cipher не может прочитать какой-то внутренний атрибут)Использование Android 4.1 Keychain

privateKey = KeyChain.getPrivateKey(context,mAlias); 
byte[] data = // some biary data 
Cipher rsasinger = javax.crypto.Cipher.getInstance("RSA/ECB/PKCS1PADDING"); 
rsasinger.init(Cipher.ENCRYPT_MODE, privkey); 

byte[] signed_bytes = rsasinger.doFinal(data); 

Я обработки закрытый ключ от KeyChain как непрозрачный и просто использовать его с помощью java-безопасности Api. Нужно ли мне использовать API KeyChain по-другому?

+0

Где происходит исключение NullpointerException (строка исходного кода)? BTW: Почему вы используете шифр для подписывания? В RSA это возможно, если вы шифруете дайджест сообщения блока данных, но вместо этого я использую подпись. – Robert

ответ

3

После дополнительной отладки и обращения с помощью Google engenier (спасибо!) Выяснилось, что Android регистрирует разные поставщики JAVA Crypto, и только поставщик OpenSSL может использовать PrivateKeys из Keystore.

Но с некоторыми хаками и с использованием /system/lib/ssl/engines/libkeystore.so должно быть возможно обойти эту проблему.

См. http://code.google.com/p/ics-openvpn/source/browse/jni/jbcrypto.cpp и proccessSignJellyBean в http://code.google.com/p/ics-openvpn/source/browse/src/de/blinkt/openvpn/OpenVpnManagementThread.java#446 для моего решения.

+0

Является ли эта проблема отслеживаемой, планирует ли Google ее исправить? – zer0stimulus

+0

Jellybean 4.2 позволяет использовать более криптоалгоритмы с поставщиком OpenSSL. – plaisthos

Смежные вопросы