brintos

brintos / linux-shallow public Read only

0
0
Text · 2.0 KiB · ece6a9b Raw
74 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR MIT */2/*3 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.4 */5 6#ifndef CURVE25519_H7#define CURVE25519_H8 9#include <crypto/algapi.h> // For crypto_memneq.10#include <linux/types.h>11#include <linux/random.h>12 13enum curve25519_lengths {14	CURVE25519_KEY_SIZE = 3215};16 17extern const u8 curve25519_null_point[];18extern const u8 curve25519_base_point[];19 20void curve25519_generic(u8 out[CURVE25519_KEY_SIZE],21			const u8 scalar[CURVE25519_KEY_SIZE],22			const u8 point[CURVE25519_KEY_SIZE]);23 24void curve25519_arch(u8 out[CURVE25519_KEY_SIZE],25		     const u8 scalar[CURVE25519_KEY_SIZE],26		     const u8 point[CURVE25519_KEY_SIZE]);27 28void curve25519_base_arch(u8 pub[CURVE25519_KEY_SIZE],29			  const u8 secret[CURVE25519_KEY_SIZE]);30 31bool curve25519_selftest(void);32 33static inline34bool __must_check curve25519(u8 mypublic[CURVE25519_KEY_SIZE],35			     const u8 secret[CURVE25519_KEY_SIZE],36			     const u8 basepoint[CURVE25519_KEY_SIZE])37{38	if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519))39		curve25519_arch(mypublic, secret, basepoint);40	else41		curve25519_generic(mypublic, secret, basepoint);42	return crypto_memneq(mypublic, curve25519_null_point,43			     CURVE25519_KEY_SIZE);44}45 46static inline bool47__must_check curve25519_generate_public(u8 pub[CURVE25519_KEY_SIZE],48					const u8 secret[CURVE25519_KEY_SIZE])49{50	if (unlikely(!crypto_memneq(secret, curve25519_null_point,51				    CURVE25519_KEY_SIZE)))52		return false;53 54	if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519))55		curve25519_base_arch(pub, secret);56	else57		curve25519_generic(pub, secret, curve25519_base_point);58	return crypto_memneq(pub, curve25519_null_point, CURVE25519_KEY_SIZE);59}60 61static inline void curve25519_clamp_secret(u8 secret[CURVE25519_KEY_SIZE])62{63	secret[0] &= 248;64	secret[31] = (secret[31] & 127) | 64;65}66 67static inline void curve25519_generate_secret(u8 secret[CURVE25519_KEY_SIZE])68{69	get_random_bytes_wait(secret, CURVE25519_KEY_SIZE);70	curve25519_clamp_secret(secret);71}72 73#endif /* CURVE25519_H */74