| 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 | struct CxofTest { |
| 10 | count int |
| 11 | msg string |
| 12 | z string |
| 13 | md string |
| 14 | } |
| 15 | |
| 16 | // Known Answer Tests (KAT) with 512-bits output for Ascon-CXOF128 |
| 17 | fn test_cxof128() ! { |
| 18 | for item in cxof128_test_data { |
| 19 | msg := hex.decode(item.msg)! |
| 20 | z := hex.decode(item.z)! |
| 21 | md := hex.decode(item.md)! |
| 22 | |
| 23 | out := ascon.cxof128_64(msg, z)! |
| 24 | assert md == out |
| 25 | |
| 26 | // With Xof128Digest opaque |
| 27 | mut cx := ascon.new_cxof128(ascon.default_xof_size, z)! |
| 28 | md0 := cx.sum(msg) |
| 29 | assert md0 == md |
| 30 | |
| 31 | // test .read() |
| 32 | cx.reset() |
| 33 | mut dst := []u8{len: 64} |
| 34 | _ := cx.write(msg)! |
| 35 | nr := cx.read(mut dst)! |
| 36 | assert nr == 64 |
| 37 | assert dst == md |
| 38 | |
| 39 | // with chunked messages |
| 40 | cx.reset() |
| 41 | chunks := arrays.chunk[u8](msg, 20) |
| 42 | mut tot := 0 |
| 43 | for chunk in chunks { |
| 44 | n := cx.write(chunk)! |
| 45 | tot += n |
| 46 | } |
| 47 | assert msg.len == tot |
| 48 | |
| 49 | chunked_md := cx.sum([]u8{}) |
| 50 | assert chunked_md == md |
| 51 | } |
| 52 | } |
| 53 | |
| 54 | const cxof128_test_data = [ |
| 55 | CxofTest{ |
| 56 | count: 1 |
| 57 | msg: '' |
| 58 | z: '' |
| 59 | md: '4f50159ef70bb3dad8807e034eaebd44c4fa2cbbc8cf1f05511ab66cdcc529905ca12083fc186ad899b270b1473dc5f7ec88d1052082dcdfe69fb75d269e7b74' |
| 60 | }, |
| 61 | CxofTest{ |
| 62 | count: 2 |
| 63 | msg: '' |
| 64 | z: '10' |
| 65 | md: '0c93a483e7d574d49fe52cce03ee646117977d57a8aa57704ab4daf44b501430ff6ac11a5d1fd6f2154b5c65728268270c8bb578508487b8965718ada6272fd6' |
| 66 | }, |
| 67 | CxofTest{ |
| 68 | count: 3 |
| 69 | msg: '' |
| 70 | z: '1011' |
| 71 | md: 'd1106c7622e79fe955bd9d79e03b918e770fe0e0cddde28beb924b02c5fc936b33acca299c89eca5d71886cbbfa4d54a21c55fde2b679f5e2488063a1719dc32' |
| 72 | }, |
| 73 | CxofTest{ |
| 74 | count: 4 |
| 75 | msg: '' |
| 76 | z: '101112' |
| 77 | md: '6a53a6dbf1bec15a79ce1214ff76a4d6bb16f60cfa56bf2c218aec5e160372117d2a2e647b128624e9b1d2259faf083f2bedd0fc751a2e2ff268d0ee026b6449' |
| 78 | }, |
| 79 | CxofTest{ |
| 80 | count: 5 |
| 81 | msg: '' |
| 82 | z: '10111213' |
| 83 | md: 'cc333dd5b4ea61abe4376d61058b16df5eda7056299865ed7d25f43ac5b8541574608bd95ab0a3c3b74abd4abf9e50e63be6efe1b836b58595d8c47705c4dffb' |
| 84 | }, |
| 85 | CxofTest{ |
| 86 | count: 6 |
| 87 | msg: '' |
| 88 | z: '1011121314' |
| 89 | md: '8ee69d28b1bf3eafacf1e169fd10b6b7b72a7e2aaf0625e8e7c00153833b7224ed8c8c127b9808352c5647f9e862958d6de9eb93c4a236d59ecd84665e7164d9' |
| 90 | }, |
| 91 | CxofTest{ |
| 92 | count: 7 |
| 93 | msg: '' |
| 94 | z: '101112131415' |
| 95 | md: '3681695c40d83f60b401ecfa14bc03780ad474438f74b823eec9f0d5a375c13488803d3b4b8c8d4acd03186039f905fa15c7860dd0e9d566f31cd9e5822a937c' |
| 96 | }, |
| 97 | CxofTest{ |
| 98 | count: 8 |
| 99 | msg: '' |
| 100 | z: '10111213141516' |
| 101 | md: '717a9ba3b3c00f4078572b2d3fb3f0a86d45f70bc4e1cd89cb7a952bfa64162383735534ecbe0a7e62e7592cf447404db0361d98c2237245688ead15c05ae59b' |
| 102 | }, |
| 103 | CxofTest{ |
| 104 | count: 9 |
| 105 | msg: '' |
| 106 | z: '1011121314151617' |
| 107 | md: '61324766441dd6c11e1736bad1d2185820885ed76fe2ce537775a6e855eeafd2a6651b5e862a44982765f8b4c7cbe9c8b354f569ead6abc62cc9b7cdd72e0cb3' |
| 108 | }, |
| 109 | CxofTest{ |
| 110 | count: 10 |
| 111 | msg: '' |
| 112 | z: '101112131415161718' |
| 113 | md: '32fde6b9d290f56fc74aac9368f32c69973e1bab35d96118db7181aae577687673c01a9e35327aded556987eed3441d4f42ec36b0c198498d9e7f357b948d560' |
| 114 | }, |
| 115 | CxofTest{ |
| 116 | count: 11 |
| 117 | msg: '' |
| 118 | z: '10111213141516171819' |
| 119 | md: '690fc893055910d7d1d38055cf5589bbbe6b82bf175847ab3e0fd9a578b044dcb42be2932067eaa563a09e634581f34c2b4cfb38e1b06841b45b7b34c746d6dd' |
| 120 | }, |
| 121 | CxofTest{ |
| 122 | count: 12 |
| 123 | msg: '' |
| 124 | z: '101112131415161718191a' |
| 125 | md: 'ecdab5b15324f99a1709be26fc329d305bd475e5f39bc2b63788792166ad08fe720ccd14e0a4de7d83ede1c7744929dc509c73748d6661a3d3215995357d3f88' |
| 126 | }, |
| 127 | CxofTest{ |
| 128 | count: 13 |
| 129 | msg: '' |
| 130 | z: '101112131415161718191a1b' |
| 131 | md: 'ec2ba3309cfa6d6d0b581374e7c020ad17c330ea2b76d48724a415dceca3859c11146c2f64e52e44d27b1c44fd27476990a2e959b9998827a527a7e69089895f' |
| 132 | }, |
| 133 | CxofTest{ |
| 134 | count: 14 |
| 135 | msg: '' |
| 136 | z: '101112131415161718191a1b1c' |
| 137 | md: '659a59bc7fdece2f1bafa9f1bfb4c262043f74da550f85c902c9c4302adfcf898fbcd74c92d67bded153137e0d32ccba88767354be99103dfeb59c686ca98dea' |
| 138 | }, |
| 139 | CxofTest{ |
| 140 | count: 15 |
| 141 | msg: '' |
| 142 | z: '101112131415161718191a1b1c1d' |
| 143 | md: '17756044b742028b508d797c2c75a0722dde763c59d3fe5f70435b82faca5a80fe9c5ec9f3c59072ae48f37a241281c25d2e903c9d9290128265f1fe92b80bed' |
| 144 | }, |
| 145 | ] |
| 146 | |