secp256r1 0.1.0-dev.8 copy "secp256r1: ^0.1.0-dev.8" to clipboard
secp256r1: ^0.1.0-dev.8 copied to clipboard

A Flutter plugin that support secp256r1 by Keystore on Android and Secure Enclave on iOS.

example/lib/main.dart

import 'dart:convert';
import 'dart:typed_data';

import 'package:agent_dart/agent_dart.dart' show P256PublicKey;
import 'package:convert/convert.dart';
import 'package:flutter/material.dart';
import 'package:secp256r1/secp256r1.dart';
import 'package:tuple/tuple.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _publicKey = 'Unknown';
  String _signed = 'Unknown';
  bool? _verified;
  String? _sharedSecret, _decrypted;
  Tuple2<Uint8List, Uint8List>? _encrypted;

  final _payloadTEC = TextEditingController(text: 'Hello world');
  final _othersPublicKeyTEC = TextEditingController();

  String get alias => 'test_alias';

  String get _verifyPayload => _payloadTEC.text;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: ListView(
          children: [
            SelectableText('getPublicKey: $_publicKey\n'),
            SelectableText('sign: $_signed\n'),
            SelectableText('verify: $_verified\n'),
            SelectableText('sharedSecret: $_sharedSecret\n'),
            SelectableText('encrypted: $_encrypted\n'),
            SelectableText('decrypted: $_decrypted\n'),
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
              child: TextField(
                controller: _payloadTEC,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  label: Text('Payload text field'),
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
              child: TextField(
                controller: _othersPublicKeyTEC,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  label: Text('Others Public Key (hex)'),
                ),
              ),
            ),
            ElevatedButton(
              onPressed: () {
                SecureP256.getPublicKey(alias).then(
                  (r) => setState(() => _publicKey = hex.encode(r.rawKey)),
                );
              },
              child: const Text('getPublicKey'),
            ),
            ElevatedButton(
              onPressed: () {
                SecureP256.sign(
                  alias,
                  Uint8List.fromList(utf8.encode(_verifyPayload)),
                ).then((r) => setState(() => _signed = hex.encode(r)));
              },
              child: const Text('sign'),
            ),
            ElevatedButton(
              onPressed: () {
                SecureP256.verify(
                  Uint8List.fromList(utf8.encode(_verifyPayload)),
                  P256PublicKey.fromRaw(
                    Uint8List.fromList(hex.decode(_publicKey)),
                  ),
                  Uint8List.fromList(hex.decode(_signed)),
                ).then((r) => setState(() => _verified = r));
              },
              child: const Text('verify'),
            ),
            ElevatedButton(
              onPressed: () {
                SecureP256.getSharedSecret(
                  alias,
                  P256PublicKey.fromRaw(
                    Uint8List.fromList(
                      hex.decode(_othersPublicKeyTEC.text),
                    ),
                  ),
                ).then((r) => setState(() => _sharedSecret = hex.encode(r)));
              },
              child: const Text('getSharedSecret'),
            ),
            ElevatedButton(
              onPressed: () {
                SecureP256.encrypt(
                  sharedSecret: Uint8List.fromList(
                    hex.decode(_sharedSecret!),
                  ),
                  message: Uint8List.fromList(utf8.encode('Hello AstroX')),
                ).then((r) => setState(() => _encrypted = r));
              },
              child: const Text('Encrypt (FFI)'),
            ),
            ElevatedButton(
              onPressed: () {
                SecureP256.decrypt(
                  sharedSecret: Uint8List.fromList(
                    hex.decode(_sharedSecret!),
                  ),
                  iv: _encrypted!.item1,
                  cipher: _encrypted!.item2,
                ).then((r) => setState(() => _decrypted = utf8.decode(r)));
              },
              child: const Text('Decrypt (FFI)'),
            ),
          ],
        ),
      ),
    );
  }
}
4
likes
160
points
361
downloads

Publisher

verified publisherastrox.io

Weekly Downloads

A Flutter plugin that support secp256r1 by Keystore on Android and Secure Enclave on iOS.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

agent_dart, agent_dart_base, flutter, plugin_platform_interface, tuple

More

Packages that depend on secp256r1