unsign32 AES_decrypt()

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;
    }
}