1 /* SPDX-License-Identifier: MIT
2 *
3 * Copyright (C) 2015-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
4 * Copyright (c) 2022 The FreeBSD Foundation
5 */
6
7 #ifndef _WG_CRYPTO
8 #define _WG_CRYPTO
9
10 #include <sys/param.h>
11 #include <sys/endian.h>
12 #include <crypto/chacha20_poly1305.h>
13 #include <crypto/curve25519.h>
14
15 struct mbuf;
16
17 int crypto_init(void);
18 void crypto_deinit(void);
19
20 enum chacha20poly1305_lengths {
21 XCHACHA20POLY1305_NONCE_SIZE = 24,
22 CHACHA20POLY1305_KEY_SIZE = 32,
23 CHACHA20POLY1305_AUTHTAG_SIZE = 16
24 };
25
26 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])27 chacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, const size_t src_len,
28 const uint8_t *ad, const size_t ad_len,
29 const uint64_t nonce,
30 const uint8_t key[CHACHA20POLY1305_KEY_SIZE])
31 {
32 uint8_t nonce_bytes[8];
33
34 le64enc(nonce_bytes, nonce);
35 chacha20_poly1305_encrypt(dst, src, src_len, ad, ad_len,
36 nonce_bytes, sizeof(nonce_bytes), key);
37 }
38
39 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])40 chacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, const size_t src_len,
41 const uint8_t *ad, const size_t ad_len,
42 const uint64_t nonce,
43 const uint8_t key[CHACHA20POLY1305_KEY_SIZE])
44 {
45 uint8_t nonce_bytes[8];
46
47 le64enc(nonce_bytes, nonce);
48 return (chacha20_poly1305_decrypt(dst, src, src_len, ad, ad_len,
49 nonce_bytes, sizeof(nonce_bytes), key));
50 }
51
52 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])53 xchacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src,
54 const size_t src_len, const uint8_t *ad,
55 const size_t ad_len,
56 const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE],
57 const uint8_t key[CHACHA20POLY1305_KEY_SIZE])
58 {
59 xchacha20_poly1305_encrypt(dst, src, src_len, ad, ad_len, nonce, key);
60 }
61
62 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])63 xchacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src,
64 const size_t src_len, const uint8_t *ad,
65 const size_t ad_len,
66 const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE],
67 const uint8_t key[CHACHA20POLY1305_KEY_SIZE])
68 {
69 return (xchacha20_poly1305_decrypt(dst, src, src_len, ad, ad_len, nonce, key));
70 }
71
72 int
73 chacha20poly1305_encrypt_mbuf(struct mbuf *, const uint64_t nonce,
74 const uint8_t key[CHACHA20POLY1305_KEY_SIZE]);
75
76 int
77 chacha20poly1305_decrypt_mbuf(struct mbuf *, const uint64_t nonce,
78 const uint8_t key[CHACHA20POLY1305_KEY_SIZE]);
79
80
81 enum blake2s_lengths {
82 BLAKE2S_BLOCK_SIZE = 64,
83 BLAKE2S_HASH_SIZE = 32,
84 BLAKE2S_KEY_SIZE = 32
85 };
86
87 #ifdef COMPAT_NEED_BLAKE2S
88 struct blake2s_state {
89 uint32_t h[8];
90 uint32_t t[2];
91 uint32_t f[2];
92 uint8_t buf[BLAKE2S_BLOCK_SIZE];
93 unsigned int buflen;
94 unsigned int outlen;
95 };
96
97 void blake2s_init(struct blake2s_state *state, const size_t outlen);
98
99 void blake2s_init_key(struct blake2s_state *state, const size_t outlen,
100 const uint8_t *key, const size_t keylen);
101
102 void blake2s_update(struct blake2s_state *state, const uint8_t *in, size_t inlen);
103
104 void blake2s_final(struct blake2s_state *state, uint8_t *out);
105
blake2s(uint8_t * out,const uint8_t * in,const uint8_t * key,const size_t outlen,const size_t inlen,const size_t keylen)106 static inline void blake2s(uint8_t *out, const uint8_t *in, const uint8_t *key,
107 const size_t outlen, const size_t inlen, const size_t keylen)
108 {
109 struct blake2s_state state;
110
111 if (keylen)
112 blake2s_init_key(&state, outlen, key, keylen);
113 else
114 blake2s_init(&state, outlen);
115
116 blake2s_update(&state, in, inlen);
117 blake2s_final(&state, out);
118 }
119 #endif
120
121 #endif
122