aboutsummaryrefslogtreecommitdiff
path: root/src/service/messenger/messenger_api_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/service/messenger/messenger_api_util.c')
-rw-r--r--src/service/messenger/messenger_api_util.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/service/messenger/messenger_api_util.c b/src/service/messenger/messenger_api_util.c
new file mode 100644
index 000000000..1d38f87a1
--- /dev/null
+++ b/src/service/messenger/messenger_api_util.c
@@ -0,0 +1,129 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2020--2024 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 * @author Tobias Frisch
22 * @file src/messenger/messenger_api_util.c
23 * @brief messenger api: client implementation of GNUnet MESSENGER service
24 */
25
26#include "messenger_api_util.h"
27
28#include "gnunet_identity_service.h"
29#include "gnunet_messenger_service.h"
30
31static void
32callback_close_channel (void *cls)
33{
34 struct GNUNET_CADET_Channel *channel = cls;
35
36 if (channel)
37 GNUNET_CADET_channel_destroy (channel);
38}
39
40
41void
42delayed_disconnect_channel (struct GNUNET_CADET_Channel *channel)
43{
44 GNUNET_assert (channel);
45
46 GNUNET_SCHEDULER_add_delayed_with_priority (GNUNET_TIME_relative_get_zero_ (),
47 GNUNET_SCHEDULER_PRIORITY_URGENT,
48 callback_close_channel, channel);
49}
50
51
52enum GNUNET_GenericReturnValue
53generate_free_member_id (struct GNUNET_ShortHashCode *id,
54 const struct GNUNET_CONTAINER_MultiShortmap *members)
55{
56 GNUNET_assert (id);
57
58 size_t counter = 1 + (members ? GNUNET_CONTAINER_multishortmap_size (
59 members) : 0);
60
61 do
62 {
63 GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, id, sizeof(struct
64 GNUNET_ShortHashCode));
65
66 if ((members) && (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains (
67 members, id)))
68 counter--;
69 else
70 break;
71 }
72 while (counter > 0);
73
74 if (counter)
75 return GNUNET_YES;
76
77 return GNUNET_NO;
78}
79
80
81const struct GNUNET_CRYPTO_PrivateKey*
82get_anonymous_private_key ()
83{
84 const struct GNUNET_IDENTITY_Ego *ego = GNUNET_IDENTITY_ego_get_anonymous ();
85 return GNUNET_IDENTITY_ego_get_private_key (ego);
86}
87
88
89const struct GNUNET_CRYPTO_PublicKey*
90get_anonymous_public_key ()
91{
92 static struct GNUNET_CRYPTO_PublicKey public_key;
93 static struct GNUNET_IDENTITY_Ego *ego = NULL;
94
95 if (! ego)
96 {
97 ego = GNUNET_IDENTITY_ego_get_anonymous ();
98 GNUNET_IDENTITY_ego_get_public_key (ego, &public_key);
99 }
100
101 return &public_key;
102}
103
104
105void
106convert_messenger_key_to_port (const struct GNUNET_HashCode *key,
107 struct GNUNET_HashCode *port)
108{
109 static uint32_t version_value = 0;
110 static struct GNUNET_HashCode version;
111
112 if (! version_value)
113 {
114 version_value = (uint32_t) (GNUNET_MESSENGER_VERSION);
115 version_value = ((version_value >> 16) & 0xFFFF);
116 version_value = GNUNET_htole32 (version_value);
117 GNUNET_CRYPTO_hash (&version_value, sizeof(version_value), &version);
118 }
119
120 GNUNET_CRYPTO_hash_sum (key, &version, port);
121}
122
123
124void
125convert_peer_identity_to_id (const struct GNUNET_PeerIdentity *identity,
126 struct GNUNET_ShortHashCode *id)
127{
128 GNUNET_memcpy (id, identity, sizeof(struct GNUNET_ShortHashCode));
129}