@ -22,6 +22,7 @@ import android.security.keystore.KeyPermanentlyInvalidatedException;
import androidx.annotation.NonNull ;
import androidx.annotation.Nullable ;
import androidx.annotation.RequiresApi ;
import androidx.biometric.BiometricManager ;
import com.mtramin.rxfingerprint.data.FingerprintAuthenticationResult ;
import com.mtramin.rxfingerprint.data.FingerprintDecryptionResult ;
@ -40,7 +41,7 @@ import io.reactivex.Observable;
* call { @link # encrypt ( EncryptionMethod , Context , String , String ) }
* < p / >
* To decrypt previously encrypted data via the { @link # encrypt ( EncryptionMethod , Context , String , String ) }
* method , call { @link # decrypt ( EncryptionMethod , Context , String , String ) }
* method , call { @link # decrypt ( EncryptionMethod , BiometricPromptDialogParam , Context , String , String ) }
* < p / >
* Helper methods provide information about the devices capability to handle fingerprint
* authentication . For fingerprint authentication to be isAvailable , the device needs to contain the
@ -59,13 +60,13 @@ public class RxFingerprint {
* @return Observable { @link FingerprintAuthenticationResult } . Will complete once the
* authentication was successful or has failed entirely .
* /
public static Observable < FingerprintAuthenticationResult > authenticate ( @NonNull Context context ) {
return FingerprintAuthenticationObservable . create ( context ) ;
public static Observable < FingerprintAuthenticationResult > authenticate ( @NonNull Context context , BiometricPromptDialogParam dialogParam ) {
return FingerprintAuthenticationObservable . create ( context , dialogParam ) ;
}
/ * *
* Encrypt data and authenticate the user with his fingerprint . The encrypted data can only be
* accessed again by calling { @link # decrypt ( Context , String ) } . Will use a default keyName in
* accessed again by calling { @link # decrypt ( Context , BiometricPromptDialogParam , String ) } . Will use a default keyName in
* the Android keystore unique to this applications package name.
* If you want to provide a custom key name use { @link # encrypt ( Context , String , String ) }
* instead .
@ -92,7 +93,7 @@ public class RxFingerprint {
/ * *
* Encrypt data and authenticate the user with his fingerprint . The encrypted data can only be
* accessed again by calling { @link # decrypt ( Context , String ) } . Will use a default keyName in
* accessed again by calling { @link # decrypt ( Context , BiometricPromptDialogParam , String ) } . Will use a default keyName in
* the Android keystore unique to this applications package name.
* If you want to provide a custom key name use { @link # encrypt ( Context , String , String ) }
* instead .
@ -121,7 +122,7 @@ public class RxFingerprint {
/ * *
* Encrypt data and authenticate the user with his fingerprint . The encrypted data can only be
* accessed again by calling { @link # decrypt ( Context , String ) } . Will use a default keyName in
* accessed again by calling { @link # decrypt ( Context , BiometricPromptDialogParam , String ) } . Will use a default keyName in
* the Android keystore unique to this applications package name.
* If you want to provide a custom key name use { @link # encrypt ( Context , String , String ) }
* instead .
@ -167,13 +168,13 @@ public class RxFingerprint {
* @return Observable result of the decryption operation . Will contain the
* decrypted string if decryption was successful .
* /
public static Observable < FingerprintDecryptionResult > decrypt ( @NonNull Context context , @NonNull String encrypted ) {
return decrypt ( EncryptionMethod . AES , context , null , encrypted ) ;
public static Observable < FingerprintDecryptionResult > decrypt ( @NonNull Context context , @NonNull BiometricPromptDialogParam dialogParam , @NonNull String encrypted ) {
return decrypt ( EncryptionMethod . AES , dialogParam , context , null , encrypted ) ;
}
/ * *
* Encrypt data and authenticate the user with his fingerprint . The encrypted data can only be
* accessed again by calling { @link # decrypt ( Context , String , String ) } with the same keyName .
* accessed again by calling { @link # decrypt ( Context , BiometricPromptDialogParam , String , String ) } with the same keyName .
* Encrypted data is only accessible after the user has authenticated with
* fingerprint authentication .
* < p / >
@ -197,7 +198,7 @@ public class RxFingerprint {
/ * *
* Encrypt data and authenticate the user with his fingerprint . The encrypted data can only be
* accessed again by calling { @link # decrypt ( Context , String , String ) } with the same keyName .
* accessed again by calling { @link # decrypt ( Context , BiometricPromptDialogParam , String , String ) } with the same keyName .
* Encrypted data is only accessible after the user has authenticated with
* fingerprint authentication .
* < p / >
@ -239,15 +240,15 @@ public class RxFingerprint {
* successful or have failed entirely .
* @return Observable result of the decryption
* /
public static Observable < FingerprintDecryptionResult > decrypt ( @NonNull Context context , @Nullable String keyName , @NonNull String encrypted ) {
return decrypt ( EncryptionMethod . AES , context , keyName , encrypted ) ;
public static Observable < FingerprintDecryptionResult > decrypt ( @NonNull Context context , @NonNull BiometricPromptDialogParam dialogParam , @Nullable String keyName , @NonNull String encrypted ) {
return decrypt ( EncryptionMethod . AES , dialogParam , context , keyName , encrypted ) ;
}
/ * *
* Encrypt data with the given { @link EncryptionMethod } . Depending on the given method , the
* fingerprint sensor might be enabled and waiting for the user to authenticate before the
* encryption step . All encrypted data can only be accessed again by calling
* { @link # decrypt ( EncryptionMethod , Context , String , String ) } with the same
* { @link # decrypt ( EncryptionMethod , BiometricPromptDialogParam , Context , String , String ) } with the same
* { @link EncryptionMethod } that was used for encryption of the given value .
* < p >
* Take more details about the encryption method and how they behave from { @link EncryptionMethod }
@ -274,7 +275,7 @@ public class RxFingerprint {
* Encrypt data with the given { @link EncryptionMethod } . Depending on the given method , the
* fingerprint sensor might be enabled and waiting for the user to authenticate before the
* encryption step . All encrypted data can only be accessed again by calling
* { @link # decrypt ( EncryptionMethod , Context , String , String ) } with the same
* { @link # decrypt ( EncryptionMethod , BiometricPromptDialogParam , Context , String , String ) } with the same
* { @link EncryptionMethod } that was used for encryption of the given value .
* < p >
* Take more details about the encryption method and how they behave from { @link EncryptionMethod }
@ -302,7 +303,7 @@ public class RxFingerprint {
* Encrypt data with the given { @link EncryptionMethod } . Depending on the given method , the
* fingerprint sensor might be enabled and waiting for the user to authenticate before the
* encryption step . All encrypted data can only be accessed again by calling
* { @link # decrypt ( EncryptionMethod , Context , String , String ) } with the same
* { @link # decrypt ( EncryptionMethod , BiometricPromptDialogParam , Context , String , String ) } with the same
* { @link EncryptionMethod } that was used for encryption of the given value .
* < p >
* Take more details about the encryption method and how they behave from { @link EncryptionMethod }
@ -333,7 +334,7 @@ public class RxFingerprint {
* Encrypt data with the given { @link EncryptionMethod } . Depending on the given method , the
* fingerprint sensor might be enabled and waiting for the user to authenticate before the
* encryption step . All encrypted data can only be accessed again by calling
* { @link # decrypt ( EncryptionMethod , Context , String , String ) } with the same
* { @link # decrypt ( EncryptionMethod , BiometricPromptDialogParam , Context , String , String ) } with the same
* { @link EncryptionMethod } that was used for encryption of the given value .
* < p >
* Take more details about the encryption method and how they behave from { @link EncryptionMethod }
@ -392,14 +393,15 @@ public class RxFingerprint {
* @return Observable result of the decryption
* /
public static Observable < FingerprintDecryptionResult > decrypt ( @NonNull EncryptionMethod method ,
@NonNull BiometricPromptDialogParam dialogParam ,
@NonNull Context context ,
@Nullable String keyName ,
@NonNull String toDecrypt ) {
switch ( method ) {
case AES :
return AesDecryptionObservable . create ( context , keyName , toDecrypt ) ;
return AesDecryptionObservable . create ( context , dialogParam , keyName , toDecrypt ) ;
case RSA :
return RsaDecryptionObservable . create ( context , keyName , toDecrypt ) ;
return RsaDecryptionObservable . create ( context , dialogParam , keyName , toDecrypt ) ;
default :
return Observable . error ( new IllegalArgumentException ( "Unknown decryption method: " + method ) ) ;
}
@ -415,7 +417,7 @@ public class RxFingerprint {
* @return { @code true } if fingerprint authentication is isAvailable
* /
public static boolean isAvailable ( @NonNull Context context ) {
return new FingerprintApiWrapper ( context ) . isAvailable ( ) ;
return BiometricManager . from ( context ) . canAuthenticate ( ) = = BiometricManager . BIOMETRIC_SUCCESS ;
}
/ * *
@ -467,4 +469,59 @@ public class RxFingerprint {
public static boolean keyInvalidated ( Throwable throwable ) {
return throwable instanceof KeyPermanentlyInvalidatedException ;
}
public static class BiometricPromptDialogParam
{
private String title , subTitle , description , negativeButtonText ;
public BiometricPromptDialogParam ( )
{
this . title = null ;
this . subTitle = null ;
this . description = null ;
this . negativeButtonText = null ;
}
public BiometricPromptDialogParam setTitle ( String title )
{
this . title = title ;
return this ;
}
public BiometricPromptDialogParam setSubTitle ( String subTitle )
{
this . subTitle = subTitle ;
return this ;
}
public BiometricPromptDialogParam setDescription ( String description )
{
this . description = description ;
return this ;
}
public BiometricPromptDialogParam setNegativeButtonText ( String buttonText )
{
this . negativeButtonText = buttonText ;
return this ;
}
public String getTitle ( ) {
return title ;
}
public String getSubTitle ( ) {
return subTitle ;
}
public String getDescription ( ) {
return description ;
}
public String getNegativeButtonText ( ) {
return negativeButtonText ;
}
}
}