unsign32 AES_encrypt()

in src/aes.c [533:596]


unsign32 AES_encrypt(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_encrypt(a,(uchar *)buff);
        return 0;
    case CBC:
        for (j=0; j<4*NB; j++) buff[j]^=a->f[j];
        AES_ecb_encrypt(a,(uchar *)buff);
        for (j=0; j<4*NB; j++) a->f[j]=buff[j];
        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++)
        {
            buff[j]^=st[j];
            a->f[16-bytes+j]=buff[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;
    }
}