ecdsa.pp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. unit ecdsa;
  2. {$mode ObjFPC}{$H+}
  3. {$modeswitch advancedrecords}
  4. interface
  5. uses
  6. sysutils, ecc, sha256;
  7. Type
  8. { TECDSA }
  9. TECDSA = record
  10. Class Function SignSHA256(aPayLoad : String; aPrivateKey : TECCPrivateKey; out aSignature : TEccSignature) : Boolean; static; overload;
  11. Class Function SignSHA256(aPayLoad : TBytes; aPrivateKey : TECCPrivateKey; out aSignature : TEccSignature) : Boolean; static; overload;
  12. Class Function VerifySHA256(aPayLoad : String; aPrivateKey : TECCPrivateKey; const aSignature : TEccSignature) : Boolean; static; overload;
  13. Class Function VerifySHA256(aPayLoad : TBytes; aPrivateKey : TECCPrivateKey; const aSignature : TEccSignature) : Boolean; static; overload;
  14. Class Function VerifySHA256(aPayLoad : String; aPublicKey : TECCPublicKey; const aSignature : TEccSignature) : Boolean; static; overload;
  15. Class Function VerifySHA256(aPayLoad : TBytes; aPublicKey : TECCPublicKey; const aSignature : TEccSignature) : Boolean; static;overload;
  16. end;
  17. implementation
  18. { TECDSA }
  19. class Function TECDSA.SignSHA256(aPayLoad: String; aPrivateKey: TECCPrivateKey; out aSignature: TEccSignature) : boolean;
  20. begin
  21. Result:=SignSha256(TEncoding.UTF8.GetAnsiBytes(aPayload),aPrivateKey,aSignature);
  22. end;
  23. class Function TECDSA.SignSHA256(aPayLoad: TBytes; aPrivateKey: TECCPrivateKey; out aSignature: TEccSignature) : Boolean;
  24. var
  25. lSHA256: TSHA256;
  26. eccHash : TECCHash;
  27. Pubkey : TECCpublicKey;
  28. begin
  29. aSignature:=Default(TEccSignature);
  30. lSHA256.Init;
  31. lSHA256.Update(aPayload);
  32. lSHA256.Final;
  33. Move(lSHA256.Digest[0], eccHash, SizeOf(eccHash));
  34. Result:=EcdsaSign(aPrivateKey,eccHash,aSignature);
  35. if Result then
  36. begin
  37. EccPublicKeyFromPrivateKey(PubKey,aPrivateKey);
  38. Result:=EcdsaVerify(Pubkey,eccHash,aSignature);
  39. end;
  40. end;
  41. Class Function TECDSA.VerifySHA256(aPayLoad : String; aPrivateKey : TECCPrivateKey; const aSignature : TEccSignature) : Boolean; static;
  42. var
  43. Pubkey : TECCpublicKey;
  44. begin
  45. EccPublicKeyFromPrivateKey(PubKey,aPrivateKey);
  46. Result:=VerifySHA256(aPayLoad,PubKey,aSignature);
  47. end;
  48. Class Function TECDSA.VerifySHA256(aPayLoad : TBytes; aPrivateKey : TECCPrivateKey; const aSignature : TEccSignature) : Boolean; static;
  49. var
  50. Pubkey : TECCpublicKey;
  51. begin
  52. EccPublicKeyFromPrivateKey(PubKey,aPrivateKey);
  53. Result:=VerifySHA256(aPayLoad,PubKey,aSignature);
  54. end;
  55. Class Function TECDSA.VerifySHA256(aPayLoad : String; aPublicKey : TECCPublicKey; const aSignature : TEccSignature) : Boolean; static;
  56. begin
  57. Result:=VerifySHA256(TEncoding.UTF8.GetAnsiBytes(aPayload),aPublicKey,aSignature);
  58. end;
  59. Class Function TECDSA.VerifySHA256(aPayLoad : TBytes; aPublicKey : TECCPublicKey; const aSignature : TEccSignature) : Boolean; static;
  60. var
  61. lSHA256: TSHA256;
  62. eccHash : TECCHash;
  63. begin
  64. lSHA256.Init;
  65. lSHA256.Update(aPayload);
  66. lSHA256.Final;
  67. Move(lSHA256.Digest[0], eccHash, SizeOf(eccHash));
  68. Result:=EcdsaVerify(aPublickey,eccHash,aSignature);
  69. end;
  70. end.