From 883291d2a93b12dd9a92c322e06b36500fd80b99 Mon Sep 17 00:00:00 2001 From: "w.siteee" Date: Fri, 23 May 2025 08:39:09 +0300 Subject: [PATCH 1/3] add errorCode to onAuthenticationError --- .../src/main/java/com/rnbiometrics/CreateSignatureCallback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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()); } } From 86e4a2abdc9d5f53d1af51006bf98b9924d01766 Mon Sep 17 00:00:00 2001 From: "w.siteee" Date: Fri, 23 May 2025 08:45:43 +0300 Subject: [PATCH 2/3] add biometricKeysExistAndSignatureValid --- .../rnbiometrics/ReactNativeBiometrics.java | 28 +++++++++++++++++++ index.ts | 21 ++++++++++++++ ios/ReactNativeBiometrics.m | 18 ++++++++++++ 3 files changed, 67 insertions(+) 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..1b72bdaa 100644 --- a/ios/ReactNativeBiometrics.m +++ b/ios/ReactNativeBiometrics.m @@ -221,6 +221,24 @@ @implementation ReactNativeBiometrics resolve(result); } }); + + 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 { From 1815f4696a41ae5b2557edf735c70280dd33acad Mon Sep 17 00:00:00 2001 From: "w.siteee" Date: Fri, 23 May 2025 10:12:26 +0300 Subject: [PATCH 3/3] fix pod --- ios/ReactNativeBiometrics.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/ReactNativeBiometrics.m b/ios/ReactNativeBiometrics.m index 1b72bdaa..87d3f269 100644 --- a/ios/ReactNativeBiometrics.m +++ b/ios/ReactNativeBiometrics.m @@ -221,8 +221,9 @@ @implementation ReactNativeBiometrics resolve(result); } }); - - RCT_EXPORT_METHOD(biometricKeysExistAndSignatureValid: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { +} + +RCT_EXPORT_METHOD(biometricKeysExistAndSignatureValid: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ BOOL biometricKeyExists = [self doesBiometricKeyExist]; @@ -239,7 +240,6 @@ @implementation ReactNativeBiometrics } }); } -} - (NSData *) getBiometricKeyTag { NSString *biometricKeyAlias = @"com.rnbiometrics.biometricKey";