Sample code for 30+ languages & platforms
Delphi ActiveX

Sign JSON (or any Text) to Create a Detached PKCS7 Signature

Demonstrates how to sign JSON or any string using a certificate + private key from a .p12/.pfx to create a detached PKCS7 signature. (A detached signature is one that does not embed the original signed data.)

Chilkat Delphi ActiveX Downloads

Delphi ActiveX
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Chilkat_TLB;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Integer;
crypt: TChilkatCrypt2;
cert: TChilkatCert;
detachedSig: Array of Byte;
stringToSign: WideString;
verified: Integer;

begin
success := 0;

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

crypt := TChilkatCrypt2.Create(Self);

cert := TChilkatCert.Create(Self);
success := cert.LoadPfxFile('qa_data/pfx/cert_test123.pfx','test123');
if (success <> 1) then
  begin
    Memo1.Lines.Add(cert.LastErrorText);
    Exit;
  end;

// Tell the crypt component to use this cert.
success := crypt.SetSigningCert(cert.ControlInterface);
if (success <> 1) then
  begin
    Memo1.Lines.Add(crypt.LastErrorText);
    Exit;
  end;

crypt.HashAlgorithm := 'sha256';

// By default, all the certs in the chain of authentication are included in the signature.
// If desired, we can choose to only include the signing certificate:
crypt.IncludeCertChain := 0;

// Create the detached signature, which does NOT contain the original data.
// To create a PKCS7 signature that contains the original data, see CAdES Sign JSON
crypt.Charset := 'utf-8';

stringToSign := '{ "abc": 123}';
detachedSig := crypt.SignString(stringToSign);
if (crypt.LastMethodSuccess = 0) then
  begin
    Memo1.Lines.Add(crypt.LastErrorText);
    Exit;
  end;

// Verify the signature against the original data.
verified := crypt.VerifyString(stringToSign,detachedSig);
if (verified = 0) then
  begin
    Memo1.Lines.Add(crypt.LastErrorText);
    Exit;
  end;

Memo1.Lines.Add('Success!');
end;