In the latest version of libressl
, RSA_generate_key
is deprecated, RSA_generate_key_ex
should be implemented instead.
Implementation (updated)
Source file (test.c
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <openssl/rsa.h> #include <openssl/pem.h> int main(){ const int kBits = 2048; unsigned long e = RSA_F4; int keylen; char *pem_key; // BIGNUM PART BIGNUM* bignum = BN_new(); if(BN_set_word(bignum, e)) printf("[Debug] BIGNUM allocated!\n"); else printf("[Debug] BIGNUM NOT allocated!\n"); // RSA PART RSA *rsa = RSA_new(); if(RSA_generate_key_ex(rsa, 2048, bignum, NULL)) printf("[Debug] RSA allocated!\n"); else printf("[Debug] RSA NOT allocated!\n"); // BIO PART BIO *bio = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPrivateKey(bio, rsa, NULL, NULL, 0, NULL, NULL); keylen = BIO_pending(bio); pem_key = calloc(keylen+1, 1); /* Null-terminate */ BIO_read(bio, pem_key, keylen); // OUTPUT printf("%s", pem_key); // FREE THE MEMORY BIO_free_all(bio); RSA_free(rsa); BN_free(bignum); free(pem_key); return 0; } |
To compile and run the program, the library libcrypto
should be imported
1 |
gcc test.c -lcrypto && ./a.out |
Expected output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[Debug] BIGNUM allocated! [Debug] RSA allocated! -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAw6QyusfybtOxUolVOgSqEEB2+Z673ivZohn2kWyw/W0jSxzR drQuK+OXcQYMxft09LtYkqtnhf8cA/UoFhOg2edhfI21j7R+4WHadJeq+cFEBceY x7+uiHh0ju/OX7vBoGg1BaiE6Hw/c6KI90HQpG4fEAIJ3qjAe4MAkBbbdmylN9mb iSwQi5NgY9ves3gVl7ZSlwpFfq72gUPoQzQPF5cquYZohHbv4d8c0Jee+npi1pmM eXZHUqLhkxR1DZpqDW2UI49y/DtDWzjeAnEGP22hEa7f53alFWpwAVvSs2iH7JqP uN6+KI+0iVErH4pDAiF1H0SwV0W7YTQNzo147QIDAQABAoIBAQCTlSPnnrmVPQBB APRXxfj8NYUKnOGfoXiVPfywi0uggVnkaaLhZt6FoTQ2wJeWKjB6BXG1grOfc2iQ 27kXnkry1gbGTKgv9brZDlYbKeaCbXaA3aa02DYzIJrc0K3freVMug91a0CHmGLN OkkULIPV5nRsQP1tB+PbyGD+UR/Q3qatpWvmPYjDJwjVTg9iB24c5AqNDJlGbcFZ OrtJC1ns2f/YpGZNooVyk/ULjCOgukYf3izmEVuxaDpZ86uGwAWiuwurZT0BjqAL jIRNl6J4sk49OKiJx7VqnVSsPaHjiyPcWrgIhN+Zoy/nPqPmwkBmfjFqO62aAx09 Ba2NvLvBAoGBAOU56A8NYjtXARzdoXABNqIqYvcm61wt/XV+Tf2E9xOzbic6/uuK gUHf18dqEH23FJFW9e1dkBWzWO9PdgCzGvmyec82WJRJMuFsgoHdAiKt3oca/OCN 2ZlgQqrWafNHfEIpVbqmyhizS2F5hnBcEw5NrN+APJYc7r91h20QJ1BFAoGBANp+ Eo6WcDlZJrZqolhTdZLt+Nr9/1/cEy0mkMYNMTD+tZEymEViDtm8wfqL20euWU2r 0WngNBs3pHEeaywa5B8y1p0n3koco5Cjkt6LDPAOg+6vymtK5/Uw7mY+P2EhJPTJ 5NuEKYDltnGu75z1/mcbDaHEXwZNw8LjHX0xd7SJAoGAYfO1s0Dv2hWatyAKDVen ZfKg6aYq6vAIH/4CC7SW9Ec3afIu3q4IAANMLL2pIF9snZLAclcJ7AwAk/qrnS7r 9wmKPb6maW9CG8wHlMDBWdpcffVNXBOhiYX11xTan4fLlGYfaSw+rgFn09ZfWYIu 7mzI05Tzzt28M/pgDX3antUCgYEApR0c/PAnAs+id7wBz2nSsiRwKV5FPLXdMAOy 6FhT0kjKAV4QwG4n9te0Z5iFL5hMGGw9pxsthVv5QxrPttbjicgrczwLukoGOWnD tbWzIz506U2jVI2Y2SwPHOjxkH8xpGNmNZWcn7H4u9SNczpa9KP3G0aA4QynYYGs aU2WvrECgYAWVONkYjYUc1EChoEK/VK9QGUTQUrb+IDAzQF/GmwONmOnWz1SW4iF OxkePdHnA/TPwLBp/78yUHwuJHnHawgOo9XR3aDz15h318kZtv2/BygHMVX8XZbS vlI7wPlyxRvmMhxgBxqmqQQCRVvyRXLEirg91fqPkECCnx9mT/cPHw== -----END RSA PRIVATE KEY----- |
Implementation (deprecated)
Source file (test.c
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <openssl/rsa.h> #include <openssl/pem.h> int main(){ const int kBits = 1024; const int kExp = 3; int keylen; char *pem_key; RSA *rsa = RSA_generate_key(kBits, kExp, 0, 0); /* To get the C-string PEM form: */ BIO *bio = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPrivateKey(bio, rsa, NULL, NULL, 0, NULL, NULL); keylen = BIO_pending(bio); pem_key = calloc(keylen+1, 1); /* Null-terminate */ BIO_read(bio, pem_key, keylen); printf("%s", pem_key); BIO_free_all(bio); RSA_free(rsa); free(pem_key); return 0; } |