- return silc_aes_ctr_encrypt(context, src, dst, len, iv);
+ AesContext *aes = context;
+
+ switch (cipher->mode) {
+ case SILC_CIPHER_MODE_CBC:
+ {
+ unsigned char tmp[16];
+ int 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;
+ }
+ }
+ break;
+
+ case SILC_CIPHER_MODE_CTR:
+ return silc_aes_encrypt(cipher, context, src, dst, len, iv);
+ break;
+
+ case SILC_CIPHER_MODE_CFB:
+ SILC_CFB_DEC_MSB_128_8(iv, aes->u.enc.inf.b[2], src, dst,
+ aes_encrypt(iv, iv, &aes->u.enc));
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;