hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

ni_test+x86_64.ha (9797B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use bytes;
      5 use crypto::cipher;
      6 use test;
      7 
      8 const zero_rk: [EXPKEYLEN256]u8 = [0...];
      9 
     10 @test fn ni_enabled() void = {
     11 	assert((hwsup && rtvtable == &x86ni_vtable && initfuncptr == &x86ni_init)
     12 		|| !x86ni_available());
     13 };
     14 
     15 // taken from fips-197.pdf Section A.1
     16 @test fn ni_enc_key_expand_128() void = {
     17 	if (!x86ni_available()) {
     18 		test::skip("Native x86 AES interface isn't available");
     19 	};
     20 
     21 	const key: [16]u8 = [
     22 		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
     23 		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
     24 	];
     25 
     26 	const expected_rounds: [_]u8 = [
     27 		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
     28 		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
     29 		0xa0, 0xfa, 0xfe, 0x17, 0x88, 0x54, 0x2c, 0xb1,
     30 		0x23, 0xa3, 0x39, 0x39, 0x2a, 0x6c, 0x76, 0x05,
     31 		0xf2, 0xc2, 0x95, 0xf2, 0x7a, 0x96, 0xb9, 0x43,
     32 		0x59, 0x35, 0x80, 0x7a, 0x73, 0x59, 0xf6, 0x7f,
     33 		0x3d, 0x80, 0x47, 0x7d, 0x47, 0x16, 0xfe, 0x3e,
     34 		0x1e, 0x23, 0x7e, 0x44, 0x6d, 0x7a, 0x88, 0x3b,
     35 		0xef, 0x44, 0xa5, 0x41, 0xa8, 0x52, 0x5b, 0x7f,
     36 		0xb6, 0x71, 0x25, 0x3b, 0xdb, 0x0b, 0xad, 0x00,
     37 		0xd4, 0xd1, 0xc6, 0xf8, 0x7c, 0x83, 0x9d, 0x87,
     38 		0xca, 0xf2, 0xb8, 0xbc, 0x11, 0xf9, 0x15, 0xbc,
     39 		0x6d, 0x88, 0xa3, 0x7a, 0x11, 0x0b, 0x3e, 0xfd,
     40 		0xdb, 0xf9, 0x86, 0x41, 0xca, 0x00, 0x93, 0xfd,
     41 		0x4e, 0x54, 0xf7, 0x0e, 0x5f, 0x5f, 0xc9, 0xf3,
     42 		0x84, 0xa6, 0x4f, 0xb2, 0x4e, 0xa6, 0xdc, 0x4f,
     43 		0xea, 0xd2, 0x73, 0x21, 0xb5, 0x8d, 0xba, 0xd2,
     44 		0x31, 0x2b, 0xf5, 0x60, 0x7f, 0x8d, 0x29, 0x2f,
     45 		0xac, 0x77, 0x66, 0xf3, 0x19, 0xfa, 0xdc, 0x21,
     46 		0x28, 0xd1, 0x29, 0x41, 0x57, 0x5c, 0x00, 0x6e,
     47 		0xd0, 0x14, 0xf9, 0xa8, 0xc9, 0xee, 0x25, 0x89,
     48 		0xe1, 0x3f, 0x0c, 0xc8, 0xb6, 0x63, 0x0c, 0xa6,
     49 	];
     50 
     51 	let block = x86ni();
     52 	x86ni_init(&block, key[..]);
     53 
     54 	assert(block.rounds == 10);
     55 	assert(bytes::equal(expected_rounds[..], block.expkey[..EXPKEYLEN128]));
     56 
     57 	cipher::finish(&block);
     58 	assert(bytes::equal(zero_rk[..], block.expkey[..EXPKEYLEN256]));
     59 };
     60 
     61 // taken from fips-197.pdf Section A.2
     62 @test fn ni_enc_key_expand_192() void = {
     63 	if (!x86ni_available()) {
     64 		test::skip("Native x86 AES interface isn't available");
     65 	};
     66 
     67 	const key: [24]u8 = [
     68 		0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
     69 		0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
     70 		0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
     71 	];
     72 
     73 	const expected_rounds: [_]u8 = [
     74 		0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
     75 		0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
     76 		0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b,
     77 		0xfe, 0x0c, 0x91, 0xf7, 0x24, 0x02, 0xf5, 0xa5,
     78 		0xec, 0x12, 0x06, 0x8e, 0x6c, 0x82, 0x7f, 0x6b,
     79 		0x0e, 0x7a, 0x95, 0xb9, 0x5c, 0x56, 0xfe, 0xc2,
     80 		0x4d, 0xb7, 0xb4, 0xbd, 0x69, 0xb5, 0x41, 0x18,
     81 		0x85, 0xa7, 0x47, 0x96, 0xe9, 0x25, 0x38, 0xfd,
     82 		0xe7, 0x5f, 0xad, 0x44, 0xbb, 0x09, 0x53, 0x86,
     83 		0x48, 0x5a, 0xf0, 0x57, 0x21, 0xef, 0xb1, 0x4f,
     84 		0xa4, 0x48, 0xf6, 0xd9, 0x4d, 0x6d, 0xce, 0x24,
     85 		0xaa, 0x32, 0x63, 0x60, 0x11, 0x3b, 0x30, 0xe6,
     86 		0xa2, 0x5e, 0x7e, 0xd5, 0x83, 0xb1, 0xcf, 0x9a,
     87 		0x27, 0xf9, 0x39, 0x43, 0x6a, 0x94, 0xf7, 0x67,
     88 		0xc0, 0xa6, 0x94, 0x07, 0xd1, 0x9d, 0xa4, 0xe1,
     89 		0xec, 0x17, 0x86, 0xeb, 0x6f, 0xa6, 0x49, 0x71,
     90 		0x48, 0x5f, 0x70, 0x32, 0x22, 0xcb, 0x87, 0x55,
     91 		0xe2, 0x6d, 0x13, 0x52, 0x33, 0xf0, 0xb7, 0xb3,
     92 		0x40, 0xbe, 0xeb, 0x28, 0x2f, 0x18, 0xa2, 0x59,
     93 		0x67, 0x47, 0xd2, 0x6b, 0x45, 0x8c, 0x55, 0x3e,
     94 		0xa7, 0xe1, 0x46, 0x6c, 0x94, 0x11, 0xf1, 0xdf,
     95 		0x82, 0x1f, 0x75, 0x0a, 0xad, 0x07, 0xd7, 0x53,
     96 		0xca, 0x40, 0x05, 0x38, 0x8f, 0xcc, 0x50, 0x06,
     97 		0x28, 0x2d, 0x16, 0x6a, 0xbc, 0x3c, 0xe7, 0xb5,
     98 		0xe9, 0x8b, 0xa0, 0x6f, 0x44, 0x8c, 0x77, 0x3c,
     99 		0x8e, 0xcc, 0x72, 0x04, 0x01, 0x00, 0x22, 0x02,
    100 	];
    101 
    102 	let block = x86ni();
    103 	x86ni_init(&block, key[..]);
    104 
    105 	assert(block.rounds == 12);
    106 	assert(bytes::equal(expected_rounds[..], block.expkey[..EXPKEYLEN192]));
    107 };
    108 
    109 
    110 // taken from fips-197.pdf Section A.3
    111 @test fn ni_enc_key_expand_256() void = {
    112 	if (!x86ni_available()) {
    113 		test::skip("Native x86 AES interface isn't available");
    114 	};
    115 
    116 	const key: [32]u8 = [
    117 		0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
    118 		0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
    119 		0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
    120 		0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4,
    121 	];
    122 
    123 	const expected_rounds: [_]u8 = [
    124 		0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
    125 		0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
    126 		0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
    127 		0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4,
    128 		0x9b, 0xa3, 0x54, 0x11, 0x8e, 0x69, 0x25, 0xaf,
    129 		0xa5, 0x1a, 0x8b, 0x5f, 0x20, 0x67, 0xfc, 0xde,
    130 		0xa8, 0xb0, 0x9c, 0x1a, 0x93, 0xd1, 0x94, 0xcd,
    131 		0xbe, 0x49, 0x84, 0x6e, 0xb7, 0x5d, 0x5b, 0x9a,
    132 		0xd5, 0x9a, 0xec, 0xb8, 0x5b, 0xf3, 0xc9, 0x17,
    133 		0xfe, 0xe9, 0x42, 0x48, 0xde, 0x8e, 0xbe, 0x96,
    134 		0xb5, 0xa9, 0x32, 0x8a, 0x26, 0x78, 0xa6, 0x47,
    135 		0x98, 0x31, 0x22, 0x29, 0x2f, 0x6c, 0x79, 0xb3,
    136 		0x81, 0x2c, 0x81, 0xad, 0xda, 0xdf, 0x48, 0xba,
    137 		0x24, 0x36, 0x0a, 0xf2, 0xfa, 0xb8, 0xb4, 0x64,
    138 		0x98, 0xc5, 0xbf, 0xc9, 0xbe, 0xbd, 0x19, 0x8e,
    139 		0x26, 0x8c, 0x3b, 0xa7, 0x09, 0xe0, 0x42, 0x14,
    140 		0x68, 0x00, 0x7b, 0xac, 0xb2, 0xdf, 0x33, 0x16,
    141 		0x96, 0xe9, 0x39, 0xe4, 0x6c, 0x51, 0x8d, 0x80,
    142 		0xc8, 0x14, 0xe2, 0x04, 0x76, 0xa9, 0xfb, 0x8a,
    143 		0x50, 0x25, 0xc0, 0x2d, 0x59, 0xc5, 0x82, 0x39,
    144 		0xde, 0x13, 0x69, 0x67, 0x6c, 0xcc, 0x5a, 0x71,
    145 		0xfa, 0x25, 0x63, 0x95, 0x96, 0x74, 0xee, 0x15,
    146 		0x58, 0x86, 0xca, 0x5d, 0x2e, 0x2f, 0x31, 0xd7,
    147 		0x7e, 0x0a, 0xf1, 0xfa, 0x27, 0xcf, 0x73, 0xc3,
    148 		0x74, 0x9c, 0x47, 0xab, 0x18, 0x50, 0x1d, 0xda,
    149 		0xe2, 0x75, 0x7e, 0x4f, 0x74, 0x01, 0x90, 0x5a,
    150 		0xca, 0xfa, 0xaa, 0xe3, 0xe4, 0xd5, 0x9b, 0x34,
    151 		0x9a, 0xdf, 0x6a, 0xce, 0xbd, 0x10, 0x19, 0x0d,
    152 		0xfe, 0x48, 0x90, 0xd1, 0xe6, 0x18, 0x8d, 0x0b,
    153 		0x04, 0x6d, 0xf3, 0x44, 0x70, 0x6c, 0x63, 0x1e,
    154 	];
    155 
    156 	let block = x86ni();
    157 	x86ni_init(&block, key[..]);
    158 
    159 	assert(block.rounds == 14);
    160 	assert(bytes::equal(expected_rounds[..], block.expkey[..EXPKEYLEN256]));
    161 };
    162 
    163 @test fn ni_test_encrypt_128() void = {
    164 	if (!x86ni_available()) {
    165 		test::skip("Native x86 AES interface isn't available");
    166 	};
    167 
    168 	let key: [_]u8 = [
    169 		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
    170 		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
    171 	];
    172 
    173 	let plain: [16]u8 = [
    174 		0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d,
    175 		0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34,
    176 	];
    177 
    178 	const cipher: [16]u8 = [
    179 		0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb,
    180 		0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32,
    181 	];
    182 
    183 	let result: [16]u8 = [0...];
    184 	let b = x86ni();
    185 
    186 	x86ni_init(&b, key[..]);
    187 	cipher::encrypt(&b, result[..], plain);
    188 
    189 	assert(bytes::equal(cipher, result));
    190 };
    191 
    192 @test fn ni_test_decrypt_128() void = {
    193 	if (!x86ni_available()) {
    194 		test::skip("Native x86 AES interface isn't available");
    195 	};
    196 
    197 	const key: [_]u8 = [
    198 		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
    199 		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
    200 	];
    201 
    202 	const plain: [16]u8 = [
    203 		0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d,
    204 		0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34,
    205 	];
    206 
    207 	const cipher: [16]u8 = [
    208 		0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb,
    209 		0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32,
    210 	];
    211 
    212 	let result: [16]u8 = [0...];
    213 	let b = x86ni();
    214 
    215 	x86ni_init(&b, key[..]);
    216 	cipher::decrypt(&b, result[..], cipher);
    217 	assert(bytes::equal(plain, result));
    218 };
    219 
    220 // fips-197.pdf Appendix C.1
    221 @test fn ni_test_example_vector1() void = {
    222 	if (!x86ni_available()) {
    223 		test::skip("Native x86 AES interface isn't available");
    224 	};
    225 
    226 	const key: []u8 = [
    227 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    228 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    229 	];
    230 
    231 	const plain: []u8 = [
    232 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    233 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
    234 	];
    235 
    236 	const cipher: []u8 = [
    237 		0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
    238 		0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a,
    239 	];
    240 
    241 	let result: [16]u8 = [0...];
    242 	let b = x86ni();
    243 
    244 	x86ni_init(&b, key[..]);
    245 
    246 	cipher::encrypt(&b, result[..], plain);
    247 	assert(bytes::equal(cipher, result));
    248 
    249 	cipher::decrypt(&b, result[..], cipher);
    250 	assert(bytes::equal(plain, result));
    251 };
    252 
    253 // fips-197.pdf Appendix C.2
    254 @test fn ni_test_example_vector2() void = {
    255 	if (!x86ni_available()) {
    256 		test::skip("Native x86 AES interface isn't available");
    257 	};
    258 
    259 	const key: []u8 = [
    260 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    261 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    262 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    263 	];
    264 
    265 	const plain: []u8 = [
    266 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    267 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
    268 	];
    269 
    270 	const cipher: []u8 = [
    271 		0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
    272 		0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91,
    273 	];
    274 
    275 	let result: [16]u8 = [0...];
    276 	let b = x86ni();
    277 
    278 	x86ni_init(&b, key[..]);
    279 
    280 	cipher::encrypt(&b, result[..], plain);
    281 	assert(bytes::equal(cipher, result));
    282 
    283 	cipher::decrypt(&b, result[..], cipher);
    284 	assert(bytes::equal(plain, result));
    285 };
    286 
    287 // fips-197.pdf Appendix C.3
    288 @test fn ni_test_example_vector3() void = {
    289 	if (!x86ni_available()) {
    290 		test::skip("Native x86 AES interface isn't available");
    291 	};
    292 
    293 	const key: []u8 = [
    294 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    295 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    296 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    297 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
    298 	];
    299 
    300 	const plain: []u8 = [
    301 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    302 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
    303 	];
    304 
    305 	const cipher: []u8 = [
    306 		0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
    307 		0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89,
    308 	];
    309 
    310 	let result: [16]u8 = [0...];
    311 	let b = x86ni();
    312 
    313 	x86ni_init(&b, key[..]);
    314 
    315 	cipher::encrypt(&b, result[..], plain);
    316 	assert(bytes::equal(cipher, result));
    317 
    318 	cipher::decrypt(&b, result[..], cipher);
    319 	assert(bytes::equal(plain, result));
    320 };