ndn-lite
ndn-lite-hmac.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018-2019 Zhiyi Zhang, Tianyuan Yu, Edward Lu
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_HMAC_H_
10 #define NDN_SECURITY_HMAC_H_
11 
12 #include "../ndn-error-code.h"
13 #include "ndn-lite-sec-config.h"
14 #include <inttypes.h>
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
24 
28 typedef uint32_t (*ndn_hmac_get_key_size_impl)(const abstract_hmac_key_t* hmac_key);
29 typedef const uint8_t* (*ndn_hmac_get_key_value_impl)(const abstract_hmac_key_t* hmac_key);
31  const uint8_t* key_value, uint32_t key_size);
32 typedef int (*ndn_hmac_sha256_impl)(const void* payload, uint32_t payload_length,
33  const abstract_hmac_key_t* hmac_key,
34  uint8_t* hmac_result);
36  const uint8_t* input_value, uint32_t input_size,
37  const uint8_t* personalization, uint32_t personalization_size,
38  const uint8_t* seed_value, uint32_t seed_size,
39  const uint8_t* additional_value, uint32_t additional_size,
40  uint32_t salt_size);
41 typedef int (*ndn_hkdf_impl)(const uint8_t* input_value, uint32_t input_size,
42  uint8_t* output_value, uint32_t output_size,
43  const uint8_t* seed_value, uint32_t seed_size);
44 typedef int (*ndn_hmacprng_impl)(const uint8_t* input_value, uint32_t input_size,
45  uint8_t* output_value, uint32_t output_size,
46  const uint8_t* seed_value, uint32_t seed_size,
47  const uint8_t* additional_value, uint32_t additional_size);
48 
52 typedef struct ndn_hmac_backend {
61 
65 typedef struct ndn_hmac_key {
70  uint32_t key_id;
72 
75 
80 uint32_t
81 ndn_hmac_get_key_size(const ndn_hmac_key_t* hmac_key);
82 
87 const uint8_t*
88 ndn_hmac_get_key_value(const ndn_hmac_key_t* hmac_key);
89 
96 int
98  const uint8_t* key_value, uint32_t key_size);
99 
108 static inline int
109 ndn_hmac_key_init(ndn_hmac_key_t* hmac_key, const uint8_t* key_value,
110  uint32_t key_size, uint32_t key_id)
111 {
112  ndn_hmac_load_key(hmac_key, key_value, key_size);
113  hmac_key->key_id = key_id;
114  return 0;
115 }
116 
121 int
122 ndn_hmac_sha256(const void* payload, uint32_t payload_length,
123  const ndn_hmac_key_t* hmac_key,
124  uint8_t* hmac_result);
125 
138 int
139 ndn_hmac_sign(const uint8_t* input_value, uint32_t input_size,
140  uint8_t* output_value, uint32_t output_max_size,
141  const ndn_hmac_key_t* hmac_key,
142  uint32_t* output_used_size);
143 
154 int
155 ndn_hmac_verify(const uint8_t* input_value, uint32_t input_size,
156  const uint8_t* sig_value, uint32_t sig_size,
157  const ndn_hmac_key_t* hmac_key);
158 
173 int
174 ndn_hmac_make_key(ndn_hmac_key_t* key, uint32_t key_id,
175  const uint8_t* input_value, uint32_t input_size,
176  const uint8_t* personalization, uint32_t personalization_size,
177  const uint8_t* seed_value, uint32_t seed_size,
178  const uint8_t* additional_value, uint32_t additional_size,
179  uint32_t salt_size);
180 
192 int
193 ndn_hkdf(const uint8_t* input_value, uint32_t input_size,
194  uint8_t* output_value, uint32_t output_size,
195  const uint8_t* seed_value, uint32_t seed_size);
196 
210 int
211 ndn_hmacprng(const uint8_t* input_value, uint32_t input_size,
212  uint8_t* output_value, uint32_t output_size,
213  const uint8_t* seed_value, uint32_t seed_size,
214  const uint8_t* additional_value, uint32_t additional_size);
215 
216 #ifdef __cplusplus
217 }
218 #endif
219 
220 #endif // NDN_SECURITY_HMAC_H_
int ndn_hkdf(const uint8_t *input_value, uint32_t input_size, uint8_t *output_value, uint32_t output_size, const uint8_t *seed_value, uint32_t seed_size)
Use HMAC-KDF (key derivation function) to generate a secure HMAC key.
Definition: ndn-lite-hmac.c:100
The structure to keep a HMAC key.
Definition: ndn-lite-hmac.h:65
ndn_hmac_sha256_impl hmac_sha256
Definition: ndn-lite-hmac.h:56
abstract_hmac_key_t abs_key
Definition: ndn-lite-hmac.h:66
uint32_t ndn_hmac_get_key_size(const ndn_hmac_key_t *hmac_key)
Get hmac key size in unit of byte.
Definition: ndn-lite-hmac.c:25
ndn_hmac_get_key_value_impl get_key_value
Definition: ndn-lite-hmac.h:54
uint32_t(* ndn_hmac_get_key_size_impl)(const abstract_hmac_key_t *hmac_key)
The APIs that are supposed to be implemented by the backend.
Definition: ndn-lite-hmac.h:28
int ndn_hmac_make_key(ndn_hmac_key_t *key, uint32_t key_id, const uint8_t *input_value, uint32_t input_size, const uint8_t *personalization, uint32_t personalization_size, const uint8_t *seed_value, uint32_t seed_size, const uint8_t *additional_value, uint32_t additional_size, uint32_t salt_size)
Generate a HMAC key with specific key size and key id.
Definition: ndn-lite-hmac.c:83
int(* ndn_hmacprng_impl)(const uint8_t *input_value, uint32_t input_size, uint8_t *output_value, uint32_t output_size, const uint8_t *seed_value, uint32_t seed_size, const uint8_t *additional_value, uint32_t additional_size)
Definition: ndn-lite-hmac.h:44
int ndn_hmac_load_key(ndn_hmac_key_t *hmac_key, const uint8_t *key_value, uint32_t key_size)
Load in-memory key bits into an NDN hmac key.
Definition: ndn-lite-hmac.c:37
int(* ndn_hmac_make_key_impl)(abstract_hmac_key_t *key, const uint8_t *input_value, uint32_t input_size, const uint8_t *personalization, uint32_t personalization_size, const uint8_t *seed_value, uint32_t seed_size, const uint8_t *additional_value, uint32_t additional_size, uint32_t salt_size)
Definition: ndn-lite-hmac.h:35
ndn_hmac_load_key_impl load_key
Definition: ndn-lite-hmac.h:55
const uint8_t *(* ndn_hmac_get_key_value_impl)(const abstract_hmac_key_t *hmac_key)
Definition: ndn-lite-hmac.h:29
uint32_t key_size
The key size of key bytes.
Definition: ndn-lite-default-hmac-impl.h:23
struct ndn_hmac_backend ndn_hmac_backend_t
The structure to represent the backend implementation.
int(* ndn_hmac_sha256_impl)(const void *payload, uint32_t payload_length, const abstract_hmac_key_t *hmac_key, uint8_t *hmac_result)
Definition: ndn-lite-hmac.h:32
int ndn_hmacprng(const uint8_t *input_value, uint32_t input_size, uint8_t *output_value, uint32_t output_size, const uint8_t *seed_value, uint32_t seed_size, const uint8_t *additional_value, uint32_t additional_size)
Use HMAC-PRNG algorithm to generate pseudo-random bytes.
Definition: ndn-lite-hmac.c:110
struct ndn_hmac_key ndn_hmac_key_t
The structure to keep a HMAC key.
int(* ndn_hmac_load_key_impl)(abstract_hmac_key_t *hmac_key, const uint8_t *key_value, uint32_t key_size)
Definition: ndn-lite-hmac.h:30
Definition: ndn-lite-default-hmac-impl.h:15
ndn_hmac_make_key_impl make_key
Definition: ndn-lite-hmac.h:57
ndn_hmac_backend_t * ndn_hmac_get_backend(void)
Definition: ndn-lite-hmac.c:19
static int ndn_hmac_key_init(ndn_hmac_key_t *hmac_key, const uint8_t *key_value, uint32_t key_size, uint32_t key_id)
Initialize a HMAC key.
Definition: ndn-lite-hmac.h:109
int ndn_hmac_sha256(const void *payload, uint32_t payload_length, const ndn_hmac_key_t *hmac_key, uint8_t *hmac_result)
Generate HMAC using sha256 digest algorithm.
Definition: ndn-lite-hmac.c:44
ndn_hmac_get_key_size_impl get_key_size
Definition: ndn-lite-hmac.h:53
ndn_hkdf_impl hkdf
Definition: ndn-lite-hmac.h:58
uint8_t key_value[32]
The key bytes buffer of current key.
Definition: ndn-lite-default-hmac-impl.h:19
int(* ndn_hkdf_impl)(const uint8_t *input_value, uint32_t input_size, uint8_t *output_value, uint32_t output_size, const uint8_t *seed_value, uint32_t seed_size)
Definition: ndn-lite-hmac.h:41
The structure to represent the backend implementation.
Definition: ndn-lite-hmac.h:52
const uint8_t * ndn_hmac_get_key_value(const ndn_hmac_key_t *hmac_key)
Get hmac key bytes.
Definition: ndn-lite-hmac.c:31
int ndn_hmac_sign(const uint8_t *input_value, uint32_t input_size, uint8_t *output_value, uint32_t output_max_size, const ndn_hmac_key_t *hmac_key, uint32_t *output_used_size)
Sign a buffer using HMAC algorithm.
Definition: ndn-lite-hmac.c:51
int ndn_hmac_verify(const uint8_t *input_value, uint32_t input_size, const uint8_t *sig_value, uint32_t sig_size, const ndn_hmac_key_t *hmac_key)
Verify a HMAC signature.
Definition: ndn-lite-hmac.c:67
uint32_t key_id
The KEY ID of current key.
Definition: ndn-lite-hmac.h:70
ndn_hmacprng_impl hmacprng
Definition: ndn-lite-hmac.h:59