aboutsummaryrefslogtreecommitdiff
path: root/src/lib/gnsrecord/test_gnsrecord_testvectors.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/gnsrecord/test_gnsrecord_testvectors.c')
-rw-r--r--src/lib/gnsrecord/test_gnsrecord_testvectors.c716
1 files changed, 716 insertions, 0 deletions
diff --git a/src/lib/gnsrecord/test_gnsrecord_testvectors.c b/src/lib/gnsrecord/test_gnsrecord_testvectors.c
new file mode 100644
index 000000000..12b9efe56
--- /dev/null
+++ b/src/lib/gnsrecord/test_gnsrecord_testvectors.c
@@ -0,0 +1,716 @@
1#include "platform.h"
2#include "gnunet_util_lib.h"
3#include "gnunet_gns_service.h"
4#include "gnunet_gnsrecord_lib.h"
5#include <inttypes.h>
6#include "gnsrecord_crypto.h"
7
8int res;
9
10struct GnsTv
11{
12 uint32_t expected_rd_count;
13 struct GNUNET_GNSRECORD_Data expected_rd[2048];
14 char *d;
15 char *zid;
16 char *ztld;
17 char *label;
18 char *q;
19 char *rdata;
20 char *rrblock;
21 char *k;
22 char *nonce;
23};
24
25struct RevocationTv
26{
27 char *d;
28 char *zid;
29 char *ztld;
30 char *m;
31 char *proof;
32 int diff;
33 int epochs;
34};
35
36struct RevocationTv rtvs[] = {
37 {
38 .d =
39 "70 ed 98 b9 07 8c 47 f7"
40 "d5 78 3b 26 cc f9 8b 7d"
41 "d5 5f 60 88 d1 53 95 97"
42 "fa 8b f5 5a c0 32 ea 6f",
43 .zid =
44 "00 01 00 00 2c a2 23 e8"
45 "79 ec c4 bb de b5 da 17"
46 "31 92 81 d6 3b 2e 3b 69"
47 "55 f1 c3 77 5c 80 4a 98"
48 "d5 f8 dd aa",
49 .ztld =
50 "000G001CM8HYGYFCRJXXXDET2WRS50EP7CQ3PTANY71QEQ409ACDBY6XN8",
51 .m =
52 "00 00 00 34 00 00 00 03"
53 "00 05 fe b4 6d 86 5c 1c"
54 "00 01 00 00 2c a2 23 e8"
55 "79 ec c4 bb de b5 da 17"
56 "31 92 81 d6 3b 2e 3b 69"
57 "55 f1 c3 77 5c 80 4a 98"
58 "d5 f8 dd aa",
59 .proof =
60 "00 05 fe b4 6d 86 5c 1c"
61 "00 00 39 5d 18 27 c0 00"
62 "e6 6a 57 0b cc d4 b3 93"
63 "e6 6a 57 0b cc d4 b3 ea"
64 "e6 6a 57 0b cc d4 b5 36"
65 "e6 6a 57 0b cc d4 b5 42"
66 "e6 6a 57 0b cc d4 b6 13"
67 "e6 6a 57 0b cc d4 b6 5f"
68 "e6 6a 57 0b cc d4 b6 72"
69 "e6 6a 57 0b cc d4 b7 0a"
70 "e6 6a 57 0b cc d4 b7 1a"
71 "e6 6a 57 0b cc d4 b7 23"
72 "e6 6a 57 0b cc d4 b7 47"
73 "e6 6a 57 0b cc d4 b7 77"
74 "e6 6a 57 0b cc d4 b7 85"
75 "e6 6a 57 0b cc d4 b7 89"
76 "e6 6a 57 0b cc d4 b7 cf"
77 "e6 6a 57 0b cc d4 b7 dc"
78 "e6 6a 57 0b cc d4 b9 3a"
79 "e6 6a 57 0b cc d4 b9 56"
80 "e6 6a 57 0b cc d4 ba 4a"
81 "e6 6a 57 0b cc d4 ba 9d"
82 "e6 6a 57 0b cc d4 bb 28"
83 "e6 6a 57 0b cc d4 bb 5a"
84 "e6 6a 57 0b cc d4 bb 92"
85 "e6 6a 57 0b cc d4 bb a2"
86 "e6 6a 57 0b cc d4 bb d8"
87 "e6 6a 57 0b cc d4 bb e2"
88 "e6 6a 57 0b cc d4 bc 93"
89 "e6 6a 57 0b cc d4 bc 94"
90 "e6 6a 57 0b cc d4 bd 0f"
91 "e6 6a 57 0b cc d4 bd ce"
92 "e6 6a 57 0b cc d4 be 6a"
93 "e6 6a 57 0b cc d4 be 73"
94 "00 01 00 00 2c a2 23 e8"
95 "79 ec c4 bb de b5 da 17"
96 "31 92 81 d6 3b 2e 3b 69"
97 "55 f1 c3 77 5c 80 4a 98"
98 "d5 f8 dd aa 04 4a 87 8a"
99 "15 8b 40 f0 c8 41 d9 f9"
100 "78 cb 13 72 ea ee 51 99"
101 "a3 d8 7e 5e 2b db c7 2a"
102 "6c 8c 73 d0 00 18 1d fc"
103 "39 c3 aa a4 81 66 7b 16"
104 "5b 58 44 e4 50 71 3d 8a"
105 "b6 a3 b2 ba 8f ef 44 7b"
106 "65 07 6a 0f",
107 .diff = 5,
108 .epochs = 2
109 }
110};
111
112struct GnsTv tvs[] = {
113 { .d =
114 "50 d7 b6 52 a4 ef ea df"
115 "f3 73 96 90 97 85 e5 95"
116 "21 71 a0 21 78 c8 e7 d4"
117 "50 fa 90 79 25 fa fd 98",
118 .zid =
119 "00 01 00 00 67 7c 47 7d"
120 "2d 93 09 7c 85 b1 95 c6"
121 "f9 6d 84 ff 61 f5 98 2c"
122 "2c 4f e0 2d 5a 11 fe df"
123 "b0 c2 90 1f",
124 .ztld = "000G0037FH3QTBCK15Y8BCCNRVWPV17ZC7TSGB1C9ZG2TPGHZVFV1GMG3W",
125 .label = "74 65 73 74 64 65 6c 65"
126 "67 61 74 69 6f 6e",
127 .q =
128 "4a dc 67 c5 ec ee 9f 76"
129 "98 6a bd 71 c2 22 4a 3d"
130 "ce 2e 91 70 26 c9 a0 9d"
131 "fd 44 ce f3 d2 0f 55 a2"
132 "73 32 72 5a 6c 8a fb bb"
133 "b0 f7 ec 9a f1 cc 42 64"
134 "12 99 40 6b 04 fd 9b 5b"
135 "57 91 f8 6c 4b 08 d5 f4",
136 .nonce =
137 "e9 0a 00 61 00 1c ee 8c"
138 "10 e2 59 80 00 00 00 01",
139 .k =
140 "86 4e 71 38 ea e7 fd 91"
141 "a3 01 36 89 9c 13 2b 23"
142 "ac eb db 2c ef 43 cb 19"
143 "f6 bf 55 b6 7d b9 b3 b3",
144 .rdata =
145 "00 1c ee 8c 10 e2 59 80"
146 "00 20 00 01 00 01 00 00"
147 "21 e3 b3 0f f9 3b c6 d3"
148 "5a c8 c6 e0 e1 3a fd ff"
149 "79 4c b7 b4 4b bb c7 48"
150 "d2 59 d0 a0 28 4d be 84",
151 .rrblock =
152 "00 00 00 a0 00 01 00 00"
153 "18 2b b6 36 ed a7 9f 79"
154 "57 11 bc 27 08 ad bb 24"
155 "2a 60 44 6a d3 c3 08 03"
156 "12 1d 03 d3 48 b7 ce b6"
157 "0a d1 0b c1 3b 40 3b 5b"
158 "25 61 26 b2 14 5a 6f 60"
159 "c5 14 f9 51 ff a7 66 f7"
160 "a3 fd 4b ac 4a 4e 19 90"
161 "05 5c b8 7e 8d 1b fd 19"
162 "aa 09 a4 29 f7 29 e9 f5"
163 "c6 ee c2 47 0a ce e2 22"
164 "07 59 e9 e3 6c 88 6f 35"
165 "00 1c ee 8c 10 e2 59 80"
166 "0c 1e da 5c c0 94 a1 c7"
167 "a8 88 64 9d 25 fa ee bd"
168 "60 da e6 07 3d 57 d8 ae"
169 "8d 45 5f 4f 13 92 c0 74"
170 "e2 6a c6 69 bd ee c2 34"
171 "62 b9 62 95 2c c6 e9 eb"},
172 { .d =
173 "50 d7 b6 52 a4 ef ea df"
174 "f3 73 96 90 97 85 e5 95"
175 "21 71 a0 21 78 c8 e7 d4"
176 "50 fa 90 79 25 fa fd 98",
177 .zid =
178 "00 01 00 00 67 7c 47 7d"
179 "2d 93 09 7c 85 b1 95 c6"
180 "f9 6d 84 ff 61 f5 98 2c"
181 "2c 4f e0 2d 5a 11 fe df"
182 "b0 c2 90 1f",
183 .ztld = "000G0037FH3QTBCK15Y8BCCNRVWPV17ZC7TSGB1C9ZG2TPGHZVFV1GMG3W",
184 .label =
185 "e5 a4 a9 e4 b8 8b e7 84"
186 "a1 e6 95 b5",
187 .nonce =
188 "ee 96 33 c1 00 1c ee 8c"
189 "10 e2 59 80 00 00 00 01",
190 .k =
191 "fb 3a b5 de 23 bd da e1"
192 "99 7a af 7b 92 c2 d2 71"
193 "51 40 8b 77 af 7a 41 ac"
194 "79 05 7c 4d f5 38 3d 01",
195 .q =
196 "af f0 ad 6a 44 09 73 68"
197 "42 9a c4 76 df a1 f3 4b"
198 "ee 4c 36 e7 47 6d 07 aa"
199 "64 63 ff 20 91 5b 10 05"
200 "c0 99 1d ef 91 fc 3e 10"
201 "90 9f 87 02 c0 be 40 43"
202 "67 78 c7 11 f2 ca 47 d5"
203 "5c f0 b5 4d 23 5d a9 77",
204 .rdata =
205 "00 1c ee 8c 10 e2 59 80"
206 "00 10 00 00 00 00 00 1c"
207 "00 00 00 00 00 00 00 00"
208 "00 00 00 00 de ad be ef"
209 "00 3f f2 aa 54 08 db 40"
210 "00 06 00 00 00 01 00 01"
211 "e6 84 9b e7 a7 b0 00 28"
212 "bb 13 ff 37 19 40 00 0b"
213 "00 04 00 00 00 10 48 65"
214 "6c 6c 6f 20 57 6f 72 6c"
215 "64 00 00 00 00 00 00 00"
216 "00 00 00 00 00 00 00 00"
217 "00 00 00 00 00 00 00 00"
218 "00 00 00 00 00 00 00 00"
219 "00 00 00 00 00 00 00 00"
220 "00 00 00 00 00 00 00 00",
221 .rrblock =
222 "00 00 00 f0 00 01 00 00"
223 "a5 12 96 df 75 7e e2 75"
224 "ca 11 8d 4f 07 fa 7a ae"
225 "55 08 bc f5 12 aa 41 12"
226 "14 29 d4 a0 de 9d 05 7e"
227 "08 5b d6 5f d4 85 10 51"
228 "ba ce 2a 45 2a fc 8a 7e"
229 "4f 6b 2c 1f 74 f0 20 35"
230 "d9 64 1a cd ba a4 66 e0"
231 "00 ce d6 f2 d2 3b 63 1c"
232 "8e 8a 0b 38 e2 ba e7 9a"
233 "22 ca d8 1d 4c 50 d2 25"
234 "35 8e bc 17 ac 0f 89 9e"
235 "00 1c ee 8c 10 e2 59 80"
236 "d8 c2 8d 2f d6 96 7d 1a"
237 "b7 22 53 f2 10 98 b8 14"
238 "a4 10 be 1f 59 98 de 03"
239 "f5 8f 7e 7c db 7f 08 a6"
240 "16 51 be 4d 0b 6f 8a 61"
241 "df 15 30 44 0b d7 47 dc"
242 "f0 d7 10 4f 6b 8d 24 c2"
243 "ac 9b c1 3d 9c 6f e8 29"
244 "05 25 d2 a6 d0 f8 84 42"
245 "67 a1 57 0e 8e 29 4d c9"
246 "3a 31 9f cf c0 3e a2 70"
247 "17 d6 fd a3 47 b4 a7 94"
248 "97 d7 f6 b1 42 2d 4e dd"
249 "82 1c 19 93 4e 96 c1 aa"
250 "87 76 57 25 d4 94 c7 64"
251 "b1 55 dc 6d 13 26 91 74"},
252 { .d =
253 "5a f7 02 0e e1 91 60 32"
254 "88 32 35 2b bc 6a 68 a8"
255 "d7 1a 7c be 1b 92 99 69"
256 "a7 c6 6d 41 5a 0d 8f 65",
257 .zid =
258 "00 01 00 14 3c f4 b9 24"
259 "03 20 22 f0 dc 50 58 14"
260 "53 b8 5d 93 b0 47 b6 3d"
261 "44 6c 58 45 cb 48 44 5d"
262 "db 96 68 8f",
263 .ztld = "000G051WYJWJ80S04BRDRM2R2H9VGQCKP13VCFA4DHC4BJT88HEXQ5K8HW",
264 .label =
265 "74 65 73 74 64 65 6c 65"
266 "67 61 74 69 6f 6e",
267 .nonce =
268 "98 13 2e a8 68 59 d3 5c"
269 "88 bf d3 17 fa 99 1b cb"
270 "00 1c ee 8c 10 e2 59 80",
271 .k =
272 "85 c4 29 a9 56 7a a6 33"
273 "41 1a 96 91 e9 09 4c 45"
274 "28 16 72 be 58 60 34 aa"
275 "e4 a2 a2 cc 71 61 59 e2",
276 .q =
277 "ab aa ba c0 e1 24 94 59"
278 "75 98 83 95 aa c0 24 1e"
279 "55 59 c4 1c 40 74 e2 55"
280 "7b 9f e6 d1 54 b6 14 fb"
281 "cd d4 7f c7 f5 1d 78 6d"
282 "c2 e0 b1 ec e7 60 37 c0"
283 "a1 57 8c 38 4e c6 1d 44"
284 "56 36 a9 4e 88 03 29 e9",
285 .rdata =
286 "00 1c ee 8c 10 e2 59 80"
287 "00 20 00 01 00 01 00 00"
288 "21 e3 b3 0f f9 3b c6 d3"
289 "5a c8 c6 e0 e1 3a fd ff"
290 "79 4c b7 b4 4b bb c7 48"
291 "d2 59 d0 a0 28 4d be 84",
292 .rrblock =
293 "00 00 00 b0 00 01 00 14"
294 "9b f2 33 19 8c 6d 53 bb"
295 "db ac 49 5c ab d9 10 49"
296 "a6 84 af 3f 40 51 ba ca"
297 "b0 dc f2 1c 8c f2 7a 1a"
298 "9f 56 a8 86 ea 73 9d 59"
299 "17 50 8f 9b 75 56 39 f3"
300 "a9 ac fa ed ed ca 7f bf"
301 "a7 94 b1 92 e0 8b f9 ed"
302 "4c 7e c8 59 4c 9f 7b 4e"
303 "19 77 4f f8 38 ec 38 7a"
304 "8f 34 23 da ac 44 9f 59"
305 "db 4e 83 94 3f 90 72 00"
306 "00 1c ee 8c 10 e2 59 80"
307 "57 7c c6 c9 5a 14 e7 04"
308 "09 f2 0b 01 67 e6 36 d0"
309 "10 80 7c 4f 00 37 2d 69"
310 "8c 82 6b d9 2b c2 2b d6"
311 "bb 45 e5 27 7c 01 88 1d"
312 "6a 43 60 68 e4 dd f1 c6"
313 "b7 d1 41 6f af a6 69 7c"
314 "25 ed d9 ea e9 91 67 c3"},
315 { .d =
316 "5a f7 02 0e e1 91 60 32"
317 "88 32 35 2b bc 6a 68 a8"
318 "d7 1a 7c be 1b 92 99 69"
319 "a7 c6 6d 41 5a 0d 8f 65",
320 .zid =
321 "00 01 00 14 3c f4 b9 24"
322 "03 20 22 f0 dc 50 58 14"
323 "53 b8 5d 93 b0 47 b6 3d"
324 "44 6c 58 45 cb 48 44 5d"
325 "db 96 68 8f",
326 .ztld = "000G051WYJWJ80S04BRDRM2R2H9VGQCKP13VCFA4DHC4BJT88HEXQ5K8HW",
327 .label =
328 "e5 a4 a9 e4 b8 8b e7 84"
329 "a1 e6 95 b5",
330 .nonce =
331 "bb 0d 3f 0f bd 22 42 77"
332 "50 da 5d 69 12 16 e6 c9"
333 "00 1c ee 8c 10 e2 59 80",
334 .k =
335 "3d f8 05 bd 66 87 aa 14"
336 "20 96 28 c2 44 b1 11 91"
337 "88 c3 92 56 37 a4 1e 5d"
338 "76 49 6c 29 45 dc 37 7b",
339 .q =
340 "ba f8 21 77 ee c0 81 e0"
341 "74 a7 da 47 ff c6 48 77"
342 "58 fb 0d f0 1a 6c 7f bb"
343 "52 fc 8a 31 be f0 29 af"
344 "74 aa 0d c1 5a b8 e2 fa"
345 "7a 54 b4 f5 f6 37 f6 15"
346 "8f a7 f0 3c 3f ce be 78"
347 "d3 f9 d6 40 aa c0 d1 ed",
348 .rdata =
349 "00 1c ee 8c 10 e2 59 80"
350 "00 10 00 00 00 00 00 1c"
351 "00 00 00 00 00 00 00 00"
352 "00 00 00 00 de ad be ef"
353 "00 3f f2 aa 54 08 db 40"
354 "00 06 00 00 00 01 00 01"
355 "e6 84 9b e7 a7 b0 00 28"
356 "bb 13 ff 37 19 40 00 0b"
357 "00 04 00 00 00 10 48 65"
358 "6c 6c 6f 20 57 6f 72 6c"
359 "64 00 00 00 00 00 00 00"
360 "00 00 00 00 00 00 00 00"
361 "00 00 00 00 00 00 00 00"
362 "00 00 00 00 00 00 00 00"
363 "00 00 00 00 00 00 00 00"
364 "00 00 00 00 00 00 00 00",
365 .rrblock =
366 "00 00 01 00 00 01 00 14"
367 "74 f9 00 68 f1 67 69 53"
368 "52 a8 a6 c2 eb 98 48 98"
369 "c5 3a cc a0 98 04 70 c6"
370 "c8 12 64 cb dd 78 ad 11"
371 "75 6d 2c 15 7a d2 ea 4f"
372 "c0 b1 b9 1c 08 03 79 44"
373 "61 d3 de f2 0d d1 63 6c"
374 "fe dc 03 89 c5 49 d1 43"
375 "6c c3 5b 4e 1b f8 89 5a"
376 "64 6b d9 a6 f4 6b 83 48"
377 "1d 9c 0e 91 d4 e1 be bb"
378 "6a 83 52 6f b7 25 2a 06"
379 "00 1c ee 8c 10 e2 59 80"
380 "4e b3 5a 50 d4 0f e1 a4"
381 "29 c7 f4 b2 67 a0 59 de"
382 "4e 2c 8a 89 a5 ed 53 d3"
383 "d4 92 58 59 d2 94 9f 7f"
384 "30 d8 a2 0c aa 96 f8 81"
385 "45 05 2d 1c da 04 12 49"
386 "8f f2 5f f2 81 6e f0 ce"
387 "61 fe 69 9b fa c7 2c 15"
388 "dc 83 0e a9 b0 36 17 1c"
389 "cf ca bb dd a8 de 3c 86"
390 "ed e2 95 70 d0 17 4b 82"
391 "82 09 48 a9 28 b7 f0 0e"
392 "fb 40 1c 10 fe 80 bb bb"
393 "02 76 33 1b f7 f5 1b 8d"
394 "74 57 9c 14 14 f2 2d 50"
395 "1a d2 5a e2 49 f5 bb f2"
396 "a6 c3 72 59 d1 75 e4 40"
397 "b2 94 39 c6 05 19 cb b1"},
398 {.d = NULL}
399};
400
401static void
402print_bytes_ (void *buf,
403 size_t buf_len,
404 int fold,
405 int in_be)
406{
407 int i;
408
409 for (i = 0; i < buf_len; i++)
410 {
411 if (0 != i)
412 {
413 if ((0 != fold) && (i % fold == 0))
414 printf ("\n ");
415 else
416 printf (" ");
417 }
418 else
419 {
420 printf (" ");
421 }
422 if (in_be)
423 printf ("%02x", ((unsigned char*) buf)[buf_len - 1 - i]);
424 else
425 printf ("%02x", ((unsigned char*) buf)[i]);
426 }
427 printf ("\n");
428}
429
430
431static void
432print_bytes (void *buf,
433 size_t buf_len,
434 int fold)
435{
436 print_bytes_ (buf, buf_len, fold, 0);
437}
438
439
440int
441parsehex (char *src, char *dst, size_t dstlen, int invert)
442{
443 int off;
444 int read_byte;
445 int data_len = 0;
446 char data[strlen (src) + 1];
447 char *pos = data;
448 int i = 0;
449 int j = 0;
450 memset (data, 0, strlen (src) + 1);
451
452 for (i = 0; i < strlen (src); i++)
453 {
454 if ((src[i] == ' ') || (src[i] == '\n'))
455 continue;
456 data[j++] = src[i];
457 }
458
459 while (sscanf (pos, " %02x%n", &read_byte, &off) == 1)
460 {
461 if (invert)
462 dst[dstlen - 1 - data_len++] = read_byte;
463 else
464 dst[data_len++] = read_byte;
465 pos += off;
466 }
467 return data_len;
468}
469
470
471void
472res_checker (void *cls,
473 unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
474{
475 struct GnsTv *tv = cls;
476 if (rd_count != tv->expected_rd_count)
477 {
478 printf ("FAIL: Record count expected: %u, was: %u\n", tv->expected_rd_count,
479 rd_count);
480 res = 1;
481 return;
482 }
483 for (int i = 0; i < rd_count; i++)
484 {
485 if (rd[i].record_type != tv->expected_rd[i].record_type)
486 {
487 printf ("FAIL: Record type expected: %u, was: %u\n",
488 tv->expected_rd[i].record_type,
489 rd[i].record_type);
490 res = 1;
491 return;
492 }
493 if (rd[i].expiration_time != tv->expected_rd[i].expiration_time)
494 {
495 printf ("FAIL: Expiration expected: %" PRIu64 ", was: %" PRIu64 "\n",
496 tv->expected_rd[i].expiration_time,
497 rd[i].expiration_time);
498 res = 1;
499 return;
500 }
501 if (rd[i].flags != tv->expected_rd[i].flags)
502 {
503 printf ("FAIL: Record flags expected: %u, was: %u\n",
504 tv->expected_rd[i].flags,
505 rd[i].flags);
506 res = 1;
507 return;
508 }
509 if (rd[i].data_size != tv->expected_rd[i].data_size)
510 {
511 printf ("FAIL: Record data size expected: %lu, was: %lu\n",
512 tv->expected_rd[i].data_size,
513 rd[i].data_size);
514 res = 1;
515 return;
516 }
517 if (0 != memcmp (rd[i].data, tv->expected_rd[i].data,
518 rd[i].data_size))
519 {
520 printf ("FAIL: Record data does not match\n");
521 res = 1;
522 return;
523 }
524 }
525}
526
527
528enum GNUNET_GenericReturnValue
529check_derivations_edkey (const char*label,
530 struct GNUNET_TIME_Absolute expire,
531 struct GNUNET_CRYPTO_PublicKey *pub,
532 struct GnsTv *tv)
533{
534 unsigned char nonce[crypto_secretbox_NONCEBYTES];
535 unsigned char skey[crypto_secretbox_KEYBYTES];
536 unsigned char nonce_expected[crypto_secretbox_NONCEBYTES];
537 unsigned char skey_expected[crypto_secretbox_KEYBYTES];
538
539
540 parsehex (tv->nonce,(char*) nonce_expected, crypto_secretbox_NONCEBYTES, 0);
541 parsehex (tv->k,(char*) skey_expected, crypto_secretbox_KEYBYTES, 0);
542 GNR_derive_block_xsalsa_key (nonce,
543 skey,
544 label,
545 GNUNET_TIME_absolute_hton (
546 expire).abs_value_us__,
547 &pub->eddsa_key);
548 /* Ignore random 128-bit nonce, can't check this here. Will be checked on
549 * decryption. */
550 if (0 != memcmp (nonce + 16, nonce_expected + 16, sizeof (nonce) - 16))
551 {
552 printf ("FAIL: Failed to derive nonce:\n");
553 print_bytes (nonce, sizeof (nonce), 8);
554 print_bytes (nonce_expected, sizeof (nonce), 8);
555 return GNUNET_NO;
556 }
557 if (0 != memcmp (skey, skey_expected, sizeof (skey)))
558 {
559 printf ("FAIL: Failed to derive secret key\n");
560 return GNUNET_NO;
561 }
562 return GNUNET_OK;
563}
564
565
566enum GNUNET_GenericReturnValue
567check_derivations_pkey (const char*label,
568 struct GNUNET_TIME_Absolute expire,
569 struct GNUNET_CRYPTO_PublicKey *pub,
570 struct GnsTv *tv)
571{
572 unsigned char ctr[GNUNET_CRYPTO_AES_KEY_LENGTH / 2];
573 unsigned char ctr_expected[GNUNET_CRYPTO_AES_KEY_LENGTH / 2];
574 unsigned char skey[GNUNET_CRYPTO_AES_KEY_LENGTH];
575 unsigned char skey_expected[GNUNET_CRYPTO_AES_KEY_LENGTH];
576
577 parsehex (tv->nonce,(char*) ctr_expected, sizeof (ctr), 0);
578 parsehex (tv->k,(char*) skey_expected, sizeof (skey), 0);
579 GNR_derive_block_aes_key (ctr,
580 skey,
581 label,
582 GNUNET_TIME_absolute_hton (
583 expire).abs_value_us__,
584 &pub->ecdsa_key);
585
586 /* Ignore random 32-bit nonce, can't check this here. Will be checked on
587 * decryption. */
588 if (0 != memcmp (ctr + 4, ctr_expected + 4, sizeof (ctr) - 4))
589 {
590 printf ("FAIL: Failed to derive nonce\n");
591 return GNUNET_NO;
592 }
593 if (0 != memcmp (skey, skey_expected, sizeof (skey)))
594 {
595 printf ("FAIL: Failed to derive secret key\n");
596 return GNUNET_NO;
597 }
598 return GNUNET_OK;
599}
600
601
602int
603main ()
604{
605 struct GNUNET_CRYPTO_PrivateKey priv;
606 struct GNUNET_CRYPTO_PublicKey pub;
607 struct GNUNET_CRYPTO_PublicKey pub_parsed;
608 struct GNUNET_GNSRECORD_Block *rrblock;
609 struct GNUNET_HashCode query;
610 struct GNUNET_HashCode expected_query;
611 struct GNUNET_TIME_Absolute expire;
612 char label[128];
613 char rdata[8096];
614 char ztld[128];
615 res = 0;
616
617 for (int i = 0; NULL != tvs[i].d; i++)
618 {
619 printf ("Test vector #%d\n", i);
620 memset (label, 0, sizeof (label));
621 parsehex (tvs[i].zid,(char*) &pub_parsed, 36, 0);
622 parsehex (tvs[i].d,(char*) &priv.ecdsa_key, sizeof (priv.ecdsa_key),
623 (GNUNET_GNSRECORD_TYPE_PKEY == ntohl (pub_parsed.type)) ? 1 : 0);
624 priv.type = pub_parsed.type;
625 GNUNET_CRYPTO_key_get_public (&priv, &pub);
626 if (0 != memcmp (&pub, &pub_parsed, GNUNET_CRYPTO_public_key_get_length (
627 &pub)))
628 {
629 printf ("Wrong pubkey.\n");
630 print_bytes (&pub, 36, 8);
631 print_bytes (&pub_parsed, 36, 8);
632 res = 1;
633 break;
634 }
635 GNUNET_STRINGS_data_to_string (&pub,
636 GNUNET_CRYPTO_public_key_get_length (
637 &pub),
638 ztld,
639 sizeof (ztld));
640 if (0 != strcmp (ztld, tvs[i].ztld))
641 {
642 printf ("Wrong zTLD: expected %s, got %s\n", tvs[i].ztld, ztld);
643 res = 1;
644 break;
645 }
646 rrblock = GNUNET_malloc (strlen (tvs[i].rrblock));
647 parsehex (tvs[i].rrblock, (char*) rrblock, 0, 0);
648 parsehex (tvs[i].label, (char*) label, 0, 0);
649 parsehex (tvs[i].q, (char*) &query, 0, 0);
650 GNUNET_GNSRECORD_query_from_public_key (&pub_parsed,
651 label,
652 &expected_query);
653 if (0 != GNUNET_memcmp (&query, &expected_query))
654 {
655 printf ("FAIL: query does not match:");
656 printf (" expected: %s", GNUNET_h2s (&expected_query));
657 printf (", was: %s\n", GNUNET_h2s (&query));
658 GNUNET_free (rrblock);
659 res = 1;
660 break;
661 }
662 int len = parsehex (tvs[i].rdata, (char*) rdata, 0, 0);
663 tvs[i].expected_rd_count =
664 GNUNET_GNSRECORD_records_deserialize_get_size (len,
665 rdata);
666 GNUNET_assert (tvs[i].expected_rd_count < 2048);
667 if (GNUNET_OK !=
668 GNUNET_GNSRECORD_records_deserialize (len,
669 rdata,
670 tvs[i].expected_rd_count,
671 tvs[i].expected_rd))
672 {
673 printf ("FAIL: Deserialization of RDATA failed\n");
674 res = 1;
675 GNUNET_free (rrblock);
676 break;
677 }
678 expire = GNUNET_GNSRECORD_record_get_expiration_time (
679 tvs[i].expected_rd_count,
680 tvs[i].expected_rd,
681 GNUNET_TIME_UNIT_ZERO_ABS);
682 if ((GNUNET_GNSRECORD_TYPE_PKEY == ntohl (pub.type)) &&
683 (GNUNET_OK != check_derivations_pkey (label, expire, &pub, &tvs[i])))
684 {
685 res = 1;
686 GNUNET_free (rrblock);
687 break;
688 }
689 else if ((GNUNET_GNSRECORD_TYPE_EDKEY == ntohl (pub.type)) &&
690 (GNUNET_OK != check_derivations_edkey (label, expire, &pub,
691 &tvs[i])))
692 {
693 res = 1;
694 GNUNET_free (rrblock);
695 break;
696 }
697 if (GNUNET_OK != GNUNET_GNSRECORD_block_decrypt (rrblock,
698 &pub_parsed,
699 label,
700 &res_checker,
701 &tvs[i]))
702 {
703 printf ("FAIL: Decryption of RRBLOCK failed\n");
704 res = 1;
705 GNUNET_free (rrblock);
706 break;
707 }
708 if (0 != res)
709 {
710 GNUNET_free (rrblock);
711 break;
712 }
713 printf ("Good.\n");
714 }
715 return res;
716}