GNUnet debian-0.24.3-24-gfea921bd2
gnunet_core_service.h
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009-2017 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 */
36#ifndef GNUNET_CORE_SERVICE_H
37#define GNUNET_CORE_SERVICE_H
38
39#ifdef __cplusplus
40extern "C" {
41#if 0 /* keep Emacsens' auto-indent happy */
42}
43#endif
44#endif
45
46
47#include "gnunet_util_lib.h"
48
53#define GNUNET_CORE_SVC_INFO_LEN 64
54
70{
75
81
87
94
101
109
110
115{
120
125
130
135
140
145
150
155
156 // Note: Services using core need to define their own Identifier here
157
163
169{
173 uint32_t major;
174
178 uint32_t minor;
179
184 // uint32_t patch;
185};
186
187
195{
200
205
210
215};
216
217
221#define GNUNET_CORE_VERSION 0x00000001
225#define CONG_CRYPTO_ENABLED 0
226
228
229
235{
240
245
251
256
261
266
271
277};
278
279#if CONG_CRYPTO_ENABLED
285struct PingMessage
286{
291
295 unsigned char nonce[crypto_aead_xchacha20poly1305_ietf_NPUBBYTES];
296
304 unsigned char tag[crypto_aead_xchacha20poly1305_ietf_ABYTES];
305
311
315 uint32_t challenge GNUNET_PACKED;
316};
317
318
322struct PongMessage
323{
328
332 unsigned char nonce[crypto_aead_xchacha20poly1305_ietf_NPUBBYTES];
333
341 unsigned char tag[crypto_aead_xchacha20poly1305_ietf_ABYTES];
342
343
347 uint32_t challenge GNUNET_PACKED;
348
352 uint32_t reserved;
353
359
365};
366
367#else
368
375{
380
385
391
396};
397
398
403{
408
413
418
422 uint32_t reserved;
423
429
435};
436
437#endif
438
440
444struct GNUNET_CORE_Handle;
445
446
458typedef void *(*GNUNET_CORE_ConnectEventHandler) (
459 void *cls,
460 const struct GNUNET_PeerIdentity *peer,
461 struct GNUNET_MQ_Handle *mq,
462 enum GNUNET_CORE_PeerClass class);
463
464
474 void *cls,
475 const struct GNUNET_PeerIdentity *peer,
476 void *peer_cls);
477
478
493 void *cls,
494 const struct GNUNET_PeerIdentity *my_identity);
495
496
523struct GNUNET_CORE_Handle *
525 void *cls,
531
532
538void
540
541
554struct GNUNET_MQ_Handle *
556 const struct GNUNET_PeerIdentity *pid);
557
558
563
564
581{
586
591
596
601
606
611
616
621
626
636
642
649
659
660
671 void *cls,
672 const struct GNUNET_PeerIdentity *pid,
675
676
696 void *peer_cb_cls);
697
698
704void
706
707
722int
724 const struct GNUNET_PeerIdentity *pid);
725
726
727#if 0 /* keep Emacsens' auto-indent happy */
728{
729#endif
730#ifdef __cplusplus
731}
732#endif
733
734/* ifndef GNUNET_CORE_SERVICE_H */
735#endif
736 /* end of group core */
738 /* end of backbone addition */
740
741/* end of gnunet_core_service.h */
struct GNUNET_MQ_MessageHandlers handlers[]
Definition: 003.c:1
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
void * connects(void *cls, const struct GNUNET_PeerIdentity *peer, struct GNUNET_MQ_Handle *mq)
Definition: 010.c:2
void disconnects(void *cls, const struct GNUNET_PeerIdentity *peer)
Definition: 011.c:2
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:98
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:108
static char * init
Set to the name of a service to start.
Definition: gnunet-arm.c:73
static struct GNUNET_TIME_Relative timeout
User defined timestamp for completing operations.
Definition: gnunet-arm.c:118
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
struct GNUNET_PeerIdentity my_identity
Our peer identity.
enum State state
current state of profiling
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition: gnunet-vpn.c:35
void(* GNUNET_CORE_DisconnectEventHandler)(void *cls, const struct GNUNET_PeerIdentity *peer, void *peer_cls)
Method called whenever a peer disconnects.
void(* GNUNET_CORE_MonitorCallback)(void *cls, const struct GNUNET_PeerIdentity *pid, enum GNUNET_CORE_KxState state, struct GNUNET_TIME_Absolute timeout)
Function called by the monitor callback whenever a peer's connection status changes.
GNUNET_CORE_PeerClass
The peer class gives a hint about the capabilities of a peer.
struct GNUNET_CORE_Handle * GNUNET_CORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, void *cls, GNUNET_CORE_StartupCallback init, GNUNET_CORE_ConnectEventHandler connects, GNUNET_CORE_DisconnectEventHandler disconnects, const struct GNUNET_MQ_MessageHandler *handlers, struct GNUNET_CORE_ServiceInfo *service_info)
Connect to the core service.
Definition: core_api.c:698
GNUNET_CORE_Service
Identifiers for services that communicate over CORE.
GNUNET_CORE_KxState
TODO how does this harmonize with CAKE_CRYPTO_ENABLED?
struct GNUNET_MQ_Handle * GNUNET_CORE_get_mq(const struct GNUNET_CORE_Handle *h, const struct GNUNET_PeerIdentity *pid)
Obtain the message queue for a connected peer.
Definition: core_api.c:775
void GNUNET_CORE_monitor_stop(struct GNUNET_CORE_MonitorHandle *mh)
Stop monitoring CORE activity.
void(* GNUNET_CORE_StartupCallback)(void *cls, const struct GNUNET_PeerIdentity *my_identity)
Function called after GNUNET_CORE_connect has succeeded (or failed for good).
void *(* GNUNET_CORE_ConnectEventHandler)(void *cls, const struct GNUNET_PeerIdentity *peer, struct GNUNET_MQ_Handle *mq, enum GNUNET_CORE_PeerClass class)
Method called whenever a given peer connects.
struct GNUNET_CORE_MonitorHandle * GNUNET_CORE_monitor_start(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CORE_MonitorCallback peer_cb, void *peer_cb_cls)
Monitor connectivity and KX status of all peers known to CORE.
int GNUNET_CORE_is_peer_connected_sync(const struct GNUNET_CORE_Handle *h, const struct GNUNET_PeerIdentity *pid)
Check if the given peer is currently connected.
void GNUNET_CORE_disconnect(struct GNUNET_CORE_Handle *handle)
Disconnect from the core service.
Definition: core_api.c:744
@ GNUNET_CORE_CLASS_SERVER
This is something like a server.
@ GNUNET_CORE_CLASS_UNKNOWN
The device's capabilities are currently unknown.
@ GNUNET_CORE_CLASS_ROUTER
This is a piece of network infrastructure.
@ GNUNET_CORE_CLASS_MOBILE
This is a mobile device.
@ GNUNET_CORE_CLASS_DESKTOP
This is a desktop computer.
@ GNUNET_CORE_CLASS_UNWILLING
This device is currently unwilling to spend more then the absolutely necessary ressources.
@ GNUNET_CORE_SERVICE_TOPOLOGY
Identifier for topology service.
@ GNUNET_CORE_SERVICE_DHT
Identifier for dht (distributed hash table) service.
@ GNUNET_CORE_SERVICE_NSE
Identifier for nse (network size estimation) service.
@ GNUNET_CORE_SERVICE_CADET
Identifier for cadet service.
@ GNUNET_CORE_SERVICE_RPS
Identifier for rps (random peer sampling) service.
@ GNUNET_CORE_SERVICE_FS
Identifier for fs (file sharing) service.
@ GNUNET_CORE_SERVICE_REVOCATION
Identifier for revocation service.
@ GNUNET_CORE_SERVICE_TEST
Identifier for testing the api.
@ GNUNET_CORE_SERVICE_HOSTLIST
Identifier for hostlist service.
@ GNUNET_CORE_KX_PEER_DISCONNECT
Last state of a KX (when it is being terminated).
@ GNUNET_CORE_KX_STATE_RESPONDER_CONNECTED
Connected as responder.
@ GNUNET_CORE_KX_STATE_DOWN
No handshake yet.
@ GNUNET_CORE_KX_STATE_INITIATOR_DONE_SENT
We sent initiator done.
@ GNUNET_CORE_KX_CORE_DISCONNECT
This is not a state in a peer's state machine, but a special value used with the GNUNET_CORE_MonitorC...
@ GNUNET_CORE_KX_STATE_INITIATOR_HELLO_RECEIVED
We've received the initiator hello.
@ GNUNET_CORE_KX_STATE_AWAIT_INITIATION
We are awating the initiator hello.
@ GNUNET_CORE_KX_STATE_INITIATOR_CONNECTED
Connected as initiator.
@ GNUNET_CORE_KX_STATE_INITIATOR_HELLO_SENT
We sent the initiator hello.
@ GNUNET_CORE_KX_STATE_RESPONDER_HELLO_RECEIVED
We've received the initiator hello.
@ GNUNET_CORE_KX_STATE_RESPONDER_HELLO_SENT
We sent the responder hello.
@ GNUNET_CORE_KX_ITERATION_FINISHED
This is not a state in a peer's state machine, but a special value used with the GNUNET_CORE_MonitorC...
@ GNUNET_CORE_KX_STATE_REKEY_SENT
We're rekeying (or had a timeout), so we have sent the other peer our new ephemeral key,...
#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.
Message transmitted with the signed ephemeral key of a peer.
struct GNUNET_PeerIdentity origin_identity
Public key of the signing peer (persistent version, not the ephemeral public key).
struct GNUNET_MessageHeader header
Message type is #GNUNET_MESSAGE_TYPE_CORE_EPHEMERAL_KEY.
int32_t sender_status
Status of the sender (should be in enum PeerStateMachine), nbo.
struct GNUNET_TIME_AbsoluteNBO expiration_time
When does the given ephemeral key expire (end of validity).
struct GNUNET_CRYPTO_EddsaSignature signature
An ECC signature of the origin_identity asserting the validity of the given ephemeral key.
struct GNUNET_TIME_AbsoluteNBO creation_time
At what time was this key created (beginning of validity).
struct GNUNET_CRYPTO_EccSignaturePurpose purpose
Information about what is being signed.
struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key
Ephemeral public ECC key.
Context for the core service connection.
Definition: core_api.c:78
void * cls
Closure for the various callbacks.
Definition: core_api.c:87
struct GNUNET_CORE_ServiceInfo service_info
Services info field for the connected service.
Definition: core_api.c:148
Handle to a CORE monitoring operation.
GNUNET_CORE_MonitorCallback peer_cb
Function called with the peer.
void * peer_cb_cls
Closure for peer_cb.
Gnunet service info - identifying compatibility with a range of version of a service communicating ov...
struct GNUNET_CORE_ServiceVersion version_max
Maximal compatible version number of service.
struct GNUNET_CORE_ServiceVersion version
Version of this service implementation.
enum GNUNET_CORE_Service service
Identifier of the service on top of CORE.
struct GNUNET_CORE_ServiceVersion version_min
Minimal compatible version number of service.
A gnunet service version for services above CORE TODO we might want to be compatible with https://sem...
uint32_t major
Major version number.
uint32_t minor
Minor version number.
header of what an ECC signature signs this must be followed by "size - 8" bytes of the actual signed ...
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and encr...
an ECC signature using EdDSA.
Handle to a message queue.
Definition: mq.c:87
Message handler for a specific message type.
Header for all communications.
The identity of the host (wraps the signing key of the peer).
Time for absolute time used by GNUnet, in microseconds and in network byte order.
Time for absolute times used by GNUnet, in microseconds.
We're sending an (encrypted) PING to the other peer to check if it can decrypt.
struct GNUNET_MessageHeader header
Message type is #GNUNET_MESSAGE_TYPE_CORE_PING.
uint32_t iv_seed
Seed for the IV.
struct GNUNET_PeerIdentity target
Intended target of the PING, used primarily to check that decryption actually worked.
uint32_t challenge
Random number chosen to make replay harder.
Response to a PING.
uint32_t challenge
Random number to make replay attacks harder.
struct GNUNET_MessageHeader header
Message type is #GNUNET_MESSAGE_TYPE_CORE_PONG.
uint32_t reserved
Reserved, always zero.
uint32_t iv_seed
Seed for the IV.
enum GNUNET_CORE_PeerClass peer_class
The peer class of the sending peer TODO is it correct to send an enum like this?
struct GNUNET_PeerIdentity target
Intended target of the PING, used primarily to check that decryption actually worked.