biometric_signature 7.0.4 copy "biometric_signature: ^7.0.4" to clipboard
biometric_signature: ^7.0.4 copied to clipboard

Hardware-backed biometric authentication for Flutter. Create cryptographic signatures using device biometrics with keys stored in Secure Enclave/StrongBox.

example/lib/main.dart

import 'package:biometric_signature/android_config.dart';
import 'package:biometric_signature/ios_config.dart';
import 'package:flutter/material.dart';
import 'package:biometric_signature/biometric_signature.dart';
import 'package:biometric_signature/signature_options.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('biometric signature test app')),
        body: const ExampleAppBody(),
      ),
    );
  }
}

class ExampleAppBody extends StatefulWidget {
  const ExampleAppBody({super.key});

  @override
  State<ExampleAppBody> createState() => _ExampleAppBodyState();
}

class _ExampleAppBodyState extends State<ExampleAppBody> {
  final _biometricSignature = BiometricSignature();

  bool useEc = true;
  String? publicKey;
  String? payload;
  String? signature;

  void _createPublicKey() async {
    final String? publicKey = await _biometricSignature.createKeys(
      androidConfig: AndroidConfig(
        useDeviceCredentials: true,
        signatureType: useEc
            ? AndroidSignatureType.ECDSA
            : AndroidSignatureType.RSA,
      ),
      iosConfig: IosConfig(
        useDeviceCredentials: false,
        signatureType: useEc ? IOSSignatureType.ECDSA : IOSSignatureType.RSA,
      ),
    );
    setState(() {
      this.publicKey = publicKey;
    });
    debugPrint("publicKey : $publicKey");
    debugPrint(await _biometricSignature.biometricAuthAvailable());
  }

  void _toggleEc(bool newValue) {
    setState(() {
      useEc = newValue;
    });
    _biometricSignature.deleteKeys().then((success) {
      debugPrint("deleteKeys success: $success");
      if (success ?? false) {
        setState(() {
          // ignore: unnecessary_this
          this.publicKey = null;
        });
      }
    });
  }

  void _payloadChanged(String value) {
    if (value == payload) {
      return;
    }
    setState(() {
      payload = value;
      signature = null;
    });
  }

  void _createSignature() async {
    if (payload == null) {
      debugPrint("payload is null");
      ScaffoldMessenger.of(
        context,
      ).showSnackBar(const SnackBar(content: Text('please enter payload')));
      return;
    }
    final signature = await _biometricSignature.createSignature(
      SignatureOptions(
        payload: payload!,
        promptMessage: "Sign Payload",
        androidOptions: const AndroidSignatureOptions(
          allowDeviceCredentials: true,
        ),
        iosOptions: const IosSignatureOptions(shouldMigrate: false),
      ),
    );
    setState(() {
      this.signature = signature;
    });
    debugPrint("signature : $signature");
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              children: [
                Text('use EC'),
                Switch(value: useEc, onChanged: _toggleEc),
              ],
            ),
            TextButton(
              onPressed: _createPublicKey,
              child: Text('create ${useEc ? 'EC' : 'RSA'} keys'),
            ),
            if (publicKey != null) Text('publicKey: \n$publicKey'),
            const Spacer(),
            if (signature != null) Text('signature: \n$signature'),
            Row(
              children: [
                Expanded(
                  child: TextField(
                    decoration: const InputDecoration(labelText: 'payload'),
                    onChanged: _payloadChanged,
                  ),
                ),
                TextButton(onPressed: _createSignature, child: Text('sign')),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
27
likes
160
points
50.5k
downloads
screenshot

Publisher

verified publishervisionflutter.com

Weekly Downloads

Hardware-backed biometric authentication for Flutter. Create cryptographic signatures using device biometrics with keys stored in Secure Enclave/StrongBox.

Repository (GitHub)
View/report issues

Topics

#biometrics #secure-enclave #strongbox #rsa #ecdsa

Documentation

API reference

License

MIT (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on biometric_signature

Packages that implement biometric_signature