<div dir="ltr"><div>I'm porting some old legacy code from OpenSSL 1.0.2 to OpenSSL 3.0.0. A portion of this code reads X509 certificates, extracts the public key, and passes it to firmware that I cannot modify. Unfortunately, this legacy firmware API was very poorly designed such that the public key is passed in a way similar to:</div><div><br></div><div><span style="font-family:monospace">    RSA *rsa = get_pubkey_from_cert(...)</span></div><div><span style="font-family:monospace">    BIGNUM *bn = rsa->n;</span></div><div><span style="font-family:monospace">    int len = BN_num_bytes(bn);</span></div><div><span style="font-family:monospace">    unsigned char *buf = malloc(len);<br></span></div><div><span style="font-family:monospace">    BN_bn2bin(bn, buf);</span></div><div><span style="font-family:monospace">    pubkey_to_firmware(buf, len);</span></div><div><br></div><div>Yuck. Ignoring the fact that this firmware appears to assume a constant exponent 'e', I cannot find a way to extract the modulus 'n' from the RSA key. I understand this is intentional. The only solution I could find is to print the key to a buffer via EVP_PKEY_print_public(), parse the result to extract the modulus into a giant hex string, and then BN_hex2bn() that back into a BIGNUM. Is there a better way?</div><div><br></div><div><br></div><div>Thanks,</div><div>Tom.III</div><div><br></div></div>