crosspki 1.1.0 copy "crosspki: ^1.1.0" to clipboard
crosspki: ^1.1.0 copied to clipboard

Flutter plugin for handling X509 certificates and key pairs from native platform key stores.

example/lib/main.dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:crosspki/crosspki.dart';

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

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

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

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    runCrossPkiApis();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> runCrossPkiApis() async {
    try {
      print('LISTING CERTIFICATES');
      var certs = await CrossPki.listCertificatesWithKey();
      print('Certs count: ${certs.length}');

      print('IMPORTING PKCS#12');
      final p12Content = base64Decode(
          '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');
      await CrossPki.importPkcs12(p12Content, "1234");
      certs = await CrossPki.listCertificatesWithKey();
      print('Certs count: ${certs.length}');
      final userCertificate = certs.first;
      print('Imported: ${userCertificate.subjectName}');
      print('CPF: ${userCertificate.pkiBrazil.cpfFormatted}');

      print('SIGN DATA TEST');
      var sig = await CrossPki.signData(userCertificate.thumbprint,
          DigestAlgorithm.sha256, base64Decode('SGVsbG8sIFdvcmxkIQ=='));
      print('Signature: ${base64Encode(sig.toList())}');

      print('SIGN HASH TEST');
      sig = await CrossPki.signHash(
          userCertificate.thumbprint,
          DigestAlgorithm.sha256,
          base64Decode('3/1gIbsr1bCvZ2KQgJ7DpTGR3YHH9wpLKGiKNiGCmG8='));
      print('Signature: ${base64Encode(sig.toList())}');

      await CrossPki.removeCertificate(certs[0].thumbprint);
      print('Removed');
      certs = await CrossPki.listCertificatesWithKey();
      print('Certs count: ${certs.length}');

      print('GENERATING RSA KEY PAIR...');
      var keyPair = await CrossPki.generateRsaKeyPair(2048);
      print('keyId: ${keyPair.keyId}');
      print(
          'publicKey ${keyPair.algorithm}: ${base64Encode(keyPair.publicKeyEncoded.toList())}');

      print('GENERATING CSR...');
      var csr = await CrossPki.generateCsr(keyPair);
      print('CSR: ${base64Encode(csr.toList())}');

      print('DONE');
    } on CrossPkiException catch (ex) {
      print('ERROR: $ex');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Cross PKI Plugin example app'),
        ),
        body: const Center(
          child: Text('Running Cross PKI API'),
        ),
      ),
    );
  }
}
2
likes
110
pub points
23%
popularity

Publisher

verified publisherlacunasoftware.com

Flutter plugin for handling X509 certificates and key pairs from native platform key stores.

Homepage

Documentation

API reference

License

unknown (LICENSE)

Dependencies

asn1lib, collection, flutter, http, plugin_platform_interface

More

Packages that depend on crosspki