#include #include #include using std::unique_ptr; #include #include #include using BN_ptr = std::unique_ptr; using RSA_ptr = std::unique_ptr; uint32_t generate_rsa_key(std::string& priv_key_str, std::string& pub_key_str) { int rc; RSA_ptr rsa(RSA_new(), ::RSA_free); BN_ptr bn(BN_new(), ::BN_free); rc = BN_set_word(bn.get(), 3); if(rc != 1) return 0x1; rc = RSA_generate_key_ex(rsa.get(), 3072, bn.get(), NULL); if(rc != 1) return 0x2; printf("Generated key\n"); fflush(stdout); /* int pub_key_der_encoded_len, priv_key_der_encoded_len; unsigned char *pub_key_der, priv_key_der; pub_key_der = NULL; pub_key_der_encoded_len = i2d_RSAPublicKey(rsa.get(), (unsigned char**) &pub_key_der); if (pub_key_der_encoded_len < 0) return 0x3; priv_key_der = NULL; priv_key_der_encoded_len = i2d_RSAPrivateKey(rsa.get(), (unsigned char**) &priv_key_der); if (priv_key_der_encoded_len < 0) return 0x4; printf("Done\n"); fflush(stdout); // priv_key_str=std::string(priv_key_der, priv_key_der_encoded_len); //, priv_key_der); // pub_key_str=std::string(pub_key_der, pub_key_der_encoded_len); */ const BIGNUM* n_internal_bigendian_struct; RSA_get0_key(rsa.get(), &n_internal_bigendian_struct, NULL, NULL); BIGNUM* n_bigendian_struct = BN_dup(n_internal_bigendian_struct); uint32_t count; int n_bignum_length=BN_num_bytes(n_bigendian_struct); unsigned char *n_bigendian = (unsigned char*) malloc(n_bignum_length); int length_bignum_le = BN_bn2bin(n_bigendian_struct, n_bigendian); unsigned char* n_littleendian = (unsigned char*) malloc(length_bignum_le); for(count=0; count