hare

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

encryption+test.ha (5674B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use bytes;
      5 use io;
      6 use memio;
      7 
      8 @test fn encrypt() void = {
      9 	let plain: [_]u8 = [
     10 		0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64,
     11 		0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
     12 		0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c,
     13 		0x61, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x39, 0x39,
     14 		0x3a, 0x20, 0x49, 0x66, 0x20, 0x49, 0x20, 0x63, 0x6f, 0x75,
     15 		0x6c, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x79,
     16 		0x6f, 0x75, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e,
     17 		0x65, 0x20, 0x74, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20,
     18 		0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65,
     19 		0x2c, 0x20, 0x73, 0x75, 0x6e, 0x73, 0x63, 0x72, 0x65, 0x65,
     20 		0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65,
     21 		0x20, 0x69, 0x74, 0x2e
     22 	];
     23 
     24 	let ad: [_]u8 = [
     25 		0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
     26 		0xc6, 0xc7,
     27 	];
     28 
     29 	let key: [_]u8 = [
     30 		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
     31 		0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93,
     32 		0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d,
     33 		0x9e, 0x9f,
     34 	];
     35 
     36 	let nonce: [_]u8 = [
     37 		0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
     38 		0x46, 0x47,
     39 	];
     40 
     41 	let cipher: [_]u8 = [
     42 		0xd3, 0x1a, 0x8d, 0x34, 0x64, 0x8e, 0x60, 0xdb, 0x7b, 0x86,
     43 		0xaf, 0xbc, 0x53, 0xef, 0x7e, 0xc2, 0xa4, 0xad, 0xed, 0x51,
     44 		0x29, 0x6e, 0x08, 0xfe, 0xa9, 0xe2, 0xb5, 0xa7, 0x36, 0xee,
     45 		0x62, 0xd6, 0x3d, 0xbe, 0xa4, 0x5e, 0x8c, 0xa9, 0x67, 0x12,
     46 		0x82, 0xfa, 0xfb, 0x69, 0xda, 0x92, 0x72, 0x8b, 0x1a, 0x71,
     47 		0xde, 0x0a, 0x9e, 0x06, 0x0b, 0x29, 0x05, 0xd6, 0xa5, 0xb6,
     48 		0x7e, 0xcd, 0x3b, 0x36, 0x92, 0xdd, 0xbd, 0x7f, 0x2d, 0x77,
     49 		0x8b, 0x8c, 0x98, 0x03, 0xae, 0xe3, 0x28, 0x09, 0x1b, 0x58,
     50 		0xfa, 0xb3, 0x24, 0xe4, 0xfa, 0xd6, 0x75, 0x94, 0x55, 0x85,
     51 		0x80, 0x8b, 0x48, 0x31, 0xd7, 0xbc, 0x3f, 0xf4, 0xde, 0xf0,
     52 		0x8e, 0x4b, 0x7a, 0x9d, 0xe5, 0x76, 0xd2, 0x65, 0x86, 0xce,
     53 		0xc6, 0x4b, 0x61, 0x16,
     54 	];
     55 
     56 	let tag: [_]u8 = [
     57 		0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09, 0xe2, 0x6a, 0x7e, 0x90,
     58 		0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91,
     59 	];
     60 
     61 	let out = memio::dynamic();
     62 	defer io::close(&out)!;
     63 
     64 	let s = chachapoly();
     65 	init(&s, &out, key, nonce, ad);
     66 	io::writeall(&s, plain)!;
     67 
     68 	let outtag: [TAGSZ]u8 = [0...];
     69 	seal(&s, outtag);
     70 
     71 	let outbuf = memio::buffer(&out);
     72 	assert(bytes::equal(outbuf, cipher));
     73 	assert(bytes::equal(outtag, tag));
     74 
     75 	let out = memio::dynamic();
     76 	defer io::close(&out)!;
     77 	let in = memio::fixed(cipher);
     78 
     79 	let s = chachapoly();
     80 	init(&s, &in, key, nonce, ad);
     81 	io::copy(&out, &s)!;
     82 
     83 	verify(&s, tag)!;
     84 
     85 	let outbuf = memio::buffer(&out);
     86 	assert(bytes::equal(outbuf, plain));
     87 
     88 	io::close(&s)!;
     89 };
     90 
     91 type sample = struct {
     92 	msg: []u8,
     93 	cipher: []u8,
     94 	additional: []u8,
     95 	key: []u8,
     96 	nonce: []u8,
     97 	mac: []u8,
     98 };
     99 
    100 // test vector taken from the XChacha20-Poly1305-AEAD draft rfc
    101 const rfcsample: sample = sample {
    102 	msg = [
    103 		0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64,
    104 		0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
    105 		0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c,
    106 		0x61, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x39, 0x39,
    107 		0x3a, 0x20, 0x49, 0x66, 0x20, 0x49, 0x20, 0x63, 0x6f, 0x75,
    108 		0x6c, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x79,
    109 		0x6f, 0x75, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e,
    110 		0x65, 0x20, 0x74, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20,
    111 		0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65,
    112 		0x2c, 0x20, 0x73, 0x75, 0x6e, 0x73, 0x63, 0x72, 0x65, 0x65,
    113 		0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65,
    114 		0x20, 0x69, 0x74, 0x2e,
    115 	],
    116 	additional = [
    117 		0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
    118 		0xc6, 0xc7,
    119 	],
    120 	key = [
    121 		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
    122 		0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93,
    123 		0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d,
    124 		0x9e, 0x9f,
    125 	],
    126 	nonce = [
    127 		0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
    128 		0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
    129 		0x54, 0x55, 0x56, 0x57,
    130 	],
    131 	cipher = [
    132 		0xbd, 0x6d, 0x17, 0x9d, 0x3e, 0x83, 0xd4, 0x3b, 0x95, 0x76,
    133 		0x57, 0x94, 0x93, 0xc0, 0xe9, 0x39, 0x57, 0x2a, 0x17, 0x00,
    134 		0x25, 0x2b, 0xfa, 0xcc, 0xbe, 0xd2, 0x90, 0x2c, 0x21, 0x39,
    135 		0x6c, 0xbb, 0x73, 0x1c, 0x7f, 0x1b, 0x0b, 0x4a, 0xa6, 0x44,
    136 		0x0b, 0xf3, 0xa8, 0x2f, 0x4e, 0xda, 0x7e, 0x39, 0xae, 0x64,
    137 		0xc6, 0x70, 0x8c, 0x54, 0xc2, 0x16, 0xcb, 0x96, 0xb7, 0x2e,
    138 		0x12, 0x13, 0xb4, 0x52, 0x2f, 0x8c, 0x9b, 0xa4, 0x0d, 0xb5,
    139 		0xd9, 0x45, 0xb1, 0x1b, 0x69, 0xb9, 0x82, 0xc1, 0xbb, 0x9e,
    140 		0x3f, 0x3f, 0xac, 0x2b, 0xc3, 0x69, 0x48, 0x8f, 0x76, 0xb2,
    141 		0x38, 0x35, 0x65, 0xd3, 0xff, 0xf9, 0x21, 0xf9, 0x66, 0x4c,
    142 		0x97, 0x63, 0x7d, 0xa9, 0x76, 0x88, 0x12, 0xf6, 0x15, 0xc6,
    143 		0x8b, 0x13, 0xb5, 0x2e,
    144 	],
    145 	mac = [
    146 		0xc0, 0x87, 0x59, 0x24, 0xc1, 0xc7, 0x98, 0x79, 0x47, 0xde,
    147 		0xaf, 0xd8, 0x78, 0x0a, 0xcf, 0x49,
    148 	],
    149 };
    150 
    151 @test fn xencrypt() void = {
    152 	let tc = rfcsample;
    153 
    154 	let out = memio::dynamic();
    155 	defer io::close(&out)!;
    156 
    157 	let s = chachapoly();
    158 	xinit(&s, &out, tc.key, tc.nonce, tc.additional);
    159 	io::writeall(&s, tc.msg)!;
    160 
    161 	let outtag: [TAGSZ]u8 = [0...];
    162 	seal(&s, outtag);
    163 
    164 	let outbuf = memio::buffer(&out);
    165 	assert(bytes::equal(outbuf, tc.cipher));
    166 	assert(bytes::equal(outtag, tc.mac));
    167 
    168 	let out = memio::dynamic();
    169 	defer io::close(&out)!;
    170 	let in = memio::fixed(tc.cipher);
    171 
    172 	let s = chachapoly();
    173 	xinit(&s, &in, tc.key, tc.nonce, tc.additional);
    174 	io::copy(&out, &s)!;
    175 
    176 	verify(&s, tc.mac)!;
    177 
    178 	let outbuf = memio::buffer(&out);
    179 	assert(bytes::equal(outbuf, tc.msg));
    180 
    181 	io::close(&s)!;
    182 };