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

Ed25519ph Sign and Verify

See more Ed25519 Examples

Demonstrates how to create an Ed25519ph signature, and then to verify it.

Note: This example requires Chilkat v9.5.0.91 or greater.

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.EdDSA,
  Chilkat.BinData,
  Chilkat.PrivateKey,
  Chilkat.PublicKey;

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

procedure RunDemo;
var
  success: Boolean;
  privKeyHex: string;
  pubKeyHex: string;
  privKey: TPrivateKey;
  bd: TBinData;
  eddsa: TEdDSA;
  hexSig: string;
  pubKey: TPublicKey;
  bVerified: Boolean;

begin
  success := False;

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

  //  Use the following test vector from https://www.rfc-editor.org/rfc/rfc8032#page-30

  //     -----TEST abc
  //  
  //     ALGORITHM:
  //     Ed25519ph
  //  
  //     SECRET KEY:
  //     833fe62409237b9d62ec77587520911e
  //     9a759cec1d19755b7da901b96dca3d42
  //  
  //     PUBLIC KEY:
  //     ec172b93ad5e563bf4932c70e1245034
  //     c35467ef2efd4d64ebf819683467e2bf
  //  
  //     MESSAGE (length 3 bytes):
  //     616263
  //  
  //     SIGNATURE:
  //     98a70222f0b8121aa9d30f813d683f80
  //     9e462b469c7ff87639499bb94e6dae41
  //     31f85042463c2a355a2003d062adf5aa
  //     a10b8c61e636062aaad11c2a26083406

  privKeyHex := '833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42';
  pubKeyHex := 'ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf';

  privKey := TPrivateKey.Create;
  success := privKey.LoadEd25519(privKeyHex,pubKeyHex);
  if (success = False) then
    begin
      WriteLn(privKey.LastErrorText);
      Exit;
    end;

  //  The data to be signed...
  bd := TBinData.Create;
  bd.AppendEncoded('616263','hex');

  eddsa := TEdDSA.Create;
  //  Indicate we want the Ed25519ph instance.
  eddsa.Algorithm := 'Ed25519ph';

  hexSig := eddsa.SignBdENC(bd,'hexlower',privKey);

  WriteLn('signature = ' + hexSig);

  //  The expected output is: 98a70222f0b8121aa9d30f813d683f80....

  //  Verify the signature..
  pubKey := TPublicKey.Create;
  success := pubKey.LoadEd25519(pubKeyHex);
  if (success = False) then
    begin
      WriteLn(pubKey.LastErrorText);
      Exit;
    end;

  bVerified := eddsa.VerifyBdENC(bd,hexSig,'hexlower',pubKey);
  if (bVerified = False) then
    begin
      WriteLn(eddsa.LastErrorText);
      WriteLn('Failed to verify the signature.');
      Exit;
    end;

  WriteLn('The Ed25519ph signature is verified!');


  privKey.Free;
  bd.Free;
  eddsa.Free;
  pubKey.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.