2 This file is part of GNUnet.
3 Copyright (C) 2020 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
22 * @file util/gnunet-gns-tvg.c
23 * @brief Generate test vectors for GNS.
24 * @author Martin Schanzenbach
27 #include "gnunet_util_lib.h"
28 #include "gnunet_signatures.h"
29 #include "gnunet_gns_service.h"
30 #include "gnunet_gnsrecord_lib.h"
31 #include "gnunet_dnsparser_lib.h"
32 #include "gnunet_testing_lib.h"
35 #define TEST_RECORD_LABEL "test"
36 #define TEST_RECORD_A "1.2.3.4"
37 #define TEST_RRCOUNT 2
40 print_bytes (void *buf,
46 for (i = 0; i < buf_len; i++)
48 if ((0 != i) && (0 != fold) && (i % fold == 0))
50 printf ("%02x", ((unsigned char*) buf)[i]);
57 print_record (const struct GNUNET_GNSRECORD_Data *rd)
61 "EXPIRATION: %" PRIu64 "\n", rd->expiration_time);
63 "DATA_SIZE: %zu\n", rd->data_size);
65 "TYPE: %d\n", rd->record_type);
67 "FLAGS: %d\n", rd->flags);
70 print_bytes ((char*) rd->data, rd->data_size, 8);
71 fprintf (stdout, "\n");
76 * Main function that will be run.
79 * @param args remaining command-line arguments
80 * @param cfgfile name of the configuration file used (for saving, can be NULL!)
81 * @param cfg configuration
87 const struct GNUNET_CONFIGURATION_Handle *cfg)
89 struct GNUNET_GNSRECORD_Data rd[2];
90 struct GNUNET_TIME_Absolute exp_abs = GNUNET_TIME_absolute_get ();
91 struct GNUNET_GNSRECORD_Block *rrblock;
93 struct GNUNET_CRYPTO_EcdsaPrivateKey id_priv;
94 struct GNUNET_CRYPTO_EcdsaPublicKey id_pub;
95 struct GNUNET_CRYPTO_EcdsaPrivateKey pkey_data_p;
96 struct GNUNET_CRYPTO_EcdsaPublicKey pkey_data;
102 GNUNET_CRYPTO_ecdsa_key_create (&id_priv);
103 GNUNET_CRYPTO_ecdsa_key_get_public (&id_priv,
105 fprintf (stdout, "Zone private key (d, little-endian scalar):\n");
106 print_bytes (&id_priv, sizeof(id_priv), 0);
107 fprintf (stdout, "\n");
108 fprintf (stdout, "Zone public key (zk):\n");
109 print_bytes (&id_pub, sizeof(id_pub), 0);
110 fprintf (stdout, "\n");
112 GNUNET_CRYPTO_ecdsa_key_create (&pkey_data_p);
113 GNUNET_CRYPTO_ecdsa_key_get_public (&pkey_data_p,
116 "Label: %s\nRRCOUNT: %d\n\n", TEST_RECORD_LABEL, TEST_RRCOUNT);
117 memset (rd, 0, sizeof (struct GNUNET_GNSRECORD_Data) * 2);
118 GNUNET_assert (GNUNET_OK == GNUNET_GNSRECORD_string_to_value (
119 GNUNET_DNSPARSER_TYPE_A, TEST_RECORD_A, &data, &data_size));
121 rd[0].data_size = data_size;
122 rd[0].expiration_time = exp_abs.abs_value_us;
123 rd[0].record_type = GNUNET_DNSPARSER_TYPE_A;
124 fprintf (stdout, "Record #0\n");
125 print_record (&rd[0]);
127 rd[1].data = &pkey_data;
128 rd[1].data_size = sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey);
129 rd[1].expiration_time = exp_abs.abs_value_us;
130 rd[1].record_type = GNUNET_GNSRECORD_TYPE_PKEY;
131 rd[1].flags = GNUNET_GNSRECORD_RF_PRIVATE;
132 fprintf (stdout, "Record #1\n");
133 print_record (&rd[1]);
135 rdata_size = GNUNET_GNSRECORD_records_get_size (2,
137 rdata = GNUNET_malloc (rdata_size);
138 GNUNET_GNSRECORD_records_serialize (2,
142 fprintf (stdout, "RDATA:\n");
143 print_bytes (rdata, rdata_size, 8);
144 fprintf (stdout, "\n");
145 rrblock = GNUNET_GNSRECORD_block_create (&id_priv,
150 size_t bdata_size = ntohl (rrblock->purpose.size)
151 - sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
152 - sizeof(struct GNUNET_TIME_AbsoluteNBO);
153 size_t rrblock_size = ntohl (rrblock->purpose.size)
154 + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)
155 + sizeof(struct GNUNET_CRYPTO_EcdsaSignature);
157 bdata = (char*) &rrblock[1];
158 fprintf (stdout, "BDATA:\n");
159 print_bytes (bdata, bdata_size, 8);
160 fprintf (stdout, "\n");
161 fprintf (stdout, "RRBLOCK:\n");
162 print_bytes (rrblock, rrblock_size, 8);
163 fprintf (stdout, "\n");
169 * The main function of the test vector generation tool.
171 * @param argc number of arguments from the command line
172 * @param argv command line arguments
173 * @return 0 ok, 1 on error
179 const struct GNUNET_GETOPT_CommandLineOption options[] = {
180 GNUNET_GETOPT_OPTION_END
183 GNUNET_assert (GNUNET_OK ==
184 GNUNET_log_setup ("gnunet-gns-tvg",
188 GNUNET_PROGRAM_run (argc, argv,
190 "Generate test vectors for GNS",
198 /* end of gnunet-gns-tvg.c */