X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=crypto%2Fevp%2Fe_aes.c;h=bd6c0a3a62a323a970a6d2d0bbc0ba9b869c595f;hb=2802ec65c20b86332a55a2dd114b8d9bf60411ae;hp=87983c6035bb2ca7c2f9eb557eb2343ee08b4cb5;hpb=deb2c1a1c58fb738b3216b663212572170de8183;p=openssl.git diff --git a/crypto/evp/e_aes.c b/crypto/evp/e_aes.c index 87983c6035..bd6c0a3a62 100644 --- a/crypto/evp/e_aes.c +++ b/crypto/evp/e_aes.c @@ -48,106 +48,73 @@ * */ +#include +#ifndef OPENSSL_NO_AES #include #include #include #include +#include +#include "evp_locl.h" -static int aes_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, +static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc); -static int aes_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out, - const unsigned char *in, unsigned int inl); -static int aes_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out, - const unsigned char *in, unsigned int inl); -#define IMPLEMENT_AES_CIPHER(name, ciph_func, keylen, ivlen, mode) \ -static EVP_CIPHER name##_cipher_st = \ - { \ - NID_##name, \ - 16,keylen,ivlen, \ - mode, \ - aes_init, \ - ciph_func, \ - NULL, \ - sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+ \ - sizeof((((EVP_CIPHER_CTX *)NULL)->c.rijndael)), \ - EVP_CIPHER_set_asn1_iv, \ - EVP_CIPHER_get_asn1_iv, \ - NULL, \ - NULL \ - }; \ -EVP_CIPHER * EVP_##name(void) \ - { \ - return &name##_cipher_st; \ - } +typedef struct + { + AES_KEY ks; + } EVP_AES_KEY; -IMPLEMENT_AES_CIPHER(aes_128_ecb, aes_ecb, 16, 0, EVP_CIPH_ECB_MODE) -IMPLEMENT_AES_CIPHER(aes_192_ecb, aes_ecb, 24, 0, EVP_CIPH_ECB_MODE) -IMPLEMENT_AES_CIPHER(aes_256_ecb, aes_ecb, 32, 0, EVP_CIPH_ECB_MODE) +#define data(ctx) EVP_C_DATA(EVP_AES_KEY,ctx) -IMPLEMENT_AES_CIPHER(aes_128_cbc, aes_cbc, 16, 16, EVP_CIPH_CBC_MODE) -IMPLEMENT_AES_CIPHER(aes_192_cbc, aes_cbc, 24, 24, EVP_CIPH_CBC_MODE) -IMPLEMENT_AES_CIPHER(aes_256_cbc, aes_cbc, 32, 32, EVP_CIPH_CBC_MODE) +IMPLEMENT_BLOCK_CIPHER(aes_128, ks, AES, EVP_AES_KEY, + NID_aes_128, 16, 16, 16, 128, + 0, aes_init_key, NULL, + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, + NULL) +IMPLEMENT_BLOCK_CIPHER(aes_192, ks, AES, EVP_AES_KEY, + NID_aes_192, 16, 24, 16, 128, + 0, aes_init_key, NULL, + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, + NULL) +IMPLEMENT_BLOCK_CIPHER(aes_256, ks, AES, EVP_AES_KEY, + NID_aes_256, 16, 32, 16, 128, + 0, aes_init_key, NULL, + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, + NULL) -static int aes_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, - const unsigned char *iv, int enc) - { - RIJNDAEL_KEY *k=&ctx->c.rijndael; - if (enc) - k->rounds = rijndaelKeySetupEnc(k->rd_key, key, ctx->key_len * 8); - else - k->rounds = rijndaelKeySetupDec(k->rd_key, key, ctx->key_len * 8); +#define IMPLEMENT_AES_CFBR(ksize,cbits) IMPLEMENT_CFBR(aes,AES,EVP_AES_KEY,ks,ksize,cbits,16) - return 1; - } +IMPLEMENT_AES_CFBR(128,1) +IMPLEMENT_AES_CFBR(192,1) +IMPLEMENT_AES_CFBR(256,1) + +IMPLEMENT_AES_CFBR(128,8) +IMPLEMENT_AES_CFBR(192,8) +IMPLEMENT_AES_CFBR(256,8) -static int aes_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out, - const unsigned char *in, unsigned int inl) +static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc) { - RIJNDAEL_KEY *k=&ctx->c.rijndael; - while(inl > 0) - { - if(ctx->encrypt) - rijndaelEncrypt(k->rd_key,k->rounds, in, out); - else - rijndaelDecrypt(k->rd_key,k->rounds, in, out); - inl-=16; - in+=16; - out+=16; - } - assert(inl == 0); + int ret; - return 1; - } + if ((ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_CFB_MODE + || (ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_OFB_MODE + || enc) + ret=AES_set_encrypt_key(key, ctx->key_len * 8, ctx->cipher_data); + else + ret=AES_set_decrypt_key(key, ctx->key_len * 8, ctx->cipher_data); -static int aes_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out, - const unsigned char *in, unsigned int inl) - { - int n; - unsigned char tmp[16]; - RIJNDAEL_KEY *k=&ctx->c.rijndael; - while(inl > 0) + if(ret < 0) { - if(ctx->encrypt) - { - for(n=0 ; n < 16 ; n++) - tmp[n] = in[n] ^ ctx->iv[n]; - rijndaelEncrypt(k->rd_key,k->rounds, tmp, out); - memcpy(ctx->iv,out,16); - } - else - { - memcpy(tmp, in, 16); - rijndaelDecrypt(k->rd_key,k->rounds, in, out); - for(n=0 ; n < 16 ; n++) - out[n] ^= ctx->iv[n]; - memcpy(ctx->iv,tmp,16); - } - inl-=16; - in+=16; - out+=16; + EVPerr(EVP_F_AES_INIT_KEY,EVP_R_AES_KEY_SETUP_FAILED); + return 0; } - assert(inl == 0); + return 1; } +#endif