I am using spongycastle in my android code. code is working fine in android 5 and android 6 but in android 4 its showing the error :
java.lang.NoClassDefFoundError: org.spongycastle.util.io.pem.PemReader
Its failing at the time of initialization of PemReader in the below code :
private PublicKey getPublicKey(AssetManager manager, String keyPath) {
PublicKey key = null;
try {
final KeyFactory keyFactory = KeyFactory.getInstance(TicketVerifier.ENCRYPTION_ALGORITHM);
InputStream stream = manager.open(keyPath);
final PemReader reader = new PemReader(new InputStreamReader(stream));
final byte[] pubKey = reader.readPemObject().getContent();
reader.close();
final X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pubKey);
key = keyFactory.generatePublic(publicKeySpec);
} catch (IOException e) {
Log.e(TAG, "error verifying ticket", e);
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, "error verifying ticket", e);
} catch (InvalidKeySpecException e) {
Log.e(TAG, "error verifying ticket", e);
}
return key;
}
build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.xx.xx.android"
minSdkVersion 17
targetSdkVersion 23
versionCode 22
versionName "5.0.0.22"
multiDexEnabled true
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
testCompile 'org.robolectric:robolectric:3.0'
compile 'com.android.support:appcompat-v7:23.3.0'
compile ('com.viewpagerindicator:library:2.4.1'){
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.google.guava'
}
compile 'com.google.zxing:android-integration:2.2'
compile 'com.google.zxing:core:2.3.0'
compile ('com.google.android.gms:play-services:4.2.42@aar'){
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.google.guava'
}
compile 'com.google.guava:guava:17.0'
compile 'org.altbeacon:android-beacon-library:2.1.3'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.3'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.2.3'
compile 'com.madgag:scprov-jdk15on:1.47.0.3'
compile 'net.oauth.core:oauth:20100527'
compile 'org.jsoup:jsoup:1.8.3'
compile 'com.android.support:support-v4:23.3.0'
}
Can anyone tell me how to handle it.
Spongycastle is split up into several Packages. The PemReader
is not part of the base Package. So make sure to add all dependencies:
dependencies {
....
compile 'com.madgag.spongycastle:core:1.54.0.0'
compile 'com.madgag.spongycastle:prov:1.54.0.0'
compile 'com.madgag.spongycastle:pkix:1.54.0.0'
compile 'com.madgag.spongycastle:pg:1.54.0.0'
}
Don't forget to insert it as a security provider in your app.
static {
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
}