rsasign.pp 977 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. program rsasign;
  2. uses classes, libnettle, rsautil, libgmp, ctypes;
  3. Procedure Stop(Msg : string);
  4. begin
  5. Writeln(Msg);
  6. Halt(1);
  7. end;
  8. Var
  9. key : Trsa_private_key;
  10. hash : tsha1_ctx;
  11. F : TFileStream;
  12. s : Tmpz_t;
  13. res : ansistring;
  14. begin
  15. LoadLibGMP;
  16. InitializeNettle();
  17. if ParamCount<2 then
  18. Stop('Usage : rsasign keyfile file [signaturefile]');
  19. if not ReadRSAKey(ParamStr(1),key) then
  20. Stop('Failed to read key from '+ParamStr(1));
  21. nettle_sha1_init(@hash);
  22. HashFile(nettle_sha1,@hash,ParamStr(2));
  23. mpz_init(@s);
  24. if (nettle_rsa_sha1_sign(@key, @hash, @s)=0) then
  25. Stop('RSA key too small');
  26. Res:=mpzToString(s);
  27. Writeln('Signature : ',Res);
  28. if ParamStr(3)<>'' then
  29. begin
  30. F:=TFileStream.Create(ParamStr(3),fmCreate);
  31. try
  32. F.WriteBuffer(Res[1],Length(Res));
  33. Writeln('Signature written to file: ',F.FileName);
  34. finally
  35. F.Free;
  36. end;
  37. end;
  38. mpz_clear(s);
  39. nettle_rsa_private_key_clear(@key);
  40. end.