| 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 | module ascon |
| 6 | |
| 7 | import encoding.hex |
| 8 | import rand |
| 9 | |
| 10 | // This test materials was taken and adapted into v from references implementation of Ascon-aead128 |
| 11 | // especially for the known answer test data, but, its not all fully-taken, just randomly choosen item. |
| 12 | // See at https://github.com/ascon/ascon-c/blob/main/crypto_aead/asconaead128/LWC_AEAD_KAT_128_128.txt |
| 13 | struct KatTest { |
| 14 | cnt int |
| 15 | key string |
| 16 | nonce string |
| 17 | pt string |
| 18 | ad string |
| 19 | ct string |
| 20 | } |
| 21 | |
| 22 | // testing for Ascon-AEAD128 encryption and decryption. |
| 23 | fn test_ascon_aead128_enc_dec() ! { |
| 24 | for item in aead128_kat_tests_data { |
| 25 | key := hex.decode(item.key)! |
| 26 | nonce := hex.decode(item.nonce)! |
| 27 | pt := hex.decode(item.pt)! |
| 28 | ad := hex.decode(item.ad)! |
| 29 | ct := hex.decode(item.ct)! |
| 30 | |
| 31 | out := encrypt(key, nonce, ad, pt)! |
| 32 | assert out == ct |
| 33 | |
| 34 | msg := decrypt(key, nonce, ad, ct)! |
| 35 | assert msg == pt |
| 36 | |
| 37 | // Work with object-based Cipher |
| 38 | mut c := new_aead128(key)! |
| 39 | // Lets encrypt the message |
| 40 | exp_ct := c.encrypt(msg, nonce, ad)! |
| 41 | assert exp_ct == ct |
| 42 | // Lets decrypt it back |
| 43 | exp_msg := c.decrypt(exp_ct, nonce, ad)! |
| 44 | assert exp_msg == msg |
| 45 | } |
| 46 | } |
| 47 | |
| 48 | const aead128_kat_tests_data = [ |
| 49 | KatTest{ |
| 50 | cnt: 1 |
| 51 | key: '000102030405060708090A0B0C0D0E0F' |
| 52 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 53 | pt: '' |
| 54 | ad: '' |
| 55 | ct: '4F9C278211BEC9316BF68F46EE8B2EC6' |
| 56 | }, |
| 57 | KatTest{ |
| 58 | cnt: 2 |
| 59 | key: '000102030405060708090A0B0C0D0E0F' |
| 60 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 61 | pt: '' |
| 62 | ad: '30' |
| 63 | ct: 'CCCB674FE18A09A285D6AB11B35675C0' |
| 64 | }, |
| 65 | KatTest{ |
| 66 | cnt: 3 |
| 67 | key: '000102030405060708090A0B0C0D0E0F' |
| 68 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 69 | pt: '' |
| 70 | ad: '3031' |
| 71 | ct: 'F65B191550C4DF9CFDD4460EBBCCA782' |
| 72 | }, |
| 73 | KatTest{ |
| 74 | cnt: 4 |
| 75 | key: '000102030405060708090A0B0C0D0E0F' |
| 76 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 77 | pt: '' |
| 78 | ad: '303132' |
| 79 | ct: 'D127CF7D2CD4DA8930616C70B3619F42' |
| 80 | }, |
| 81 | KatTest{ |
| 82 | cnt: 5 |
| 83 | key: '000102030405060708090A0B0C0D0E0F' |
| 84 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 85 | pt: '' |
| 86 | ad: '30313233' |
| 87 | ct: '000BA92E52B5ED6B97C9D913CC4C82DF' |
| 88 | }, |
| 89 | KatTest{ |
| 90 | cnt: 6 |
| 91 | key: '000102030405060708090A0B0C0D0E0F' |
| 92 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 93 | pt: '' |
| 94 | ad: '3031323334' |
| 95 | ct: 'F7CC167F8FED3AEEA99B385B8622157E' |
| 96 | }, |
| 97 | KatTest{ |
| 98 | cnt: 7 |
| 99 | key: '000102030405060708090A0B0C0D0E0F' |
| 100 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 101 | pt: '' |
| 102 | ad: '303132333435' |
| 103 | ct: '51CCBC46D56E93B89B1A3BFDAD0AA4D5' |
| 104 | }, |
| 105 | KatTest{ |
| 106 | cnt: 8 |
| 107 | key: '000102030405060708090A0B0C0D0E0F' |
| 108 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 109 | pt: '' |
| 110 | ad: '30313233343536' |
| 111 | ct: 'B38ABBD573E071C6265EEAC4A68F65AB' |
| 112 | }, |
| 113 | KatTest{ |
| 114 | cnt: 9 |
| 115 | key: '000102030405060708090A0B0C0D0E0F' |
| 116 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 117 | pt: '' |
| 118 | ad: '3031323334353637' |
| 119 | ct: '865C594093A9EDEE2C1D6384CCB4939E' |
| 120 | }, |
| 121 | KatTest{ |
| 122 | cnt: 10 |
| 123 | key: '000102030405060708090A0B0C0D0E0F' |
| 124 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 125 | pt: '' |
| 126 | ad: '303132333435363738' |
| 127 | ct: '24F13284A0F90F906B18C7E4061C0896' |
| 128 | }, |
| 129 | KatTest{ |
| 130 | cnt: 27 |
| 131 | key: '000102030405060708090A0B0C0D0E0F' |
| 132 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 133 | pt: '' |
| 134 | ad: '303132333435363738393A3B3C3D3E3F40414243444546474849' |
| 135 | ct: '4ED362C4407B1D3BE17A51465659DECF' |
| 136 | }, |
| 137 | KatTest{ |
| 138 | cnt: 28 |
| 139 | key: '000102030405060708090A0B0C0D0E0F' |
| 140 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 141 | pt: '' |
| 142 | ad: '303132333435363738393A3B3C3D3E3F404142434445464748494A' |
| 143 | ct: 'A35C52EC6E7C78C051B23D03F691916F' |
| 144 | }, |
| 145 | KatTest{ |
| 146 | cnt: 29 |
| 147 | key: '000102030405060708090A0B0C0D0E0F' |
| 148 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 149 | pt: '' |
| 150 | ad: '303132333435363738393A3B3C3D3E3F404142434445464748494A4B' |
| 151 | ct: 'F1C946363A21CCFFE291A289202FC64C' |
| 152 | }, |
| 153 | KatTest{ |
| 154 | cnt: 30 |
| 155 | key: '000102030405060708090A0B0C0D0E0F' |
| 156 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 157 | pt: '' |
| 158 | ad: '303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C' |
| 159 | ct: 'F1D453E933904578EEC3EA8E85550CE5' |
| 160 | }, |
| 161 | KatTest{ |
| 162 | cnt: 31 |
| 163 | key: '000102030405060708090A0B0C0D0E0F' |
| 164 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 165 | pt: '' |
| 166 | ad: '303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D' |
| 167 | ct: '82E22C860881C0485EC5F5E8CEA42CEA' |
| 168 | }, |
| 169 | KatTest{ |
| 170 | cnt: 32 |
| 171 | key: '000102030405060708090A0B0C0D0E0F' |
| 172 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 173 | pt: '' |
| 174 | ad: '303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E' |
| 175 | ct: 'C6306F1F154C78833984173360AAE874' |
| 176 | }, |
| 177 | KatTest{ |
| 178 | cnt: 33 |
| 179 | key: '000102030405060708090A0B0C0D0E0F' |
| 180 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 181 | pt: '' |
| 182 | ad: '303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F' |
| 183 | ct: 'EFC3E78B02AD9A80A6F0548C5B0BB5BA' |
| 184 | }, |
| 185 | KatTest{ |
| 186 | cnt: 34 |
| 187 | key: '000102030405060708090A0B0C0D0E0F' |
| 188 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 189 | pt: '20' |
| 190 | ad: '' |
| 191 | ct: 'E8DD576ABA1CD3E6FC704DE02AEDB79588' |
| 192 | }, |
| 193 | KatTest{ |
| 194 | cnt: 35 |
| 195 | key: '000102030405060708090A0B0C0D0E0F' |
| 196 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 197 | pt: '20' |
| 198 | ad: '30' |
| 199 | ct: '962B8016836C75A7D86866588CA245D886' |
| 200 | }, |
| 201 | KatTest{ |
| 202 | cnt: 49 |
| 203 | key: '000102030405060708090A0B0C0D0E0F' |
| 204 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 205 | pt: '20' |
| 206 | ad: '303132333435363738393A3B3C3D3E' |
| 207 | ct: '2089CB1DE2AE7D3E45BA7E9CC293548546' |
| 208 | }, |
| 209 | KatTest{ |
| 210 | cnt: 599 |
| 211 | key: '000102030405060708090a0b0c0d0e0f' |
| 212 | nonce: '101112131415161718191a1b1c1d1e1f' |
| 213 | pt: '202122232425262728292a2b2c2d2e2f3031' |
| 214 | ad: '30313233' |
| 215 | ct: 'cf5337fcb70ec45d179e0c3f51bb25ac967a2e7062ee9bd80da6c72e3a9b43aed9e0' |
| 216 | }, |
| 217 | KatTest{ |
| 218 | cnt: 600 |
| 219 | key: '000102030405060708090a0b0c0d0e0f' |
| 220 | nonce: '101112131415161718191a1b1c1d1e1f' |
| 221 | pt: '202122232425262728292a2b2c2d2e2f3031' |
| 222 | ad: '3031323334' |
| 223 | ct: '3076658cba8bf3bb6dccaa2f1255ee2e7db6f6493c7698f65f6860a7433a0f561e6c' |
| 224 | }, |
| 225 | KatTest{ |
| 226 | cnt: 601 |
| 227 | key: '000102030405060708090a0b0c0d0e0f' |
| 228 | nonce: '101112131415161718191a1b1c1d1e1f' |
| 229 | pt: '202122232425262728292a2b2c2d2e2f3031' |
| 230 | ad: '303132333435' |
| 231 | ct: '9310c6dd8e9cbc3e406c0ebfbea312435f2c6975faf3b6b2b17ef1ea2503c3d31ef5' |
| 232 | }, |
| 233 | KatTest{ |
| 234 | cnt: 602 |
| 235 | key: '000102030405060708090a0b0c0d0e0f' |
| 236 | nonce: '101112131415161718191a1b1c1d1e1f' |
| 237 | pt: '202122232425262728292a2b2c2d2e2f3031' |
| 238 | ad: '30313233343536' |
| 239 | ct: '6e024bd403f386eb9d1c56f459cfdcde1b2fdf8fd8be2faf0576c81e8d21c0dd8f8a' |
| 240 | }, |
| 241 | KatTest{ |
| 242 | cnt: 603 |
| 243 | key: '000102030405060708090A0B0C0D0E0F' |
| 244 | nonce: '101112131415161718191A1B1C1D1E1F' |
| 245 | pt: '202122232425262728292A2B2C2D2E2F3031' |
| 246 | ad: '3031323334353637' |
| 247 | ct: 'fabe2cb1e7eba6329a30080f26e7dc72503dfc57f4de06a334b7ebadca03b44b73e9' |
| 248 | }, |
| 249 | ] |
| 250 | |
| 251 | fn test_ascon_aead128_loop() { |
| 252 | for n in 0 .. 256 { |
| 253 | key := []u8{len: 16, init: rand.u8()} |
| 254 | nonce := []u8{len: 16, init: rand.u8()} |
| 255 | ad := []u8{len: int(rand.u8()), init: rand.u8()} |
| 256 | txt := []u8{len: n, init: rand.u8()} |
| 257 | e := encrypt(key, nonce, ad, txt)! |
| 258 | d := decrypt(key, nonce, ad, e)! |
| 259 | assert txt == d |
| 260 | } |
| 261 | } |
| 262 | |