RE: CardRSADecrypt succeeds but CryptDecrypt fails with NTE_BAD_DA
- From: glosoria <glosoria@xxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Sat, 7 Jun 2008 03:06:03 -0700
Thanks for your reply Mounir,
but I followed your tips and it's still not working.
I'm going to get a little more specific with the parameters I get as input
and the results I am obtaining to see if you can help me out.
This is the original data that I have to cypher and decypher:
"OpenSSL - Frequently Asked Questions Which is the current version of
OpenSSL? Where is the documentation? How can I contact the OpenSSL
developers? Do I " ...and it goes on, but I wont post the whole buffer.
When the CardRSADecrypt function of my card module gets called these are the
input parameters I receive in the CARD_RSA_DECRYPT_INFO structure:
pInfo->dwVersion: 1,
pInfo->bContainerIndex: 00,
pInfo->dwKeyspec: 1,
pInfo->cbData: 128,
pInfo->pbData: af 36 42 fc 64 01 32 fb c4 da 25 e7 95 04 77 de 92 b3 44 89
29 2f 6e 78 32 63 a8 62 d9 7c 5d 34 f3 45 7b 1f 23 48 2d 09 e0 76 10 d4 d9 58
14 94 ff 42 de 62 26 0c 99 44 53 4f 11 0f d4 c5 0a d4 f5 b1 ae ea e8 e9 bf c9
1d 2c 20 54 84 18 69 c6 20 04 eb b7 f3 89 87 7a eb a3 63 cb cf 4f 79 d5 2b cf
3f 0e 65 f8 77 d7 61 23 5e e9 fc 4d fa 18 e4 b4 21 1b a2 38 a0 a0 3b 0c 99 94
75 e4 f8 7c
Inside the function I decrypt the data with the openssl RSA_private_decrypt
function, using the private key that my smartcard holds (because my card is
not a cryptographic one). After I process the input cypher, the prior
structure looks like this:
dwVersion: 1 ,
pInfo->bContainerIndex: 00 ,
pInfo->dwKeySpec: 1 ,
pInfo->cbData: 128 ,
pInfo->pbData: 4f 70 65 6e 53 53 4c 20 20 2d 20 20 46 72 65 71 75 65 6e 74
6c 79 20 41 73 6b 65 64 20 51 75 65 73 74 69 6f 6e 73 20 57 68 69 63 68 20 69
73 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4f
70 65 6e 53 53 4c 3f 20 57 68 65 72 65 20 69 73 20 74 68 65 20 64 6f 63 75 6d
65 6e 74 61 74 69 6f 6e 3f 20 48 6f 77 20 63 61 6e 20 49 38 a0 a0 3b 0c 99 94
75 e4 f8 7c
If I edit the deciphered data (in pInfo->pbData) using an hexadecimal editor
I get the following:
"OpenSSL - Frequently Asked Questions Which is the current version of
OpenSSL? Where is the documentation? How can I"
....and 11 weird characters which I suppose are the padding bytes: 38 a0 a0
3b 0c 99 94 75 e4 f8 7c
That is exactly what my function returns, and I am still getting the ugly
NTE_BAD_DATA error in the CAPI CryptDecrypt function.
Do yo see anything wrong here? I just don't understand what I'm doing wrong.
"Mounir IDRASSI" wrote:
Hi,.
In the implementation of CardRSADecrypt , you should only perform a bare
bone RSA private key exponentiation (classically C^D mod N) without trying to
remove any padding from output data. All the padding verification and
removal is done by the MS Base Smart Card CSP.
Cheers,
--
Mounir IDRASSI
IDRIX
http://www.idrix.fr
to reach : mounir_idrix_fr (replace the underscores with the at and dot
characters respectively)
"glosoria" wrote:
Hello everyone,
I'm new to writing a card module and I have some doubts about the
implementation of the CardRSADecrypt function. I don't know if either the
documentation is not complete or if I'm making a mistake.
I came to the point of implementing the CardRSADecrypt function in my card
module, and when I test it, by calling it through the CAPI function
CryptDecrypt, it fails with a NTE_BAD_DATA error (that is CryptDecrypt fails).
CardRSADecrypt finishes well and returns SCARD_S_SUCCESS. But it seems like
CryptDecrypt (or maybe the BaseCSP in between) doesn't like the data that it
is returning.
I print the data that is being returned by CardRSADecrypt and it is fine.
The data is decrypted (in fact the data is the same as originally I ciphered
by using the certificate that is inside the smart card). Maybe I am not
inicialiting the return parameters right:
- Should the returned decrypted data include padding?
- what should pInfo->cbData return? the documentation of the CryptDecrypt
funcion in the MSDN says: "This value must always be the same as the key
modulus". According to that, If I'm using a 1024 bits key, I should return
128bytes, right?
If so, how should I fill that returned data? Because in my test, the length
of the descripted data is 117 bytes. Then, How should I filled the bytes
between 117 and 128, is there any special format? Should I fill them with
'\0' and an pattern saying the length of the zeros? Or should I return the
data in an special TLV format or blob that indicates the lenght of the data
and the padding?
Thanks in advance for your answers,
Best regards,
Gloria.
- Follow-Ups:
- RE: CardRSADecrypt succeeds but CryptDecrypt fails with NTE_BAD_DA
- From: Mounir IDRASSI
- RE: CardRSADecrypt succeeds but CryptDecrypt fails with NTE_BAD_DA
- References:
- CardRSADecrypt succeeds but CryptDecrypt fails with NTE_BAD_DATA
- From: glosoria
- RE: CardRSADecrypt succeeds but CryptDecrypt fails with NTE_BAD_DATA
- From: Mounir IDRASSI
- CardRSADecrypt succeeds but CryptDecrypt fails with NTE_BAD_DATA
- Prev by Date: Re: CryptVerifySignature fail with message NTE_BAD_SIGNATURE
- Next by Date: Re: CryptVerifySignature fail with message NTE_BAD_SIGNATURE
- Previous by thread: RE: CardRSADecrypt succeeds but CryptDecrypt fails with NTE_BAD_DATA
- Next by thread: RE: CardRSADecrypt succeeds but CryptDecrypt fails with NTE_BAD_DA
- Index(es):
Relevant Pages
|