Wed Oct 28 11:51:12 2009

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.

00240 {   aes_32t        locals(b0, b1);
00241 #ifdef dec_imvars
00242     dec_imvars; /* declare variables for inv_mcol() if needed */
00243 #endif
00244 
00245     aes_32t nr = (cx->ks[45] ^ cx->ks[52] ^ cx->ks[53] ? cx->ks[52] : 14);
00246     const aes_32t *kp = cx->ks + nr * N_COLS;
00247 
00248 #ifdef AES_ERR_CHK
00249     if(   (nr != 10 || !(cx->ks[0] | cx->ks[3] | cx->ks[4])) 
00250        && (nr != 12 || !(cx->ks[0] | cx->ks[5] | cx->ks[6]))
00251        && (nr != 14 || !(cx->ks[0] | cx->ks[7] | cx->ks[8])) )
00252         return aes_error;
00253 #endif
00254 
00255     state_in(b0, in_blk, kp);
00256 
00257 #if (DEC_UNROLL == FULL)
00258 
00259     switch(nr)
00260     {
00261     case 14:
00262         round(inv_rnd,  b1, b0, kp -  1 * N_COLS);
00263         round(inv_rnd,  b0, b1, kp -  2 * N_COLS);
00264         kp -= 2 * N_COLS;
00265     case 12:
00266         round(inv_rnd,  b1, b0, kp -  1 * N_COLS);
00267         round(inv_rnd,  b0, b1, kp -  2 * N_COLS);
00268         kp -= 2 * N_COLS;
00269     case 10:
00270         round(inv_rnd,  b1, b0, kp -  1 * N_COLS);
00271         round(inv_rnd,  b0, b1, kp -  2 * N_COLS);
00272         round(inv_rnd,  b1, b0, kp -  3 * N_COLS);
00273         round(inv_rnd,  b0, b1, kp -  4 * N_COLS);
00274         round(inv_rnd,  b1, b0, kp -  5 * N_COLS);
00275         round(inv_rnd,  b0, b1, kp -  6 * N_COLS);
00276         round(inv_rnd,  b1, b0, kp -  7 * N_COLS);
00277         round(inv_rnd,  b0, b1, kp -  8 * N_COLS);
00278         round(inv_rnd,  b1, b0, kp -  9 * N_COLS);
00279         round(inv_lrnd, b0, b1, kp - 10 * N_COLS);
00280     }
00281 
00282 #else
00283 
00284 #if (DEC_UNROLL == PARTIAL)
00285     {   aes_32t    rnd;
00286         for(rnd = 0; rnd < (nr >> 1) - 1; ++rnd)
00287         {
00288             kp -= N_COLS;
00289             round(inv_rnd, b1, b0, kp);
00290             kp -= N_COLS;
00291             round(inv_rnd, b0, b1, kp);
00292         }
00293         kp -= N_COLS;
00294         round(inv_rnd, b1, b0, kp);
00295 #else
00296     {   aes_32t    rnd;
00297         for(rnd = 0; rnd < nr - 1; ++rnd)
00298         {
00299             kp -= N_COLS;
00300             round(inv_rnd, b1, b0, kp);
00301             l_copy(b0, b1);
00302         }
00303 #endif
00304         kp -= N_COLS;
00305         round(inv_lrnd, b0, b1, kp);
00306     }
00307 #endif
00308 
00309     state_out(out_blk, b0);
00310 #ifdef AES_ERR_CHK
00311     return aes_good;
00312 #endif
00313 }

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.

00116 {   aes_32t         locals(b0, b1);
00117     const aes_32t   *kp = cx->ks;
00118 #ifdef dec_fmvars
00119     dec_fmvars; /* declare variables for fwd_mcol() if needed */
00120 #endif
00121 
00122     aes_32t nr = (kp[45] ^ kp[52] ^ kp[53] ? kp[52] : 14);
00123 
00124 #ifdef AES_ERR_CHK
00125     if(   (nr != 10 || !(kp[0] | kp[3] | kp[4])) 
00126        && (nr != 12 || !(kp[0] | kp[5] | kp[6]))
00127        && (nr != 14 || !(kp[0] | kp[7] | kp[8])) )
00128         return aes_error;
00129 #endif
00130 
00131     state_in(b0, in_blk, kp);
00132 
00133 #if (ENC_UNROLL == FULL)
00134 
00135     switch(nr)
00136     {
00137     case 14:
00138         round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
00139         round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
00140         kp += 2 * N_COLS;
00141     case 12:
00142         round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
00143         round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
00144         kp += 2 * N_COLS;
00145     case 10:
00146         round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
00147         round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
00148         round(fwd_rnd,  b1, b0, kp + 3 * N_COLS);
00149         round(fwd_rnd,  b0, b1, kp + 4 * N_COLS);
00150         round(fwd_rnd,  b1, b0, kp + 5 * N_COLS);
00151         round(fwd_rnd,  b0, b1, kp + 6 * N_COLS);
00152         round(fwd_rnd,  b1, b0, kp + 7 * N_COLS);
00153         round(fwd_rnd,  b0, b1, kp + 8 * N_COLS);
00154         round(fwd_rnd,  b1, b0, kp + 9 * N_COLS);
00155         round(fwd_lrnd, b0, b1, kp +10 * N_COLS);
00156     }
00157 
00158 #else
00159 
00160 #if (ENC_UNROLL == PARTIAL)
00161     {   aes_32t    rnd;
00162         for(rnd = 0; rnd < (nr >> 1) - 1; ++rnd)
00163         {
00164             kp += N_COLS;
00165             round(fwd_rnd, b1, b0, kp);
00166             kp += N_COLS;
00167             round(fwd_rnd, b0, b1, kp);
00168         }
00169         kp += N_COLS;
00170         round(fwd_rnd,  b1, b0, kp);
00171 #else
00172     {   aes_32t    rnd;
00173         for(rnd = 0; rnd < nr - 1; ++rnd)
00174         {
00175             kp += N_COLS;
00176             round(fwd_rnd, b1, b0, kp);
00177             l_copy(b0, b1);
00178         }
00179 #endif
00180         kp += N_COLS;
00181         round(fwd_lrnd, b0, b1, kp);
00182     }
00183 #endif
00184 
00185     state_out(out_blk, b0);
00186 #ifdef AES_ERR_CHK
00187     return aes_good;
00188 #endif
00189 }


Generated on Wed Oct 28 11:51:12 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6