xml_crypto 2.1.3 copy "xml_crypto: ^2.1.3" to clipboard
xml_crypto: ^2.1.3 copied to clipboard

outdated

Xml digital signature library for Dart

example/example.dart

//Copyright (C) 2022 Potix Corporation. All Rights Reserved.
//History: Tue Feb 15 18:40:31 CST 2022
// Author: rudyhuang

import 'dart:io';

import 'package:xml_crypto/xml_crypto.dart';
import 'package:xpath_selector/xpath_selector.dart';

void main() {
  final xml = "<library>"
      "<book>"
      "<name>Harry Potter</name>"
      "</book>"
      "</library>";

  //sign an xml document
  signXml(xml,
      "//*[local-name()='book']",
      'client.pem',
      'result.xml');

  print('xml signed successfully');

  var signedXml = File('result.xml').readAsStringSync();
  print('validating signature...');

  //validate an xml document
  if (validateXml(signedXml, 'client_public.pem')) {
    print('signature is valid');
  } else {
    print('signature not valid');
  }
}

void signXml(String xml, String xpath, String key, String dest) {
  final sig = SignedXml()
    ..signingKey = File(key).readAsBytesSync()
    ..addReference(xpath)
    ..computeSignature(xml);
  File(dest).writeAsStringSync(sig.signedXml);
}

bool validateXml(String xml, String key) {
  final signature = XPath.xml(xml)
      .query("/*/*[local-name()='Signature']").node;
  final sig = SignedXml()
    ..keyInfoProvider = FileKeyInfo(key)
    ..loadSignature(signature!.node);
  final res = sig.checkSignature(xml);
  if (!res) print(sig.validationErrors);
  return res;
}