^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Diffie-Hellman secret to be used with kpp API along with helper functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2016, Intel Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Authors: Salvatore Benedetto <salvatore.benedetto@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef _CRYPTO_DH_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define _CRYPTO_DH_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * DOC: DH Helper Functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * To use DH with the KPP cipher API, the following data structure and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * functions should be used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * To use DH with KPP, the following functions should be used to operate on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * a DH private key. The packet private key that can be set with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * the KPP API function call of crypto_kpp_set_secret.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * struct dh - define a DH private key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * @key: Private DH key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * @p: Diffie-Hellman parameter P
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * @q: Diffie-Hellman parameter Q
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * @g: Diffie-Hellman generator G
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * @key_size: Size of the private DH key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * @p_size: Size of DH parameter P
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * @q_size: Size of DH parameter Q
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * @g_size: Size of DH generator G
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct dh {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) void *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) void *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) void *q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) void *g;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) unsigned int key_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) unsigned int p_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) unsigned int q_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) unsigned int g_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * crypto_dh_key_len() - Obtain the size of the private DH key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * @params: private DH key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * This function returns the packet DH key size. A caller can use that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * with the provided DH private key reference to obtain the required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * memory size to hold a packet key.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * Return: size of the key in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) unsigned int crypto_dh_key_len(const struct dh *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * crypto_dh_encode_key() - encode the private key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * @buf: Buffer allocated by the caller to hold the packet DH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * private key. The buffer should be at least crypto_dh_key_len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * bytes in size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * @len: Length of the packet private key buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * @params: Buffer with the caller-specified private key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * The DH implementations operate on a packet representation of the private
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * key.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * Return: -EINVAL if buffer has insufficient size, 0 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) int crypto_dh_encode_key(char *buf, unsigned int len, const struct dh *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * crypto_dh_decode_key() - decode a private key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * @buf: Buffer holding a packet key that should be decoded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * @len: Length of the packet private key buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * @params: Buffer allocated by the caller that is filled with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * unpacked DH private key.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * The unpacking obtains the private key by pointing @p to the correct location
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * in @buf. Thus, both pointers refer to the same memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * Return: -EINVAL if buffer has insufficient size, 0 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #endif