Due to Android KeyStore is not thread-safe,
So the sign method will throw exceptions when invoked by multithread usage.
Exceptions
one.block.eosiojavaandroidkeystoresignatureprovider.errors.AndroidKeyStoreSigningError: java.security.SignatureException: android.security.KeyStoreException: Invalid operation handle
at one.block.eosiojavaandroidkeystoresignatureprovider.EosioAndroidKeyStoreUtility$Companion.sign(EosioAndroidKeyStoreUtility.kt:214)
at one.block.eosiojavaandroidkeystoresignatureprovider.EosioAndroidKeyStoreUtility.sign(Unknown Source:2)
at com.mykey.test.kotelin.TestActivity.sign(TestActivity.java:35)
at com.mykey.test.kotelin.TestActivity.access$000(TestActivity.java:15)
at com.mykey.test.kotelin.TestActivity$1.run(TestActivity.java:26)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.security.SignatureException: android.security.KeyStoreException: Invalid operation handle
at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineUpdate(AndroidKeyStoreSignatureSpiBase.java:273)
at java.security.Signature$Delegate.engineUpdate(Signature.java:1358)
at java.security.Signature.update(Signature.java:915)
at java.security.Signature.update(Signature.java:888)
at one.block.eosiojavaandroidkeystoresignatureprovider.EosioAndroidKeyStoreUtility$Companion.sign(EosioAndroidKeyStoreUtility.kt:210)
... 5 more
Caused by: android.security.KeyStoreException: Invalid operation handle
at android.security.KeyStore.getKeyStoreException(KeyStore.java:695)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.update(KeyStoreCryptoOperationChunkedStreamer.java:132)
at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineUpdate(AndroidKeyStoreSignatureSpiBase.java:271)
... 9 more
How to reproduce?
EosioAndroidKeyStoreUtility.generateAndroidKeyStoreKey("Test");
for (int i = 1; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
sign();
}
}).start();
}
private void sign() {
try {
String unsignedData = "UnSignedMsg";
byte[] signature = EosioAndroidKeyStoreUtility.sign(unsignedData.getBytes(), "Test", null, null);
String str = new String(Hex.encode(signature));
Log.e("MYKEY", "signature:" + str);
} catch (Exception e) {
e.printStackTrace();
Log.e("MYKEY", "error");
}
}
Due to Android KeyStore is not thread-safe, So the sign method will throw exceptions when invoked by multithread usage.
Exceptions
How to reproduce?
Will provide one pull request soon.