in src/aes.c [600:667]
unsign32 AES_decrypt(amcl_aes *a,char *buff)
{
int j;
int bytes;
char st[16];
unsign32 fell_off;
/* Supported modes of operation */
fell_off=0;
switch (a->mode)
{
case ECB:
AES_ecb_decrypt(a,(uchar *)buff);
return 0;
case CBC:
for (j=0; j<4*NB; j++)
{
st[j]=a->f[j];
a->f[j]=buff[j];
}
AES_ecb_decrypt(a,(uchar *)buff);
for (j=0; j<4*NB; j++)
{
buff[j]^=st[j];
st[j]=0;
}
return 0;
case CFB1:
case CFB2:
case CFB4:
bytes=a->mode-CFB1+1;
for (j=0; j<bytes; j++) fell_off=(fell_off<<8)|a->f[j];
for (j=0; j<4*NB; j++) st[j]=a->f[j];
for (j=bytes; j<4*NB; j++) a->f[j-bytes]=a->f[j];
AES_ecb_encrypt(a,(uchar *)st);
for (j=0; j<bytes; j++)
{
a->f[16-bytes+j]=buff[j];
buff[j]^=st[j];
}
return fell_off;
case OFB1:
case OFB2:
case OFB4:
case OFB8:
case OFB16:
bytes=a->mode-OFB1+1;
AES_ecb_encrypt(a,(uchar *)(a->f));
for (j=0; j<bytes; j++) buff[j]^=a->f[j];
return 0;
case CTR1:
case CTR2:
case CTR4:
case CTR8:
case CTR16:
bytes=a->mode-CTR1+1;
for (j=0; j<4*NB; j++) st[j]=a->f[j];
AES_ecb_encrypt(a,(uchar *)st);
for (j=0; j<bytes; j++) buff[j]^=st[j];
increment(a->f);
return 0;
default:
return 0;
}
}