rsautil.pas 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. unit rsautil;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, ctypes, libgmp, libnettle;
  6. // Read an RSA key in s-expression format
  7. Function ReadRSAKey(const aFileName : String; out aPublic : trsa_public_key; out aPrivate : trsa_private_key) : Boolean;
  8. Function ReadRSAKey(const aFileName : String; out aPublic : trsa_public_key) : Boolean;
  9. Function ReadRSAKey(const aFileName : String; out aPrivate : trsa_private_key) : Boolean;
  10. function HashFile(aHash : pnettle_hash; Ctx : Pointer; aFileName : string) : Boolean;
  11. function HashStream(aHash : pnettle_hash; Ctx : Pointer; F : TStream) : Boolean;
  12. Function ReadSignature(const aFileName : String; out s : tmpz_t) : Boolean;
  13. Function MpzToString(s : tmpz_t) : Ansistring;
  14. implementation
  15. Function MpzToString(s : tmpz_t) : Ansistring;
  16. Var
  17. P : pcchar;
  18. begin
  19. Result:='';
  20. SetLength(result,4096);
  21. P:=mpz_get_str(pcchar(Result),16,@s);
  22. Setlength(Result,StrLen(PAnsiChar(P)));
  23. end;
  24. function HashFile(aHash : pnettle_hash; Ctx : Pointer; aFileName : string) : Boolean;
  25. Var
  26. F : TFileStream;
  27. begin
  28. Writeln('Hashing file ',aFileName);
  29. F:=TFileStream.Create(aFileName,fmOpenRead);
  30. try
  31. Result:=HashStream(aHash,ctx,F);
  32. Finally
  33. F.Free;
  34. end;
  35. end;
  36. Function HashStream(aHash : pnettle_hash; Ctx : Pointer; F : TStream) : Boolean;
  37. Const
  38. BufSize = 2048;
  39. Type
  40. TBuffer = Array[0..BufSize-1] of Byte;
  41. Var
  42. Buf : TBuffer;
  43. N : Integer;
  44. begin
  45. Writeln('Hashing stream...');
  46. Buf:=Default(TBuffer);
  47. Repeat
  48. N:=F.Read(Buf,BufSize);
  49. aHash^.update(ctx, N, @buf);
  50. until (N<BufSize);
  51. Result:=True;
  52. end;
  53. Function ReadSignature(const aFileName : String; out s : tmpz_t) : Boolean;
  54. Var
  55. B : TBytes;
  56. F : TFileStream;
  57. begin
  58. Writeln('reading signature string from ',aFileName);
  59. mpz_init(@s);
  60. B:=[];
  61. F:=TFileStream.Create(aFileName,fmOpenRead);
  62. try
  63. SetLength(B,F.Size);
  64. F.ReadBuffer(B[0],Length(B));
  65. Result:=mpz_set_str(@s,Pcchar(B),16)=0;
  66. finally
  67. F.Free;
  68. end;
  69. end;
  70. Function ReadRSAKey(const aFileName : String; out aPublic : trsa_public_key; out aPrivate : trsa_private_key) : Boolean;
  71. Var
  72. B : TBytes;
  73. F : TFileStream;
  74. begin
  75. Writeln('reading RSA private/public key from ',aFileName);
  76. nettle_rsa_public_key_init(@aPublic);
  77. nettle_rsa_private_key_init(@aPrivate);
  78. B:=[];
  79. F:=TFileStream.Create(aFileName,fmOpenRead);
  80. try
  81. SetLength(B,F.Size);
  82. F.ReadBuffer(B[0],Length(B));
  83. Result:=nettle_rsa_keypair_from_sexp(@aPublic,@aPrivate,0,Length(B),PByte(B))<>0;
  84. finally
  85. F.Free;
  86. end;
  87. end;
  88. Function ReadRSAKey(const aFileName : String; out aPublic : trsa_public_key) : Boolean;
  89. Var
  90. B : TBytes;
  91. F : TFileStream;
  92. begin
  93. Writeln('reading RSA public key from ',aFileName);
  94. nettle_rsa_public_key_init(@aPublic);
  95. B:=[];
  96. F:=TFileStream.Create(aFileName,fmOpenRead);
  97. try
  98. SetLength(B,F.Size);
  99. F.ReadBuffer(B[0],Length(B));
  100. Result:=nettle_rsa_keypair_from_sexp(@aPublic,Nil,0,Length(B),PByte(B))<>0;
  101. finally
  102. F.Free;
  103. end;
  104. end;
  105. Function ReadRSAKey(const aFileName : String; out aPrivate : trsa_private_key) : Boolean;
  106. Var
  107. B : TBytes;
  108. F : TFileStream;
  109. begin
  110. Writeln('reading RSA private key from ',aFileName);
  111. nettle_rsa_private_key_init(@aPrivate);
  112. B:=[];
  113. F:=TFileStream.Create(aFileName,fmOpenRead);
  114. try
  115. SetLength(B,F.Size);
  116. F.ReadBuffer(B[0],Length(B));
  117. Result:=nettle_rsa_keypair_from_sexp(Nil,@aPrivate,0,Length(B),PByte(B))<>0;
  118. finally
  119. F.Free;
  120. end;
  121. end;
  122. end.