privkey.pp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. {
  2. Simple Low-level example showing how to generate a
  3. RSA private key (4096 bytes) using the GnuTLS binding.
  4. Author: Silvio Clecio (silvioprog)
  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. { cchar = Byte;
  17. Pcchar = PAnsiChar;
  18. Pcsize_t = PNativeUInt;
  19. Pcvoid = Pointer;}
  20. EGnuTLS = Exception;
  21. procedure CheckRet(ret: cint);
  22. var
  23. P: Pchar;
  24. S: string;
  25. begin
  26. if ret = GNUTLS_E_SUCCESS then
  27. Exit;
  28. P := gnutls_strerror(ret);
  29. S:=StrPas(P);// SetString(S, @P[0], Length(Pcchar(@P[0])));
  30. SetCodePage(RawByteString(S), CP_UTF8, False);
  31. raise EGnuTLS.Create(S);
  32. end;
  33. var
  34. priv_key: String;
  35. priv_key_size: cuint = SizeOf(priv_key);
  36. key: Tgnutls_x509_privkey_t;
  37. begin
  38. LoadGnuTLS;
  39. try
  40. Assert(GnuTLSLoaded);
  41. try
  42. CheckRet(gnutls_x509_privkey_init(@key));
  43. priv_key_size := gnutls_sec_param_to_pk_bits(GNUTLS_PK_RSA, GNUTLS_SEC_PARAM_HIGH);
  44. setLength(Priv_key,priv_key_size*2);
  45. CheckRet(gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, priv_key_size, 0));
  46. CheckRet(gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM, @priv_key[1], @priv_key_size));
  47. setLength(Priv_key,priv_key_size);
  48. WriteLn(priv_key);
  49. except
  50. gnutls_x509_privkey_deinit(key);
  51. raise;
  52. end;
  53. finally
  54. FreeGnuTLS;
  55. end;
  56. end.