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