yubikit_flutter 0.0.3 copy "yubikit_flutter: ^0.0.3" to clipboard
yubikit_flutter: ^0.0.3 copied to clipboard

outdated

Wrapper for YubiKit iOS and Android SDKs

example/lib/main.dart

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

import 'package:flutter/material.dart';
import 'package:yubikit_flutter/piv/piv_key_algorithm.dart';
import 'package:yubikit_flutter/piv/piv_key_type.dart';
import 'package:yubikit_flutter/piv/piv_management_key_type.dart';
import 'package:yubikit_flutter/piv/piv_pin_policy.dart';
import 'package:yubikit_flutter/piv/piv_session.dart';
import 'package:yubikit_flutter/smartcard/smartcard_application.dart';
import 'package:yubikit_flutter/smartcard/smartcard_instruction.dart';

import 'package:yubikit_flutter/piv/piv_slot.dart';
import 'package:yubikit_flutter/piv/piv_touch_policy.dart';
import 'package:yubikit_flutter/yubikit_flutter.dart';

void main() {
  runApp(const MaterialApp(home: MyApp()));
}

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

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

class _MyAppState extends State<MyApp> {
  Uint8List? signature;
  Uint8List? publicKey;
  late Uint8List data;

  @override
  void initState() {
    super.initState();
    data = Uint8List.fromList("Hello World".codeUnits);
  }

  @override
  void dispose() {
    super.dispose();
  }

  void setSignature(Uint8List? newSignature) {
    setState(() {
      signature = newSignature;
    });
  }

  void setPublicKey(Uint8List? newPublicKey) {
    setState(() {
      publicKey = newPublicKey;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Yubikit example app'),
      ),
      body: Center(
        child: Column(
          children: [
            ElevatedButton(
                onPressed: () async => {
                      setSignature(await YubikitFlutter.pivSession()
                          .signWithKey(
                              YKFPIVSlot.signature,
                              YKFPIVKeyType.rsa2048,
                              YKFPIVKeyAlgorithm
                                  .rsaSignatureMessagePKCS1v15SHA512,
                              YubikitFlutterPivSession.defaultPin,
                              data))
                    },
                child: const Text("Sign")),
            ElevatedButton(
                onPressed: () async => {
                      setPublicKey(await YubikitFlutter.pivSession()
                          .generateKey(
                              YKFPIVSlot.signature,
                              YKFPIVKeyType.rsa2048,
                              YKFPIVPinPolicy.def,
                              YKFPIVTouchPolicy.def,
                              YKFPIVManagementKeyType.tripleDES,
                              Uint8List.fromList(YubikitFlutterPivSession
                                  .defaultManagementKey),
                              YubikitFlutterPivSession.defaultPin))
                    },
                child: const Text("Generate key")),
            ElevatedButton(
                onPressed: () async {
                  Uint8List? decryptedData = await YubikitFlutter.pivSession()
                      .decryptWithKey(
                          YKFPIVSlot.signature,
                          YKFPIVKeyAlgorithm.rsaEncryptionPKCS1,
                          YubikitFlutterPivSession.defaultPin,
                          data);
                  setState(() {
                    data = decryptedData;
                  });
                },
                child: const Text("Decrypt data")),
            ElevatedButton(
                onPressed: () async {
                  Uint8List encryptedData = await YubikitFlutter.pivSession()
                      .encryptWithKey(YKFPIVKeyType.rsa2048, publicKey!, data);
                  setState(() {
                    data = encryptedData;
                  });
                },
                child: const Text("Encrypt data")),
            ElevatedButton(
                onPressed: () async {
                  await YubikitFlutter.pivSession().reset();
                  setState(() {
                    publicKey = null;
                    signature = null;
                    data = Uint8List.fromList("Hello World".codeUnits);
                  });
                },
                child: const Text("Reset")),
            ElevatedButton(
                onPressed: () async {
                  Uint8List data = await YubikitFlutter.smartCardSession()
                      .sendApdu(0x00, Instruction.getVersion, 0x00, 0x00,
                          Uint8List.fromList([]), Application.openpgp);
                  String version = data[0].toString() +
                      "." +
                      data[1].toString() +
                      "." +
                      data[2].toString();
                  showDialog(
                    context: context,
                    builder: (ctx) => AlertDialog(
                      content: Text("Application version: " + version),
                      actions: <Widget>[
                        ElevatedButton(
                          onPressed: () {
                            Navigator.of(ctx).pop();
                          },
                          child: const Text("Ok"),
                        ),
                      ],
                    ),
                  );
                },
                child: const Text("Application version(APDU)")),
            Text("Signature: " + (base64.encode(signature ?? []))),
            Text("Public key: " + (base64.encode(publicKey ?? []))),
            Text("Data: " + String.fromCharCodes(data)),
          ],
        ),
      ),
    );
  }
}