jeroentrappers / flutter_keychain

A flutter plugin for secure storage on Android via KeyStore and iOS via Keychain
Other
56 stars 41 forks source link

Emulator 5.0 & 5.1: Suppressed: java.lang.ClassNotFoundException: android.security.keystore.KeyGenParameterSpec$Builder #7

Closed pdalfarr closed 4 years ago

pdalfarr commented 5 years ago

First, let me thank you for this library: great job!

One issue I have is this: Looks like it does not work on 5.0 & 5.1 emulator (not sure about real devices) because of a suppressed class? Suppressed: java.lang.ClassNotFoundException: android.security.keystore.KeyGenParameterSpec$Builder

I checked the Android Studio project folder of my Flutter app: minSdkVersion 21 which is Android Lollipop (5.0)

I then dug into the code and found out that some code is commented in C:\Users\\\flutter.pub-cache\hosted\pub.dartlang.org\flutter_keychain-1.0.0\android\src\main\kotlin\be\appmire\flutterkeychain\FlutterKeychainPlugin.kt

I uncommented and it seems to be working fine now.

Can you please fix or explain this?

Thanks

//    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
//
//      spec = android.security.KeyPairGeneratorSpec.Builder( context)
//              .setAlias(keyAlias)
//              .setSubject(X500Principal("CN=$keyAlias"))
//              .setSerialNumber(BigInteger.valueOf(1))
//              .setStartDate(start.time)
//              .setEndDate(end.time)
//              .build()
//    } else {
        spec = KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_DECRYPT or KeyProperties.PURPOSE_ENCRYPT)
                .setCertificateSubject(X500Principal("CN=$keyAlias"))
                .setDigests(KeyProperties.DIGEST_SHA256)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                .setUserAuthenticationRequired(false)
                .setCertificateSerialNumber(BigInteger.valueOf(1))
                .setCertificateNotBefore(start.time)
                .setCertificateNotAfter(end.time)
                .build()
//    }

FYI, Stack trace with comment on (Android 5.x)

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mytestapp, PID: 3910
    java.lang.NoClassDefFoundError: Failed resolution of: Landroid/security/keystore/KeyGenParameterSpec$Builder;
        at be.appmire.flutterkeychain.RsaKeyStoreKeyWrapper.createKeys(FlutterKeychainPlugin.kt:156)
        at be.appmire.flutterkeychain.RsaKeyStoreKeyWrapper.createRSAKeysIfNeeded(FlutterKeychainPlugin.kt:123)
        at be.appmire.flutterkeychain.RsaKeyStoreKeyWrapper.<init>(FlutterKeychainPlugin.kt:48)
        at be.appmire.flutterkeychain.FlutterKeychainPlugin$Companion.registerWith(FlutterKeychainPlugin.kt:280)
        at be.appmire.flutterkeychain.FlutterKeychainPlugin.registerWith(FlutterKeychainPlugin.kt)
        at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(GeneratedPluginRegistrant.java:15)
        at com.mytestapp.MainActivity.onCreate(MainActivity.java:11)
        at android.app.Activity.performCreate(Activity.java:5937)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "android.security.keystore.KeyGenParameterSpec$Builder" on path: DexPathList[[zip file "/data/app/com.mytestapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.mytestapp-1/lib/x86, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at be.appmire.flutterkeychain.RsaKeyStoreKeyWrapper.createKeys(FlutterKeychainPlugin.kt:156) 
        at be.appmire.flutterkeychain.RsaKeyStoreKeyWrapper.createRSAKeysIfNeeded(FlutterKeychainPlugin.kt:123) 
        at be.appmire.flutterkeychain.RsaKeyStoreKeyWrapper.<init>(FlutterKeychainPlugin.kt:48) 
        at be.appmire.flutterkeychain.FlutterKeychainPlugin$Companion.registerWith(FlutterKeychainPlugin.kt:280) 
        at be.appmire.flutterkeychain.FlutterKeychainPlugin.registerWith(FlutterKeychainPlugin.kt) 
        at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(GeneratedPluginRegistrant.java:15) 
        at com.mytestapp.MainActivity.onCreate(MainActivity.java:11) 
        at android.app.Activity.performCreate(Activity.java:5937) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
        at android.app.ActivityThread.access$800(ActivityThread.java:144) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5221) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
        Suppressed: java.lang.ClassNotFoundException: android.security.keystore.KeyGenParameterSpec$Builder
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                ... 21 more
     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
jeroentrappers commented 5 years ago

Recently a PR was merged that might have fixed this issue. I have not made a new release yet. You can include the repository via git link to verify, if this is ok for you, please let me know and I will create a new version that has this change.

you can put this in you pubspec.yaml

flutter_keychain: 
    git:
      url: git://github.com/jeroentrappers/flutter_keychain
pdalfarr commented 5 years ago

Hi,

I just tested my app with

flutter_keychain: 
    git:
      url: git://github.com/jeroentrappers/flutter_keychain

and it's working fine.

wilburx9 commented 4 years ago
flutter_keychain: 
    git:
      url: git://github.com/jeroentrappers/flutter_keychain

This fixed it for me.

jeroentrappers commented 4 years ago

Thanks

benoitskipr commented 3 years ago

fixes a crash a client of ours was having, can I suggest you release it officially, thanks for the tip (and the lib) @jeroentrappers