v / vlib / x / crypto / ascon / aead128_test.v
261 lines · 253 sloc · 6.94 KB · 7101472677283577ec8aa3dc4976fbd70ad6a702
Raw
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//
5module ascon
6
7import encoding.hex
8import 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
13struct 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.
23fn 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
48const 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
251fn 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