xref: /openbmc/linux/include/crypto/ecdh.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
23c4b2390SSalvatore Benedetto /*
33c4b2390SSalvatore Benedetto  * ECDH params to be used with kpp API
43c4b2390SSalvatore Benedetto  *
53c4b2390SSalvatore Benedetto  * Copyright (c) 2016, Intel Corporation
63c4b2390SSalvatore Benedetto  * Authors: Salvatore Benedetto <salvatore.benedetto@intel.com>
73c4b2390SSalvatore Benedetto  */
83c4b2390SSalvatore Benedetto #ifndef _CRYPTO_ECDH_
93c4b2390SSalvatore Benedetto #define _CRYPTO_ECDH_
103c4b2390SSalvatore Benedetto 
118d23da22SStephan Mueller /**
128d23da22SStephan Mueller  * DOC: ECDH Helper Functions
138d23da22SStephan Mueller  *
148d23da22SStephan Mueller  * To use ECDH with the KPP cipher API, the following data structure and
158d23da22SStephan Mueller  * functions should be used.
168d23da22SStephan Mueller  *
178d23da22SStephan Mueller  * The ECC curves known to the ECDH implementation are specified in this
188d23da22SStephan Mueller  * header file.
198d23da22SStephan Mueller  *
208d23da22SStephan Mueller  * To use ECDH with KPP, the following functions should be used to operate on
218d23da22SStephan Mueller  * an ECDH private key. The packet private key that can be set with
228d23da22SStephan Mueller  * the KPP API function call of crypto_kpp_set_secret.
238d23da22SStephan Mueller  */
248d23da22SStephan Mueller 
253c4b2390SSalvatore Benedetto /* Curves IDs */
263c4b2390SSalvatore Benedetto #define ECC_CURVE_NIST_P192	0x0001
273c4b2390SSalvatore Benedetto #define ECC_CURVE_NIST_P256	0x0002
28*703c748dSSaulo Alessandre #define ECC_CURVE_NIST_P384	0x0003
293c4b2390SSalvatore Benedetto 
308d23da22SStephan Mueller /**
318d23da22SStephan Mueller  * struct ecdh - define an ECDH private key
328d23da22SStephan Mueller  *
338d23da22SStephan Mueller  * @key:	Private ECDH key
348d23da22SStephan Mueller  * @key_size:	Size of the private ECDH key
358d23da22SStephan Mueller  */
363c4b2390SSalvatore Benedetto struct ecdh {
373c4b2390SSalvatore Benedetto 	char *key;
383c4b2390SSalvatore Benedetto 	unsigned short key_size;
393c4b2390SSalvatore Benedetto };
403c4b2390SSalvatore Benedetto 
418d23da22SStephan Mueller /**
428d23da22SStephan Mueller  * crypto_ecdh_key_len() - Obtain the size of the private ECDH key
438d23da22SStephan Mueller  * @params:	private ECDH key
448d23da22SStephan Mueller  *
458d23da22SStephan Mueller  * This function returns the packet ECDH key size. A caller can use that
468d23da22SStephan Mueller  * with the provided ECDH private key reference to obtain the required
478d23da22SStephan Mueller  * memory size to hold a packet key.
488d23da22SStephan Mueller  *
498d23da22SStephan Mueller  * Return: size of the key in bytes
508d23da22SStephan Mueller  */
516e97e08dSTudor-Dan Ambarus unsigned int crypto_ecdh_key_len(const struct ecdh *params);
528d23da22SStephan Mueller 
538d23da22SStephan Mueller /**
548d23da22SStephan Mueller  * crypto_ecdh_encode_key() - encode the private key
558d23da22SStephan Mueller  * @buf:	Buffer allocated by the caller to hold the packet ECDH
568d23da22SStephan Mueller  *		private key. The buffer should be at least crypto_ecdh_key_len
578d23da22SStephan Mueller  *		bytes in size.
588d23da22SStephan Mueller  * @len:	Length of the packet private key buffer
598d23da22SStephan Mueller  * @p:		Buffer with the caller-specified private key
608d23da22SStephan Mueller  *
618d23da22SStephan Mueller  * The ECDH implementations operate on a packet representation of the private
628d23da22SStephan Mueller  * key.
638d23da22SStephan Mueller  *
648d23da22SStephan Mueller  * Return:	-EINVAL if buffer has insufficient size, 0 on success
658d23da22SStephan Mueller  */
663c4b2390SSalvatore Benedetto int crypto_ecdh_encode_key(char *buf, unsigned int len, const struct ecdh *p);
678d23da22SStephan Mueller 
688d23da22SStephan Mueller /**
698d23da22SStephan Mueller  * crypto_ecdh_decode_key() - decode a private key
708d23da22SStephan Mueller  * @buf:	Buffer holding a packet key that should be decoded
71c0ca1215STudor-Dan Ambarus  * @len:	Length of the packet private key buffer
728d23da22SStephan Mueller  * @p:		Buffer allocated by the caller that is filled with the
73c0ca1215STudor-Dan Ambarus  *		unpacked ECDH private key.
748d23da22SStephan Mueller  *
758d23da22SStephan Mueller  * The unpacking obtains the private key by pointing @p to the correct location
768d23da22SStephan Mueller  * in @buf. Thus, both pointers refer to the same memory.
778d23da22SStephan Mueller  *
788d23da22SStephan Mueller  * Return:	-EINVAL if buffer has insufficient size, 0 on success
798d23da22SStephan Mueller  */
803c4b2390SSalvatore Benedetto int crypto_ecdh_decode_key(const char *buf, unsigned int len, struct ecdh *p);
813c4b2390SSalvatore Benedetto 
823c4b2390SSalvatore Benedetto #endif
83