wireguard: add dos mitigation support
[vpp.git] / src / plugins / wireguard / wireguard_cookie.h
1 /*
2  * Copyright (c) 2020 Doc.ai and/or its affiliates.
3  * Copyright (c) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>.
4  * Copyright (c) 2019-2020 Matt Dunwoodie <ncon@noconroy.net>.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #ifndef __included_wg_cookie_h__
19 #define __included_wg_cookie_h__
20
21 #include <vnet/ip/ip46_address.h>
22 #include <wireguard/wireguard_noise.h>
23
24 enum cookie_mac_state
25 {
26   INVALID_MAC,
27   VALID_MAC_BUT_NO_COOKIE,
28   VALID_MAC_WITH_COOKIE
29 };
30
31 #define COOKIE_MAC_SIZE         16
32 #define COOKIE_KEY_SIZE         32
33 #define COOKIE_NONCE_SIZE       24
34 #define COOKIE_COOKIE_SIZE      16
35 #define COOKIE_SECRET_SIZE      32
36 #define COOKIE_INPUT_SIZE       32
37 #define COOKIE_ENCRYPTED_SIZE   (COOKIE_COOKIE_SIZE + COOKIE_MAC_SIZE)
38
39 #define COOKIE_MAC1_KEY_LABEL   "mac1----"
40 #define COOKIE_COOKIE_KEY_LABEL "cookie--"
41 #define COOKIE_SECRET_MAX_AGE   120
42 #define COOKIE_SECRET_LATENCY   5
43
44 /* Constants for initiation rate limiting */
45 #define RATELIMIT_SIZE          (1 << 13)
46 #define RATELIMIT_SIZE_MAX      (RATELIMIT_SIZE * 8)
47 #define NSEC_PER_SEC            1000000000LL
48 #define INITIATIONS_PER_SECOND  20
49 #define INITIATIONS_BURSTABLE   5
50 #define INITIATION_COST         (NSEC_PER_SEC / INITIATIONS_PER_SECOND)
51 #define TOKEN_MAX               (INITIATION_COST * INITIATIONS_BURSTABLE)
52 #define ELEMENT_TIMEOUT         1
53 #define IPV4_MASK_SIZE          4       /* Use all 4 bytes of IPv4 address */
54 #define IPV6_MASK_SIZE          8       /* Use top 8 bytes (/64) of IPv6 address */
55
56 typedef struct cookie_macs
57 {
58   uint8_t mac1[COOKIE_MAC_SIZE];
59   uint8_t mac2[COOKIE_MAC_SIZE];
60 } message_macs_t;
61
62 typedef struct cookie_maker
63 {
64   uint8_t cp_mac1_key[COOKIE_KEY_SIZE];
65   uint8_t cp_cookie_key[COOKIE_KEY_SIZE];
66
67   uint8_t cp_cookie[COOKIE_COOKIE_SIZE];
68   f64 cp_birthdate;
69   int cp_mac1_valid;
70   uint8_t cp_mac1_last[COOKIE_MAC_SIZE];
71 } cookie_maker_t;
72
73 typedef struct cookie_checker
74 {
75   uint8_t cc_mac1_key[COOKIE_KEY_SIZE];
76   uint8_t cc_cookie_key[COOKIE_KEY_SIZE];
77
78   f64 cc_secret_birthdate;
79   uint8_t cc_secret[COOKIE_SECRET_SIZE];
80 } cookie_checker_t;
81
82
83 void cookie_maker_init (cookie_maker_t *, const uint8_t[COOKIE_INPUT_SIZE]);
84 void cookie_checker_update (cookie_checker_t *, uint8_t[COOKIE_INPUT_SIZE]);
85 void cookie_checker_create_payload (vlib_main_t *vm, cookie_checker_t *cc,
86                                     message_macs_t *cm,
87                                     uint8_t nonce[COOKIE_NONCE_SIZE],
88                                     uint8_t ecookie[COOKIE_ENCRYPTED_SIZE],
89                                     ip46_address_t *ip, u16 udp_port);
90 bool cookie_maker_consume_payload (vlib_main_t *vm, cookie_maker_t *cp,
91                                    uint8_t nonce[COOKIE_NONCE_SIZE],
92                                    uint8_t ecookie[COOKIE_ENCRYPTED_SIZE]);
93 void cookie_maker_mac (cookie_maker_t *, message_macs_t *, void *, size_t);
94 enum cookie_mac_state
95 cookie_checker_validate_macs (vlib_main_t *vm, cookie_checker_t *,
96                               message_macs_t *, void *, size_t, bool,
97                               ip46_address_t *ip, u16 udp_port);
98
99 #endif /* __included_wg_cookie_h__ */
100
101 /*
102  * fd.io coding-style-patch-verification: ON
103  *
104  * Local Variables:
105  * eval: (c-set-style "gnu")
106  * End:
107  */