| 1 | // Copyright ©2025 blackshirt. |
| 2 | // Use of this source code is governed by an MIT license |
| 3 | // that can be found in the LICENSE file. |
| 4 | // |
| 5 | import arrays |
| 6 | import encoding.hex |
| 7 | import x.crypto.ascon |
| 8 | |
| 9 | // This test for Xof128 with 512-bits outputs |
| 10 | struct XofTest { |
| 11 | count int |
| 12 | msg string |
| 13 | md string |
| 14 | } |
| 15 | |
| 16 | fn test_xof128() ! { |
| 17 | for item in xof128_test_data { |
| 18 | msg := hex.decode(item.msg)! |
| 19 | md := hex.decode(item.md)! |
| 20 | out := ascon.xof128_64(msg)! |
| 21 | assert out == md |
| 22 | |
| 23 | // With Xof128Digest opaque |
| 24 | mut x := ascon.new_xof128(ascon.default_xof_size) |
| 25 | md0 := x.sum(msg) |
| 26 | assert md0 == md |
| 27 | |
| 28 | // test .read() |
| 29 | x.reset() |
| 30 | mut dst := []u8{len: 64} |
| 31 | _ := x.write(msg)! |
| 32 | nr := x.read(mut dst)! |
| 33 | assert nr == 64 |
| 34 | assert dst == md |
| 35 | |
| 36 | // with chunked messages |
| 37 | x.reset() |
| 38 | chunks := arrays.chunk[u8](msg, 20) |
| 39 | mut tot := 0 |
| 40 | for chunk in chunks { |
| 41 | n := x.write(chunk)! |
| 42 | tot += n |
| 43 | } |
| 44 | assert msg.len == tot |
| 45 | |
| 46 | chunked_md := x.sum([]u8{}) |
| 47 | assert chunked_md == md |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | const xof128_test_data = [ |
| 52 | XofTest{ |
| 53 | count: 1 |
| 54 | msg: '' |
| 55 | md: '473d5e6164f58b39dfd84aacdb8ae42ec2d91fed33388ee0d960d9b3993295c6ad77855a5d3b13fe6ad9e6098988373af7d0956d05a8f1665d2c67d1a3ad10ff' |
| 56 | }, |
| 57 | XofTest{ |
| 58 | count: 2 |
| 59 | msg: '00' |
| 60 | md: '51430e0438ecdf642b393630d977625f5f337656ba58ab1e960784ac32a16e0d446405551f5469384f8ea283cf12e64fa72c426bfebaea3aa1529e2c4ab23a2f' |
| 61 | }, |
| 62 | XofTest{ |
| 63 | count: 3 |
| 64 | msg: '0001' |
| 65 | md: 'a05383077af971d3830bd37e7b981497a773d441db077c6494cc73125953846eb6427fba4cd308ff90a11385d51101341bf5379249217bfdace9cca1148cc966' |
| 66 | }, |
| 67 | XofTest{ |
| 68 | count: 4 |
| 69 | msg: '000102' |
| 70 | md: '9c96f31c3e7bdfdc5ef6ba836f760a0d6548d94dd0a512033022c9242e8ba916c30c3961d37d7dd7282e2191494d60dc5058588b276c60c90be2aaa7e7013d96' |
| 71 | }, |
| 72 | XofTest{ |
| 73 | count: 5 |
| 74 | msg: '00010203' |
| 75 | md: '21f7fd74588e244af45f9016b8db19b857ec5e6208978cfc1b4611ed91fb38f87e8f82a6409fb2b77acfbba8862aa22a7b0c98c1c01d5a4fdf64827b450fa1eb' |
| 76 | }, |
| 77 | XofTest{ |
| 78 | count: 6 |
| 79 | msg: '0001020304' |
| 80 | md: 'd647cc91aafff06a486f00a33fdfe9222f08b94da3b17804da9aaae167b4285dd6395e2a61fded3cf73c99774aff7066f74f7698f4824ba538602087d7c267fa' |
| 81 | }, |
| 82 | XofTest{ |
| 83 | count: 7 |
| 84 | msg: '000102030405' |
| 85 | md: '4793fbe6aa7688e52cd3a97a2685c68b218e0ca8754307956509974ab107d8ba19070424d5dfd336c3fc1250a273b9146f9f26d7658b9e213c37aebbe74abc6e' |
| 86 | }, |
| 87 | XofTest{ |
| 88 | count: 8 |
| 89 | msg: '00010203040506' |
| 90 | md: '7ae562db37212a9acd2673ecfd5b4f1c5cb2e6f64ebf00aa7f6ef8dc82c448d5fe11cd91f4368c37690d79e5de0ca8ad419e1918ce8dab2d42363e9476638a7b' |
| 91 | }, |
| 92 | XofTest{ |
| 93 | count: 9 |
| 94 | msg: '0001020304050607' |
| 95 | md: '8d1886f5d3ec4af8d15b44bc62b74da6ea91bc28fb82f9c34079b5ed6e38b6c951803d7dfb3c5e512a0ef5e4060062a6fd067f9c73ef9bee527411bda67fc896' |
| 96 | }, |
| 97 | XofTest{ |
| 98 | count: 10 |
| 99 | msg: '000102030405060708' |
| 100 | md: 'db3013bfbbd132dc1d3152fd955ed48f7cbb675e9ad2a2fecf92b74c957592e0c89959e81c16fd07ead9eeb8e40359c497aa20258b43d87ec69ad0bb0993fd38' |
| 101 | }, |
| 102 | XofTest{ |
| 103 | count: 601 |
| 104 | msg: '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354555657' |
| 105 | md: '8fbbce48a72faf257e06df9408d4b6e11d35a86dfc29c0f106cb86128a2fe94208dcc8df4a439978cdb77f53317cbe5507b7f33da590be10a424d4ef60b37036' |
| 106 | }, |
| 107 | XofTest{ |
| 108 | count: 602 |
| 109 | msg: '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758' |
| 110 | md: 'b4ca30047dc94ed770e45f4fa07b25a049d4a149a78227e25625cec2cbee7cfdd7d3cfb2635a38770e04009de348726364f648984ef47e9bc90c2a3c0526b227' |
| 111 | }, |
| 112 | ] |
| 113 | |