Hello, I have been trying to decrypt the "client pre master secret" sent in a SSL handshake using the server's private key with OpenSSL's Crypto library. But RSA_private_decrypt() always returns -1!
I have set up a test apache2 server with modssl and have generated the server's private key and certificate. I sniffed the packets off the network from a single SSL session using a single TCP connection between a client and my test server, and now I am trying to decrypt the "client pre-master secret". In the code below I have opened the server's private key file, and read it into a RSA object using PEM_read_RSAPrivateKey(). The RSA_check_key() function does not return any errors. I pass this key with my encrypted data, its length, a buffer to hold the decrypted data, and the padding setting to RSA_private_decrypt() but this always returns -1. I have checked to make sure my encrypted and decrypted buffers are correct, and the length is correct. Apparently the RSA key struct is correct since no errors came from RSA_check_key(), and I am using the only private key for the server, so I can't be using the wrong key. I'm pretty sure the padding is RSA_PKCS1_PADDING, is this correct for apache2 w/ modssl using rsa handshakes for ssl? I have also tried the RSA_PKCS1_OAEP_PADDING and the RSA_SSLv3_PADDING, and RSA_NO_PADDING without succes. The cipher suite used was TLS_RSA_WITH_RC4_128_MD5. The length of the encrypted-client-pre-master-secret is 258 bytes, when decrypted it should be 48 bytes. Can anyone see a step I'm missing, anyone know what's going on here? Thanks! Will . . . //Steps //1. Using serverPrivateKey, decrypt the client_pre_master_secret //1.1 Open server's private key file if((fp = fopen("server.key", "rb")) == NULL) { printf("Cannot open server key file.\n"); return; } //1.2 Generate RSA struct from private key file PEM_read_RSAPrivateKey(fp, &pRsa, NULL, NULL); //1.3 Check for succesfull key generation if(RSA_check_key(pRsa) != 1) { printf("RSA_check_key(): PrivateKey check failed\n"); return; } //1.4 Using Private RSA Key, decode the client_pre_master_secret check = RSA_private_decrypt(clientPreMasterLength, toDecrypt, decryptedPreMasterSecret, pRsa, RSA_PKCS1_PADDING); if(check == -1) { printf("RSA_private_decrypt() failed"); exit(1); } . . . ______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]