hare

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

+test.ha (3349B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use bytes;
      5 use crypto::mac;
      6 use crypto::sha1;
      7 use crypto::sha256;
      8 use hash;
      9 use strings;
     10 
     11 fn assert_hmac_sha1(keystr: str, vectors: [](str, [20]u8)) void = {
     12 	let key = strings::toutf8(keystr);
     13 	let h = sha1::sha1();
     14 	let buf: [sha1::BLOCKSZ]u8 = [0x1...];
     15 
     16 	for (let i = 0z; i < len(vectors); i += 1) {
     17 		hash::reset(&h);
     18 		let hmac = hmac(&h, key, buf);
     19 		defer mac::finish(&hmac);
     20 
     21 		const vector = vectors[i];
     22 
     23 		mac::write(&hmac, strings::toutf8(vector.0));
     24 
     25 		let sum: [sha1::SZ]u8 = [0...];
     26 		mac::sum(&hmac, sum);
     27 
     28 		assert(bytes::equal(vector.1, sum));
     29 	};
     30 };
     31 
     32 @test fn hmac_sha1_empty_key() void = {
     33 	const vectors: [_](str, [20]u8) = [
     34 		(
     35 			"",
     36 			[
     37 				0xfb, 0xdb, 0x1d, 0x1b, 0x18, 0xaa, 0x6c, 0x08,
     38 				0x32, 0x4b, 0x7d, 0x64, 0xb7, 0x1f, 0xb7, 0x63,
     39 				0x70, 0x69, 0x0e, 0x1d,
     40 			]
     41 		),
     42 		(
     43 			"abc",
     44 			[
     45 				0x9b, 0x4a, 0x91, 0x8f, 0x39, 0x8d, 0x74, 0xd3,
     46 				0xe3, 0x67, 0x97, 0x0a, 0xba, 0x3c, 0xbe, 0x54,
     47 				0xe4, 0xd2, 0xb5, 0xd9,
     48 			]
     49 		),
     50 		(
     51 			"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijkl"
     52 			"mnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopq"
     53 			"rstu",
     54 			[
     55 				0xf4, 0x50, 0x13, 0xac, 0xc6, 0xa6, 0xa5, 0x3a,
     56 				0x49, 0xbf, 0xc0, 0x7b, 0x1e, 0xd8, 0xf5, 0x39,
     57 				0x5b, 0xf3, 0x9d, 0x96,
     58 			]
     59 		),
     60 	];
     61 	assert_hmac_sha1("", vectors);
     62 };
     63 
     64 @test fn hmac_sha1() void = {
     65 	const vectors: [_](str, [20]u8) = [
     66 		(
     67 			"",
     68 			[
     69 				0xc5, 0x89, 0xa2, 0x7a, 0xb0, 0xaf, 0x9f, 0xe7,
     70 				0xe0, 0x38, 0x68, 0x24, 0x73, 0x5d, 0x22, 0x0d,
     71 				0x04, 0x1b, 0x70, 0xf0,
     72 			]
     73 		),
     74 		(
     75 			"abc",
     76 			[
     77 				0x85, 0x2d, 0x02, 0xc6, 0xfd, 0x3b, 0x51, 0xdf,
     78 				0x64, 0x4a, 0xfb, 0x13, 0x81, 0x76, 0xb3, 0x07,
     79 				0x61, 0xca, 0x95, 0x27,
     80 			]
     81 		),
     82 		(
     83 			"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijkl"
     84 			"mnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopq"
     85 			"rstu",
     86 			[
     87 				0x41, 0x29, 0x43, 0xf0, 0x84, 0x0d, 0xc1, 0xa1,
     88 				0x33, 0x8a, 0x16, 0xec, 0x3d, 0x73, 0x0b, 0x76,
     89 				0x25, 0xac, 0xf0, 0xaa,
     90 			]
     91 		),
     92 	];
     93 
     94 	assert_hmac_sha1("trustno1", vectors);
     95 };
     96 
     97 @test fn hmac_sha1_large_key() void = {
     98 	const vectors: [_](str, [20]u8) = [
     99 		(
    100 			"",
    101 			[
    102 				0x24, 0xe4, 0x38, 0xcb, 0x07, 0x54, 0xef, 0x48,
    103 				0x97, 0x20, 0x05, 0x65, 0xd5, 0xf2, 0x7f, 0x6e,
    104 				0x62, 0x77, 0xfc, 0x95
    105 			],
    106 		),
    107 		(
    108 			"abc",
    109 			[
    110 				0xe3, 0x1a, 0x77, 0xff, 0xf1, 0x4b, 0xbf, 0xba,
    111 				0x5d, 0x2f, 0x8b, 0x44, 0xa6, 0x33, 0xd4, 0xc9,
    112 				0xfc, 0x8a, 0xd0, 0xe9,
    113 			]
    114 		),
    115 		(
    116 			"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijkl"
    117 			"mnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopq"
    118 			"rstu",
    119 			[
    120 				0x5a, 0x64, 0x69, 0x18, 0xa0, 0xe3, 0xaf, 0xe9,
    121 				0xab, 0x45, 0x1d, 0xf3, 0xcd, 0xdd, 0x1e, 0x7e,
    122 				0xb9, 0x19, 0xa7, 0x4b
    123 			]
    124 		),
    125 	];
    126 
    127 	let key = "xxabcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhi"
    128 		"jklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
    129 	assert_hmac_sha1(key, vectors);
    130 };
    131 
    132 @test fn sha256() void = {
    133 	const expected: [_]u8 = [
    134 		0xb6, 0x13, 0x67, 0x9a, 0x08, 0x14, 0xd9, 0xec, 0x77, 0x2f,
    135 		0x95, 0xd7, 0x78, 0xc3, 0x5f, 0xc5, 0xff, 0x16, 0x97, 0xc4,
    136 		0x93, 0x71, 0x56, 0x53, 0xc6, 0xc7, 0x12, 0x14, 0x42, 0x92,
    137 		0xc5, 0xad,
    138 	];
    139 
    140 	let hmac = sha256([]);
    141 	defer mac::finish(&hmac);
    142 
    143 	let sum: [sha256::SZ]u8 = [0...];
    144 	mac::sum(&hmac, sum);
    145 
    146 	assert(bytes::equal(expected, sum));
    147 };