David,
Thank you. Below is my test program. Could you tell me where is wrong?
(openssl-0.9.8g, under WidowsXP, VC6++)
void select_random_key(unsigned char *key, int b)
{
int i;
RAND_bytes(key, b);
for (i = 0; i < b - 1; i++)
printf("%02X:", key[i]);
printf("%02X\n", key[b - 1]);
}
void select_random_iv(unsigned char *iv, int b)
{
RAND_pseudo_bytes(iv, b);
}
unsigned char *EncryptTest(unsigned char *in, int inl, unsigned char *key,
unsigned char *iv, int *outl)
{
EVP_CIPHER_CTX ctx;
int ret;
EVP_CIPHER_CTX_init(&ctx);
ret = EVP_CIPHER_CTX_set_padding(&ctx, 0); //0 for no padding, 1 for padding
if(!ret) abort();
ret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), 0, key, iv);
if(!ret) abort();
cout<<"EVP_CIPHER_CTX_block_size: "<<EVP_CIPHER_CTX_block_size(&ctx)<<endl;;
cout<<"EVP_CIPHER_CTX_key_length: "<<EVP_CIPHER_CTX_key_length(&ctx)<<endl;
cout<<"EVP_CIPHER_CTX_iv_length: "<<EVP_CIPHER_CTX_iv_length(&ctx)<<endl;
unsigned char *out=0;
*outl=0;
out = (unsigned char *)malloc(inl + EVP_CIPHER_CTX_block_size(&ctx));
ret = EVP_EncryptUpdate(&ctx, out, outl, in, inl);
if(!ret) abort();
ret = EVP_EncryptFinal_ex(&ctx, out, outl);
if(!ret) abort();
return out;
}
unsigned char *DecryptTest(unsigned char *in, int inl, unsigned char *key,
unsigned char *iv, int * outl)
{
int ret;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
ret = EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), 0, key, iv);
if(!ret) abort();
cout<<"EVP_CIPHER_CTX_block_size: "<<EVP_CIPHER_CTX_block_size(&ctx)<<endl;;
cout<<"EVP_CIPHER_CTX_key_length: "<<EVP_CIPHER_CTX_key_length(&ctx)<<endl;
cout<<"EVP_CIPHER_CTX_iv_length: "<<EVP_CIPHER_CTX_iv_length(&ctx)<<endl;
unsigned char *out=0;
*outl=0;
out = (unsigned char *)malloc(inl + EVP_CIPHER_CTX_block_size(&ctx));
int len=0;
ret = EVP_DecryptUpdate(&ctx, out, outl, in, inl ); // inl=16
if(!ret) abort();
len += *outl;
ret = EVP_DecryptFinal_ex(&ctx, out, outl);
if(!ret) abort(); // !!! abort here, ret=0
len += *outl;
ret = EVP_CIPHER_CTX_cleanup(&ctx);
if(!ret) abort();
*outl = len;
return out;
}
main()
{
int i;
unsigned char key[32];
unsigned char iv[16];
select_random_key(key, 32);
select_random_iv(iv, 16);
unsigned char in[]={
0x9,0x28,0x97,0x17,
0x2,0x18,0x19,0x12,
0x6,0x48,0x39,0x19,
0x7,0x58,0x96,0x13};
unsigned char *out;
int outl;
out = EncryptTest(in, sizeof(in), key,iv, &outl);
unsigned char *out2;
int outl2;
out2 = DecryptTest(out, outl, key,iv, &outl2);
cout<<memcmp(out2,in,sizeof(in))<<endl;
free(out);
free(out2);
}
bian
___________________________________________________________
天生购物狂,狂抢购物券,你还等什么!
http://cn.mail.yahoo.com/promo/taobao20/index.php
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [EMAIL PROTECTED]