import from branch_1_1:
[freeradius.git] / src / modules / rlm_eap / types / rlm_eap_psk / AES.h
1 /**\r
2  * AES.h\r
3  *\r
4  * The Advanced Encryption Standard (AES, aka AES) block cipher,\r
5  * designed by J. Daemen and V. Rijmen.\r
6  *\r
7  * @author Paulo S. L. M. Barreto\r
8  *\r
9  * This software is hereby placed in the public domain.\r
10  *\r
11  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS\r
12  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
13  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
14  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE\r
15  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
16  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
17  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
18  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
19  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
20  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
21  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
22  */\r
23 #ifndef __AES_H\r
24 #define __AES_H\r
25 \r
26 #include <freeradius-devel/ident.h>\r
27 RCSIDH(AES_H, "$Id$")\r
28 \r
29 #include "BlockCipher.h"\r
30 \r
31 #ifndef USUAL_TYPES\r
32 #define USUAL_TYPES\r
33 typedef unsigned char   byte;\r
34 typedef unsigned long   uint;   /* assuming sizeof(uint) == 4 */\r
35 #endif /* USUAL_TYPES */\r
36 \r
37 #ifndef AES_BLOCKBITS\r
38 #define AES_BLOCKBITS   128\r
39 #endif\r
40 #if AES_BLOCKBITS != 128\r
41 #error "AES_BLOCKBITS must be 128"\r
42 #endif\r
43 \r
44 #ifndef AES_BLOCKSIZE\r
45 #define AES_BLOCKSIZE   16 /* bytes */\r
46 #endif\r
47 #if AES_BLOCKSIZE != 16\r
48 #error "AES_BLOCKSIZE must be 16"\r
49 #endif\r
50 \r
51 #ifndef AES_MINKEYBITS\r
52 #define AES_MINKEYBITS  128\r
53 #endif\r
54 #if AES_MINKEYBITS != 128\r
55 #error "AES_MINKEYBITS must be 128"\r
56 #endif\r
57 \r
58 #ifndef AES_MINKEYSIZE\r
59 #define AES_MINKEYSIZE  16 /* bytes */\r
60 #endif\r
61 #if AES_MINKEYSIZE != 16\r
62 #error "AES_MINKEYSIZE must be 16"\r
63 #endif\r
64 \r
65 #ifndef AES_MAXKEYBITS\r
66 #define AES_MAXKEYBITS  256\r
67 #endif\r
68 #if AES_MAXKEYBITS != 256\r
69 #error "AES_MAXKEYBITS must be 256"\r
70 #endif\r
71 \r
72 #ifndef AES_MAXKEYSIZE\r
73 #define AES_MAXKEYSIZE  32 /* bytes */\r
74 #endif\r
75 #if AES_MAXKEYSIZE != 32\r
76 #error "AES_MAXKEYSIZE must be 32"\r
77 #endif\r
78 \r
79 #define MAXKC   (AES_MAXKEYBITS/32)\r
80 #define MAXKB   (AES_MAXKEYBITS/8)\r
81 #define MAXNR   14\r
82 \r
83 class AES: public BlockCipher {\r
84 public:\r
85 \r
86         AES();\r
87         virtual ~AES();\r
88 \r
89     /**\r
90      * Block size in bits.\r
91      */\r
92     inline uint blockBits() const {\r
93                 return AES_BLOCKBITS;\r
94         }\r
95 \r
96     /**\r
97      * Block size in bytes.\r
98      */\r
99     inline uint blockSize() const {\r
100                 return AES_BLOCKSIZE;\r
101         }\r
102 \r
103     /**\r
104      * Key size in bits.\r
105      */\r
106         inline uint keyBits() const {\r
107                 return (Nr - 6) << 5;\r
108         }\r
109 \r
110     /**\r
111      * Key size in bytes.\r
112      */\r
113         inline uint keySize() const {\r
114                 return (Nr - 6) << 2;\r
115         }\r
116 \r
117     void makeKey(const byte *cipherKey, uint keyBits, uint dir);\r
118 \r
119     void encrypt(const byte *pt, byte *ct);\r
120 \r
121     void decrypt(const byte *ct, byte *pt);\r
122 \r
123 private:\r
124     // static void Initialize();\r
125         void ExpandKey(const byte *cipherKey, uint keyBits);\r
126         void InvertKey();\r
127         uint Nr;\r
128         uint e_sched[4*(MAXNR + 1)];\r
129         uint d_sched[4*(MAXNR + 1)];\r
130 };\r
131 \r
132 #endif /* __AES_H */\r
133 \r