FreeBSD/Linux Kernel Cross Reference
sys/dev/wg/wg_noise.h
1 /* SPDX-License-Identifier: ISC
2 *
3 * Copyright (C) 2015-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
4 * Copyright (C) 2019-2021 Matt Dunwoodie <ncon@noconroy.net>
5 */
6
7 #ifndef __NOISE_H__
8 #define __NOISE_H__
9
10 #include "crypto.h"
11
12 #define NOISE_PUBLIC_KEY_LEN CURVE25519_KEY_SIZE
13 #define NOISE_SYMMETRIC_KEY_LEN CHACHA20POLY1305_KEY_SIZE
14 #define NOISE_TIMESTAMP_LEN (sizeof(uint64_t) + sizeof(uint32_t))
15 #define NOISE_AUTHTAG_LEN CHACHA20POLY1305_AUTHTAG_SIZE
16 #define NOISE_HASH_LEN BLAKE2S_HASH_SIZE
17
18 #define REJECT_AFTER_TIME 180
19 #define REKEY_TIMEOUT 5
20 #define KEEPALIVE_TIMEOUT 10
21
22 struct noise_local;
23 struct noise_remote;
24 struct noise_keypair;
25
26 /* Local configuration */
27 struct noise_local *
28 noise_local_alloc(void *);
29 struct noise_local *
30 noise_local_ref(struct noise_local *);
31 void noise_local_put(struct noise_local *);
32 void noise_local_free(struct noise_local *, void (*)(struct noise_local *));
33 void * noise_local_arg(struct noise_local *);
34
35 void noise_local_private(struct noise_local *,
36 const uint8_t[NOISE_PUBLIC_KEY_LEN]);
37 int noise_local_keys(struct noise_local *,
38 uint8_t[NOISE_PUBLIC_KEY_LEN],
39 uint8_t[NOISE_PUBLIC_KEY_LEN]);
40
41 /* Remote configuration */
42 struct noise_remote *
43 noise_remote_alloc(struct noise_local *, void *,
44 const uint8_t[NOISE_PUBLIC_KEY_LEN]);
45 int noise_remote_enable(struct noise_remote *);
46 void noise_remote_disable(struct noise_remote *);
47 struct noise_remote *
48 noise_remote_lookup(struct noise_local *, const uint8_t[NOISE_PUBLIC_KEY_LEN]);
49 struct noise_remote *
50 noise_remote_index(struct noise_local *, uint32_t);
51 struct noise_remote *
52 noise_remote_ref(struct noise_remote *);
53 void noise_remote_put(struct noise_remote *);
54 void noise_remote_free(struct noise_remote *, void (*)(struct noise_remote *));
55 struct noise_local *
56 noise_remote_local(struct noise_remote *);
57 void * noise_remote_arg(struct noise_remote *);
58
59 void noise_remote_set_psk(struct noise_remote *,
60 const uint8_t[NOISE_SYMMETRIC_KEY_LEN]);
61 int noise_remote_keys(struct noise_remote *,
62 uint8_t[NOISE_PUBLIC_KEY_LEN],
63 uint8_t[NOISE_SYMMETRIC_KEY_LEN]);
64 int noise_remote_initiation_expired(struct noise_remote *);
65 void noise_remote_handshake_clear(struct noise_remote *);
66 void noise_remote_keypairs_clear(struct noise_remote *);
67
68 /* Keypair functions */
69 struct noise_keypair *
70 noise_keypair_lookup(struct noise_local *, uint32_t);
71 struct noise_keypair *
72 noise_keypair_current(struct noise_remote *);
73 struct noise_keypair *
74 noise_keypair_ref(struct noise_keypair *);
75 int noise_keypair_received_with(struct noise_keypair *);
76 void noise_keypair_put(struct noise_keypair *);
77
78 struct noise_remote *
79 noise_keypair_remote(struct noise_keypair *);
80
81 int noise_keypair_nonce_next(struct noise_keypair *, uint64_t *);
82 int noise_keypair_nonce_check(struct noise_keypair *, uint64_t);
83
84 int noise_keep_key_fresh_send(struct noise_remote *);
85 int noise_keep_key_fresh_recv(struct noise_remote *);
86 int noise_keypair_encrypt(
87 struct noise_keypair *,
88 uint32_t *r_idx,
89 uint64_t nonce,
90 struct mbuf *);
91 int noise_keypair_decrypt(
92 struct noise_keypair *,
93 uint64_t nonce,
94 struct mbuf *);
95
96 /* Handshake functions */
97 int noise_create_initiation(
98 struct noise_remote *,
99 uint32_t *s_idx,
100 uint8_t ue[NOISE_PUBLIC_KEY_LEN],
101 uint8_t es[NOISE_PUBLIC_KEY_LEN + NOISE_AUTHTAG_LEN],
102 uint8_t ets[NOISE_TIMESTAMP_LEN + NOISE_AUTHTAG_LEN]);
103
104 int noise_consume_initiation(
105 struct noise_local *,
106 struct noise_remote **,
107 uint32_t s_idx,
108 uint8_t ue[NOISE_PUBLIC_KEY_LEN],
109 uint8_t es[NOISE_PUBLIC_KEY_LEN + NOISE_AUTHTAG_LEN],
110 uint8_t ets[NOISE_TIMESTAMP_LEN + NOISE_AUTHTAG_LEN]);
111
112 int noise_create_response(
113 struct noise_remote *,
114 uint32_t *s_idx,
115 uint32_t *r_idx,
116 uint8_t ue[NOISE_PUBLIC_KEY_LEN],
117 uint8_t en[0 + NOISE_AUTHTAG_LEN]);
118
119 int noise_consume_response(
120 struct noise_local *,
121 struct noise_remote **,
122 uint32_t s_idx,
123 uint32_t r_idx,
124 uint8_t ue[NOISE_PUBLIC_KEY_LEN],
125 uint8_t en[0 + NOISE_AUTHTAG_LEN]);
126
127 #ifdef SELFTESTS
128 bool noise_counter_selftest(void);
129 #endif /* SELFTESTS */
130
131 #endif /* __NOISE_H__ */
Cache object: b3cc162539e093e7e25dafdb57562e69
|