xref: /freebsd/crypto/libecc/include/libecc/ecdh/ecccdh.h (revision f0865ec9906d5a18fa2a3b61381f22ce16e606ad)
1*f0865ec9SKyle Evans /*
2*f0865ec9SKyle Evans  *  Copyright (C) 2021 - This file is part of libecc project
3*f0865ec9SKyle Evans  *
4*f0865ec9SKyle Evans  *  Authors:
5*f0865ec9SKyle Evans  *      Ryad BENADJILA <ryadbenadjila@gmail.com>
6*f0865ec9SKyle Evans  *      Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr>
7*f0865ec9SKyle Evans  *
8*f0865ec9SKyle Evans  *  This software is licensed under a dual BSD and GPL v2 license.
9*f0865ec9SKyle Evans  *  See LICENSE file at the root folder of the project.
10*f0865ec9SKyle Evans  */
11*f0865ec9SKyle Evans #include <libecc/lib_ecc_config.h>
12*f0865ec9SKyle Evans #include <libecc/lib_ecc_types.h>
13*f0865ec9SKyle Evans #if defined(WITH_ECCCDH)
14*f0865ec9SKyle Evans 
15*f0865ec9SKyle Evans 
16*f0865ec9SKyle Evans #ifndef __ECCCDH_H__
17*f0865ec9SKyle Evans #define __ECCCDH_H__
18*f0865ec9SKyle Evans 
19*f0865ec9SKyle Evans #include <libecc/curves/curves.h>
20*f0865ec9SKyle Evans #include <libecc/sig/ec_key.h>
21*f0865ec9SKyle Evans #include <libecc/utils/utils.h>
22*f0865ec9SKyle Evans 
23*f0865ec9SKyle Evans /* Get the size of the shared secret associated to the curve parameters.
24*f0865ec9SKyle Evans  *
25*f0865ec9SKyle Evans  */
26*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int ecccdh_shared_secret_size(const ec_params *params, u8 *size);
27*f0865ec9SKyle Evans 
28*f0865ec9SKyle Evans /* Get the size of the serialized public key associated to the curve parameters.
29*f0865ec9SKyle Evans  *
30*f0865ec9SKyle Evans  */
31*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int ecccdh_serialized_pub_key_size(const ec_params *params, u8 *size);
32*f0865ec9SKyle Evans 
33*f0865ec9SKyle Evans /* Initialize ECCCDH public key from an initialized private key.
34*f0865ec9SKyle Evans  *
35*f0865ec9SKyle Evans  */
36*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int ecccdh_init_pub_key(ec_pub_key *out_pub, const ec_priv_key *in_priv);
37*f0865ec9SKyle Evans 
38*f0865ec9SKyle Evans /* Generate a key pair for ECCCDH given curve parameters as input.
39*f0865ec9SKyle Evans  *
40*f0865ec9SKyle Evans  */
41*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int ecccdh_gen_key_pair(ec_key_pair *kp, const ec_params *params);
42*f0865ec9SKyle Evans 
43*f0865ec9SKyle Evans /* Create a key pair from a serialized private key.
44*f0865ec9SKyle Evans  *
45*f0865ec9SKyle Evans  */
46*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int ecccdh_import_key_pair_from_priv_key_buf(ec_key_pair *kp, const ec_params *params, const u8 *priv_key_buf, u8 priv_key_buf_len);
47*f0865ec9SKyle Evans 
48*f0865ec9SKyle Evans /* Serialize our public key in a buffer.
49*f0865ec9SKyle Evans  *
50*f0865ec9SKyle Evans  */
51*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int ecccdh_serialize_pub_key(const ec_pub_key *our_pub_key, u8 *buff, u8 buff_len);
52*f0865ec9SKyle Evans 
53*f0865ec9SKyle Evans /* Derive the ECCCDH shared secret and store it in a buffer given the peer
54*f0865ec9SKyle Evans  * public key and our private key.
55*f0865ec9SKyle Evans  *
56*f0865ec9SKyle Evans  * The shared_secret_len length MUST be exactly equal to the expected shared secret size:
57*f0865ec9SKyle Evans  * the function fails otherwise.
58*f0865ec9SKyle Evans  */
59*f0865ec9SKyle Evans ATTRIBUTE_WARN_UNUSED_RET int ecccdh_derive_secret(const ec_priv_key *our_priv_key, const u8 *peer_pub_key, u8 peer_pub_key_len, u8 *shared_secret, u8 shared_secret_len);
60*f0865ec9SKyle Evans 
61*f0865ec9SKyle Evans #endif /* __ECCCDH_H__ */
62*f0865ec9SKyle Evans 
63*f0865ec9SKyle Evans #endif /* WITH_ECCCDH */
64