diff --git a/android/src/main/java/com/rnbiometrics/CreateSignatureCallback.java b/android/src/main/java/com/rnbiometrics/CreateSignatureCallback.java index 7dc9ad98..fef04f5e 100644 --- a/android/src/main/java/com/rnbiometrics/CreateSignatureCallback.java +++ b/android/src/main/java/com/rnbiometrics/CreateSignatureCallback.java @@ -30,7 +30,7 @@ public void onAuthenticationError(int errorCode, @NonNull CharSequence errString resultMap.putString("error", "User cancellation"); this.promise.resolve(resultMap); } else { - this.promise.reject(errString.toString(), errString.toString()); + this.promise.reject(String.valueOf(errorCode), errString.toString()); } } diff --git a/android/src/main/java/com/rnbiometrics/ReactNativeBiometrics.java b/android/src/main/java/com/rnbiometrics/ReactNativeBiometrics.java index 00bf6adc..402d11c0 100644 --- a/android/src/main/java/com/rnbiometrics/ReactNativeBiometrics.java +++ b/android/src/main/java/com/rnbiometrics/ReactNativeBiometrics.java @@ -270,4 +270,32 @@ protected boolean deleteBiometricKey() { return false; } } + + @ReactMethod + public void biometricKeysExistAndSignatureValid(Promise promise) { + try { + boolean doesBiometricKeyExist = doesBiometricKeyExistAndSignatureValid(); + WritableMap resultMap = new WritableNativeMap(); + resultMap.putBoolean("keysExist", doesBiometricKeyExist); + promise.resolve(resultMap); + } catch (Exception e) { + promise.reject("Error checking if biometric key exists: " + e.getMessage(), + "Error checking if biometric key exists: " + e.getMessage()); + } + } + + protected boolean doesBiometricKeyExistAndSignatureValid() { + try { + Signature signature = Signature.getInstance("SHA256withRSA"); + KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); + keyStore.load(null); + + PrivateKey privateKey = (PrivateKey) keyStore.getKey(biometricKeyAlias, null); + signature.initSign(privateKey); + + return true; + } catch (Exception e) { + return false; + } + } } diff --git a/index.ts b/index.ts index 32528b4f..41391948 100644 --- a/index.ts +++ b/index.ts @@ -51,6 +51,9 @@ interface SimplePromptResult { success: boolean error?: string } +interface BiometricKeysExistAndSignatureValidResult { + keysExist: boolean +} /** * Enum for touch id sensor type @@ -132,6 +135,15 @@ export module ReactNativeBiometricsLegacy { export function simplePrompt(simplePromptOptions: SimplePromptOptions): Promise { return new ReactNativeBiometrics().simplePrompt(simplePromptOptions) } + + /** + * Returns promise that resolves to an object with object.keysExists = true | false + * indicating if the keys were found to exist or not and signature valid + * @returns {Promise} Promise that resolves to object with details aobut the existence of keys + */ + export function biometricKeysExistAndSignatureValid(): Promise { + return new ReactNativeBiometrics().biometricKeysExistAndSignatureValid(); + } } export default class ReactNativeBiometrics { @@ -221,4 +233,13 @@ export default class ReactNativeBiometrics { ...simplePromptOptions }) } + + /** + * Returns promise that resolves to an object with object.keysExists = true | false + * indicating if the keys were found to exist or not and signature valid + * @returns {Promise} Promise that resolves to object with details aobut the existence of keys + */ + biometricKeysExistAndSignatureValid(): Promise { + return bridge.biometricKeysExistAndSignatureValid(); + } } diff --git a/ios/ReactNativeBiometrics.m b/ios/ReactNativeBiometrics.m index 03ec3884..87d3f269 100644 --- a/ios/ReactNativeBiometrics.m +++ b/ios/ReactNativeBiometrics.m @@ -223,6 +223,24 @@ @implementation ReactNativeBiometrics }); } +RCT_EXPORT_METHOD(biometricKeysExistAndSignatureValid: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { + dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + BOOL biometricKeyExists = [self doesBiometricKeyExist]; + + if (biometricKeyExists) { + NSDictionary *result = @{ + @"keysExist": @(YES) + }; + resolve(result); + } else { + NSDictionary *result = @{ + @"keysExist": @(NO) + }; + resolve(result); + } + }); +} + - (NSData *) getBiometricKeyTag { NSString *biometricKeyAlias = @"com.rnbiometrics.biometricKey"; NSData *biometricKeyTag = [biometricKeyAlias dataUsingEncoding:NSUTF8StringEncoding];