xref: /freebsd/sys/dev/wg/wg_noise.h (revision a90b9d0159070121c221b966469c3e36d912bf82)
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__ */
132