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

Verify a .p7m and get Algorithm Information

See more Digital Signatures Examples

Demonstrates how to verify a .p7m and then examine the algorithms used by the signature.

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.Crypt2,
  Chilkat.JsonObject;

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

procedure RunDemo;
var
  success: Boolean;
  crypt: TCrypt2;
  inFile: string;
  outFile: string;
  json: TJsonObject;
  i: Integer;
  count_i: Integer;
  strVal: string;
  certSerialNumber: string;
  certIssuerCN: string;
  certIssuerDN: string;
  certDigestAlgOid: string;
  certDigestAlgName: string;
  contentType: string;
  signingTime: string;
  messageDigest: string;
  signingAlgOid: string;
  signerDigest: string;
  j: Integer;
  count_j: Integer;
  oid: string;
  oidName: string;
  der: string;

begin
  success := False;

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

  crypt := TCrypt2.Create;

  inFile := 'qa_data/p7m/brainpoolP256r1.p7m';
  outFile := 'qa_output/something.dat';

  //  Verify and extract the signed data.
  success := crypt.VerifyP7M(inFile,outFile);
  if (success = False) then
    begin
      WriteLn(crypt.LastErrorText);
      Exit;
    end;

  //  Examine details about the signature(s)
  json := TJsonObject.Create;
  crypt.GetLastJsonData(json);
  json.EmitCompact := False;
  WriteLn(json.Emit());

  //  Sample output

  //  {
  //    "pkcs7": {
  //      "verify": {
  //        "digestAlgorithms": [
  //          "sha256"
  //        ],
  //        "signerInfo": [
  //          {
  //            "cert": {
  //              "serialNumber": "FFFFE552B302FFFFFF1E34C3ACEB2FFFF",
  //              "issuerCN": "The common name of the cert...",
  //              "issuerDN": "",
  //              "digestAlgOid": "2.16.840.1.101.3.4.2.1",
  //              "digestAlgName": "SHA256"
  //            },
  //            "contentType": "1.2.840.113549.1.7.1",
  //            "signingTime": "190409140500Z",
  //            "messageDigest": "lQe9If7vZKFf/NlSYu5Esmlw3phVK/RFsbbb1uH73t8=",
  //            "signingAlgOid": "1.2.840.10045.4.3.2",
  //            "signerDigest": "lQe9If7vZKFf/NlSYu5Esmlw3phVK/RFsbbb1uH73t8=",
  //            "authAttr": [
  //              {
  //                "oid": "1.2.840.113549.1.9.3",
  //                "oidName": "contentType"
  //              },
  //              {
  //                "oid": "1.2.840.113549.1.9.5",
  //                "oidName": "signingTime"
  //              },
  //              {
  //                "oid": "1.2.840.113549.1.9.52",
  //                "oidName": "1.2.840.113549.1.9.52",
  //                "der": "MBs ... AwI="
  //              },
  //              {
  //                "oid": "1.2.840.113549.1.9.4",
  //                "oidName": "messageDigest"
  //              },
  //              {
  //                "oid": "1.2.840.113549.1.9.16.2.47",
  //                "oidName": "signingCertificateV2",
  //                "der": "MCYw .. 7PlQ=="
  //              },
  //              {
  //                "oid": "1.2.840.113549.1.9.20",
  //                "oidName": "1.2.840.113549.1.9.20"
  //              }
  //            ]
  //          }
  //        ]
  //      }
  //    }
  //  }

  //  Code for parsing the above JSON...

  i := 0;
  count_i := json.SizeOfArray('pkcs7.verify.digestAlgorithms');
  while i < count_i do
    begin
      json.I := i;
      strVal := json.StringOf('pkcs7.verify.digestAlgorithms[i]');
      i := i + 1;
    end;

  i := 0;
  count_i := json.SizeOfArray('pkcs7.verify.signerInfo');
  while i < count_i do
    begin
      json.I := i;
      certSerialNumber := json.StringOf('pkcs7.verify.signerInfo[i].cert.serialNumber');
      certIssuerCN := json.StringOf('pkcs7.verify.signerInfo[i].cert.issuerCN');
      certIssuerDN := json.StringOf('pkcs7.verify.signerInfo[i].cert.issuerDN');
      certDigestAlgOid := json.StringOf('pkcs7.verify.signerInfo[i].cert.digestAlgOid');
      certDigestAlgName := json.StringOf('pkcs7.verify.signerInfo[i].cert.digestAlgName');
      contentType := json.StringOf('pkcs7.verify.signerInfo[i].contentType');
      signingTime := json.StringOf('pkcs7.verify.signerInfo[i].signingTime');
      messageDigest := json.StringOf('pkcs7.verify.signerInfo[i].messageDigest');
      signingAlgOid := json.StringOf('pkcs7.verify.signerInfo[i].signingAlgOid');
      signerDigest := json.StringOf('pkcs7.verify.signerInfo[i].signerDigest');
      j := 0;
      count_j := json.SizeOfArray('pkcs7.verify.signerInfo[i].authAttr');
      while j < count_j do
        begin
          json.J := j;
          oid := json.StringOf('pkcs7.verify.signerInfo[i].authAttr[j].oid');
          oidName := json.StringOf('pkcs7.verify.signerInfo[i].authAttr[j].oidName');
          der := json.StringOf('pkcs7.verify.signerInfo[i].authAttr[j].der');
          j := j + 1;
        end;

      i := i + 1;
    end;

  WriteLn('Success!');


  crypt.Free;
  json.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.