Sample code for 30+ languages & platforms
Dart

DSA Signature Create and Verify

See more DSA Examples

Shows how to create a DSA (DSS) signature for the contents of a file. The first step is to create an SHA-1 hash of the file contents. The hash is signed using the Digital Signature Algorithm and the signature bytes are retrieved as a hex-encoded string.

The 2nd part of the example loads the signature and verifies it against the hash.

Chilkat Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  var success = false;

  // This example requires the Chilkat API to have been previously unlocked.
  // See Global Unlock Sample for sample code.

  final crypt = CkCrypt2();

  crypt.encodingMode = 'hex';
  crypt.hashAlgorithm = 'sha-1';

  // Return the SHA-1 hash of a file.  The file may be any size.
  // The Chilkat Crypt component will stream the file when 
  // computing the hash, keeping the memory usage constant
  // and reasonable.
  // The 20-byte SHA-1 hash is returned as a hex-encoded string.
  final hashStr = crypt.hashFileENC('hamlet.xml');

  final dsa = CkDsa();

  // Load a DSA private key from a PEM file.  Chilkat DSA
  // provides the ability to load and save DSA public and private
  // keys from encrypted or non-encrypted PEM or DER.
  // The LoadText method is for convenience only.  You may
  // use any means to load the contents of a PEM file into
  // a string.
  final pemPrivateKey = dsa.loadText('dsa_priv.pem');
  try {
    dsa.fromPem(pemPrivateKey);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // You may optionally verify the key to ensure that it is a valid
  // DSA key.
  success = dsa.verifyKey();
  if (!success) {
    print(dsa.lastErrorText);
    return;
  }

  // Load the hash to be signed into the DSA object:
  try {
    dsa.setEncodedHash('hex', hashStr);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // Now that the DSA object contains both the private key and hash,
  // it is ready to create the signature:
  try {
    dsa.signHash();
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // If SignHash is successful, the DSA object contains the
  // signature.  It may be accessed as a hex or base64 encoded
  // string.  (It is also possible to access directly in byte array form via
  // the "Signature" property.)
  final hexSig = dsa.getEncodedSignature('hex');
  print('Signature:');
  print(hexSig);

  // -----------------------------------------------------------
  // Step 2: Verify the DSA Signature
  // -----------------------------------------------------------

  final dsa2 = CkDsa();

  // Load the DSA public key to be used for verification:
  final pemPublicKey = dsa2.loadText('dsa_pub.pem');
  try {
    dsa2.fromPublicPem(pemPublicKey);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // Load the hash to be verified against the signature.
  try {
    dsa2.setEncodedHash('hex', hashStr);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // Load the signature:
  try {
    dsa2.setEncodedSignature('hex', hexSig);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // Verify:
  try {
    dsa2.verify();
    print('DSA Signature Verified!');
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
  }
}