implementation 'co.infinum:goldfinger:1.1.0'
Goldfinger.Builder(context).build()
if (goldfinger.hasEnrolledFingerprint()) {
/* Authenticate */
}
goldfinger.authenticate(new Goldfinger.Callback() {
@Override
public void onSuccess(String value) {
/* Authenticated */
}
@Override
public void onError(Error error) {
/* Error, can be either critical or non-critical */
}
});
You can see all Goldfinger methods here.
Goldfinger has separate Rx module in case you want to use reactive approach.
implementation 'co.infinum:goldfinger:1.1.0'
implementation 'co.infinum:goldfinger:1.1.0'
RxGoldfinger.Builder(context).build()
goldfinger.authenticate().subscribe(new Observer<GoldfingerEvent>() {
...
@Override
public void onNext(GoldfingerEvent event) {
if (event instanceof GoldfingerEvent.OnSuccess) {
/* Authenticated */
} else if (event instanceof GoldfingerEvent.OnError) {
/* Error, can be either critical or non-critical */
}
}
});
You can see all RxGoldfinger methods here.
To use the Android Fingerprint API you must:
- Create a new or load an existing
SecretKey
- Create a
Cipher
with a created or loadedSecretKey
- Create a
CryptoObject
with a createdCipher
- Start Fingerprint authentication with a created
CryptoObject
- Handle possible exceptions at every step due to complexity of the Android Fingerprint API
The CryptoObject
is locked when created and it is unlocked when the user successfully authenticates. Once it is unlocked, you can use it to cipher data.
Fingerprint authentication is used to either:
- Authenticate the user, e.g. for payment
- Perform encryption or decryption operations over user’s case-sensitive information, e.g. passwords
Goldfinger wraps everything mentioned and provides an intuitive and easy-to-use interface.
If you don’t like Default implementations, you can easily modify them using Goldfinger.Builder
object.
Goldfinger.Builder(context)
.setLogEnabled(true)
.setCryptoCreator(cryptoCreator)
.setCrypto(crypto)
.build()
Logging is off by default. You can enable it by calling Goldfinger.Builder(context).setLogEnabled(true)
.
Creating a CryptoObject
is a complicated process that has multiple steps. CryptoFactory
allows you to modify CryptoObject
creation and adjust it to your needs.
new CryptoFactory() {
@Nullable
@Override
public FingerprintManagerCompat.CryptoObject createAuthenticationCryptoObject(String keyName) {}
@Nullable
@Override
public FingerprintManagerCompat.CryptoObject createEncryptionCryptoObject(String keyName) {}
@Nullable
@Override
public FingerprintManagerCompat.CryptoObject createDecryptionCryptoObject(String keyName) {}
};
All methods should return a CryptoObject
instance or a null
value if an error happens during object creation.
You can find the default implementation here.
Goldfinger automatically handles encryption and decryption operations via a Crypto
implementation which you can implement yourself in case you want a custom cipher.
new Crypto() {
@Nullable
@Override
public String encrypt(FingerprintManagerCompat.CryptoObject cryptoObject, String value) {}
@Nullable
@Override
public String decrypt(FingerprintManagerCompat.CryptoObject cryptoObject, String value) {}
}
Crypto
methods receive an unlocked CryptoObject
that ciphers data and a String
value as data you should cipher. The return value should be ciphered data or null
if an error happens.
The default Crypto
implementation can be found here.
- Android Oreo doesn't throw
KeyPermanentlyInvalidatedException
- Link
Feedback and code contributions are very much welcome. Just make a pull request with a short description of your changes. By making contributions to this project you give permission for your code to be used under the same license.
Maintained and sponsored by Infinum.