hare

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

ni+x86_64.ha (8851B)


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