Fri Jul 15 2011 11:58:49

Asterisk developer's documentation


aescrypt.c File Reference

This file contains the code for implementing encryption and decryption for AES (Rijndael) for block and key sizes of 16, 24 and 32 bytes. It can optionally be replaced by code written in assembler using NASM. For further details see the file aesopt.h. More...

#include "aesopt.h"
Include dependency graph for aescrypt.c:

Go to the source code of this file.

Defines

#define fwd_lrnd(y, x, k, c)   (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,l),fwd_var,rf1,c))
#define fwd_rnd(y, x, k, c)   (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c))
#define fwd_var(x, r, c)
#define inv_lrnd(y, x, k, c)   (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,l),inv_var,rf1,c))
#define inv_rnd(y, x, k, c)   (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,n),inv_var,rf1,c))
#define inv_var(x, r, c)
#define l_copy(y, x)
#define locals(y, x)   x[4],y[4]
#define round(rm, y, x, k)   rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3)
#define si(y, x, k, c)   (s(y,c) = word_in(x, c) ^ (k)[c])
#define so(y, x, c)   word_out(y, c, s(x,c))
#define state_in(y, x, k)   si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3)
#define state_out(y, x)   so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3)

Functions

aes_rval aes_decrypt (const void *in_blk, void *out_blk, const aes_decrypt_ctx cx[1])
aes_rval aes_encrypt (const void *in_blk, void *out_blk, const aes_encrypt_ctx cx[1])

Detailed Description

This file contains the code for implementing encryption and decryption for AES (Rijndael) for block and key sizes of 16, 24 and 32 bytes. It can optionally be replaced by code written in assembler using NASM. For further details see the file aesopt.h.

Author:
Dr Brian Gladman <brg@gladman.me.uk>

Definition in file aescrypt.c.


Define Documentation

#define fwd_lrnd (   y,
  x,
  k,
 
)    (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,l),fwd_var,rf1,c))

Definition at line 108 of file aescrypt.c.

Referenced by aes_encrypt().

#define fwd_rnd (   y,
  x,
  k,
 
)    (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c))

Definition at line 99 of file aescrypt.c.

Referenced by aes_encrypt().

#define fwd_var (   x,
  r,
 
)
Value:
( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\
 : r == 1 ? ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))\
 : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\
 :          ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2)))

Definition at line 91 of file aescrypt.c.

#define inv_lrnd (   y,
  x,
  k,
 
)    (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,l),inv_var,rf1,c))

Definition at line 232 of file aescrypt.c.

Referenced by aes_decrypt().

#define inv_rnd (   y,
  x,
  k,
 
)    (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,n),inv_var,rf1,c))

Definition at line 223 of file aescrypt.c.

Referenced by aes_decrypt().

#define inv_var (   x,
  r,
 
)
Value:
( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\
 : r == 1 ? ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))\
 : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\
 :          ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0)))

Definition at line 215 of file aescrypt.c.

#define l_copy (   y,
 
)
Value:
s(y,0) = s(x,0); s(y,1) = s(x,1); \
                        s(y,2) = s(x,2); s(y,3) = s(x,3);

Definition at line 63 of file aescrypt.c.

Referenced by aes_decrypt(), and aes_encrypt().

#define locals (   y,
 
)    x[4],y[4]

Definition at line 58 of file aescrypt.c.

Referenced by aes_decrypt(), and aes_encrypt().

#define round (   rm,
  y,
  x,
 
)    rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3)

Definition at line 67 of file aescrypt.c.

Referenced by aes_decrypt(), aes_encrypt(), and usbradio_text().

#define si (   y,
  x,
  k,
 
)    (s(y,c) = word_in(x, c) ^ (k)[c])

Definition at line 54 of file aescrypt.c.

Referenced by destroy_callback(), speex_callback(), speex_read(), and speex_write().

#define so (   y,
  x,
 
)    word_out(y, c, s(x,c))

Definition at line 55 of file aescrypt.c.

#define state_in (   y,
  x,
 
)    si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3)

Definition at line 65 of file aescrypt.c.

Referenced by aes_decrypt(), and aes_encrypt().

#define state_out (   y,
 
)    so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3)

Definition at line 66 of file aescrypt.c.

Referenced by aes_decrypt(), and aes_encrypt().


Function Documentation

aes_rval aes_decrypt ( const void *  in_blk,
void *  out_blk,
const aes_decrypt_ctx  cx[1] 
)

Definition at line 239 of file aescrypt.c.

References aes_error, aes_good, inv_lrnd, inv_rnd, aes_decrypt_ctx::ks, l_copy, locals, N_COLS, round, state_in, and state_out.

{   aes_32t        locals(b0, b1);
#ifdef dec_imvars
    dec_imvars; /* declare variables for inv_mcol() if needed */
#endif

    aes_32t nr = (cx->ks[45] ^ cx->ks[52] ^ cx->ks[53] ? cx->ks[52] : 14);
    const aes_32t *kp = cx->ks + nr * N_COLS;

#ifdef AES_ERR_CHK
    if(   (nr != 10 || !(cx->ks[0] | cx->ks[3] | cx->ks[4]))
       && (nr != 12 || !(cx->ks[0] | cx->ks[5] | cx->ks[6]))
       && (nr != 14 || !(cx->ks[0] | cx->ks[7] | cx->ks[8])) )
        return aes_error;
#endif

    state_in(b0, in_blk, kp);

#if (DEC_UNROLL == FULL)

    switch(nr)
    {
    case 14:
        round(inv_rnd,  b1, b0, kp -  1 * N_COLS);
        round(inv_rnd,  b0, b1, kp -  2 * N_COLS);
        kp -= 2 * N_COLS;
    case 12:
        round(inv_rnd,  b1, b0, kp -  1 * N_COLS);
        round(inv_rnd,  b0, b1, kp -  2 * N_COLS);
        kp -= 2 * N_COLS;
    case 10:
        round(inv_rnd,  b1, b0, kp -  1 * N_COLS);
        round(inv_rnd,  b0, b1, kp -  2 * N_COLS);
        round(inv_rnd,  b1, b0, kp -  3 * N_COLS);
        round(inv_rnd,  b0, b1, kp -  4 * N_COLS);
        round(inv_rnd,  b1, b0, kp -  5 * N_COLS);
        round(inv_rnd,  b0, b1, kp -  6 * N_COLS);
        round(inv_rnd,  b1, b0, kp -  7 * N_COLS);
        round(inv_rnd,  b0, b1, kp -  8 * N_COLS);
        round(inv_rnd,  b1, b0, kp -  9 * N_COLS);
        round(inv_lrnd, b0, b1, kp - 10 * N_COLS);
    }

#else

#if (DEC_UNROLL == PARTIAL)
    {   aes_32t    rnd;
        for(rnd = 0; rnd < (nr >> 1) - 1; ++rnd)
        {
            kp -= N_COLS;
            round(inv_rnd, b1, b0, kp);
            kp -= N_COLS;
            round(inv_rnd, b0, b1, kp);
        }
        kp -= N_COLS;
        round(inv_rnd, b1, b0, kp);
#else
    {   aes_32t    rnd;
        for(rnd = 0; rnd < nr - 1; ++rnd)
        {
            kp -= N_COLS;
            round(inv_rnd, b1, b0, kp);
            l_copy(b0, b1);
        }
#endif
        kp -= N_COLS;
        round(inv_lrnd, b0, b1, kp);
    }
#endif

    state_out(out_blk, b0);
#ifdef AES_ERR_CHK
    return aes_good;
#endif
}
aes_rval aes_encrypt ( const void *  in_blk,
void *  out_blk,
const aes_encrypt_ctx  cx[1] 
)

Definition at line 115 of file aescrypt.c.

References aes_error, aes_good, dec_fmvars, fwd_lrnd, fwd_rnd, aes_encrypt_ctx::ks, l_copy, locals, N_COLS, round, state_in, and state_out.

{   aes_32t         locals(b0, b1);
    const aes_32t   *kp = cx->ks;
#ifdef dec_fmvars
    dec_fmvars; /* declare variables for fwd_mcol() if needed */
#endif

    aes_32t nr = (kp[45] ^ kp[52] ^ kp[53] ? kp[52] : 14);

#ifdef AES_ERR_CHK
    if(   (nr != 10 || !(kp[0] | kp[3] | kp[4]))
       && (nr != 12 || !(kp[0] | kp[5] | kp[6]))
       && (nr != 14 || !(kp[0] | kp[7] | kp[8])) )
        return aes_error;
#endif

    state_in(b0, in_blk, kp);

#if (ENC_UNROLL == FULL)

    switch(nr)
    {
    case 14:
        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
        kp += 2 * N_COLS;
    case 12:
        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
        kp += 2 * N_COLS;
    case 10:
        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
        round(fwd_rnd,  b1, b0, kp + 3 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 4 * N_COLS);
        round(fwd_rnd,  b1, b0, kp + 5 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 6 * N_COLS);
        round(fwd_rnd,  b1, b0, kp + 7 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 8 * N_COLS);
        round(fwd_rnd,  b1, b0, kp + 9 * N_COLS);
        round(fwd_lrnd, b0, b1, kp +10 * N_COLS);
    }

#else

#if (ENC_UNROLL == PARTIAL)
    {   aes_32t    rnd;
        for(rnd = 0; rnd < (nr >> 1) - 1; ++rnd)
        {
            kp += N_COLS;
            round(fwd_rnd, b1, b0, kp);
            kp += N_COLS;
            round(fwd_rnd, b0, b1, kp);
        }
        kp += N_COLS;
        round(fwd_rnd,  b1, b0, kp);
#else
    {   aes_32t    rnd;
        for(rnd = 0; rnd < nr - 1; ++rnd)
        {
            kp += N_COLS;
            round(fwd_rnd, b1, b0, kp);
            l_copy(b0, b1);
        }
#endif
        kp += N_COLS;
        round(fwd_lrnd, b0, b1, kp);
    }
#endif

    state_out(out_blk, b0);
#ifdef AES_ERR_CHK
    return aes_good;
#endif
}