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

S/MIME Decrypt using Certificate and Private Key in Apple Keychain

See more Apple Keychain Examples

Decrypts S/MIME using a certificate with private key found in the Apple Keychain.

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;
  cert: TCert;
  mime: TMime;

begin
  success := False;

  cert := TCert.Create;

  //  Load the certificate to be used for decryption by the Subject Common Name
  //  On MacOS and iOS, Chilkat will search the Keychain(s) for the matching certificate.
  //  Note: The private key must be present to decrypt.
  success := cert.LoadByCommonName('My Cert');
  if (success = False) then
    begin
      WriteLn(cert.LastErrorText);
      Exit;
    end;

  WriteLn('Cert has private key: ' + cert.HasPrivateKey());

  //  Load the MIME to be decrypted.
  //  We encrypted using this example:  S/MIME Encrypt using Certificate in Apple Keychain
  mime := TMime.Create;
  success := mime.LoadMimeFile('./encrypted.mime');
  if (success = False) then
    begin
      WriteLn(mime.LastErrorText);
      Exit;
    end;

  WriteLn(mime.GetMime());
  WriteLn('----');

  //  Here's the encrypted MIME:

  //  Subject: test
  //  SomeHeader: 123
  //  Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
  //  Content-Disposition: attachment; filename="smime.p7m"
  //  Content-Transfer-Encoding: base64
  //  
  //  MIICSwYJKoZIhvcNAQcDoIICPDCCAjgCAQAxggGzMIIBrwIBADCBljCBgTELMAkGA1UEBhMCSVQx
  //  EDAOBgNVBAgMB0JlcmdhbW8xGTAXBgNVBAcMEFBvbnRlIFNhbiBQaWV0cm8xFzAVBgNVBAoMDkFj
  //  dGFsaXMgUy5wLkEuMSwwKgYDVQQDDCNBY3RhbGlzIENsaWVudCBBdXRoZW50aWNhdGlvbiBDQSBH
  //  MwIQPCWvkSv8oQ7xRmEHJ6TzEDANBgkqhkiG9w0BAQEFAASCAQB3VZvHRE5EWxug7Sckpcz1ucDZ
  //  YiTKiqmyPt75MhzNRQLtKFx/jWwlemUwnPMzeu6yutCkZ74Bdn7MBsfDqV3bUz43wAu+fRBteGvF
  //  mTc00MfY8L7o8dkpj4AqAOCj4hKQzbSE99GvSzyXcPE2Gm5NrOPtKxqfFqbBRTCb4fBZP84LaL+x
  //  rnYfrM4qXTppixyN8iFYCd4maEbMu/GA5o+j0BkDDnx42pILDoAGV/ERyx55Y3Nc2Mhm/cITBMNn
  //  g7uS9KPrlYizNaqVu09Hi9jg4gdZaRiTjUqg05tSOk/YqIQxTgfscwSPY92/ewpI6e1EHtLt8Q33
  //  gWCbERptSntUMHwGCSqGSIb3DQEHATAdBglghkgBZQMEAQIEENm1AxeXlEMx7p6McjHIj5CAUEQj
  //  0GuJ5LnTqiqIjOiwmwNidl1N1TRluxX5vAQvwBuYE6bQK4+i04yn2Av3cucW4kvxgP2Nmni+XgQt
  //  aPPKlasaVceEeZ15IYjw77/m3YYn

  //  -------------------------------------
  //  Decrypt the MIME.
  success := mime.DecryptUsingCert(cert);
  if (success = False) then
    begin
      WriteLn(mime.LastErrorText);
      Exit;
    end;

  //  -------------------------------------
  //  Note: A password dialog may be shown, possibly twice, when accessing the private key.
  //  See the following blog post explaining how to suppress the dialog:
  //  Suppress Password Dialog when Accessing Private Key in Apple Keychain

  //  Show the unencrypted MIME
  WriteLn(mime.GetMime());

  //  Here's the decrypted MIME

  //  Subject: test
  //  SomeHeader: 123
  //  Content-Type: text/plain
  //  
  //  This is the body.


  cert.Free;
  mime.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.