Bouncycastle не работает в Android API <21 - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь запустить некоторый код Spongycastle в Android:

    try {
        Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
        ECGenParameterSpec spec = new ECGenParameterSpec("P-256");
        KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDSA", "SC");
        generator.initialize(spec, new SecureRandom());
        KeyPair keyPair = generator.generateKeyPair();
        ECPublicKey publicKey = (ECPublicKey) keyPair.getPublic();
        ECPrivateKey privateKey = (ECPrivateKey) keyPair.getPrivate();
        String publicKeyStr = publicKey.getW().getAffineX().toString() + ":" + publicKey.getW().getAffineY().toString();
        Log.d(TAG, publicKeyStr);
        Calendar c = Calendar.getInstance();
        Date d0 = c.getTime();
        c.add(Calendar.DATE, 1);
        Date expiry = c.getTime();
        String token = Jwts.builder()
                .setIssuedAt(d0)
                .setSubject("00000000-0000-0000-0000-000000000001")
                .setExpiration(expiry)
                .signWith(privateKey, SignatureAlgorithm.ES256).compact();
        Log.d(TAG, token);
    } catch (Exception e) {
        Log.d(TAG, e.toString());
    }

в API версии 21+, работает как положено.

в API версии 18, работает в режиме отладки.в выпуске происходит сбой в функции generator.generateKeyPair() с java.lang.IllegalArgumentException: Invalid point.

в API версии 16, происходит сбой в функции Jwts.builder().signWith() с io.jsonwebtoken.security.SignatureException: Invalid Elliptic Curve PrivateKey. can't recognise key type in ECDSA based signer.

любая идея о том, что я делаюнеправильно?

edit : я, по-видимому, исправил проблему, переключившись с spongycastle на bouncycastle.

в моем build.gradle я изменил это:

implementation 'com.madgag.spongycastle:core:1.58.0.0'
implementation 'com.madgag.spongycastle:prov:1.58.0.0'

к этому:

implementation 'org.bouncycastle:bcpkix-jdk15on:1.60'

и в моем коде я избавился от этой строки:

Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());

и добавил следующие строки:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleProvider(), 1);

ия изменил провайдера с "SC" на "BC".

, и теперь мой код работает так, как мне хотелось бы, для всех версий API Android.

Теперь меня беспокоит комментарийэта ссылка ...

Spongy Castle: он устарел?

... от автора spongycastle:

Почему Spongy Castle не может быть устаревшим?

...

даже на устройствах после Android 3.0, производители устройств не обходятся без небрежного объединения библиотек,возможно, что BНа некоторых непонятных устройствах все еще можно связать старый замок.

что это значит?Может ли это привести к неисправности моего кода на некоторых устройствах?

1 Ответ

0 голосов
/ 30 мая 2019

использовать надувной замок:

dependencies {
    // https://mvnrepository.com/artifact/org.bouncycastle
    implementation "org.bouncycastle:bcprov-jdk15on:1.60"
    implementation "org.bouncycastle:bcpkix-jdk15on:1.60"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...