1744bfb21SJohn Baldwin /* SPDX-License-Identifier: MIT
2744bfb21SJohn Baldwin *
3744bfb21SJohn Baldwin * Copyright (C) 2015-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
4744bfb21SJohn Baldwin * Copyright (c) 2022 The FreeBSD Foundation
5744bfb21SJohn Baldwin */
6744bfb21SJohn Baldwin
7744bfb21SJohn Baldwin #ifndef _WG_CRYPTO
8744bfb21SJohn Baldwin #define _WG_CRYPTO
9744bfb21SJohn Baldwin
10744bfb21SJohn Baldwin #include <sys/param.h>
11*854d0662SJohn Baldwin #include <sys/endian.h>
12*854d0662SJohn Baldwin #include <crypto/chacha20_poly1305.h>
13*854d0662SJohn Baldwin #include <crypto/curve25519.h>
14744bfb21SJohn Baldwin
15744bfb21SJohn Baldwin struct mbuf;
16744bfb21SJohn Baldwin
17744bfb21SJohn Baldwin int crypto_init(void);
18744bfb21SJohn Baldwin void crypto_deinit(void);
19744bfb21SJohn Baldwin
20744bfb21SJohn Baldwin enum chacha20poly1305_lengths {
21744bfb21SJohn Baldwin XCHACHA20POLY1305_NONCE_SIZE = 24,
22744bfb21SJohn Baldwin CHACHA20POLY1305_KEY_SIZE = 32,
23744bfb21SJohn Baldwin CHACHA20POLY1305_AUTHTAG_SIZE = 16
24744bfb21SJohn Baldwin };
25744bfb21SJohn Baldwin
26744bfb21SJohn Baldwin static inline void
chacha20poly1305_encrypt(uint8_t * dst,const uint8_t * src,const size_t src_len,const uint8_t * ad,const size_t ad_len,const uint64_t nonce,const uint8_t key[CHACHA20POLY1305_KEY_SIZE])27744bfb21SJohn Baldwin chacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, const size_t src_len,
28744bfb21SJohn Baldwin const uint8_t *ad, const size_t ad_len,
29744bfb21SJohn Baldwin const uint64_t nonce,
30744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE])
31744bfb21SJohn Baldwin {
32744bfb21SJohn Baldwin uint8_t nonce_bytes[8];
33744bfb21SJohn Baldwin
34744bfb21SJohn Baldwin le64enc(nonce_bytes, nonce);
35744bfb21SJohn Baldwin chacha20_poly1305_encrypt(dst, src, src_len, ad, ad_len,
36744bfb21SJohn Baldwin nonce_bytes, sizeof(nonce_bytes), key);
37744bfb21SJohn Baldwin }
38744bfb21SJohn Baldwin
39744bfb21SJohn Baldwin static inline bool
chacha20poly1305_decrypt(uint8_t * dst,const uint8_t * src,const size_t src_len,const uint8_t * ad,const size_t ad_len,const uint64_t nonce,const uint8_t key[CHACHA20POLY1305_KEY_SIZE])40744bfb21SJohn Baldwin chacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, const size_t src_len,
41744bfb21SJohn Baldwin const uint8_t *ad, const size_t ad_len,
42744bfb21SJohn Baldwin const uint64_t nonce,
43744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE])
44744bfb21SJohn Baldwin {
45744bfb21SJohn Baldwin uint8_t nonce_bytes[8];
46744bfb21SJohn Baldwin
47744bfb21SJohn Baldwin le64enc(nonce_bytes, nonce);
48744bfb21SJohn Baldwin return (chacha20_poly1305_decrypt(dst, src, src_len, ad, ad_len,
49744bfb21SJohn Baldwin nonce_bytes, sizeof(nonce_bytes), key));
50744bfb21SJohn Baldwin }
51744bfb21SJohn Baldwin
52744bfb21SJohn Baldwin static inline void
xchacha20poly1305_encrypt(uint8_t * dst,const uint8_t * src,const size_t src_len,const uint8_t * ad,const size_t ad_len,const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE],const uint8_t key[CHACHA20POLY1305_KEY_SIZE])53744bfb21SJohn Baldwin xchacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src,
54744bfb21SJohn Baldwin const size_t src_len, const uint8_t *ad,
55744bfb21SJohn Baldwin const size_t ad_len,
56744bfb21SJohn Baldwin const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE],
57744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE])
58744bfb21SJohn Baldwin {
59744bfb21SJohn Baldwin xchacha20_poly1305_encrypt(dst, src, src_len, ad, ad_len, nonce, key);
60744bfb21SJohn Baldwin }
61744bfb21SJohn Baldwin
62744bfb21SJohn Baldwin static inline bool
xchacha20poly1305_decrypt(uint8_t * dst,const uint8_t * src,const size_t src_len,const uint8_t * ad,const size_t ad_len,const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE],const uint8_t key[CHACHA20POLY1305_KEY_SIZE])63744bfb21SJohn Baldwin xchacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src,
64744bfb21SJohn Baldwin const size_t src_len, const uint8_t *ad,
65744bfb21SJohn Baldwin const size_t ad_len,
66744bfb21SJohn Baldwin const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE],
67744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE])
68744bfb21SJohn Baldwin {
69744bfb21SJohn Baldwin return (xchacha20_poly1305_decrypt(dst, src, src_len, ad, ad_len, nonce, key));
70744bfb21SJohn Baldwin }
71744bfb21SJohn Baldwin
72744bfb21SJohn Baldwin int
73744bfb21SJohn Baldwin chacha20poly1305_encrypt_mbuf(struct mbuf *, const uint64_t nonce,
74744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]);
75744bfb21SJohn Baldwin
76744bfb21SJohn Baldwin int
77744bfb21SJohn Baldwin chacha20poly1305_decrypt_mbuf(struct mbuf *, const uint64_t nonce,
78744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]);
79744bfb21SJohn Baldwin
80744bfb21SJohn Baldwin
81744bfb21SJohn Baldwin enum blake2s_lengths {
82744bfb21SJohn Baldwin BLAKE2S_BLOCK_SIZE = 64,
83744bfb21SJohn Baldwin BLAKE2S_HASH_SIZE = 32,
84744bfb21SJohn Baldwin BLAKE2S_KEY_SIZE = 32
85744bfb21SJohn Baldwin };
86744bfb21SJohn Baldwin
87744bfb21SJohn Baldwin #ifdef COMPAT_NEED_BLAKE2S
88744bfb21SJohn Baldwin struct blake2s_state {
89744bfb21SJohn Baldwin uint32_t h[8];
90744bfb21SJohn Baldwin uint32_t t[2];
91744bfb21SJohn Baldwin uint32_t f[2];
92744bfb21SJohn Baldwin uint8_t buf[BLAKE2S_BLOCK_SIZE];
93744bfb21SJohn Baldwin unsigned int buflen;
94744bfb21SJohn Baldwin unsigned int outlen;
95744bfb21SJohn Baldwin };
96744bfb21SJohn Baldwin
97744bfb21SJohn Baldwin void blake2s_init(struct blake2s_state *state, const size_t outlen);
98744bfb21SJohn Baldwin
99744bfb21SJohn Baldwin void blake2s_init_key(struct blake2s_state *state, const size_t outlen,
100744bfb21SJohn Baldwin const uint8_t *key, const size_t keylen);
101744bfb21SJohn Baldwin
102744bfb21SJohn Baldwin void blake2s_update(struct blake2s_state *state, const uint8_t *in, size_t inlen);
103744bfb21SJohn Baldwin
104744bfb21SJohn Baldwin void blake2s_final(struct blake2s_state *state, uint8_t *out);
105744bfb21SJohn Baldwin
blake2s(uint8_t * out,const uint8_t * in,const uint8_t * key,const size_t outlen,const size_t inlen,const size_t keylen)106744bfb21SJohn Baldwin static inline void blake2s(uint8_t *out, const uint8_t *in, const uint8_t *key,
107744bfb21SJohn Baldwin const size_t outlen, const size_t inlen, const size_t keylen)
108744bfb21SJohn Baldwin {
109744bfb21SJohn Baldwin struct blake2s_state state;
110744bfb21SJohn Baldwin
111744bfb21SJohn Baldwin if (keylen)
112744bfb21SJohn Baldwin blake2s_init_key(&state, outlen, key, keylen);
113744bfb21SJohn Baldwin else
114744bfb21SJohn Baldwin blake2s_init(&state, outlen);
115744bfb21SJohn Baldwin
116744bfb21SJohn Baldwin blake2s_update(&state, in, inlen);
117744bfb21SJohn Baldwin blake2s_final(&state, out);
118744bfb21SJohn Baldwin }
119744bfb21SJohn Baldwin #endif
120744bfb21SJohn Baldwin
121744bfb21SJohn Baldwin #endif
122