4 * The Advanced Encryption Standard (AES, aka AES) block cipher,
\r
5 * designed by J. Daemen and V. Rijmen.
\r
7 * @author Paulo S. L. M. Barreto
\r
9 * This software is hereby placed in the public domain.
\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
26 #include <freeradius-devel/ident.h>
\r
27 RCSIDH(AES_H, "$Id$")
\r
29 #include "BlockCipher.h"
\r
33 typedef unsigned char byte;
\r
34 typedef unsigned long uint; /* assuming sizeof(uint) == 4 */
\r
35 #endif /* USUAL_TYPES */
\r
37 #ifndef AES_BLOCKBITS
\r
38 #define AES_BLOCKBITS 128
\r
40 #if AES_BLOCKBITS != 128
\r
41 #error "AES_BLOCKBITS must be 128"
\r
44 #ifndef AES_BLOCKSIZE
\r
45 #define AES_BLOCKSIZE 16 /* bytes */
\r
47 #if AES_BLOCKSIZE != 16
\r
48 #error "AES_BLOCKSIZE must be 16"
\r
51 #ifndef AES_MINKEYBITS
\r
52 #define AES_MINKEYBITS 128
\r
54 #if AES_MINKEYBITS != 128
\r
55 #error "AES_MINKEYBITS must be 128"
\r
58 #ifndef AES_MINKEYSIZE
\r
59 #define AES_MINKEYSIZE 16 /* bytes */
\r
61 #if AES_MINKEYSIZE != 16
\r
62 #error "AES_MINKEYSIZE must be 16"
\r
65 #ifndef AES_MAXKEYBITS
\r
66 #define AES_MAXKEYBITS 256
\r
68 #if AES_MAXKEYBITS != 256
\r
69 #error "AES_MAXKEYBITS must be 256"
\r
72 #ifndef AES_MAXKEYSIZE
\r
73 #define AES_MAXKEYSIZE 32 /* bytes */
\r
75 #if AES_MAXKEYSIZE != 32
\r
76 #error "AES_MAXKEYSIZE must be 32"
\r
79 #define MAXKC (AES_MAXKEYBITS/32)
\r
80 #define MAXKB (AES_MAXKEYBITS/8)
\r
83 class AES: public BlockCipher {
\r
90 * Block size in bits.
\r
92 inline uint blockBits() const {
\r
93 return AES_BLOCKBITS;
\r
97 * Block size in bytes.
\r
99 inline uint blockSize() const {
\r
100 return AES_BLOCKSIZE;
\r
104 * Key size in bits.
\r
106 inline uint keyBits() const {
\r
107 return (Nr - 6) << 5;
\r
111 * Key size in bytes.
\r
113 inline uint keySize() const {
\r
114 return (Nr - 6) << 2;
\r
117 void makeKey(const byte *cipherKey, uint keyBits, uint dir);
\r
119 void encrypt(const byte *pt, byte *ct);
\r
121 void decrypt(const byte *ct, byte *pt);
\r
124 // static void Initialize();
\r
125 void ExpandKey(const byte *cipherKey, uint keyBits);
\r
128 uint e_sched[4*(MAXNR + 1)];
\r
129 uint d_sched[4*(MAXNR + 1)];
\r
132 #endif /* __AES_H */
\r