Sample code for 30+ languages & platforms
Dart Requires Chilkat v11.0.0+

Decrypt S/MIME and Verify S/MIME Signatures

See more MIME Examples

_LANGUAGE_ example to decrypt S/MIME and verify S/MIME signatures. The S/MIME is unwrapped to get the original MIME prior to signing/encrypting.

Chilkat Dart Downloads

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

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

  final mime = CkMime();

  // Load an S/MIME message from a file:
  try {
    mime.loadMimeFile('signedMime.txt');
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // The ContainsEncryptedParts/ContainsSignedParts methods
  // can be called to determine if the MIME is encrypted and/or signed:
  final isEncrypted = mime.containsEncryptedParts();
  final isSigned = mime.containsSignedParts();

  // We don't want the "unwrap extras".  You'll see what those
  // are in a few moments...
  mime.unwrapExtras = false;

  // To verify the signature, call UnwrapSecurity.  This will
  // verify the signature(s) and decrypt the S/MIME and restore
  // the MIME to the unsigned/unencrypted state.
  // The results of what was found are present in the MIME object's
  // properties, as well as extra header fields that are added
  // to the unwrapped MIME.
  try {
    mime.unwrapSecurity();
  } on ChilkatException catch (e) {
    // UnwrapSecurity returns true if all signatures were
    // verified and all parts decrypted.
    print(e.lastErrorText);
    return;
  }

  // The mime.UnwrapExtras property controls whether or not
  // these additional fields are added to the unwrapped MIME:
  // 
  // X-NumPartsSigned: 1
  // X-SignaturesValid: yes
  // X-NumPartsEncrypted: 1
  // X-Decrypted: no
  // 
  // The X-NumPartsSigned/X-SignaturesValid headers are added
  // if the MIME was signed.  
  // 
  // The X-NumPartsEncrypted/X-Decrypted headers are added
  // if the MIME was encrypted.
  // 

  // If the MIME was signed, get the certificate used for signing.
  if (isSigned) {
    final signerCert = CkCert();

    // The NumSignerCerts property indicates how many certificates
    // were used for signing.  This example will assume the value is 1.
    // To get the 1st signer cert, call LastSignerCert with an index of 0:
    try {
      mime.lastSignerCert(0, signerCert);
      print('**** Signer Cert: ${signerCert.subjectCN}');
    } on ChilkatException {
      // mime.lastSignerCert() failed; continue anyway.
    }
  }

  // If the MIME was encrypted, get the certificate used for decryption
  if (isEncrypted) {
    // The NumDecryptCerts property indicates how many certificates
    // were used for decrypting.  This example will assume the value is 1.
    // To get the 1st decrypt cert, call LastDecryptCert with an index of 0:
    final decryptCert = CkCert();
    try {
      mime.lastDecryptCert(0, decryptCert);
      print('**** Decrypt Cert: ${decryptCert.subjectCN}');
    } on ChilkatException {
      // mime.lastDecryptCert() failed; continue anyway.
    }
  }

  // Display the unwrapped MIME:
  print(mime.getMime());

  // Save the unwrapped MIME to a file:
  mime.saveMime('unwrappedMime.txt');
}