12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- {
- Simple Low-level example showing how to generate a
- RSA private key (4096 bytes) using the GnuTLS binding.
- Author: Silvio Clecio (silvioprog)
- Date: Mon Jan 7 01:36:18 -03 2019
- GnuTLS version: 3.4+
- }
- program privkey;
- {$MODE OBJFPC}{$H+}
- {$ASSERTIONS ON}
- uses
- sysutils,
- ctypes,
- gnutls;
- type
- { cchar = Byte;
- Pcchar = PAnsiChar;
- Pcsize_t = PNativeUInt;
- Pcvoid = Pointer;}
- EGnuTLS = Exception;
- procedure CheckRet(ret: cint);
- var
- P: Pchar;
- S: string;
- begin
- if ret = GNUTLS_E_SUCCESS then
- Exit;
- P := gnutls_strerror(ret);
- S:=StrPas(P);// SetString(S, @P[0], Length(Pcchar(@P[0])));
- SetCodePage(RawByteString(S), CP_UTF8, False);
- raise EGnuTLS.Create(S);
- end;
- var
- priv_key: String;
- priv_key_size: cuint = SizeOf(priv_key);
- key: Tgnutls_x509_privkey_t;
-
- begin
- LoadGnuTLS;
- try
- Assert(GnuTLSLoaded);
- try
- CheckRet(gnutls_x509_privkey_init(@key));
- priv_key_size := gnutls_sec_param_to_pk_bits(GNUTLS_PK_RSA, GNUTLS_SEC_PARAM_HIGH);
- setLength(Priv_key,priv_key_size*2);
- CheckRet(gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, priv_key_size, 0));
- CheckRet(gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM, @priv_key[1], @priv_key_size));
- setLength(Priv_key,priv_key_size);
- WriteLn(priv_key);
- except
- gnutls_x509_privkey_deinit(key);
- raise;
- end;
- finally
- FreeGnuTLS;
- end;
- end.
|