aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2021-03-02 17:16:18 +0100
committerChristian Grothoff <christian@grothoff.org>2021-03-02 17:26:18 +0100
commit45ceb4fdf94566a67dbeac28cebb0f3154b843cf (patch)
treebf1ff5b2f8ac41843634180453a877c8b964cff0 /src
parentad3e581f24153c42d3c39b4af4b83b830f18fecd (diff)
downloadgnunet-45ceb4fdf94566a67dbeac28cebb0f3154b843cf.tar.gz
gnunet-45ceb4fdf94566a67dbeac28cebb0f3154b843cf.zip
add base32 encoder/decoder
Diffstat (limited to 'src')
-rw-r--r--src/util/.gitignore1
-rw-r--r--src/util/Makefile.am9
-rw-r--r--src/util/gnunet-base32.c152
-rw-r--r--src/util/gnunet-scrypt.c7
4 files changed, 165 insertions, 4 deletions
diff --git a/src/util/.gitignore b/src/util/.gitignore
index 8556ee7b8..7c7b7045d 100644
--- a/src/util/.gitignore
+++ b/src/util/.gitignore
@@ -80,3 +80,4 @@ python27_location
80perf_malloc 80perf_malloc
81perf_mq 81perf_mq
82perf_scheduler 82perf_scheduler
83gnunet-base32
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index 33fe26e34..6b9e083a7 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -152,9 +152,10 @@ libexec_PROGRAMS = \
152 gnunet-timeout 152 gnunet-timeout
153 153
154bin_PROGRAMS = \ 154bin_PROGRAMS = \
155 gnunet-resolver \ 155 gnunet-base32 \
156 gnunet-config \ 156 gnunet-config \
157 gnunet-crypto-tvg \ 157 gnunet-crypto-tvg \
158 gnunet-resolver \
158 $(GNUNET_ECC) \ 159 $(GNUNET_ECC) \
159 $(GNUNET_SCRYPT) \ 160 $(GNUNET_SCRYPT) \
160 gnunet-uri 161 gnunet-uri
@@ -203,6 +204,12 @@ gnunet_ecc_LDADD = \
203 libgnunetutil.la \ 204 libgnunetutil.la \
204 $(GN_LIBINTL) -lgcrypt 205 $(GN_LIBINTL) -lgcrypt
205 206
207gnunet_base32_SOURCES = \
208 gnunet-base32.c
209gnunet_base32_LDADD = \
210 libgnunetutil.la \
211 $(GN_LIBINTL)
212
206gnunet_scrypt_SOURCES = \ 213gnunet_scrypt_SOURCES = \
207 gnunet-scrypt.c 214 gnunet-scrypt.c
208gnunet_scrypt_LDADD = \ 215gnunet_scrypt_LDADD = \
diff --git a/src/util/gnunet-base32.c b/src/util/gnunet-base32.c
new file mode 100644
index 000000000..2c797f56e
--- /dev/null
+++ b/src/util/gnunet-base32.c
@@ -0,0 +1,152 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2021 GNUnet e.V.
4
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.
9
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.
14
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/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
21/**
22 * @file util/gnunet-base32.c
23 * @brief tool to encode/decode from/to the Crockford Base32 encoding GNUnet uses
24 * @author Christian Grothoff
25 */
26#include "platform.h"
27#include "gnunet_util_lib.h"
28
29
30/**
31 * The main function of gnunet-base32
32 *
33 * @param argc number of arguments from the command line
34 * @param argv command line arguments
35 * @return 0 ok, 1 on error
36 */
37int
38main (int argc,
39 char *const *argv)
40{
41 int decode = 0;
42 const struct GNUNET_GETOPT_CommandLineOption options[] = {
43 GNUNET_GETOPT_option_flag ('d',
44 "decode",
45 gettext_noop ("run decoder modus, otherwise runs as encoder"),
46 &decode),
47 GNUNET_GETOPT_option_help ("Crockford base32 encoder/decoder"),
48 GNUNET_GETOPT_option_version (PACKAGE_VERSION),
49 GNUNET_GETOPT_OPTION_END
50 };
51 int ret;
52 char *in;
53 unsigned int in_size;
54 ssize_t iret;
55 char *out;
56 size_t out_size;
57
58 if (GNUNET_OK !=
59 GNUNET_STRINGS_get_utf8_args (argc, argv,
60 &argc, &argv))
61 return 2;
62 ret = GNUNET_GETOPT_run ("gnunet-base32",
63 options,
64 argc,
65 argv);
66 if (ret < 0)
67 return 1;
68 if (0 == ret)
69 return 0;
70 in_size = 0;
71 in = NULL;
72 iret = 1;
73 while (iret > 0)
74 {
75 /* read in blocks of 4k */
76 char buf[4092];
77
78 iret = read (0,
79 buf,
80 sizeof (buf));
81 if (iret < 0)
82 {
83 GNUNET_free (in);
84 return 2;
85 }
86 if (iret > 0)
87 {
88 if (iret + in_size < in_size)
89 {
90 GNUNET_break (0);
91 GNUNET_free (in);
92 return 1;
93 }
94 GNUNET_array_grow (in,
95 in_size,
96 in_size + iret);
97 memcpy (&in[in_size - iret],
98 buf,
99 iret);
100 }
101 }
102 if (decode)
103 {
104 /* This formula can overestimate by 1 byte, so we try both
105 out_size and out_size-1 below */
106 out_size = in_size * 5 / 8;
107 out = GNUNET_malloc (out_size);
108 if (GNUNET_OK !=
109 GNUNET_STRINGS_string_to_data (in,
110 in_size,
111 out,
112 out_size))
113 {
114 out_size--;
115 if (GNUNET_OK !=
116 GNUNET_STRINGS_string_to_data (in,
117 in_size,
118 out,
119 out_size))
120 {
121 GNUNET_free (out);
122 GNUNET_free (in);
123 return 3;
124 }
125 }
126 }
127 else
128 {
129 out = GNUNET_STRINGS_data_to_string_alloc (in,
130 in_size);
131 out_size = strlen (out);
132 }
133 {
134 size_t pos = 0;
135
136 while (pos < out_size)
137 {
138 iret = write (1,
139 &out[pos],
140 out_size - pos);
141 if (iret <= 0)
142 return 4;
143 pos += iret;
144 }
145 }
146 GNUNET_free (out);
147 GNUNET_free_nz ((void *) argv);
148 return 0;
149}
150
151
152/* end of gnunet-uri.c */
diff --git a/src/util/gnunet-scrypt.c b/src/util/gnunet-scrypt.c
index 5c3dfc12e..fe8b6769f 100644
--- a/src/util/gnunet-scrypt.c
+++ b/src/util/gnunet-scrypt.c
@@ -290,8 +290,8 @@ run (void *cls,
290int 290int
291main (int argc, char *const *argv) 291main (int argc, char *const *argv)
292{ 292{
293 struct GNUNET_GETOPT_CommandLineOption options[] = 293 struct GNUNET_GETOPT_CommandLineOption options[] = {
294 { GNUNET_GETOPT_option_ulong ( 294 GNUNET_GETOPT_option_ulong (
295 'b', 295 'b',
296 "bits", 296 "bits",
297 "BITS", 297 "BITS",
@@ -315,7 +315,8 @@ main (int argc, char *const *argv)
315 gettext_noop ( 315 gettext_noop (
316 "time to wait between calculations"), 316 "time to wait between calculations"),
317 &proof_find_delay), 317 &proof_find_delay),
318 GNUNET_GETOPT_OPTION_END }; 318 GNUNET_GETOPT_OPTION_END
319 };
319 int ret; 320 int ret;
320 321
321 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) 322 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))