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                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to