iPXE
aes_test.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301, USA.
18 *
19 * You can also choose to distribute this program under the terms of
20 * the Unmodified Binary Distribution Licence (as given in the file
21 * COPYING.UBDL), provided that you have satisfied its requirements.
22 */
23
24FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25
26/** @file
27 *
28 * AES tests
29 *
30 * These test vectors are provided by NIST as part of the
31 * Cryptographic Toolkit Examples, downloadable from:
32 *
33 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_Core_All.pdf
34 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_ECB.pdf
35 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CBC.pdf
36 *
37 */
38
39/* Forcibly enable assertions */
40#undef NDEBUG
41
42#include <assert.h>
43#include <string.h>
44#include <ipxe/aes.h>
45#include <ipxe/test.h>
46#include "cipher_test.h"
47
48/** Key used for NIST 128-bit test vectors */
49#define AES_KEY_NIST_128 \
50 KEY ( 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, \
51 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c )
52
53/** Key used for NIST 192-bit test vectors */
54#define AES_KEY_NIST_192 \
55 KEY ( 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, \
56 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 0x62, 0xf8, \
57 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b )
58
59/** Key used for NIST 256-bit test vectors */
60#define AES_KEY_NIST_256 \
61 KEY ( 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, \
62 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, \
63 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, \
64 0xa3, 0x09, 0x14, 0xdf, 0xf4 )
65
66/** Initialisation vector used for NIST CBC-mode test vectors */
67#define AES_IV_NIST_CBC \
68 IV ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, \
69 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f )
70
71/** Plaintext used for NIST test vectors */
72#define AES_PLAINTEXT_NIST \
73 PLAINTEXT ( 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, \
74 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, \
75 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, \
76 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, \
77 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, \
78 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, \
79 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, \
80 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 )
81
82/** AES-128-ECB (same test as AES-128-Core) */
85 CIPHERTEXT ( 0x3a, 0xd7, 0x7b, 0xb4, 0x0d, 0x7a, 0x36, 0x60,
86 0xa8, 0x9e, 0xca, 0xf3, 0x24, 0x66, 0xef, 0x97,
87 0xf5, 0xd3, 0xd5, 0x85, 0x03, 0xb9, 0x69, 0x9d,
88 0xe7, 0x85, 0x89, 0x5a, 0x96, 0xfd, 0xba, 0xaf,
89 0x43, 0xb1, 0xcd, 0x7f, 0x59, 0x8e, 0xce, 0x23,
90 0x88, 0x1b, 0x00, 0xe3, 0xed, 0x03, 0x06, 0x88,
91 0x7b, 0x0c, 0x78, 0x5e, 0x27, 0xe8, 0xad, 0x3f,
92 0x82, 0x23, 0x20, 0x71, 0x04, 0x72, 0x5d, 0xd4 ), AUTH() );
93
94/** AES-128-CBC */
97 CIPHERTEXT ( 0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46,
98 0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d,
99 0x50, 0x86, 0xcb, 0x9b, 0x50, 0x72, 0x19, 0xee,
100 0x95, 0xdb, 0x11, 0x3a, 0x91, 0x76, 0x78, 0xb2,
101 0x73, 0xbe, 0xd6, 0xb8, 0xe3, 0xc1, 0x74, 0x3b,
102 0x71, 0x16, 0xe6, 0x9e, 0x22, 0x22, 0x95, 0x16,
103 0x3f, 0xf1, 0xca, 0xa1, 0x68, 0x1f, 0xac, 0x09,
104 0x12, 0x0e, 0xca, 0x30, 0x75, 0x86, 0xe1, 0xa7 ), AUTH() );
105
106/** AES-192-ECB (same test as AES-192-Core) */
109 CIPHERTEXT ( 0xbd, 0x33, 0x4f, 0x1d, 0x6e, 0x45, 0xf2, 0x5f,
110 0xf7, 0x12, 0xa2, 0x14, 0x57, 0x1f, 0xa5, 0xcc,
111 0x97, 0x41, 0x04, 0x84, 0x6d, 0x0a, 0xd3, 0xad,
112 0x77, 0x34, 0xec, 0xb3, 0xec, 0xee, 0x4e, 0xef,
113 0xef, 0x7a, 0xfd, 0x22, 0x70, 0xe2, 0xe6, 0x0a,
114 0xdc, 0xe0, 0xba, 0x2f, 0xac, 0xe6, 0x44, 0x4e,
115 0x9a, 0x4b, 0x41, 0xba, 0x73, 0x8d, 0x6c, 0x72,
116 0xfb, 0x16, 0x69, 0x16, 0x03, 0xc1, 0x8e, 0x0e ), AUTH() );
117
118/** AES-192-CBC */
121 CIPHERTEXT ( 0x4f, 0x02, 0x1d, 0xb2, 0x43, 0xbc, 0x63, 0x3d,
122 0x71, 0x78, 0x18, 0x3a, 0x9f, 0xa0, 0x71, 0xe8,
123 0xb4, 0xd9, 0xad, 0xa9, 0xad, 0x7d, 0xed, 0xf4,
124 0xe5, 0xe7, 0x38, 0x76, 0x3f, 0x69, 0x14, 0x5a,
125 0x57, 0x1b, 0x24, 0x20, 0x12, 0xfb, 0x7a, 0xe0,
126 0x7f, 0xa9, 0xba, 0xac, 0x3d, 0xf1, 0x02, 0xe0,
127 0x08, 0xb0, 0xe2, 0x79, 0x88, 0x59, 0x88, 0x81,
128 0xd9, 0x20, 0xa9, 0xe6, 0x4f, 0x56, 0x15, 0xcd ), AUTH() );
129
130/** AES-256-ECB (same test as AES-256-Core) */
133 CIPHERTEXT ( 0xf3, 0xee, 0xd1, 0xbd, 0xb5, 0xd2, 0xa0, 0x3c,
134 0x06, 0x4b, 0x5a, 0x7e, 0x3d, 0xb1, 0x81, 0xf8,
135 0x59, 0x1c, 0xcb, 0x10, 0xd4, 0x10, 0xed, 0x26,
136 0xdc, 0x5b, 0xa7, 0x4a, 0x31, 0x36, 0x28, 0x70,
137 0xb6, 0xed, 0x21, 0xb9, 0x9c, 0xa6, 0xf4, 0xf9,
138 0xf1, 0x53, 0xe7, 0xb1, 0xbe, 0xaf, 0xed, 0x1d,
139 0x23, 0x30, 0x4b, 0x7a, 0x39, 0xf9, 0xf3, 0xff,
140 0x06, 0x7d, 0x8d, 0x8f, 0x9e, 0x24, 0xec, 0xc7 ), AUTH() );
141
142/** AES-256-CBC */
145 CIPHERTEXT ( 0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba,
146 0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6,
147 0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d,
148 0x67, 0x9f, 0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d,
149 0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf,
150 0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61,
151 0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc,
152 0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b ), AUTH() );
153
154/**
155 * Perform AES self-test
156 *
157 */
158static void aes_test_exec ( void ) {
159 struct cipher_algorithm *ecb = &aes_ecb_algorithm;
160 struct cipher_algorithm *cbc = &aes_cbc_algorithm;
161 unsigned int keylen;
162
163 /* Correctness tests */
164 cipher_ok ( &aes_128_ecb );
165 cipher_ok ( &aes_128_cbc );
166 cipher_ok ( &aes_192_ecb );
167 cipher_ok ( &aes_192_cbc );
168 cipher_ok ( &aes_256_ecb );
169 cipher_ok ( &aes_256_cbc );
170
171 /* Speed tests */
172 for ( keylen = 128 ; keylen <= 256 ; keylen += 64 ) {
173 DBG ( "AES-%d-ECB encryption required %ld cycles per byte\n",
174 keylen, cipher_cost_encrypt ( ecb, ( keylen / 8 ) ) );
175 DBG ( "AES-%d-ECB decryption required %ld cycles per byte\n",
176 keylen, cipher_cost_decrypt ( ecb, ( keylen / 8 ) ) );
177 DBG ( "AES-%d-CBC encryption required %ld cycles per byte\n",
178 keylen, cipher_cost_encrypt ( cbc, ( keylen / 8 ) ) );
179 DBG ( "AES-%d-CBC decryption required %ld cycles per byte\n",
180 keylen, cipher_cost_decrypt ( cbc, ( keylen / 8 ) ) );
181 }
182}
183
184/** AES self-test */
185struct self_test aes_test __self_test = {
186 .name = "aes",
187 .exec = aes_test_exec,
188};
AES algorithm.
struct cipher_algorithm aes_ecb_algorithm
struct cipher_algorithm aes_cbc_algorithm
static void aes_test_exec(void)
Perform AES self-test.
Definition aes_test.c:158
#define AES_PLAINTEXT_NIST
Plaintext used for NIST test vectors.
Definition aes_test.c:72
#define AES_KEY_NIST_256
Key used for NIST 256-bit test vectors.
Definition aes_test.c:60
#define AES_KEY_NIST_128
Key used for NIST 128-bit test vectors.
Definition aes_test.c:49
#define AES_IV_NIST_CBC
Initialisation vector used for NIST CBC-mode test vectors.
Definition aes_test.c:67
#define AES_KEY_NIST_192
Key used for NIST 192-bit test vectors.
Definition aes_test.c:54
Assertions.
unsigned long cipher_cost_decrypt(struct cipher_algorithm *cipher, size_t key_len)
Calculate cipher decryption cost.
unsigned long cipher_cost_encrypt(struct cipher_algorithm *cipher, size_t key_len)
Calculate cipher encryption cost.
Cipher self-tests.
#define cipher_ok(test)
Report a cipher encryption and decryption test result.
#define IV(...)
Define inline initialisation vector.
Definition cipher_test.h:48
#define AUTH(...)
Define inline authentication tag.
Definition cipher_test.h:60
#define CIPHER_TEST(name, CIPHER, KEY, IV, ADDITIONAL, PLAINTEXT, CIPHERTEXT, AUTH)
Define a cipher test.
Definition cipher_test.h:75
#define ADDITIONAL(...)
Define inline additional data.
Definition cipher_test.h:51
#define CIPHERTEXT(...)
Define inline ciphertext data.
Definition cipher_test.h:57
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
String functions.
A cipher algorithm.
Definition crypto.h:51
A self-test set.
Definition test.h:15
Self-test infrastructure.
#define __self_test
Declare a self-test.
Definition test.h:32