ndn-lite
signature.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018-2019 Zhiyi Zhang, Tianyuan Yu
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_ENCODING_SIGNATURE_H
10 #define NDN_ENCODING_SIGNATURE_H
11 
12 #include "name.h"
13 #include "../ndn-constants.h"
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
23 typedef struct ndn_validity_period {
27  uint8_t not_before[15];
31  uint8_t not_after[15];
33 
38 typedef struct ndn_signature {
42  uint8_t sig_type;
50  uint32_t sig_size;
60  uint32_t signature_nonce;
65  uint64_t timestamp;
69  uint8_t enable_Seqnum;
70  uint64_t seqnum;
77 
85 static inline int
87 {
88  signature->enable_KeyLocator = 0;
89  signature->enable_ValidityPeriod = 0;
90  signature->enable_SignatureNonce = 0;
91  signature->signature_nonce = 0;
92  signature->enable_Timestamp = 0;
93  signature->timestamp = 0;
94  signature->enable_Seqnum = 0;
95  signature->seqnum = 0;
96  return 0;
97 }
98 
99 static inline int
101 {
102  switch (type) {
104  signature->sig_size = NDN_SEC_SHA256_HASH_SIZE;
105  break;
108  break;
110  signature->sig_size = NDN_SEC_SHA256_HASH_SIZE;
111  break;
112  default:
114  }
115  signature->sig_type = type;
116  return 0;
117 }
118 
126 static inline int
127 ndn_signature_set_signature(ndn_signature_t* signature, const uint8_t* sig_value, size_t sig_size)
128 {
129  if (sig_size > NDN_SIGNATURE_BUFFER_SIZE)
130  return NDN_OVERSIZE;
131 
132  if (signature->sig_type == NDN_SIG_TYPE_ECDSA_SHA256 && sig_size != 64)
133  return NDN_SEC_WRONG_SIG_SIZE;
134 
135  if (signature->sig_type == NDN_SIG_TYPE_HMAC_SHA256 && sig_size != 32)
136  return NDN_SEC_WRONG_SIG_SIZE;
137 
138  if (signature->sig_type == NDN_SIG_TYPE_DIGEST_SHA256 && sig_size != 32)
139  return NDN_SEC_WRONG_SIG_SIZE;
140 
141  signature->sig_size = sig_size;
142  memcpy(signature->sig_value, sig_value, sig_size);
143  return 0;
144 }
145 
153 static inline void
155 {
156  signature->enable_KeyLocator = 1;
157  memcpy(&signature->key_locator_name, key_name, sizeof(ndn_name_t));
158 }
159 
166 static inline void
167 ndn_signature_set_timestamp(ndn_signature_t* signature, uint64_t timestamp)
168 {
169  signature->enable_Timestamp = 1;
170  signature->timestamp = timestamp;
171 }
172 
178 static inline void
180 {
181  signature->enable_SignatureNonce = 1;
182  signature->signature_nonce = nonce;
183 }
184 
190 static inline void
191 ndn_signature_set_seqnum(ndn_signature_t* signature, uint32_t seqnum)
192 {
193  signature->enable_Seqnum = 1;
194  signature->seqnum = seqnum;
195 }
196 
204 static inline void
206  const uint8_t* not_before, const uint8_t* not_after)
207 {
208  signature->enable_ValidityPeriod = 1;
209  memcpy(signature->validity_period.not_before, not_before, 15);
210  memcpy(signature->validity_period.not_after, not_after, 15);
211 }
212 
219 static inline uint32_t
221 {
222  // signature type
223  uint32_t info_buffer_size = encoder_probe_block_size(TLV_SignatureType, 1);
224 
225  if (signature->enable_KeyLocator > 0) {
226  uint32_t key_name_block_size = ndn_name_probe_block_size(&signature->key_locator_name);
227  info_buffer_size += encoder_probe_block_size(TLV_KeyLocator, key_name_block_size);
228  }
229  if (signature->enable_ValidityPeriod > 0) {
230  uint32_t validity_period_buffer_size = encoder_probe_block_size(TLV_NotBefore, 15);
231  validity_period_buffer_size += encoder_probe_block_size(TLV_NotAfter, 15);
232  info_buffer_size += encoder_probe_block_size(TLV_ValidityPeriod, validity_period_buffer_size);
233  }
234  if (signature->enable_SignatureNonce > 0) {
235  info_buffer_size += encoder_probe_block_size(TLV_SignatureNonce, 4);
236  }
237  if (signature->enable_Timestamp > 0) {
238  info_buffer_size += encoder_probe_block_size(TLV_Timestamp,
240  }
241  if (signature->enable_Seqnum > 0) {
242  info_buffer_size += encoder_probe_block_size(TLV_SeqNum,
243  encoder_probe_uint_length(signature->seqnum));
244  }
245  return encoder_probe_block_size(TLV_SignatureInfo, info_buffer_size);
246 }
247 
254 static inline uint32_t
256 {
258 }
259 
266 int
268 
275 int
277 
284 int
286 
293 int
295 
296 #ifdef __cplusplus
297 }
298 #endif
299 
300 #endif // NDN_ENCODING_SIGNATURE_H
Definition: ndn-enums.h:45
The structure to represent the signature validity period.
Definition: signature.h:23
uint32_t signature_nonce
Definition: signature.h:60
Definition: ndn-enums.h:44
int ndn_signature_value_tlv_decode(ndn_decoder_t *decoder, ndn_signature_t *signature)
Decode an Signature value TLV block into an Signature structure.
Definition: signature.c:215
static void ndn_signature_set_key_locator(ndn_signature_t *signature, const ndn_name_t *key_name)
Set keylocator of the Signature.
Definition: signature.h:154
Definition: tlv.h:54
Definition: tlv.h:65
#define NDN_SEC_SHA256_HASH_SIZE
Definition: ndn-constants.h:114
uint8_t sig_type
Signature type.
Definition: signature.h:42
ndn_validity_period_t validity_period
Signature validity period.
Definition: signature.h:74
The structure to keep the state when doing NDN TLV decoding.
Definition: decoder.h:21
uint8_t sig_value[NDN_SIGNATURE_BUFFER_SIZE]
The buffer which holds signature value.
Definition: signature.h:46
Definition: tlv.h:43
Definition: tlv.h:42
#define NDN_SEC_UNSUPPORT_SIGN_TYPE
Definition: ndn-error-code.h:96
Definition: ndn-enums.h:43
struct ndn_validity_period ndn_validity_period_t
The structure to represent the signature validity period.
static void ndn_signature_set_seqnum(ndn_signature_t *signature, uint32_t seqnum)
Set SeqNum of the Signed Interest.
Definition: signature.h:191
int ndn_signature_value_tlv_encode(ndn_encoder_t *encoder, const ndn_signature_t *signature)
Encode the Signature value into wire format (TLV block) from Signature structure.
Definition: signature.c:119
static int ndn_signature_set_signature_type(ndn_signature_t *signature, uint8_t type)
Definition: signature.h:100
ndn_name_t key_locator_name
Definition: signature.h:55
uint8_t not_after[15]
Signature is valid not after.
Definition: signature.h:31
#define NDN_ASN1_ECDSA_MAX_ENCODED_SIG_SIZE
Definition: ndn-constants.h:106
uint8_t enable_KeyLocator
Key locator of the signing key.
Definition: signature.h:54
static int ndn_signature_init(ndn_signature_t *signature)
Init a Signature structure.
Definition: signature.h:86
Definition: tlv.h:51
The structure to represent the Name.
Definition: name.h:24
Definition: tlv.h:52
uint64_t seqnum
Definition: signature.h:70
#define NDN_SEC_WRONG_SIG_SIZE
Definition: ndn-error-code.h:92
static void ndn_signature_set_timestamp(ndn_signature_t *signature, uint64_t timestamp)
Set Timestamp of the Signature.
Definition: signature.h:167
The structure to represent the Signature.
Definition: signature.h:38
int ndn_signature_info_tlv_encode(ndn_encoder_t *encoder, const ndn_signature_t *signature)
Encode the Signature info into wire format (TLV block) from Signature structure.
Definition: signature.c:12
static void ndn_signature_set_signature_nonce(ndn_signature_t *signature, uint32_t nonce)
Set Nonce of the Signed Interest.
Definition: signature.h:179
static uint32_t encoder_probe_block_size(uint32_t type, uint32_t payload_size)
Probe the size of a TLV block.
Definition: encoder.h:82
uint8_t enable_Timestamp
The signature timestamp.
Definition: signature.h:64
uint32_t sig_size
Signature value size.
Definition: signature.h:50
static void ndn_signature_set_validity_period(ndn_signature_t *signature, const uint8_t *not_before, const uint8_t *not_after)
Set validity period of the Signature.
Definition: signature.h:205
uint8_t not_before[15]
Signature is valid not before.
Definition: signature.h:27
static uint32_t ndn_name_probe_block_size(const ndn_name_t *name)
Probe the size of a Name TLV block before encoding it from a Name structure.
Definition: name.h:102
uint8_t enable_ValidityPeriod
Definition: signature.h:75
Definition: tlv.h:64
static int ndn_signature_set_signature(ndn_signature_t *signature, const uint8_t *sig_value, size_t sig_size)
Set signature value of the Signature.
Definition: signature.h:127
static int encoder_probe_uint_length(uint64_t value)
Probe the length of a non-negative int as the value (V).
Definition: encoder.h:243
Definition: tlv.h:63
int ndn_signature_info_tlv_decode(ndn_decoder_t *decoder, ndn_signature_t *signature)
Decode an Signature info TLV block into an Signature structure.
Definition: signature.c:132
#define NDN_OVERSIZE
The object given is larger than expected.
Definition: ndn-error-code.h:33
Definition: tlv.h:56
The structure to keep the state when doing NDN TLV encoding.
Definition: encoder.h:31
static uint32_t ndn_signature_value_probe_block_size(const ndn_signature_t *signature)
Probe the size of a Signature value TLV block before encoding it from a Signature structure.
Definition: signature.h:255
#define NDN_SIGNATURE_BUFFER_SIZE
Definition: ndn-constants.h:36
uint8_t enable_SignatureNonce
The signature info nonce.
Definition: signature.h:59
uint64_t timestamp
Definition: signature.h:65
struct ndn_signature ndn_signature_t
The structure to represent the Signature.
uint8_t enable_Seqnum
The signature sequence number.
Definition: signature.h:69
Definition: tlv.h:55
static uint32_t ndn_signature_info_probe_block_size(const ndn_signature_t *signature)
Probe the size of a Signature info TLV block before encoding it from a Signature structure.
Definition: signature.h:220