GNUnet  0.20.0
hello-ng.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2018 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 
26 #include "platform.h"
27 #include "gnunet_signatures.h"
28 #include "gnunet_hello_lib.h"
29 #include "gnunet_protocols.h"
30 #include "gnunet_util_lib.h"
31 #include "gnunet_ats_service.h"
32 
38 {
43 
48 
53 };
55 
66 void
68  const char *address,
70  struct GNUNET_TIME_Absolute mono_time,
71  const struct GNUNET_CRYPTO_EddsaPrivateKey *private_key,
72  void **result,
73  size_t *result_size)
74 {
75  struct SignedAddress sa;
77  char *sig_str;
78 
80  sa.purpose.size = htonl (sizeof(sa));
81  sa.mono_time = GNUNET_TIME_absolute_hton (mono_time);
83  GNUNET_CRYPTO_eddsa_sign (private_key, &sa, &sig);
84  sig_str = NULL;
85  (void) GNUNET_STRINGS_base64_encode (&sig, sizeof(sig), &sig_str);
86  *result_size =
87  1 + GNUNET_asprintf ((char **) result,
88  "%s;%llu;%u;%s",
89  sig_str,
90  (unsigned long long) mono_time.abs_value_us,
91  (unsigned int) nt,
92  address);
93  GNUNET_free (sig_str);
94 }
95 
96 
107 char *
109  size_t raw_size,
110  const struct GNUNET_PeerIdentity *pid,
111  enum GNUNET_NetworkType *nt,
112  struct GNUNET_TIME_Absolute *mono_time)
113 {
114  const struct GNUNET_CRYPTO_EddsaPublicKey *public_key = &pid->public_key;
115  const char *raws = raw;
116  unsigned long long raw_us = 0;
117  unsigned int raw_nt = 0;
118  const char *sc;
119  const char *sc2;
120  const char *sc3;
121  const char *raw_addr;
122  char *data = NULL;
123  struct GNUNET_TIME_Absolute raw_mono_time;
124  struct SignedAddress sa;
125  struct GNUNET_CRYPTO_EddsaSignature *sig;
126 
127  if ('\0' != raws[raw_size-1])
128  {
129  GNUNET_break_op (0);
130  return NULL;
131  }
132  if (NULL == (sc = strchr (raws, ';')))
133  {
134  GNUNET_break_op (0);
135  return NULL;
136  }
137  if (NULL == (sc2 = strchr (sc + 1, ';')))
138  {
139  GNUNET_break_op (0);
140  return NULL;
141  }
142  if (NULL == (sc3 = strchr (sc2 + 1, ';')))
143  {
144  GNUNET_break_op (0);
145  return NULL;
146  }
147  if (2 != sscanf (sc + 1, "%llu;%u;%*s", &raw_us, &raw_nt))
148  {
149  GNUNET_break_op (0);
150  return NULL;
151  }
152  raw_addr = sc3 + 1;
153  raw_mono_time.abs_value_us = raw_us;
154  if (sizeof(struct GNUNET_CRYPTO_EddsaSignature) !=
155  GNUNET_STRINGS_base64_decode (raws, sc - raws, (void **) &data))
156  {
157  GNUNET_break_op (0);
158  GNUNET_free (data);
159  return NULL;
160  }
161  sig = (struct GNUNET_CRYPTO_EddsaSignature*) data;
163  sa.purpose.size = htonl (sizeof(sa));
164  sa.mono_time = GNUNET_TIME_absolute_hton (raw_mono_time);
165  GNUNET_CRYPTO_hash (raw_addr, strlen (raw_addr), &sa.addr_hash);
166  if (GNUNET_YES !=
168  &sa,
169  sig,
170  public_key))
171  {
172  GNUNET_free (data);
173  GNUNET_break_op (0);
174  return NULL;
175  }
176  GNUNET_free (data);
177  *mono_time = raw_mono_time;
178  *nt = raw_nt;
179  return GNUNET_strdup (raw_addr);
180 }
181 
182 
190 char *
192 {
193  const char *dash;
194 
195  dash = strchr (address, '-');
196  if (NULL == dash)
197  return NULL;
198  return GNUNET_strndup (address, dash - address);
199 }
#define GNUNET_SIGNATURE_PURPOSE_TRANSPORT_ADDRESS
Signature by a peer affirming that this is one of its addresses for the given time period.
static char * address
GNS address for this phone.
static int raw
raw output
Definition: gnunet-gns.c:78
uint32_t data
The data value.
static struct GNUNET_NAT_AUTO_Test * nt
Handle to a NAT test operation.
static int result
Global testing status.
static struct GNUNET_FS_SearchContext * sc
Definition: gnunet-search.c:87
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
Automatic transport selection and outbound bandwidth determination.
Helper library for handling HELLOs.
Constants for network protocols.
#define GNUNET_CRYPTO_eddsa_sign(priv, ps, sig)
EdDSA sign a given block.
#define GNUNET_CRYPTO_eddsa_verify(purp, ps, sig, pub)
Verify EdDSA signature.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
GNUNET_NETWORK_STRUCT_END void GNUNET_HELLO_sign_address(const char *address, enum GNUNET_NetworkType nt, struct GNUNET_TIME_Absolute mono_time, const struct GNUNET_CRYPTO_EddsaPrivateKey *private_key, void **result, size_t *result_size)
Build address record by signing raw information with private key.
Definition: hello-ng.c:67
char * GNUNET_HELLO_address_to_prefix(const char *address)
Given an address as a string, extract the prefix that identifies the communicator offering transmissi...
Definition: hello-ng.c:191
char * GNUNET_HELLO_extract_address(const void *raw, size_t raw_size, const struct GNUNET_PeerIdentity *pid, enum GNUNET_NetworkType *nt, struct GNUNET_TIME_Absolute *mono_time)
Check signature and extract address record.
Definition: hello-ng.c:108
#define GNUNET_NETWORK_STRUCT_BEGIN
Define as empty, GNUNET_PACKED should suffice, but this won't work on W32.
#define GNUNET_NETWORK_STRUCT_END
Define as empty, GNUNET_PACKED should suffice, but this won't work on W32;.
#define GNUNET_PACKED
gcc-ism to get packed structs.
@ GNUNET_YES
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_strndup(a, length)
Wrapper around GNUNET_xstrndup_.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_NetworkType
Types of networks (with separate quotas) we support.
Definition: gnunet_nt_lib.h:39
size_t GNUNET_STRINGS_base64_decode(const char *data, size_t len, void **output)
Decode from Base64.
Definition: strings.c:1695
size_t GNUNET_STRINGS_base64_encode(const void *in, size_t len, char **output)
Encode into Base64.
Definition: strings.c:1607
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:638
header of what an ECC signature signs this must be followed by "size - 8" bytes of the actual signed ...
uint32_t size
How many bytes does this signature sign? (including this purpose header); in network byte order (!...
uint32_t purpose
What does this signature vouch for? This must contain a GNUNET_SIGNATURE_PURPOSE_XXX constant (from g...
Private ECC key encoded for transmission.
Public ECC key (always for curve Ed25519) encoded in a format suitable for network transmission and E...
an ECC signature using EdDSA.
A 512-bit hashcode.
The identity of the host (wraps the signing key of the peer).
struct GNUNET_CRYPTO_EddsaPublicKey public_key
Time for absolute time used by GNUnet, in microseconds and in network byte order.
Time for absolute times used by GNUnet, in microseconds.
uint64_t abs_value_us
The actual value.
Binary block we sign when we sign an address.
Definition: hello-ng.c:38
struct GNUNET_HashCode addr_hash
Hash of the address.
Definition: hello-ng.c:52
struct GNUNET_TIME_AbsoluteNBO mono_time
When was the address generated.
Definition: hello-ng.c:47
struct GNUNET_CRYPTO_EccSignaturePurpose purpose
Purpose must be GNUNET_SIGNATURE_PURPOSE_TRANSPORT_ADDRESS.
Definition: hello-ng.c:42