1a364ee04SAaron LI /*- 2a364ee04SAaron LI * SPDX-License-Identifier: ISC 3a6bca3d2SAaron LI * 4a6bca3d2SAaron LI * Copyright (C) 2015-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 5a6bca3d2SAaron LI * Copyright (C) 2019-2021 Matt Dunwoodie <ncon@noconroy.net> 6a364ee04SAaron LI * 7a364ee04SAaron LI * Permission to use, copy, modify, and distribute this software for any 8a364ee04SAaron LI * purpose with or without fee is hereby granted, provided that the above 9a364ee04SAaron LI * copyright notice and this permission notice appear in all copies. 10a364ee04SAaron LI * 11a364ee04SAaron LI * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12a364ee04SAaron LI * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13a364ee04SAaron LI * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14a364ee04SAaron LI * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15a364ee04SAaron LI * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16a364ee04SAaron LI * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17a364ee04SAaron LI * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18a6bca3d2SAaron LI */ 19a6bca3d2SAaron LI 20a364ee04SAaron LI #ifndef _NET_WG_NOISE_H_ 21a364ee04SAaron LI #define _NET_WG_NOISE_H_ 22a6bca3d2SAaron LI 235aabec17SAaron LI #ifndef _KERNEL 245aabec17SAaron LI #error "This file should not be included by userland programs." 255aabec17SAaron LI #endif 265aabec17SAaron LI 27d94868ddSAaron LI #include <crypto/chachapoly.h> 28d94868ddSAaron LI #include <crypto/blake2/blake2s.h> 29d94868ddSAaron LI #include <crypto/curve25519/curve25519.h> 30d94868ddSAaron LI 31a6bca3d2SAaron LI #define NOISE_PUBLIC_KEY_LEN CURVE25519_KEY_SIZE 32a6bca3d2SAaron LI #define NOISE_SYMMETRIC_KEY_LEN CHACHA20POLY1305_KEY_SIZE 33a6bca3d2SAaron LI #define NOISE_AUTHTAG_LEN CHACHA20POLY1305_AUTHTAG_SIZE 34a6bca3d2SAaron LI #define NOISE_HASH_LEN BLAKE2S_HASH_SIZE 35a7f975c0SAaron LI #define NOISE_TIMESTAMP_LEN (sizeof(uint64_t) + sizeof(uint32_t)) 36a6bca3d2SAaron LI 37a6bca3d2SAaron LI #define REJECT_AFTER_TIME 180 38a6bca3d2SAaron LI #define REKEY_TIMEOUT 5 39a6bca3d2SAaron LI #define KEEPALIVE_TIMEOUT 10 40a6bca3d2SAaron LI 41a6bca3d2SAaron LI struct noise_local; 42a6bca3d2SAaron LI struct noise_remote; 43a6bca3d2SAaron LI struct noise_keypair; 44a6bca3d2SAaron LI 45*41fc5cd7SAaron LI int noise_init(void); 46*41fc5cd7SAaron LI void noise_deinit(void); 47*41fc5cd7SAaron LI 48a6bca3d2SAaron LI /* Local configuration */ 49a6bca3d2SAaron LI struct noise_local * 5029a085f5SAaron LI noise_local_alloc(void); 5129a085f5SAaron LI void noise_local_free(struct noise_local *); 52a6bca3d2SAaron LI 53682f87c9SAaron LI bool noise_local_set_private(struct noise_local *, 54a6bca3d2SAaron LI const uint8_t[NOISE_PUBLIC_KEY_LEN]); 55682f87c9SAaron LI bool noise_local_keys(struct noise_local *, 56a6bca3d2SAaron LI uint8_t[NOISE_PUBLIC_KEY_LEN], 57a6bca3d2SAaron LI uint8_t[NOISE_PUBLIC_KEY_LEN]); 58a6bca3d2SAaron LI 59a6bca3d2SAaron LI /* Remote configuration */ 60a6bca3d2SAaron LI struct noise_remote * 61a7f975c0SAaron LI noise_remote_alloc(struct noise_local *, 62a7f975c0SAaron LI const uint8_t[NOISE_PUBLIC_KEY_LEN], void *); 63a6bca3d2SAaron LI int noise_remote_enable(struct noise_remote *); 64a6bca3d2SAaron LI void noise_remote_disable(struct noise_remote *); 65a6bca3d2SAaron LI struct noise_remote * 66a7f975c0SAaron LI noise_remote_lookup(struct noise_local *, 67a7f975c0SAaron LI const uint8_t[NOISE_PUBLIC_KEY_LEN]); 68a6bca3d2SAaron LI struct noise_remote * 69a6bca3d2SAaron LI noise_remote_index(struct noise_local *, uint32_t); 70a6bca3d2SAaron LI struct noise_remote * 71a6bca3d2SAaron LI noise_remote_ref(struct noise_remote *); 72a6bca3d2SAaron LI void noise_remote_put(struct noise_remote *); 73ef7d48a7SAaron LI void noise_remote_free(struct noise_remote *); 74a6bca3d2SAaron LI void * noise_remote_arg(struct noise_remote *); 75a6bca3d2SAaron LI 76a6bca3d2SAaron LI void noise_remote_set_psk(struct noise_remote *, 77a6bca3d2SAaron LI const uint8_t[NOISE_SYMMETRIC_KEY_LEN]); 78682f87c9SAaron LI bool noise_remote_keys(struct noise_remote *, 79a6bca3d2SAaron LI uint8_t[NOISE_PUBLIC_KEY_LEN], 80a6bca3d2SAaron LI uint8_t[NOISE_SYMMETRIC_KEY_LEN]); 81682f87c9SAaron LI bool noise_remote_initiation_expired(struct noise_remote *); 82a6bca3d2SAaron LI void noise_remote_handshake_clear(struct noise_remote *); 83a6bca3d2SAaron LI void noise_remote_keypairs_clear(struct noise_remote *); 84a6bca3d2SAaron LI 85a6bca3d2SAaron LI /* Keypair functions */ 86a6bca3d2SAaron LI struct noise_keypair * 87a6bca3d2SAaron LI noise_keypair_lookup(struct noise_local *, uint32_t); 88a6bca3d2SAaron LI struct noise_keypair * 89a6bca3d2SAaron LI noise_keypair_current(struct noise_remote *); 90a6bca3d2SAaron LI struct noise_keypair * 91a6bca3d2SAaron LI noise_keypair_ref(struct noise_keypair *); 92a6bca3d2SAaron LI void noise_keypair_put(struct noise_keypair *); 93a6bca3d2SAaron LI struct noise_remote * 94a6bca3d2SAaron LI noise_keypair_remote(struct noise_keypair *); 9570a0d19bSAaron LI bool noise_keypair_received_with(struct noise_keypair *); 9670a0d19bSAaron LI bool noise_keypair_should_refresh(struct noise_remote *, bool); 97682f87c9SAaron LI bool noise_keypair_counter_next(struct noise_keypair *, uint64_t *); 9879d60aa0SAaron LI int noise_keypair_counter_check(struct noise_keypair *, uint64_t); 99a7f975c0SAaron LI int noise_keypair_encrypt(struct noise_keypair *, uint32_t *r_idx, 100a7f975c0SAaron LI uint64_t counter, struct mbuf *); 101a7f975c0SAaron LI int noise_keypair_decrypt(struct noise_keypair *, uint64_t counter, 102a6bca3d2SAaron LI struct mbuf *); 103a6bca3d2SAaron LI 104a6bca3d2SAaron LI /* Handshake functions */ 105e44138a7SAaron LI bool noise_create_initiation( 106a6bca3d2SAaron LI struct noise_remote *, 107a6bca3d2SAaron LI uint32_t *s_idx, 108a6bca3d2SAaron LI uint8_t ue[NOISE_PUBLIC_KEY_LEN], 109a6bca3d2SAaron LI uint8_t es[NOISE_PUBLIC_KEY_LEN + NOISE_AUTHTAG_LEN], 110a6bca3d2SAaron LI uint8_t ets[NOISE_TIMESTAMP_LEN + NOISE_AUTHTAG_LEN]); 111e44138a7SAaron LI struct noise_remote * 112e44138a7SAaron LI noise_consume_initiation( 113a6bca3d2SAaron LI struct noise_local *, 114a6bca3d2SAaron LI uint32_t s_idx, 115a6bca3d2SAaron LI uint8_t ue[NOISE_PUBLIC_KEY_LEN], 116a6bca3d2SAaron LI uint8_t es[NOISE_PUBLIC_KEY_LEN + NOISE_AUTHTAG_LEN], 117a6bca3d2SAaron LI uint8_t ets[NOISE_TIMESTAMP_LEN + NOISE_AUTHTAG_LEN]); 118e44138a7SAaron LI bool noise_create_response( 119a6bca3d2SAaron LI struct noise_remote *, 120a6bca3d2SAaron LI uint32_t *s_idx, 121a6bca3d2SAaron LI uint32_t *r_idx, 122a6bca3d2SAaron LI uint8_t ue[NOISE_PUBLIC_KEY_LEN], 123a6bca3d2SAaron LI uint8_t en[0 + NOISE_AUTHTAG_LEN]); 124e44138a7SAaron LI struct noise_remote * 125e44138a7SAaron LI noise_consume_response( 126a6bca3d2SAaron LI struct noise_local *, 127a6bca3d2SAaron LI uint32_t s_idx, 128a6bca3d2SAaron LI uint32_t r_idx, 129a6bca3d2SAaron LI uint8_t ue[NOISE_PUBLIC_KEY_LEN], 130a6bca3d2SAaron LI uint8_t en[0 + NOISE_AUTHTAG_LEN]); 131a6bca3d2SAaron LI 132e6c44b2eSAaron LI #ifdef WG_SELFTESTS 133a6bca3d2SAaron LI bool noise_counter_selftest(void); 134e6c44b2eSAaron LI #endif /* WG_SELFTESTS */ 135a6bca3d2SAaron LI 136a364ee04SAaron LI #endif /* _NET_WG_NOISE_H_ */ 137