So here's what I'm trying to do in a unit test, wiring in the method
replacement seems to work (i.e. my priv decrypt callback is called at the right
place) but the encrypt --> decrypt doesn't work in a unit test so it certainly
won't work there or anywhere else.
So I load the certificate and get key handles using capi, brief snippets:
result = CryptAcquireCertificatePrivateKey(
m_pccert_context,
CRYPT_ACQUIRE_COMPARE_KEY_FLAG,
NULL,
&m_crypto_provider,
&key_spec,
NULL);
...
// Get Private Key
result = CryptGetUserKey(
m_crypto_provider,
AT_KEYEXCHANGE,
&m_cert_key_pair);
...
// Get the public key information for the certificate.
result = CryptImportPublicKeyInfo(
m_crypto_provider,
X509_ASN_ENCODING,
&m_pccert_context->pCertInfo->SubjectPublicKeyInfo,
&m_cert_public_key);
That all works since I can then (pub) encrypt and (priv) decrypt a sample
message in capi, I do some other sanity tests and get to my interop test, I
load the x509 certificate from the m_pccert_context, i.e.
BIO * input = BIO_new_mem_buf_fn (
(void*) m_pccert_context->pbCertEncoded,
(UINT32) m_pccert_context->cbCertEncoded);
m_x509_cert = d2i_X509_bio_fn(input, NULL);
and then pull the public key to encrypt:
EVP_PKEY * my_pkey = X509_get_pubkey_fn(m_x509_cert);
my_rsa_key->n = BN_dup_fn(my_pkey->pkey.rsa->n);
my_rsa_key->e = BN_dup_fn(my_pkey->pkey.rsa->e);
When I extract and print the modulus (i.e. the n) from both my_rsa_key and the
m_cert_public_key (exported as a PUBLICKEYBLOB), they're the same (but
reversed), so I proceed to encrypt my test message with openssl:
enc_mess_len = RSA_public_encrypt(
strlen(test_mess),
(unsigned char *) test_mess,
(unsigned char *) enc_mess,
my_rsa_key,
RSA_PKCS1_OAEP_PADDING);
And decrypt with capi:
if(!CryptDecrypt(
m_cert_key_pair, //__in HCRYPTKEY hKey,
NULL, //__in HCRYPTHASH hHash,
TRUE, //__in BOOL Final,
CRYPT_OAEP, //__in DWORD dwFlags,
(BYTE*) enc_mess, //__inout BYTE *pbData,
&decrypted_len //__inout DWORD *pdwDataLen,
))
{
// Figure out what went wrong.
DWORD last_error = GetLastError();
return -1;
}
And it always fails with NTE_BAD_DATA. (I've eliminated some function wrappers
but this is basically it.) I've tried different padding schemes, e.g.
CRYPT_OAEP <---> RSA_PKCS1_OAEP_PADDING
?? the default <-----> RSA_PKCS1_PADDING
I've tried CRYPT_DECRYPT_RSA_NO_PADDING_CHECK (and get an NTE_BAD_FLAGS error)
thanks ms, I've tried reversing the encrypted buffer, all to no avail.
Am I missing something here? Thanks in advance .... N
---
Nou Dadoun
[email protected]
604-628-1215
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [email protected]