xref: /openbmc/linux/drivers/net/wireguard/cookie.h (revision 8dd06ef34b6e2f41b29fbf5fc1663780f2524285)
1*e7096c13SJason A. Donenfeld /* SPDX-License-Identifier: GPL-2.0 */
2*e7096c13SJason A. Donenfeld /*
3*e7096c13SJason A. Donenfeld  * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
4*e7096c13SJason A. Donenfeld  */
5*e7096c13SJason A. Donenfeld 
6*e7096c13SJason A. Donenfeld #ifndef _WG_COOKIE_H
7*e7096c13SJason A. Donenfeld #define _WG_COOKIE_H
8*e7096c13SJason A. Donenfeld 
9*e7096c13SJason A. Donenfeld #include "messages.h"
10*e7096c13SJason A. Donenfeld #include <linux/rwsem.h>
11*e7096c13SJason A. Donenfeld 
12*e7096c13SJason A. Donenfeld struct wg_peer;
13*e7096c13SJason A. Donenfeld 
14*e7096c13SJason A. Donenfeld struct cookie_checker {
15*e7096c13SJason A. Donenfeld 	u8 secret[NOISE_HASH_LEN];
16*e7096c13SJason A. Donenfeld 	u8 cookie_encryption_key[NOISE_SYMMETRIC_KEY_LEN];
17*e7096c13SJason A. Donenfeld 	u8 message_mac1_key[NOISE_SYMMETRIC_KEY_LEN];
18*e7096c13SJason A. Donenfeld 	u64 secret_birthdate;
19*e7096c13SJason A. Donenfeld 	struct rw_semaphore secret_lock;
20*e7096c13SJason A. Donenfeld 	struct wg_device *device;
21*e7096c13SJason A. Donenfeld };
22*e7096c13SJason A. Donenfeld 
23*e7096c13SJason A. Donenfeld struct cookie {
24*e7096c13SJason A. Donenfeld 	u64 birthdate;
25*e7096c13SJason A. Donenfeld 	bool is_valid;
26*e7096c13SJason A. Donenfeld 	u8 cookie[COOKIE_LEN];
27*e7096c13SJason A. Donenfeld 	bool have_sent_mac1;
28*e7096c13SJason A. Donenfeld 	u8 last_mac1_sent[COOKIE_LEN];
29*e7096c13SJason A. Donenfeld 	u8 cookie_decryption_key[NOISE_SYMMETRIC_KEY_LEN];
30*e7096c13SJason A. Donenfeld 	u8 message_mac1_key[NOISE_SYMMETRIC_KEY_LEN];
31*e7096c13SJason A. Donenfeld 	struct rw_semaphore lock;
32*e7096c13SJason A. Donenfeld };
33*e7096c13SJason A. Donenfeld 
34*e7096c13SJason A. Donenfeld enum cookie_mac_state {
35*e7096c13SJason A. Donenfeld 	INVALID_MAC,
36*e7096c13SJason A. Donenfeld 	VALID_MAC_BUT_NO_COOKIE,
37*e7096c13SJason A. Donenfeld 	VALID_MAC_WITH_COOKIE_BUT_RATELIMITED,
38*e7096c13SJason A. Donenfeld 	VALID_MAC_WITH_COOKIE
39*e7096c13SJason A. Donenfeld };
40*e7096c13SJason A. Donenfeld 
41*e7096c13SJason A. Donenfeld void wg_cookie_checker_init(struct cookie_checker *checker,
42*e7096c13SJason A. Donenfeld 			    struct wg_device *wg);
43*e7096c13SJason A. Donenfeld void wg_cookie_checker_precompute_device_keys(struct cookie_checker *checker);
44*e7096c13SJason A. Donenfeld void wg_cookie_checker_precompute_peer_keys(struct wg_peer *peer);
45*e7096c13SJason A. Donenfeld void wg_cookie_init(struct cookie *cookie);
46*e7096c13SJason A. Donenfeld 
47*e7096c13SJason A. Donenfeld enum cookie_mac_state wg_cookie_validate_packet(struct cookie_checker *checker,
48*e7096c13SJason A. Donenfeld 						struct sk_buff *skb,
49*e7096c13SJason A. Donenfeld 						bool check_cookie);
50*e7096c13SJason A. Donenfeld void wg_cookie_add_mac_to_packet(void *message, size_t len,
51*e7096c13SJason A. Donenfeld 				 struct wg_peer *peer);
52*e7096c13SJason A. Donenfeld 
53*e7096c13SJason A. Donenfeld void wg_cookie_message_create(struct message_handshake_cookie *src,
54*e7096c13SJason A. Donenfeld 			      struct sk_buff *skb, __le32 index,
55*e7096c13SJason A. Donenfeld 			      struct cookie_checker *checker);
56*e7096c13SJason A. Donenfeld void wg_cookie_message_consume(struct message_handshake_cookie *src,
57*e7096c13SJason A. Donenfeld 			       struct wg_device *wg);
58*e7096c13SJason A. Donenfeld 
59*e7096c13SJason A. Donenfeld #endif /* _WG_COOKIE_H */
60