Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
Generate ECDSA Key and Get Details as XML
See more ECC Examples
Demonstrates how to generate an ECDSA key and gets the parts as XML.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.Asn,
Chilkat.Prng,
Chilkat.PrivateKey,
Chilkat.Xml,
Chilkat.Crypt2,
Chilkat.Ecc;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
ecc: TEcc;
fortuna: TPrng;
entropy: string;
privKey: TPrivateKey;
asn: TAsn;
xml: TXml;
crypt: TCrypt2;
privKeyHex: string;
begin
success := False;
// This requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
ecc := TEcc.Create;
// Generate a random ECC private key on the secp256k1 curve.
// Chilkat also supports other curves, such as secp384r1, secp521r1, and secp256r1.
// Create a Fortuna PRNG and seed it with system entropy.
// This will be our source of random data for generating the ECC private key.
fortuna := TPrng.Create;
entropy := fortuna.GetEntropy(32,'base64');
success := fortuna.AddEntropy(entropy,'base64');
privKey := TPrivateKey.Create;
success := ecc.GenKey('secp256k1',fortuna,privKey);
if (success = False) then
begin
WriteLn(ecc.LastErrorText);
Exit;
end;
// An EC private key has this ASN.1
// ECPrivateKey ::= SEQUENCE {
// version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
// privateKey OCTET STRING,
// parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
// publicKey [1] BIT STRING OPTIONAL (This is the ANSI X9.63 public key format.)
asn := TAsn.Create;
success := asn.LoadEncoded(privKey.GetPkcs1ENC('base64'),'base64');
if (success <> True) then
begin
WriteLn(asn.LastErrorText);
Exit;
end;
xml := TXml.Create;
xml.LoadXml(asn.AsnToXml());
WriteLn(xml.GetXml());
// The XML looks like this:
// <?xml version="1.0" encoding="utf-8" ?>
// <sequence>
// <int>01</int>
// <octets>JgJvBG+3wletkJab8iXAkpz0O8/AgWZSpkYVcB7SpnU=</octets>
// <contextSpecific tag="0" constructed="1">
// <oid>1.3.132.0.10</oid>
// </contextSpecific>
// </sequence>
// The 32-byte private key is in the octets..
// Get it as hex.
crypt := TCrypt2.Create;
privKeyHex := crypt.ReEncode(xml.GetChildContent('octets'),'base64','hex');
WriteLn('EC private key as hex = ' + privKeyHex);
ecc.Free;
fortuna.Free;
privKey.Free;
asn.Free;
xml.Free;
crypt.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.