ECDSA KeyPairGenerator недоступен (но в JUnit работает) - PullRequest
0 голосов
/ 06 декабря 2018

Я получаю ниже Исключение, которое я наблюдал при запуске приложения для Android - это не происходит, когда я запускаю код ниже как JUnit.

java.security.NoSuchAlgorithmException: ECDSA KeyPairGenerator not available
    at java.security.KeyPairGenerator.getInstance(KeyPairGenerator.java:225)
    at com.mhamdaoui.smartcardreader.CryptoUtils$Companion.getMerchantEphemeralPublicKey(CryptoUtils.kt:48)
    at com.mhamdaoui.smartcardreader.MainActivity.onTagDiscovered(MainActivity.kt:80)
    at android.nfc.NfcActivityManager.onTagDiscovered(NfcActivityManager.java:603)
    at android.nfc.IAppCallback$Stub.onTransact(IAppCallback.java:83)
    at android.os.Binder.execTransact(Binder.java:573)

Код:

  Security.addProvider(BouncyCastleProvider())
  val generator = KeyPairGenerator.getInstance("ECDSA")
  val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
  generator.initialize(ecSpec)
  val keyPair = generator.generateKeyPair()
  val publicKey = keyPair.public as ECPublicKey
  return publicKey.q.getEncoded(true)

Как решить эту проблему?

ОБНОВЛЕНИЕ

Когда я создаюJUnit в тесте (я использую Android Studio):

@Test
fun compressedGeneratorTest() {
  Security.addProvider(BouncyCastleProvider())
  val generator = KeyPairGenerator.getInstance("ECDSA")
  val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
  generator.initialize(ecSpec)
  val keyPair = generator.generateKeyPair()
  val publicKey = keyPair.public as ECPublicKey
  val encoded = publicKey.q.getEncoded(true)
  assert(true)
}

Все также работает.Как решить эту проблему во время выполнения приложения?

1 Ответ

0 голосов
/ 07 декабря 2018

Проблема в том, что невозможно использовать BounceyCastle на Android - вместо этого используйте SpongyCastle:

implementation 'com.madgag.spongycastle:prov:1.54.0.0'
implementation 'com.madgag.spongycastle:pkix:1.54.0.0'

И затем инициализируйте провайдера, как показано ниже:

Security.addProvider(org.spongycastle.jce.provider.BouncyCastleProvider())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...