Hello,
> P.S. Here is my source code:
>
> #define EVP_ERR(_errVal) do { ret = _errVal; goto err; } while (0)
>
> int
> evpEncrypt(int keyIdx, BYTE *dstPtr, BYTE *srcPtr, int cryptLen, int
> *errCode)
> { // Call the OpenSSL encryption routine
> EVP_CIPHER_CTX ctx;
> static unsigned char iv[EVP_MAX_IV_LENGTH];
> int retLen, outLen, ret, evpErr;
>
> if (cryptLen <= 0)
> EVP_ERR(-1);
> if (!EVP_EncryptInit(&ctx, EVP_aes_256_ecb(),
> sysblk.keyData[keyIdx], iv))
> EVP_ERR(-2);
> retLen = cryptLen + AES_BLOCK_SIZE;
> if (!EVP_EncryptUpdate(&ctx, dstPtr, &retLen, srcPtr, cryptLen))
> EVP_ERR(-3);
> outLen = retLen;
> retLen = cryptLen + AES_BLOCK_SIZE*2;
> if (!EVP_EncryptFinal(&ctx, &dstPtr[outLen], &retLen))
> EVP_ERR(-4);
> return outLen + retLen;
>
> err:
> while ((evpErr = ERR_get_error()) != 0)
> *errCode = evpErr;
> return ret;
> }
>
> int
> evpDecrypt(int keyIdx, BYTE *dstPtr, BYTE *srcPtr, int cryptLen, int
> *errCode)
> { // Call the OpenSSL decryption routine
> EVP_CIPHER_CTX ctx;
> static unsigned char iv[EVP_MAX_IV_LENGTH];
> int retLen, outLen, ret, evpErr;
>
> if (cryptLen < AES_BLOCK_SIZE)
> EVP_ERR(-10);
> if (!EVP_DecryptInit(&ctx, EVP_aes_256_ecb(),
> sysblk.keyData[keyIdx], iv))
> EVP_ERR(-11);
> retLen = cryptLen + AES_BLOCK_SIZE;
> if (!EVP_DecryptUpdate(&ctx, dstPtr, &retLen, srcPtr, cryptLen))
> EVP_ERR(-12);
> outLen = retLen;
> retLen = cryptLen + AES_BLOCK_SIZE;
> if (!EVP_DecryptFinal(&ctx, &dstPtr[outLen], &retLen))
> EVP_ERR(-13);
> return outLen + retLen;
>
> err:
> while ((evpErr = ERR_get_error()) != 0)
> *errCode = evpErr;
> return ret;
> }
You should call EVP_CIPHER_CTX_cleanup() after EVP_DecryptFinal().
Best regards,
--
Marek Marcola <[EMAIL PROTECTED]>
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [EMAIL PROTECTED]