hare

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

+test.ha (5475B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use bytes;
      5 use encoding::hex;
      6 use strings;
      7 use test;
      8 
      9 @test fn mode_d_one_pass() void = {
     10 	let pass: [32]u8 = [1...];
     11 	let salt: [16]u8 = [2...];
     12 	let secret: [8]u8 = [3...];
     13 	let data: [12]u8 = [4...];
     14 	let result: [32]u8 = [0...];
     15 
     16 	let expected: [_]u8 = [
     17 		0xfa, 0x17, 0x75, 0xca, 0x80, 0x90, 0x64, 0x66, 0x18, 0xbe,
     18 		0x70, 0xeb, 0x0f, 0xc9, 0xde, 0x43, 0x67, 0x58, 0xed, 0x0c,
     19 		0xa5, 0x36, 0x83, 0x1a, 0xe9, 0xe1, 0x03, 0x48, 0x93, 0x81,
     20 		0xc1, 0x79,
     21 	];
     22 
     23 	let cfg = conf {
     24 		secret = secret,
     25 		data = data,
     26 		passes = 1,
     27 		parallel = 4,
     28 		version = 0x13,
     29 		mem = 32,
     30 		...
     31 	};
     32 
     33 	argon2d(result[..], pass, salt, &cfg)!;
     34 
     35 	assert(bytes::equal(result, expected));
     36 };
     37 
     38 @test fn rfc_d_test_vector() void = {
     39 	let pass: [32]u8 = [1...];
     40 	let salt: [16]u8 = [2...];
     41 	let secret: [8]u8 = [3...];
     42 	let data: [12]u8 = [4...];
     43 	let result: [32]u8 = [0...];
     44 
     45 	let mem: []u64 = alloc([0...], 32z * BLOCKSZ)!;
     46 	defer free(mem);
     47 
     48 	let expected: [_]u8 = [
     49 		0x51, 0x2b, 0x39, 0x1b, 0x6f, 0x11, 0x62, 0x97, 0x53, 0x71,
     50 		0xd3, 0x09, 0x19, 0x73, 0x42, 0x94, 0xf8, 0x68, 0xe3, 0xbe,
     51 		0x39, 0x84, 0xf3, 0xc1, 0xa1, 0x3a, 0x4d, 0xb9, 0xfa, 0xbe,
     52 		0x4a, 0xcb,
     53 	];
     54 
     55 	let cfg = conf {
     56 		secret = secret,
     57 		data = data,
     58 		passes = 3,
     59 		parallel = 4,
     60 		version = 0x13,
     61 		mem = mem[..],
     62 		...
     63 	};
     64 
     65 	argon2d(result[..], pass, salt, &cfg)!;
     66 
     67 	assert(bytes::equal(result, expected));
     68 };
     69 
     70 
     71 @test fn rfc_i_test_vector() void = {
     72 	let pass: [32]u8 = [1...];
     73 	let salt: [16]u8 = [2...];
     74 	let secret: [8]u8 = [3...];
     75 	let data: [12]u8 = [4...];
     76 	let result: [32]u8 = [0...];
     77 
     78 	let mem: []u64 = alloc([0...], 32z * BLOCKSZ)!;
     79 	defer free(mem);
     80 
     81 	let expected: [_]u8 = [
     82 		0xc8, 0x14, 0xd9, 0xd1, 0xdc, 0x7f, 0x37, 0xaa, 0x13, 0xf0,
     83 		0xd7, 0x7f, 0x24, 0x94, 0xbd, 0xa1, 0xc8, 0xde, 0x6b, 0x01,
     84 		0x6d, 0xd3, 0x88, 0xd2, 0x99, 0x52, 0xa4, 0xc4, 0x67, 0x2b,
     85 		0x6c, 0xe8,
     86 	];
     87 
     88 	let cfg = conf {
     89 		secret = secret,
     90 		data = data,
     91 		passes = 3,
     92 		parallel = 4,
     93 		version = 0x13,
     94 		mem = mem[..],
     95 		...
     96 	};
     97 
     98 	argon2i(result[..], pass, salt, &cfg)!;
     99 
    100 	assert(bytes::equal(result, expected));
    101 };
    102 
    103 @test fn rfc_id_test_vector() void = {
    104 	let pass: [32]u8 = [1...];
    105 	let salt: [16]u8 = [2...];
    106 	let secret: [8]u8 = [3...];
    107 	let data: [12]u8 = [4...];
    108 	let result: [32]u8 = [0...];
    109 
    110 	let mem: []u64 = alloc([0...], 32z * BLOCKSZ)!;
    111 	defer free(mem);
    112 
    113 	let expected: [_]u8 = [
    114 		0x0d, 0x64, 0x0d, 0xf5, 0x8d, 0x78, 0x76, 0x6c, 0x08, 0xc0,
    115 		0x37, 0xa3, 0x4a, 0x8b, 0x53, 0xc9, 0xd0, 0x1e, 0xf0, 0x45,
    116 		0x2d, 0x75, 0xb6, 0x5e, 0xb5, 0x25, 0x20, 0xe9, 0x6b, 0x01,
    117 		0xe6, 0x59,
    118 	];
    119 
    120 	let cfg = conf {
    121 		secret = secret,
    122 		data = data,
    123 		passes = 3,
    124 		parallel = 4,
    125 		version = 0x13,
    126 		mem = mem[..],
    127 		...
    128 	};
    129 
    130 	argon2id(result[..], pass, salt, &cfg)!;
    131 
    132 	assert(bytes::equal(result, expected));
    133 };
    134 
    135 type tcase = struct {
    136 	c: conf,
    137 	m: mode,
    138 	h: str,
    139 };
    140 
    141 @test fn samples() void = {
    142 	const pass = strings::toutf8("trustno1");
    143 	const salt = strings::toutf8("abcdefgh");
    144 
    145 	const tests: [_]tcase = [
    146 		tcase {
    147 			c = conf {
    148 				passes = 1,
    149 				parallel = 3,
    150 				version = 0x13,
    151 				mem = 64,
    152 				...
    153 			},
    154 			m = mode::ID,
    155 			h = "c7ada5ba3222fa45a3802249b509dcfb10e68a50e3faad2a6377eeca8395ab47",
    156 		},
    157 		tcase {
    158 			c = conf {
    159 				passes = 1,
    160 				parallel = 4,
    161 				version = 0x13,
    162 				mem = 64,
    163 				...
    164 			},
    165 			m = mode::ID,
    166 			h = "21543b2017ede3f865ea5cb88295628ba25eb3be53a8c4aeb0ac1a264be0110a",
    167 		},
    168 		tcase {
    169 			c = conf {
    170 				passes = 1,
    171 				parallel = 4,
    172 				version = 0x13,
    173 				mem = 64,
    174 				...
    175 			},
    176 			m = mode::I,
    177 			h = "5c3124ce5f3556e5e25f06b5108718f2cd72afee98a3249656eb85ecc0e5b314",
    178 		},
    179 		tcase {
    180 			c = conf {
    181 				passes = 1,
    182 				parallel = 4,
    183 				version = 0x13,
    184 				mem = 64,
    185 				...
    186 			},
    187 			m = mode::D,
    188 			h = "d75524ad0b899363ce77f2d1e1040763dc01cfc725db635391bba163001f08cb",
    189 		},
    190 		tcase {
    191 			c = conf {
    192 				passes = 3,
    193 				parallel = 3,
    194 				version = 0x13,
    195 				mem = 64,
    196 				...
    197 			},
    198 			m = mode::ID,
    199 			h = "226c3ca6caba42b102035d332a11b350f1e19675fccb6e24aa33ca8c31d588c1",
    200 		},
    201 		tcase {
    202 			c = conf {
    203 				passes = 1,
    204 				parallel = 8,
    205 				version = 0x13,
    206 				mem = 64,
    207 				...
    208 			},
    209 			m = mode::ID,
    210 			h = "fadf598b70708f4d91b0e98f038fd25a73950f1f85d57fb250740d817f95e9a9",
    211 		},
    212 		tcase {
    213 			c = conf {
    214 				passes = 1,
    215 				parallel = 4,
    216 				version = 0x13,
    217 				mem = 96,
    218 				...
    219 			},
    220 			m = mode::ID,
    221 			h = "c99aa41cb53cc4919d336c19d38b30d8633c71faa9475293f3fbe0aa6ccd65b2",
    222 		},
    223 	];
    224 
    225 	for (let i = 0z; i < len(tests); i += 1) {
    226 		const t = tests[i];
    227 		const expected = hex::decodestr(t.h)!;
    228 		defer free(expected);
    229 		let dest: []u8 = alloc([0...], len(expected))!;
    230 		defer free(dest);
    231 
    232 		argon2(dest, pass, salt, &t.c, t.m)!;
    233 		assert(bytes::equal(expected, dest));
    234 	};
    235 };
    236 
    237 @test fn samples_slow() void = {
    238 	test::require("slow");
    239 
    240 	const pass = strings::toutf8("trustno1");
    241 	const salt = strings::toutf8("abcdefgh");
    242 
    243 	const tests: [_]tcase = [
    244 		tcase {
    245 			c = low_mem_conf,
    246 			m = mode::ID,
    247 			h = "8974537c53677aae532b319af700bb4232a0d74eee7d57296b2a3f8303a6bafe",
    248 		},
    249 		tcase {
    250 			c = default_conf,
    251 			m = mode::ID,
    252 			h = "3b282cbf435b0e022f7041549583ddc802e519109f1da8f12d2054910913d660",
    253 		},
    254 	];
    255 
    256 	for (let i = 0z; i < len(tests); i += 1) {
    257 		const t = tests[i];
    258 		const expected = hex::decodestr(t.h)!;
    259 		defer free(expected);
    260 		let dest: []u8 = alloc([0...], len(expected))!;
    261 		defer free(dest);
    262 
    263 		argon2(dest, pass, salt, &t.c, t.m)!;
    264 		assert(bytes::equal(expected, dest));
    265 	};
    266 };