break;
case SILC_CIPHER_MODE_CTR:
+ case SILC_CIPHER_MODE_CFB:
aes_encrypt_key(key, keylen, &((AesContext *)context)->u.enc);
break;
SILC_CIPHER_API_SET_IV(aes)
{
- if (cipher->mode == SILC_CIPHER_MODE_CTR) {
- AesContext *aes = context;
+ AesContext *aes = context;
+
+ switch (cipher->mode) {
+ case SILC_CIPHER_MODE_CTR:
/* Starts new block. */
aes->u.enc.inf.b[2] = 0;
+ break;
+
+ case SILC_CIPHER_MODE_CFB:
+ /* Starts new block. */
+ aes->u.enc.inf.b[2] = 16;
+ break;
+
+ default:
+ break;
}
}
SILC_CIPHER_API_ENCRYPT(aes)
{
AesContext *aes = context;
- int i;
+ SilcUInt32 ctr[4];
switch (cipher->mode) {
case SILC_CIPHER_MODE_CBC:
break;
case SILC_CIPHER_MODE_CTR:
- {
- SilcUInt32 ctr[4];
-
- SILC_GET32_MSB(ctr[0], iv);
- SILC_GET32_MSB(ctr[1], iv + 4);
- SILC_GET32_MSB(ctr[2], iv + 8);
- SILC_GET32_MSB(ctr[3], iv + 12);
-
- i = aes->u.enc.inf.b[2];
- if (!i)
- i = 16;
-
- while (len-- > 0) {
- if (i == 16) {
- if (++ctr[3] == 0)
- if (++ctr[2] == 0)
- if (++ctr[1] == 0)
- ++ctr[0];
-
- SILC_PUT32_MSB(ctr[0], iv);
- SILC_PUT32_MSB(ctr[1], iv + 4);
- SILC_PUT32_MSB(ctr[2], iv + 8);
- SILC_PUT32_MSB(ctr[3], iv + 12);
-
- aes_encrypt(iv, iv, &aes->u.enc);
- i = 0;
- }
- *dst++ = *src++ ^ iv[i++];
- }
- aes->u.enc.inf.b[2] = i;
+ SILC_CTR_MSB_128_8(iv, ctr, iv, aes->u.enc.inf.b[2], src, dst,
+ aes_encrypt(iv, iv, &aes->u.enc));
+ break;
- SILC_PUT32_MSB(ctr[0], iv);
- SILC_PUT32_MSB(ctr[1], iv + 4);
- SILC_PUT32_MSB(ctr[2], iv + 8);
- SILC_PUT32_MSB(ctr[3], iv + 12);
- }
+ case SILC_CIPHER_MODE_CFB:
+ SILC_CFB_ENC_MSB_128_8(iv, aes->u.enc.inf.b[2], src, dst,
+ aes_encrypt(iv, iv, &aes->u.enc));
break;
default:
SILC_CIPHER_API_DECRYPT(aes)
{
+ AesContext *aes = context;
+
switch (cipher->mode) {
case SILC_CIPHER_MODE_CBC:
{
while(nb--) {
memcpy(tmp, src, 16);
- aes_decrypt(src, dst, &((AesContext *)context)->u.dec);
+ 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];
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;
}
ke4(cx->ks, 6); ke4(cx->ks, 7);
ke4(cx->ks, 8);
ke4(cx->ks, 9);
- cx->inf.l = 0;
cx->inf.b[0] = 10 * 16;
}
ke6(cx->ks, 4); ke6(cx->ks, 5);
ke6(cx->ks, 6);
kef6(cx->ks, 7);
- cx->inf.l = 0;
cx->inf.b[0] = 12 * 16;
}
ke8(cx->ks, 2); ke8(cx->ks, 3);
ke8(cx->ks, 4); ke8(cx->ks, 5);
kef8(cx->ks, 6);
- cx->inf.l = 0;
cx->inf.b[0] = 14 * 16;
}
kd4(cx->ks, 4); kd4(cx->ks, 5);
kd4(cx->ks, 6); kd4(cx->ks, 7);
kd4(cx->ks, 8); kdl4(cx->ks, 9);
- cx->inf.l = 0;
cx->inf.b[0] = 10 * 16;
}
kd6(cx->ks, 2); kd6(cx->ks, 3);
kd6(cx->ks, 4); kd6(cx->ks, 5);
kd6(cx->ks, 6); kdl6(cx->ks, 7);
- cx->inf.l = 0;
cx->inf.b[0] = 12 * 16;
}
kd8(cx->ks, 2); kd8(cx->ks, 3);
kd8(cx->ks, 4); kd8(cx->ks, 5);
kdl8(cx->ks, 6);
- cx->inf.l = 0;
cx->inf.b[0] = 14 * 16;
}