99 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * Diffie-Hellman secret to be used with kpp API along with helper functions4 *5 * Copyright (c) 2016, Intel Corporation6 * Authors: Salvatore Benedetto <salvatore.benedetto@intel.com>7 */8#ifndef _CRYPTO_DH_9#define _CRYPTO_DH_10 11/**12 * DOC: DH Helper Functions13 *14 * To use DH with the KPP cipher API, the following data structure and15 * functions should be used.16 *17 * To use DH with KPP, the following functions should be used to operate on18 * a DH private key. The packet private key that can be set with19 * the KPP API function call of crypto_kpp_set_secret.20 */21 22/**23 * struct dh - define a DH private key24 *25 * @key: Private DH key26 * @p: Diffie-Hellman parameter P27 * @g: Diffie-Hellman generator G28 * @key_size: Size of the private DH key29 * @p_size: Size of DH parameter P30 * @g_size: Size of DH generator G31 */32struct dh {33 const void *key;34 const void *p;35 const void *g;36 unsigned int key_size;37 unsigned int p_size;38 unsigned int g_size;39};40 41/**42 * crypto_dh_key_len() - Obtain the size of the private DH key43 * @params: private DH key44 *45 * This function returns the packet DH key size. A caller can use that46 * with the provided DH private key reference to obtain the required47 * memory size to hold a packet key.48 *49 * Return: size of the key in bytes50 */51unsigned int crypto_dh_key_len(const struct dh *params);52 53/**54 * crypto_dh_encode_key() - encode the private key55 * @buf: Buffer allocated by the caller to hold the packet DH56 * private key. The buffer should be at least crypto_dh_key_len57 * bytes in size.58 * @len: Length of the packet private key buffer59 * @params: Buffer with the caller-specified private key60 *61 * The DH implementations operate on a packet representation of the private62 * key.63 *64 * Return: -EINVAL if buffer has insufficient size, 0 on success65 */66int crypto_dh_encode_key(char *buf, unsigned int len, const struct dh *params);67 68/**69 * crypto_dh_decode_key() - decode a private key70 * @buf: Buffer holding a packet key that should be decoded71 * @len: Length of the packet private key buffer72 * @params: Buffer allocated by the caller that is filled with the73 * unpacked DH private key.74 *75 * The unpacking obtains the private key by pointing @p to the correct location76 * in @buf. Thus, both pointers refer to the same memory.77 *78 * Return: -EINVAL if buffer has insufficient size, 0 on success79 */80int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params);81 82/**83 * __crypto_dh_decode_key() - decode a private key without parameter checks84 * @buf: Buffer holding a packet key that should be decoded85 * @len: Length of the packet private key buffer86 * @params: Buffer allocated by the caller that is filled with the87 * unpacked DH private key.88 *89 * Internal function providing the same services as the exported90 * crypto_dh_decode_key(), but without any of those basic parameter91 * checks conducted by the latter.92 *93 * Return: -EINVAL if buffer has insufficient size, 0 on success94 */95int __crypto_dh_decode_key(const char *buf, unsigned int len,96 struct dh *params);97 98#endif99