X-Git-Url: http://git.silcnet.org/gitweb/?p=crypto.git;a=blobdiff_plain;f=lib%2Fsilccrypt%2Faes.c;fp=lib%2Fsilccrypt%2Faes.c;h=95bdd68485d8c9b1857c32ffa896ec969c958c69;hp=75c7c523fc5cc31deffcca20e0633e80cbdf6b1b;hb=9cb3b70fbb028d0bc059a3e5af3c4ea532a2b2f5;hpb=abd261065eac46a2d2c970833f3fa701bc1516e3 diff --git a/lib/silccrypt/aes.c b/lib/silccrypt/aes.c index 75c7c523..95bdd684 100644 --- a/lib/silccrypt/aes.c +++ b/lib/silccrypt/aes.c @@ -130,24 +130,8 @@ SILC_CIPHER_API_ENCRYPT(aes) break; case SILC_CIPHER_MODE_CBC: - { - SilcUInt32 nb = len >> 4; - - SILC_ASSERT((len & (16 - 1)) == 0); - if (len & (16 - 1)) - return FALSE; - - while(nb--) { - lp32(iv)[0] ^= lp32(src)[0]; - lp32(iv)[1] ^= lp32(src)[1]; - lp32(iv)[2] ^= lp32(src)[2]; - lp32(iv)[3] ^= lp32(src)[3]; - aes_encrypt(iv, iv, &aes->u.enc); - memcpy(dst, iv, 16); - src += 16; - dst += 16; - } - } + SILC_CBC_ENC_MSB_128_8(len, iv, src, dst, i, + aes_encrypt(iv, iv, &aes->u.enc)); break; case SILC_CIPHER_MODE_CFB: @@ -168,6 +152,8 @@ SILC_CIPHER_API_ENCRYPT(aes) SILC_CIPHER_API_DECRYPT(aes) { AesContext *aes = context; + unsigned char prev[16]; + int i; switch (ops->mode) { case SILC_CIPHER_MODE_CTR: @@ -187,25 +173,8 @@ SILC_CIPHER_API_DECRYPT(aes) break; case SILC_CIPHER_MODE_CBC: - { - unsigned char tmp[16]; - SilcUInt32 nb = len >> 4; - - if (len & (16 - 1)) - return FALSE; - - while(nb--) { - memcpy(tmp, src, 16); - aes_decrypt(src, dst, &aes->u.dec); - lp32(dst)[0] ^= lp32(iv)[0]; - lp32(dst)[1] ^= lp32(iv)[1]; - lp32(dst)[2] ^= lp32(iv)[2]; - lp32(dst)[3] ^= lp32(iv)[3]; - memcpy(iv, tmp, 16); - src += 16; - dst += 16; - } - } + SILC_CBC_DEC_MSB_128_8(len, iv, prev, src, dst, i, + aes_decrypt(src, dst, &aes->u.dec)); break; case SILC_CIPHER_MODE_CFB: