> -----Original Message-----
> From: Richard Levitte [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, March 12, 2008 7:21 PM
> To: [email protected]; Xu, Qiang (FXSGSC)
> Subject: Re: crypto library in openssl
>
> You're doing three mistakes:
>
> 1. you're assuming the EVP routines treat your data as character
> strings. That's incorrect, it treats them as binary blobs. Any of
> the bytes in that blob can be zero, and apparently, you're getting
> a result that starts with a zero byte.
> 2. you're not using the resulting length from the EVP routines. Doing
> so will give you correct answer, strlen() is not guaranteed to do
> that (it will only give you the correct answer if you have no zero
> byte anywhere in the result).
> 3. you're also not checking the returned result from the EVP routines.
Now i am adding code to check the resulting lenght from EVP routines:
=====================================================
#define ESS_CRYPTO_CRYPT_BUFFER_SIZE (56)
......
bool_t esscrypto_decryptString(unsigned char *toDecrypt,
unsigned char *passPhrase,
int sizeOfStrToDecrypt,
int maxDecryptedStringSize,
int *sizeOfDecryptedString,
unsigned char **decryptedString)
{
EVP_CIPHER_CTX openSSLDecryptionStructure;
int tempOutputLength = 0;
int i = 0;
int tmpOutputBufferPosition = 0;
int tmpOffset = 0;
char *tempPassPhrase = NULL;
int currentDecryptedStrLength = 0;
char *tempPtr = NULL;
......
for (i = 0; i < sizeOfStrToDecrypt/ ESS_CRYPTO_CRYPT_BUFFER_SIZE; i++)
{
/* decrypt the contents of the buffer */
EVP_DecryptUpdate(&openSSLDecryptionStructure,
&((*decryptedString)[tmpOutputBufferPosition]),
&tmpOffset,
&toDecrypt[tmpOutputBufferPosition],
ESS_CRYPTO_CRYPT_BUFFER_SIZE);
/* Increment the position we are at in decrypting the string */
tmpOutputBufferPosition = tmpOutputBufferPosition + tmpOffset;
LOGFORCE("EVP_DecryptUpdate1: tmpOffset is %d", tmpOffset); //xq
}
......
/*
* if there is data left to decrypt that did not fit exactly within
* the buffer, decrypt that remaining bit.
******/
if ( sizeOfStrToDecrypt % ESS_CRYPTO_CRYPT_BUFFER_SIZE)
{
/* decrypt the contents of the buffer */
EVP_DecryptUpdate(&openSSLDecryptionStructure,
&((*decryptedString)[tmpOutputBufferPosition]),
&tmpOffset,
&toDecrypt[tmpOutputBufferPosition],
sizeOfStrToDecrypt % ESS_CRYPTO_CRYPT_BUFFER_SIZE);
/* Increment the position we are at in decrypting the string */
tmpOutputBufferPosition = tmpOutputBufferPosition + tmpOffset;
LOGFORCE("EVP_DecryptUpdate2: tmpOffset is %d", tmpOffset); //xq
}
......
/* finalize the results from decryption (check CRC) */
EVP_DecryptFinal(&openSSLDecryptionStructure,
&((*decryptedString)[tmpOutputBufferPosition]),
&tmpOffset);
LOGFORCE("EVP_DecryptFinal: tmpOffset is %d", tmpOffset); //xq
/* set the final length of the decrypted string */
*sizeOfDecryptedString = tmpOutputBufferPosition + tmpOffset;
LOGFORCE("*sizeOfDecryptedString is %d", *sizeOfDecryptedString);
for (i = 0; i < *sizeOfDecryptedString; i++)
{
LOGFORCE("char in final result is %c", (*decryptedString)[i]);
}
......
=====================================================
The lenght of the password "$elkins02" is only 9 characters, far less than
ESS_CRYPTO_CRYPT_BUFFER_SIZE (56), so only the later two LOGFORCE are recorded.
But still, the error seems to come from EVP APIs.
For user with password "#elkins02", the log is:
=====================================================
<smbipc> (Thu Mar 13 2008 02:50:39.354) <p17565,t16384,essCrypto.c,563>
INFO>> Decrypting string (in hex) [AAC893A997A6E21FD2A2D2D4F205133B]
<smbipc> (Thu Mar 13 2008 02:50:39.364) <p17565,t16384,essCrypto.c,682>
INFO>> EVP_DecryptUpdate2: tmpOffset is 8
<smbipc> (Thu Mar 13 2008 02:50:39.364) <p17565,t16384,essCrypto.c,690>
INFO>> EVP_DecryptFinal: tmpOffset is 1
<smbipc> (Thu Mar 13 2008 02:50:39.364) <p17565,t16384,essCrypto.c,695>
INFO>> *sizeOfDecryptedString is 9
=====================================================
This is correct.
For user with password "$elkins02", the log is:
=====================================================
<smbipc> (Thu Mar 13 2008 02:51:22.509) <p17565,t16384,essCrypto.c,563>
INFO>> Decrypting string (in hex) [7208148B96ABDC]
<smbipc> (Thu Mar 13 2008 02:51:22.509) <p17565,t16384,essCrypto.c,682>
INFO>> EVP_DecryptUpdate2: tmpOffset is 0
<smbipc> (Thu Mar 13 2008 02:51:22.517) <p17565,t16384,essCrypto.c,690>
INFO>> EVP_DecryptFinal: tmpOffset is 0
<smbipc> (Thu Mar 13 2008 02:51:22.517) <p17565,t16384,essCrypto.c,695>
INFO>> *sizeOfDecryptedString is 0
=====================================================
The prototype of EVP_DecryptUpdate() is "int EVP_DecryptUpdate(EVP_CIPHER_CTX
*ctx, unsigned char *out, int *outl, unsigned char *in, int inl)", so this
tmpOffset is 0 means something wrong with the output length.
Is this the evidence of a defect of crypto library?
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [EMAIL PROTECTED]