Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

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 Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Cert,
  Chilkat.Mime;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  mime: TMime;
  isEncrypted: Boolean;
  isSigned: Boolean;
  signerCert: TCert;
  decryptCert: TCert;

begin
  success := False;

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

  mime := TMime.Create;

  //  Load an S/MIME message from a file:
  success := mime.LoadMimeFile('signedMime.txt');
  if (success = False) then
    begin
      WriteLn(mime.LastErrorText);
      Exit;
    end;

  //  The ContainsEncryptedParts/ContainsSignedParts methods
  //  can be called to determine if the MIME is encrypted and/or signed:
  isEncrypted := mime.ContainsEncryptedParts();
  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.
  success := mime.UnwrapSecurity();
  if (success <> True) then
    begin
      //  UnwrapSecurity returns True if all signatures were
      //  verified and all parts decrypted.
      WriteLn(mime.LastErrorText);
      Exit;
    end;

  //  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 = True) then
    begin
      signerCert := TCert.Create;

      //  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:
      success := mime.LastSignerCert(0,signerCert);
      if (success = True) then
        begin
          WriteLn('**** Signer Cert: ' + signerCert.SubjectCN);
        end;
    end;

  //  If the MIME was encrypted, get the certificate used for decryption
  if (isEncrypted = True) then
    begin
      //  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:
      decryptCert := TCert.Create;
      success := mime.LastDecryptCert(0,decryptCert);
      if (success = True) then
        begin
          WriteLn('**** Decrypt Cert: ' + decryptCert.SubjectCN);
        end;
    end;

  //  Display the unwrapped MIME:
  WriteLn(mime.GetMime());

  //  Save the unwrapped MIME to a file:
  success := mime.SaveMime('unwrappedMime.txt');


  mime.Free;
      signerCert.Free;
      decryptCert.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.