hare

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

ct64+test.ha (7229B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use bytes;
      5 use crypto::cipher;
      6 
      7 @test fn test_encrypt_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 plain: [16]u8 = [
     14 		0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d,
     15 		0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34,
     16 	];
     17 
     18 	const cipher: [16]u8 = [
     19 		0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb,
     20 		0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32,
     21 	];
     22 
     23 	let result: [16]u8 = [0...];
     24 
     25 	let block = ct64();
     26 	ct64_init(&block, key);
     27 	defer cipher::finish(&block);
     28 	cipher::encrypt(&block, result[..], plain[..]);
     29 
     30 	assert(bytes::equal(cipher, result));
     31 };
     32 
     33 @test fn test_encrypt_128_multiple_blocks() void = {
     34 	const key: [16]u8 = [
     35 		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
     36 		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
     37 	];
     38 
     39 	const plain: [_]u8 = [
     40 		0xdb, 0x3a, 0x36, 0x50, 0x85, 0x60, 0x4c, 0x65,
     41 		0xc0, 0x22, 0x5a, 0x0d, 0x68, 0x2f, 0x19, 0xc2,
     42 		0x16, 0x27, 0xdd, 0xae, 0xd7, 0x28, 0x29, 0x23,
     43 		0xfa, 0x97, 0x28, 0xb0, 0x9a, 0x90, 0xfe, 0xb3,
     44 		0xde, 0x57, 0xbc, 0x15, 0x15, 0x8d, 0xb6, 0x29,
     45 		0x61, 0x40, 0x76, 0x51, 0x32, 0xc2, 0x3d, 0x1e,
     46 		0xdf, 0x97, 0x6a, 0x5e, 0x0a, 0x6b, 0xf6, 0x40,
     47 		0xb4, 0x08, 0x7e, 0xde, 0x17, 0xa4, 0x58, 0x98
     48 	];
     49 
     50 	const cipher: [_]u8 = [
     51 		0xdd, 0xf4, 0x53, 0x55, 0x18, 0x7a, 0xf0, 0x65,
     52 		0x59, 0xd6, 0xdc, 0x4e, 0xc2, 0x89, 0xff, 0x7b,
     53 		0x54, 0x41, 0x6a, 0xda, 0xa0, 0xad, 0x85, 0xbd,
     54 		0x75, 0x1e, 0x59, 0x15, 0x6d, 0x30, 0xa8, 0xa8,
     55 		0xa8, 0x54, 0x6e, 0xab, 0x9c, 0x47, 0x84, 0xd,
     56 		0x6e, 0xb5, 0x5e, 0xba, 0xb0, 0xd9, 0x47, 0xfa,
     57 		0x53, 0x6b, 0xff, 0x31, 0x47, 0x86, 0xf8, 0x4c,
     58 		0x6b, 0x65, 0xaa, 0xa2, 0xd2, 0xd7, 0xc1, 0xdf
     59 	];
     60 
     61 
     62 	let block = ct64();
     63 	ct64_init(&block, key[..]);
     64 	defer cipher::finish(&block);
     65 
     66 	// test from 1 to 4 parallel blocks
     67 	for (let i = 0z; i < 4; i += 1) {
     68 		let result: [64]u8 = [0...];
     69 
     70 		let sz = (i + 1) * 16;
     71 		cipher::encrypt(&block, result[0..sz], plain[0..sz]);
     72 
     73 		assert(bytes::equal(cipher[0..sz], result[0..sz]));
     74 	};
     75 };
     76 
     77 @test fn test_decrypt_128_multiple_blocks() void = {
     78 	const key: [16]u8 = [
     79 		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
     80 		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
     81 	];
     82 
     83 	const plain: [_]u8 = [
     84 		0xdb, 0x3a, 0x36, 0x50, 0x85, 0x60, 0x4c, 0x65,
     85 		0xc0, 0x22, 0x5a, 0x0d, 0x68, 0x2f, 0x19, 0xc2,
     86 		0x16, 0x27, 0xdd, 0xae, 0xd7, 0x28, 0x29, 0x23,
     87 		0xfa, 0x97, 0x28, 0xb0, 0x9a, 0x90, 0xfe, 0xb3,
     88 		0xde, 0x57, 0xbc, 0x15, 0x15, 0x8d, 0xb6, 0x29,
     89 		0x61, 0x40, 0x76, 0x51, 0x32, 0xc2, 0x3d, 0x1e,
     90 		0xdf, 0x97, 0x6a, 0x5e, 0x0a, 0x6b, 0xf6, 0x40,
     91 		0xb4, 0x08, 0x7e, 0xde, 0x17, 0xa4, 0x58, 0x98
     92 	];
     93 
     94 	const cipher: [_]u8 = [
     95 		0xdd, 0xf4, 0x53, 0x55, 0x18, 0x7a, 0xf0, 0x65,
     96 		0x59, 0xd6, 0xdc, 0x4e, 0xc2, 0x89, 0xff, 0x7b,
     97 		0x54, 0x41, 0x6a, 0xda, 0xa0, 0xad, 0x85, 0xbd,
     98 		0x75, 0x1e, 0x59, 0x15, 0x6d, 0x30, 0xa8, 0xa8,
     99 		0xa8, 0x54, 0x6e, 0xab, 0x9c, 0x47, 0x84, 0xd,
    100 		0x6e, 0xb5, 0x5e, 0xba, 0xb0, 0xd9, 0x47, 0xfa,
    101 		0x53, 0x6b, 0xff, 0x31, 0x47, 0x86, 0xf8, 0x4c,
    102 		0x6b, 0x65, 0xaa, 0xa2, 0xd2, 0xd7, 0xc1, 0xdf
    103 	];
    104 
    105 
    106 	let block = ct64();
    107 	ct64_init(&block, key[..]);
    108 	defer cipher::finish(&block);
    109 
    110 	// test from 1 to 4 parallel blocks
    111 	for (let i = 0z; i < 4; i += 1) {
    112 		let result: [64]u8 = [0...];
    113 
    114 		let sz = (i + 1) * 16;
    115 		cipher::decrypt(&block, result[0..sz], cipher[0..sz]);
    116 
    117 		assert(bytes::equal(plain[0..sz], result[0..sz]));
    118 	};
    119 };
    120 
    121 @test fn test_decrypt_128() void = {
    122 	const key: []u8 = [
    123 		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
    124 		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
    125 	];
    126 
    127 	const plain: [16]u8 = [
    128 		0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d,
    129 		0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34,
    130 	];
    131 
    132 	const cipher: [16]u8 = [
    133 		0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb,
    134 		0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32,
    135 	];
    136 
    137 	let result: [16]u8 = [0...];
    138 
    139 	let block = ct64();
    140 	ct64_init(&block, key[..]);
    141 	defer cipher::finish(&block);
    142 
    143 	cipher::decrypt(&block, result[..], cipher[..]);
    144 
    145 	assert(bytes::equal(plain, result));
    146 };
    147 
    148 // fips-197.pdf Appendix C.1
    149 @test fn test_example_vector1() void = {
    150 	const key: [_]u8 = [
    151 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    152 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    153 	];
    154 
    155 	const plain: [_]u8 = [
    156 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    157 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
    158 	];
    159 
    160 	const cipher: [_]u8 = [
    161 		0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
    162 		0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a,
    163 	];
    164 
    165 	let result: [16]u8 = [0...];
    166 
    167 	let block = ct64();
    168 	ct64_init(&block, key[..]);
    169 	defer cipher::finish(&block);
    170 
    171 	cipher::encrypt(&block, result[..], plain[..]);
    172 	assert(bytes::equal(cipher, result));
    173 
    174 	cipher::decrypt(&block, result[..], cipher[..]);
    175 	assert(bytes::equal(plain, result));
    176 };
    177 
    178 @test fn test_example_vector1_in_place() void = {
    179 	const key: [_]u8 = [
    180 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    181 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    182 	];
    183 
    184 	const plain: [_]u8 = [
    185 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    186 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
    187 	];
    188 
    189 	const cipher: [_]u8 = [
    190 		0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
    191 		0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a,
    192 	];
    193 
    194 	let result: [16]u8 = plain;
    195 
    196 	let block = ct64();
    197 	ct64_init(&block, key[..]);
    198 	defer cipher::finish(&block);
    199 
    200 	cipher::encrypt(&block, result[..], result[..]);
    201 	assert(bytes::equal(cipher, result));
    202 
    203 	cipher::decrypt(&block, result[..], result[..]);
    204 	assert(bytes::equal(plain, result));
    205 };
    206 
    207 // fips-197.pdf Appendix C.2
    208 @test fn test_example_vector2() void = {
    209 	const key: [_]u8 = [
    210 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    211 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    212 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    213 	];
    214 
    215 	const plain: [_]u8 = [
    216 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    217 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
    218 	];
    219 
    220 	const cipher: [_]u8 = [
    221 		0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
    222 		0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91,
    223 	];
    224 
    225 	let result: [16]u8 = [0...];
    226 	let block = ct64();
    227 	ct64_init(&block, key[..]);
    228 	defer cipher::finish(&block);
    229 
    230 	cipher::encrypt(&block, result[..], plain[..]);
    231 	assert(bytes::equal(cipher, result));
    232 
    233 	cipher::decrypt(&block, result[..], cipher[..]);
    234 	assert(bytes::equal(plain, result));
    235 };
    236 
    237 // fips-197.pdf Appendix C.3
    238 @test fn test_example_vector3() void = {
    239 	const key: []u8 = [
    240 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    241 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
    242 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    243 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
    244 	];
    245 
    246 	const plain: []u8 = [
    247 		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    248 		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
    249 	];
    250 
    251 	const cipher: []u8 = [
    252 		0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
    253 		0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89,
    254 	];
    255 
    256 	let result: [16]u8 = [0...];
    257 	let block = ct64();
    258 	ct64_init(&block, key[..]);
    259 	defer cipher::finish(&block);
    260 
    261 	cipher::encrypt(&block, result[..], plain[..]);
    262 	assert(bytes::equal(cipher, result));
    263 
    264 	cipher::decrypt(&block, result[..], cipher[..]);
    265 	assert(bytes::equal(plain, result));
    266 };