1
2
3
4/* 1. Standard types for AES cryptography source code               */
5
6typedef unsigned char   u1byte; /* an 8 bit unsigned character type */
7typedef unsigned short  u2byte; /* a 16 bit unsigned integer type   */
8typedef unsigned long   u4byte; /* a 32 bit unsigned integer type   */
9
10typedef signed char     s1byte; /* an 8 bit signed character type   */
11typedef signed short    s2byte; /* a 16 bit signed integer type     */
12typedef signed long     s4byte; /* a 32 bit signed integer type     */
13
14/* 2. Standard interface for AES cryptographic routines             */
15
16/* These are all based on 32 bit unsigned values and will therefore */
17/* require endian conversions for big-endian architectures          */
18
19#ifdef  __cplusplus
20    extern "C"
21    {
22#endif
23
24    char **cipher_name(void);
25    u4byte *set_key(const u4byte in_key[], const u4byte key_len);
26    void rEncrypt(const u4byte in_blk[4], u4byte out_blk[4]);
27    void rDecrypt(const u4byte in_blk[4], u4byte out_blk[4]);
28
29#ifdef  __cplusplus
30    };
31#endif
32
33/* 3. Basic macros for speeding up generic operations               */
34
35/* Circular rotate of 32 bit values                                 */
36
37#ifdef _MSC_VER
38
39#  include <stdlib.h>
40#  pragma intrinsic(_lrotr,_lrotl)
41#  define rotr(x,n) _lrotr(x,n)
42#  define rotl(x,n) _lrotl(x,n)
43
44#else
45
46#define rotr(x,n)   (((x) >> ((int)(n))) | ((x) << (32 - (int)(n))))
47#define rotl(x,n)   (((x) << ((int)(n))) | ((x) >> (32 - (int)(n))))
48
49#endif
50
51/* Invert byte order in a 32 bit variable                           */
52
53#define bswap(x)    ((rotl(x, 8) & 0x00ff00ff) | (rotr(x, 8) & 0xff00ff00))
54
55/* Extract byte from a 32 bit quantity (little endian notation)     */
56
57#define byte(x,n)   ((u1byte)((x) >> (8 * n)))
58
59/* For inverting byte order in input/output 32 bit words if needed  */
60#ifdef	__ppc__
61#define BYTE_SWAP
62#endif
63
64#ifdef  BLOCK_SWAP
65#define BYTE_SWAP
66#define WORD_SWAP
67#endif
68
69#ifdef  BYTE_SWAP
70#define io_swap(x)  bswap(x)
71#else
72#define io_swap(x)  (x)
73#endif
74
75/* For inverting the byte order of input/output blocks if needed    */
76
77#ifdef  WORD_SWAP
78
79#define get_block(x)                            \
80    ((u4byte*)(x))[0] = io_swap(in_blk[3]);     \
81    ((u4byte*)(x))[1] = io_swap(in_blk[2]);     \
82    ((u4byte*)(x))[2] = io_swap(in_blk[1]);     \
83    ((u4byte*)(x))[3] = io_swap(in_blk[0])
84
85#define put_block(x)                            \
86    out_blk[3] = io_swap(((u4byte*)(x))[0]);    \
87    out_blk[2] = io_swap(((u4byte*)(x))[1]);    \
88    out_blk[1] = io_swap(((u4byte*)(x))[2]);    \
89    out_blk[0] = io_swap(((u4byte*)(x))[3])
90
91#define get_key(x,len)                          \
92    ((u4byte*)(x))[4] = ((u4byte*)(x))[5] =     \
93    ((u4byte*)(x))[6] = ((u4byte*)(x))[7] = 0;  \
94    switch((((len) + 63) / 64)) {               \
95    case 2:                                     \
96    ((u4byte*)(x))[0] = io_swap(in_key[3]);     \
97    ((u4byte*)(x))[1] = io_swap(in_key[2]);     \
98    ((u4byte*)(x))[2] = io_swap(in_key[1]);     \
99    ((u4byte*)(x))[3] = io_swap(in_key[0]);     \
100    break;                                      \
101    case 3:                                     \
102    ((u4byte*)(x))[0] = io_swap(in_key[5]);     \
103    ((u4byte*)(x))[1] = io_swap(in_key[4]);     \
104    ((u4byte*)(x))[2] = io_swap(in_key[3]);     \
105    ((u4byte*)(x))[3] = io_swap(in_key[2]);     \
106    ((u4byte*)(x))[4] = io_swap(in_key[1]);     \
107    ((u4byte*)(x))[5] = io_swap(in_key[0]);     \
108    break;                                      \
109    case 4:                                     \
110    ((u4byte*)(x))[0] = io_swap(in_key[7]);     \
111    ((u4byte*)(x))[1] = io_swap(in_key[6]);     \
112    ((u4byte*)(x))[2] = io_swap(in_key[5]);     \
113    ((u4byte*)(x))[3] = io_swap(in_key[4]);     \
114    ((u4byte*)(x))[4] = io_swap(in_key[3]);     \
115    ((u4byte*)(x))[5] = io_swap(in_key[2]);     \
116    ((u4byte*)(x))[6] = io_swap(in_key[1]);     \
117    ((u4byte*)(x))[7] = io_swap(in_key[0]);     \
118    }
119
120#else
121
122#define get_block(x)                            \
123    ((u4byte*)(x))[0] = io_swap(in_blk[0]);     \
124    ((u4byte*)(x))[1] = io_swap(in_blk[1]);     \
125    ((u4byte*)(x))[2] = io_swap(in_blk[2]);     \
126    ((u4byte*)(x))[3] = io_swap(in_blk[3])
127
128#define put_block(x)                            \
129    out_blk[0] = io_swap(((u4byte*)(x))[0]);    \
130    out_blk[1] = io_swap(((u4byte*)(x))[1]);    \
131    out_blk[2] = io_swap(((u4byte*)(x))[2]);    \
132    out_blk[3] = io_swap(((u4byte*)(x))[3])
133
134#define get_key(x,len)                          \
135    ((u4byte*)(x))[4] = ((u4byte*)(x))[5] =     \
136    ((u4byte*)(x))[6] = ((u4byte*)(x))[7] = 0;  \
137    switch((((len) + 63) / 64)) {               \
138    case 4:                                     \
139    ((u4byte*)(x))[6] = io_swap(in_key[6]);     \
140    ((u4byte*)(x))[7] = io_swap(in_key[7]);     \
141    case 3:                                     \
142    ((u4byte*)(x))[4] = io_swap(in_key[4]);     \
143    ((u4byte*)(x))[5] = io_swap(in_key[5]);     \
144    case 2:                                     \
145    ((u4byte*)(x))[0] = io_swap(in_key[0]);     \
146    ((u4byte*)(x))[1] = io_swap(in_key[1]);     \
147    ((u4byte*)(x))[2] = io_swap(in_key[2]);     \
148    ((u4byte*)(x))[3] = io_swap(in_key[3]);     \
149    }
150
151#endif
152