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