ndn-lite
ndn-lite-ecc.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018-2019 Zhiyi Zhang
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v3.0. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
9 #ifndef NDN_SECURITY_ECC_H_
10 #define NDN_SECURITY_ECC_H_
11 
12 #include "../ndn-error-code.h"
13 #include "ndn-lite-sec-config.h"
14 #include "ndn-lite-rng.h"
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
25 
29 typedef uint32_t (*ndn_ecc_get_pub_key_size_impl)(const abstract_ecc_pub_key_t* pub_key);
30 typedef uint32_t (*ndn_ecc_get_prv_key_size_impl)(const abstract_ecc_prv_key_t* prv_key);
31 typedef const uint8_t* (*ndn_ecc_get_pub_key_value_impl)(const abstract_ecc_pub_key_t* pub_key);
33  const uint8_t* key_value, uint32_t key_size);
35  const uint8_t* key_value, uint32_t key_size);
36 typedef int (*ndn_ecc_set_rng_impl)(ndn_rng_impl rng);
37 typedef int (*ndn_ecdsa_sign_impl)(const uint8_t* payload_value, uint32_t payload_size,
38  uint8_t* output_value, uint32_t output_max_size,
39  const abstract_ecc_prv_key_t* prv_key,
40  uint8_t ecdsa_type, uint32_t* output_used_size);
41 typedef int (*ndn_ecdsa_verify_impl)(const uint8_t* payload_value, uint32_t payload_size,
42  const uint8_t* sig_value, uint32_t sig_size,
43  const abstract_ecc_pub_key_t* pub_key, uint8_t ecdsa_type);
45  abstract_ecc_prv_key_t* prv_key,
46  uint8_t curve_type);
48  const abstract_ecc_prv_key_t* ecc_prv,
49  uint8_t curve_type, uint8_t* output,
50  uint32_t output_size);
51 
55 typedef struct ndn_ecc_backend {
67 
71 typedef struct ndn_ecc_pub {
76  uint32_t key_id;
80  uint8_t curve_type;
82 
86 typedef struct ndn_ecc_prv {
91  uint32_t key_id;
95  uint8_t curve_type;
97 
100 
105 uint32_t
107 
112 uint32_t
114 
119 const uint8_t*
121 
128 int
130  const uint8_t* key_value, uint32_t key_size);
131 
142 static inline int
143 ndn_ecc_pub_init(ndn_ecc_pub_t* ecc_pub, const uint8_t* key_value,
144  uint32_t key_size, uint8_t curve_type, uint32_t key_id)
145 {
146  ndn_ecc_load_pub_key(ecc_pub, key_value, key_size);
147  ecc_pub->curve_type = curve_type;
148  ecc_pub->key_id = key_id;
149  return 0;
150 }
151 
158 int
160  const uint8_t* key_value, uint32_t key_size);
161 
172 static inline int
173 ndn_ecc_prv_init(ndn_ecc_prv_t* ecc_prv, const uint8_t* key_value,
174  uint32_t key_size, uint8_t curve_type, uint32_t key_id)
175 {
176  ndn_ecc_load_prv_key(ecc_prv, key_value, key_size);
177  ecc_prv->curve_type = curve_type;
178  ecc_prv->key_id = key_id;
179  return 0;
180 }
181 
188 int
190 
199 int
200 ndn_ecc_make_key(ndn_ecc_pub_t* ecc_pub, ndn_ecc_prv_t* ecc_prv,
201  uint8_t curve_type, uint32_t key_id);
202 
212 int
213 ndn_ecc_dh_shared_secret(const ndn_ecc_pub_t* ecc_pub, const ndn_ecc_prv_t* ecc_prv,
214  uint8_t curve_type, uint8_t* output, uint32_t output_size);
215 
231 int
232 ndn_ecdsa_sign(const uint8_t* input_value, uint32_t input_size,
233  uint8_t* output_value, uint32_t output_max_size,
234  const ndn_ecc_prv_t* ecc_prv_key,
235  uint8_t ecdsa_type, uint32_t* output_used_size);
236 
247 int
248 ndn_ecdsa_verify(const uint8_t* input_value, uint32_t input_size,
249  const uint8_t* sig_value, uint32_t sig_size,
250  const ndn_ecc_pub_t* ecc_pub_key,
251  uint8_t ecdsa_type);
252 
253 
254 #ifdef __cplusplus
255 }
256 #endif
257 
258 #endif // NDN_SECURITY_ECC_H_
ndn_ecc_get_pub_key_value_impl get_pub_key_value
Definition: ndn-lite-ecc.h:58
int(* ndn_rng_impl)(uint8_t *dest, unsigned size)
ndn_rng_impl type
Definition: ndn-lite-rng.h:30
ndn_ecc_make_key_impl make_key
Definition: ndn-lite-ecc.h:62
uint32_t key_id
The KEY ID of current key.
Definition: ndn-lite-ecc.h:91
const uint8_t *(* ndn_ecc_get_pub_key_value_impl)(const abstract_ecc_pub_key_t *pub_key)
Definition: ndn-lite-ecc.h:31
ndn_ecc_dh_shared_secret_impl dh_shared_secret
Definition: ndn-lite-ecc.h:63
int ndn_ecdsa_sign(const uint8_t *input_value, uint32_t input_size, uint8_t *output_value, uint32_t output_max_size, const ndn_ecc_prv_t *ecc_prv_key, uint8_t ecdsa_type, uint32_t *output_used_size)
Sign a buffer using ECDSA algorithm.
Definition: ndn-lite-ecc.c:79
The structure to represent the backend implementation.
Definition: ndn-lite-ecc.h:55
uint32_t ndn_ecc_get_prv_key_size(const ndn_ecc_prv_t *prv_key)
Get private key size in unit of byte.
Definition: ndn-lite-ecc.c:28
The structure to keep an ECC private key.
Definition: ndn-lite-ecc.h:86
abstract_ecc_pub_key_t abs_key
Definition: ndn-lite-ecc.h:72
Definition: ndn-lite-default-ecc-impl.h:23
uint32_t key_id
The KEY ID of current key.
Definition: ndn-lite-ecc.h:76
ndn_ecc_load_pub_key_impl load_pub_key
Definition: ndn-lite-ecc.h:59
uint8_t key_value[NDN_SEC_ECC_MAX_PRIVATE_KEY_SIZE]
Definition: ndn-lite-default-ecc-impl.h:24
ndn_ecc_set_rng_impl set_rng
Definition: ndn-lite-ecc.h:61
int(* ndn_ecc_load_prv_key_impl)(abstract_ecc_prv_key_t *prv_key, const uint8_t *key_value, uint32_t key_size)
Definition: ndn-lite-ecc.h:34
int ndn_ecc_set_rng(ndn_rng_impl rng)
Set RNG function for backend implementation library, which need this to perform non-deterministic sig...
Definition: ndn-lite-ecc.c:54
int ndn_ecc_load_prv_key(ndn_ecc_prv_t *prv_key, const uint8_t *key_value, uint32_t key_size)
Load in-memory key bits into an NDN private key.
Definition: ndn-lite-ecc.c:47
int(* ndn_ecdsa_verify_impl)(const uint8_t *payload_value, uint32_t payload_size, const uint8_t *sig_value, uint32_t sig_size, const abstract_ecc_pub_key_t *pub_key, uint8_t ecdsa_type)
Definition: ndn-lite-ecc.h:41
uint32_t ndn_ecc_get_pub_key_size(const ndn_ecc_pub_t *pub_key)
Get public key size in unit of byte.
Definition: ndn-lite-ecc.c:22
ndn_ecc_get_prv_key_size_impl get_prv_key_size
Definition: ndn-lite-ecc.h:57
int(* ndn_ecc_dh_shared_secret_impl)(const abstract_ecc_pub_key_t *ecc_pub, const abstract_ecc_prv_key_t *ecc_prv, uint8_t curve_type, uint8_t *output, uint32_t output_size)
Definition: ndn-lite-ecc.h:47
static int ndn_ecc_prv_init(ndn_ecc_prv_t *ecc_prv, const uint8_t *key_value, uint32_t key_size, uint8_t curve_type, uint32_t key_id)
Initialize an ECC private key.
Definition: ndn-lite-ecc.h:173
struct ndn_ecc_pub ndn_ecc_pub_t
The structure to keep an ECC public key.
int ndn_ecc_load_pub_key(ndn_ecc_pub_t *pub_key, const uint8_t *key_value, uint32_t key_size)
Load in-memory key bits into an NDN public key.
Definition: ndn-lite-ecc.c:40
ndn_ecc_backend_t * ndn_ecc_get_backend(void)
Definition: ndn-lite-ecc.c:16
int ndn_ecc_make_key(ndn_ecc_pub_t *ecc_pub, ndn_ecc_prv_t *ecc_prv, uint8_t curve_type, uint32_t key_id)
Generate an ECC key pair with specific curve type and key id.
Definition: ndn-lite-ecc.c:60
Definition: ndn-lite-default-ecc-impl.h:18
uint32_t key_size
Definition: ndn-lite-default-ecc-impl.h:25
uint8_t curve_type
The curve type of current key.
Definition: ndn-lite-ecc.h:80
abstract_ecc_prv_key_t abs_key
Definition: ndn-lite-ecc.h:87
int(* ndn_ecc_set_rng_impl)(ndn_rng_impl rng)
Definition: ndn-lite-ecc.h:36
int(* ndn_ecc_make_key_impl)(abstract_ecc_pub_key_t *pub_key, abstract_ecc_prv_key_t *prv_key, uint8_t curve_type)
Definition: ndn-lite-ecc.h:44
int(* ndn_ecc_load_pub_key_impl)(abstract_ecc_pub_key_t *pub_key, const uint8_t *key_value, uint32_t key_size)
Definition: ndn-lite-ecc.h:32
struct ndn_ecc_prv ndn_ecc_prv_t
The structure to keep an ECC private key.
struct ndn_ecc_backend ndn_ecc_backend_t
The structure to represent the backend implementation.
int(* ndn_ecdsa_sign_impl)(const uint8_t *payload_value, uint32_t payload_size, uint8_t *output_value, uint32_t output_max_size, const abstract_ecc_prv_key_t *prv_key, uint8_t ecdsa_type, uint32_t *output_used_size)
Definition: ndn-lite-ecc.h:37
static int ndn_ecc_pub_init(ndn_ecc_pub_t *ecc_pub, const uint8_t *key_value, uint32_t key_size, uint8_t curve_type, uint32_t key_id)
Initialize an ECC public key.
Definition: ndn-lite-ecc.h:143
ndn_ecdsa_sign_impl ecdsa_sign
Definition: ndn-lite-ecc.h:64
uint32_t(* ndn_ecc_get_pub_key_size_impl)(const abstract_ecc_pub_key_t *pub_key)
The APIs that are supposed to be implemented by the backend.
Definition: ndn-lite-ecc.h:29
int ndn_ecc_dh_shared_secret(const ndn_ecc_pub_t *ecc_pub, const ndn_ecc_prv_t *ecc_prv, uint8_t curve_type, uint8_t *output, uint32_t output_size)
Negotiate a shared secret wih given ECC public and private keys via ECDH.
Definition: ndn-lite-ecc.c:71
ndn_ecdsa_verify_impl ecdsa_verify
Definition: ndn-lite-ecc.h:65
ndn_ecc_get_pub_key_size_impl get_pub_key_size
Definition: ndn-lite-ecc.h:56
uint32_t(* ndn_ecc_get_prv_key_size_impl)(const abstract_ecc_prv_key_t *prv_key)
Definition: ndn-lite-ecc.h:30
ndn_ecc_load_prv_key_impl load_prv_key
Definition: ndn-lite-ecc.h:60
uint8_t curve_type
The curve type of current key.
Definition: ndn-lite-ecc.h:95
The structure to keep an ECC public key.
Definition: ndn-lite-ecc.h:71
const uint8_t * ndn_ecc_get_pub_key_value(const ndn_ecc_pub_t *pub_key)
Get public key bytes.
Definition: ndn-lite-ecc.c:34
int ndn_ecdsa_verify(const uint8_t *input_value, uint32_t input_size, const uint8_t *sig_value, uint32_t sig_size, const ndn_ecc_pub_t *ecc_pub_key, uint8_t ecdsa_type)
Verify an ECDSA signature in ASN.1 DER format.
Definition: ndn-lite-ecc.c:95