privkey.pp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. {
  2. Simple low-level example for how generate a RSA private key (4096 bytes) using
  3. the GnuTLS binding.
  4. Author(s): Silvio Clecio (silvioprog), Michael Van Canneyt
  5. Date: Mon Jan 7 01:36:18 -03 2019
  6. GnuTLS version: 3.4+
  7. }
  8. program privkey;
  9. {$MODE OBJFPC}{$H+}
  10. {$ASSERTIONS ON}
  11. uses
  12. sysutils,
  13. ctypes,
  14. gnutls;
  15. type
  16. EGnuTLS = Exception;
  17. procedure TLSCheckRet(Aret: cint); inline;
  18. begin
  19. if Aret <> GNUTLS_E_SUCCESS then
  20. raise EGnuTLS.Create(gnutls_strerror(Aret));
  21. end;
  22. var
  23. priv_key: AnsiString = '';
  24. priv_key_size: cuint;
  25. key: Tgnutls_x509_privkey_t;
  26. begin
  27. LoadGnuTLS;
  28. Assert(GnuTLSLoaded);
  29. key:=nil;
  30. try
  31. TLSCheckRet(gnutls_x509_privkey_init(@key));
  32. priv_key_size := gnutls_sec_param_to_pk_bits(GNUTLS_PK_RSA,GNUTLS_SEC_PARAM_HIGH);
  33. SetLength(priv_key, Pred(priv_key_size));
  34. TLSCheckRet(gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, priv_key_size, 0));
  35. TLSCheckRet(gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM, @priv_key[1], @priv_key_size));
  36. SetLength(priv_key, Pred(priv_key_size));
  37. WriteLn(priv_key);
  38. finally
  39. if key<>Nil then
  40. gnutls_x509_privkey_deinit(key);
  41. FreeGnuTLS;
  42. end;
  43. end.