简体   繁体   中英

How to extract RSA public key to variable?

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);

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-----

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM