Reputation: 191
I know how to print PEM public key or how to save it in file. I don't find any function which save it in variable. Of course I can save it in file and then read it from it, but I would like to avoid it if it is possible.
How I print public key:
RSA* rsa = RSA_new();
BIGNUM* bne = BN_new();
EVP_PKEY* pkey;
BIO* pem1;
pem1 = BIO_new_fp(stdout, BIO_NOCLOSE);
rc = BN_set_word(bne,RSA_F4);
if(rc != 1) {
goto _setWord_failed;
}
rc = RSA_generate_key_ex(rsa, 2048, bne, NULL);
if(rc != 1) {
goto _setWord_failed;
}
pkey = EVP_PKEY_new();
rc = EVP_PKEY_set1_RSA(pkey,rsa);
if(rc != 1) {
goto _setRSA_failed;
}
PEM_write_bio_PUBKEY(pem1,pkey);
BIO_free(pem1);
EVP_PKEY_free(pkey);
RSA_free(rsa);
BN_free(bne);
Upvotes: 0
Views: 2374
Reputation: 191
Ok I did it in ugly way, but I didn't find any other way.
int rc;
RSA* rsa = RSA_new();
BIGNUM* bne = BN_new();
EVP_PKEY* pkey;
BIO* pem1;
pem1 = BIO_new_fp(stdout, BIO_NOCLOSE);
char * string = (char*)malloc(600*sizeof(char)); //bigger than I need
setbuf(stdout, string);
ui32 size = 0;
rc = BN_set_word(bne,RSA_F4);
if(rc != 1) {
//error message
}
rc = RSA_generate_key_ex(rsa, 2048, bne, NULL);
if(rc != 1) {
//error message
}
pkey = EVP_PKEY_new();
rc = EVP_PKEY_set1_RSA(pkey,rsa);
if(rc != 1) {
//error message
}
rc = PEM_write_bio_PUBKEY(pem1,pkey);
size = strlen(string);
setbuf(stdout, NULL);
IO_free(pem1);
EVP_PKEY_free(pkey);
RSA_free(rsa);
BN_free(bne);
and now in variable string I have exactly what I need:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwww7XUUFXW8/+/MZVDB3
W+emyOSW7HNlEOVk3Gg5/k5kKj2gDjPvbiUPSGtPQR9XA1vIcW13HZGkkdo2NFtV
8+sUp9eV+37LNdBg1t5M0RsD8T+o+7pyJ2IM1QjALFMK7UmdprLnQUAmnNwn4CnO
IXwKmde/Gwq9bn3icZYppS8iMc6hgXx73y5A34+eUgU80xnXZGmBF5SAEAPRSRzl
XzqRFBGkNkM0rAhS3IqedtXmKJizGyHYba7DrSK2LL6xCXHvgxpuiIPqWL648ktC
EWRcS4vBXd1XpAGX0clvZ5tKwbldD2mOQIXVmcN6D4/qdDH1kjBS1m0+0Z9NB2wg
iwIDAQAB
-----END PUBLIC KEY-----
Upvotes: 1