1*744bfb21SJohn Baldwin /* SPDX-License-Identifier: MIT 2*744bfb21SJohn Baldwin * 3*744bfb21SJohn Baldwin * Copyright (C) 2015-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4*744bfb21SJohn Baldwin * Copyright (c) 2022 The FreeBSD Foundation 5*744bfb21SJohn Baldwin */ 6*744bfb21SJohn Baldwin 7*744bfb21SJohn Baldwin #ifndef _WG_CRYPTO 8*744bfb21SJohn Baldwin #define _WG_CRYPTO 9*744bfb21SJohn Baldwin 10*744bfb21SJohn Baldwin #include <sys/param.h> 11*744bfb21SJohn Baldwin 12*744bfb21SJohn Baldwin struct mbuf; 13*744bfb21SJohn Baldwin 14*744bfb21SJohn Baldwin int crypto_init(void); 15*744bfb21SJohn Baldwin void crypto_deinit(void); 16*744bfb21SJohn Baldwin 17*744bfb21SJohn Baldwin enum chacha20poly1305_lengths { 18*744bfb21SJohn Baldwin XCHACHA20POLY1305_NONCE_SIZE = 24, 19*744bfb21SJohn Baldwin CHACHA20POLY1305_KEY_SIZE = 32, 20*744bfb21SJohn Baldwin CHACHA20POLY1305_AUTHTAG_SIZE = 16 21*744bfb21SJohn Baldwin }; 22*744bfb21SJohn Baldwin 23*744bfb21SJohn Baldwin #ifdef COMPAT_NEED_CHACHA20POLY1305 24*744bfb21SJohn Baldwin void 25*744bfb21SJohn Baldwin chacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, const size_t src_len, 26*744bfb21SJohn Baldwin const uint8_t *ad, const size_t ad_len, 27*744bfb21SJohn Baldwin const uint64_t nonce, 28*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]); 29*744bfb21SJohn Baldwin 30*744bfb21SJohn Baldwin bool 31*744bfb21SJohn Baldwin chacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, const size_t src_len, 32*744bfb21SJohn Baldwin const uint8_t *ad, const size_t ad_len, 33*744bfb21SJohn Baldwin const uint64_t nonce, 34*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]); 35*744bfb21SJohn Baldwin 36*744bfb21SJohn Baldwin void 37*744bfb21SJohn Baldwin xchacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, 38*744bfb21SJohn Baldwin const size_t src_len, const uint8_t *ad, 39*744bfb21SJohn Baldwin const size_t ad_len, 40*744bfb21SJohn Baldwin const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE], 41*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]); 42*744bfb21SJohn Baldwin 43*744bfb21SJohn Baldwin bool 44*744bfb21SJohn Baldwin xchacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, 45*744bfb21SJohn Baldwin const size_t src_len, const uint8_t *ad, 46*744bfb21SJohn Baldwin const size_t ad_len, 47*744bfb21SJohn Baldwin const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE], 48*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]); 49*744bfb21SJohn Baldwin #else 50*744bfb21SJohn Baldwin #include <sys/endian.h> 51*744bfb21SJohn Baldwin #include <crypto/chacha20_poly1305.h> 52*744bfb21SJohn Baldwin 53*744bfb21SJohn Baldwin static inline void 54*744bfb21SJohn Baldwin chacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, const size_t src_len, 55*744bfb21SJohn Baldwin const uint8_t *ad, const size_t ad_len, 56*744bfb21SJohn Baldwin const uint64_t nonce, 57*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]) 58*744bfb21SJohn Baldwin { 59*744bfb21SJohn Baldwin uint8_t nonce_bytes[8]; 60*744bfb21SJohn Baldwin 61*744bfb21SJohn Baldwin le64enc(nonce_bytes, nonce); 62*744bfb21SJohn Baldwin chacha20_poly1305_encrypt(dst, src, src_len, ad, ad_len, 63*744bfb21SJohn Baldwin nonce_bytes, sizeof(nonce_bytes), key); 64*744bfb21SJohn Baldwin } 65*744bfb21SJohn Baldwin 66*744bfb21SJohn Baldwin static inline bool 67*744bfb21SJohn Baldwin chacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, const size_t src_len, 68*744bfb21SJohn Baldwin const uint8_t *ad, const size_t ad_len, 69*744bfb21SJohn Baldwin const uint64_t nonce, 70*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]) 71*744bfb21SJohn Baldwin { 72*744bfb21SJohn Baldwin uint8_t nonce_bytes[8]; 73*744bfb21SJohn Baldwin 74*744bfb21SJohn Baldwin le64enc(nonce_bytes, nonce); 75*744bfb21SJohn Baldwin return (chacha20_poly1305_decrypt(dst, src, src_len, ad, ad_len, 76*744bfb21SJohn Baldwin nonce_bytes, sizeof(nonce_bytes), key)); 77*744bfb21SJohn Baldwin } 78*744bfb21SJohn Baldwin 79*744bfb21SJohn Baldwin static inline void 80*744bfb21SJohn Baldwin xchacha20poly1305_encrypt(uint8_t *dst, const uint8_t *src, 81*744bfb21SJohn Baldwin const size_t src_len, const uint8_t *ad, 82*744bfb21SJohn Baldwin const size_t ad_len, 83*744bfb21SJohn Baldwin const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE], 84*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]) 85*744bfb21SJohn Baldwin { 86*744bfb21SJohn Baldwin xchacha20_poly1305_encrypt(dst, src, src_len, ad, ad_len, nonce, key); 87*744bfb21SJohn Baldwin } 88*744bfb21SJohn Baldwin 89*744bfb21SJohn Baldwin static inline bool 90*744bfb21SJohn Baldwin xchacha20poly1305_decrypt(uint8_t *dst, const uint8_t *src, 91*744bfb21SJohn Baldwin const size_t src_len, const uint8_t *ad, 92*744bfb21SJohn Baldwin const size_t ad_len, 93*744bfb21SJohn Baldwin const uint8_t nonce[XCHACHA20POLY1305_NONCE_SIZE], 94*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]) 95*744bfb21SJohn Baldwin { 96*744bfb21SJohn Baldwin return (xchacha20_poly1305_decrypt(dst, src, src_len, ad, ad_len, nonce, key)); 97*744bfb21SJohn Baldwin } 98*744bfb21SJohn Baldwin #endif 99*744bfb21SJohn Baldwin 100*744bfb21SJohn Baldwin int 101*744bfb21SJohn Baldwin chacha20poly1305_encrypt_mbuf(struct mbuf *, const uint64_t nonce, 102*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]); 103*744bfb21SJohn Baldwin 104*744bfb21SJohn Baldwin int 105*744bfb21SJohn Baldwin chacha20poly1305_decrypt_mbuf(struct mbuf *, const uint64_t nonce, 106*744bfb21SJohn Baldwin const uint8_t key[CHACHA20POLY1305_KEY_SIZE]); 107*744bfb21SJohn Baldwin 108*744bfb21SJohn Baldwin 109*744bfb21SJohn Baldwin enum blake2s_lengths { 110*744bfb21SJohn Baldwin BLAKE2S_BLOCK_SIZE = 64, 111*744bfb21SJohn Baldwin BLAKE2S_HASH_SIZE = 32, 112*744bfb21SJohn Baldwin BLAKE2S_KEY_SIZE = 32 113*744bfb21SJohn Baldwin }; 114*744bfb21SJohn Baldwin 115*744bfb21SJohn Baldwin #ifdef COMPAT_NEED_BLAKE2S 116*744bfb21SJohn Baldwin struct blake2s_state { 117*744bfb21SJohn Baldwin uint32_t h[8]; 118*744bfb21SJohn Baldwin uint32_t t[2]; 119*744bfb21SJohn Baldwin uint32_t f[2]; 120*744bfb21SJohn Baldwin uint8_t buf[BLAKE2S_BLOCK_SIZE]; 121*744bfb21SJohn Baldwin unsigned int buflen; 122*744bfb21SJohn Baldwin unsigned int outlen; 123*744bfb21SJohn Baldwin }; 124*744bfb21SJohn Baldwin 125*744bfb21SJohn Baldwin void blake2s_init(struct blake2s_state *state, const size_t outlen); 126*744bfb21SJohn Baldwin 127*744bfb21SJohn Baldwin void blake2s_init_key(struct blake2s_state *state, const size_t outlen, 128*744bfb21SJohn Baldwin const uint8_t *key, const size_t keylen); 129*744bfb21SJohn Baldwin 130*744bfb21SJohn Baldwin void blake2s_update(struct blake2s_state *state, const uint8_t *in, size_t inlen); 131*744bfb21SJohn Baldwin 132*744bfb21SJohn Baldwin void blake2s_final(struct blake2s_state *state, uint8_t *out); 133*744bfb21SJohn Baldwin 134*744bfb21SJohn Baldwin static inline void blake2s(uint8_t *out, const uint8_t *in, const uint8_t *key, 135*744bfb21SJohn Baldwin const size_t outlen, const size_t inlen, const size_t keylen) 136*744bfb21SJohn Baldwin { 137*744bfb21SJohn Baldwin struct blake2s_state state; 138*744bfb21SJohn Baldwin 139*744bfb21SJohn Baldwin if (keylen) 140*744bfb21SJohn Baldwin blake2s_init_key(&state, outlen, key, keylen); 141*744bfb21SJohn Baldwin else 142*744bfb21SJohn Baldwin blake2s_init(&state, outlen); 143*744bfb21SJohn Baldwin 144*744bfb21SJohn Baldwin blake2s_update(&state, in, inlen); 145*744bfb21SJohn Baldwin blake2s_final(&state, out); 146*744bfb21SJohn Baldwin } 147*744bfb21SJohn Baldwin #endif 148*744bfb21SJohn Baldwin 149*744bfb21SJohn Baldwin #ifdef COMPAT_NEED_CURVE25519 150*744bfb21SJohn Baldwin enum curve25519_lengths { 151*744bfb21SJohn Baldwin CURVE25519_KEY_SIZE = 32 152*744bfb21SJohn Baldwin }; 153*744bfb21SJohn Baldwin 154*744bfb21SJohn Baldwin bool curve25519(uint8_t mypublic[static CURVE25519_KEY_SIZE], 155*744bfb21SJohn Baldwin const uint8_t secret[static CURVE25519_KEY_SIZE], 156*744bfb21SJohn Baldwin const uint8_t basepoint[static CURVE25519_KEY_SIZE]); 157*744bfb21SJohn Baldwin 158*744bfb21SJohn Baldwin static inline bool 159*744bfb21SJohn Baldwin curve25519_generate_public(uint8_t pub[static CURVE25519_KEY_SIZE], 160*744bfb21SJohn Baldwin const uint8_t secret[static CURVE25519_KEY_SIZE]) 161*744bfb21SJohn Baldwin { 162*744bfb21SJohn Baldwin static const uint8_t basepoint[CURVE25519_KEY_SIZE] = { 9 }; 163*744bfb21SJohn Baldwin 164*744bfb21SJohn Baldwin return curve25519(pub, secret, basepoint); 165*744bfb21SJohn Baldwin } 166*744bfb21SJohn Baldwin 167*744bfb21SJohn Baldwin static inline void curve25519_clamp_secret(uint8_t secret[static CURVE25519_KEY_SIZE]) 168*744bfb21SJohn Baldwin { 169*744bfb21SJohn Baldwin secret[0] &= 248; 170*744bfb21SJohn Baldwin secret[31] = (secret[31] & 127) | 64; 171*744bfb21SJohn Baldwin } 172*744bfb21SJohn Baldwin 173*744bfb21SJohn Baldwin static inline void curve25519_generate_secret(uint8_t secret[CURVE25519_KEY_SIZE]) 174*744bfb21SJohn Baldwin { 175*744bfb21SJohn Baldwin arc4random_buf(secret, CURVE25519_KEY_SIZE); 176*744bfb21SJohn Baldwin curve25519_clamp_secret(secret); 177*744bfb21SJohn Baldwin } 178*744bfb21SJohn Baldwin #else 179*744bfb21SJohn Baldwin #include <crypto/curve25519.h> 180*744bfb21SJohn Baldwin #endif 181*744bfb21SJohn Baldwin 182*744bfb21SJohn Baldwin #endif 183