libcoap 4.3.4-develop-9f1418e
oscore_context.h
Go to the documentation of this file.
1/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
3/*
4 * Copyright (c) 2018, SICS, RISE AB
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the Institute nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 */
32
48#ifndef _OSCORE_CONTEXT_H
49#define _OSCORE_CONTEXT_H
50
51#include "coap3/coap_internal.h"
52#include "coap3/coap_uthash_internal.h"
53#include <stdint.h>
54
61#define CONTEXT_KEY_LEN 16
62#define TOKEN_SEQ_NUM 2 /* to be set by application */
63#define EP_CTX_NUM 10 /* to be set by application */
64#define CONTEXT_INIT_VECT_LEN 13
65#define CONTEXT_SEQ_LEN sizeof(uint64_t)
66
67#define ED25519_PRIVATE_KEY_LEN 32
68#define ED25519_PUBLIC_KEY_LEN 32
69#define ED25519_SEED_LEN 32
70#define ED25519_SIGNATURE_LEN 64
71
72#define OSCORE_SEQ_MAX (((uint64_t)1 << 40) - 1)
73
74typedef enum {
79
83
96 uint8_t rfc8613_b_1_2;
97 uint8_t rfc8613_b_2;
98 uint32_t ssn_freq;
103};
104
106 uint64_t seq;
107 uint64_t next_seq;
110};
111
113 /* This field allows recipient chaining */
116 uint64_t last_seq;
117 /* uint64_t highest_seq; */
123 uint8_t echo_value[8];
125};
126
127#define OSCORE_ASSOCIATIONS_ADD(r, obj) \
128 HASH_ADD(hh, (r), token->s[0], (obj)->token->length, (obj))
129
130#define OSCORE_ASSOCIATIONS_DELETE(r, obj) HASH_DELETE(hh, (r), (obj))
131
132#define OSCORE_ASSOCIATIONS_ITER(r, tmp) \
133 oscore_associations_t *tmp, *rtmp; \
134 HASH_ITER (hh, (r), tmp, rtmp)
135
136#define OSCORE_ASSOCIATIONS_ITER_SAFE(e, el, rtmp) \
137 for ((el) = (e); (el) && ((rtmp) = (el)->hh.next, 1); (el) = (rtmp))
138
139#define OSCORE_ASSOCIATIONS_FIND(r, k, res) \
140 { HASH_FIND(hh, (r), (k)->s, (k)->length, (res)); }
141
143 UT_hash_handle hh;
151 uint8_t is_observe;
152};
153
164 coap_oscore_conf_t *oscore_conf);
165
179 oscore_ctx_t *o_osc_ctx,
180 coap_bin_const_t *sender_id,
181 coap_bin_const_t *recipient_id,
182 coap_bin_const_t *id_context);
183
190void oscore_update_ctx(oscore_ctx_t *osc_ctx, coap_bin_const_t *id_context);
191
192void oscore_free_context(oscore_ctx_t *osc_ctx);
193
194void oscore_free_contexts(coap_context_t *c_context);
195
196int oscore_remove_context(coap_context_t *c_context, oscore_ctx_t *osc_ctx);
197
208 coap_bin_const_t *rid,
209 uint32_t break_key);
210
212
213uint8_t oscore_bytes_equal(uint8_t *a_ptr,
214 uint8_t a_len,
215 uint8_t *b_ptr,
216 uint8_t b_len);
217
218void oscore_convert_to_hex(const uint8_t *src,
219 size_t src_len,
220 char *dest,
221 size_t dst_len);
222
224 const char *name,
225 coap_bin_const_t *value);
226
227void oscore_log_int_value(coap_log_t level, const char *name, int value);
228
229void oscore_log_char_value(coap_log_t level, const char *name,
230 const char *value);
231
244 const coap_bin_const_t rcpkey_id,
245 const coap_bin_const_t *ctxkey_id,
246 uint8_t *oscore_r2,
247 oscore_recipient_ctx_t **recipient_ctx);
248
250
252 coap_pdu_t *sent_pdu,
253 coap_bin_const_t *token,
254 oscore_recipient_ctx_t *recipient_ctx,
255 coap_bin_const_t *aad,
256 coap_bin_const_t *nonce,
257 coap_bin_const_t *partial_iv,
258 int is_observe);
259
261 coap_bin_const_t *token);
262
264 oscore_association_t *association);
265
267
269 cose_encrypt0_t *code,
270 uint8_t coap_request,
271 coap_bin_const_t *sender_key,
272 coap_bin_const_t *id_context,
273 size_t cs_size,
274 uint8_t *keystream,
275 size_t keystream_size);
276
279#endif /* _OSCORE_CONTEXT_H */
Pulls together all the internal only header files.
uint64_t coap_tick_t
This data type represents internal timer ticks with COAP_TICKS_PER_SECOND resolution.
Definition: coap_time.h:143
coap_log_t
Logging type.
Definition: coap_debug.h:50
cose_hkdf_alg_t
Definition: oscore_cose.h:165
cose_alg_t
Definition: oscore_cose.h:126
void oscore_convert_to_hex(const uint8_t *src, size_t src_len, char *dest, size_t dst_len)
int oscore_delete_association(coap_session_t *session, oscore_association_t *association)
oscore_recipient_ctx_t * oscore_add_recipient(oscore_ctx_t *ctx, coap_bin_const_t *rid, uint32_t break_key)
oscore_add_recipient - add in recipient information
int oscore_delete_recipient(oscore_ctx_t *osc_ctx, coap_bin_const_t *rid)
oscore_mode_t
void oscore_update_ctx(oscore_ctx_t *osc_ctx, coap_bin_const_t *id_context)
oscore_update_ctx - update a osc_ctx with a new id_context
void oscore_free_context(oscore_ctx_t *osc_ctx)
oscore_ctx_t * oscore_derive_ctx(coap_context_t *c_context, coap_oscore_conf_t *oscore_conf)
oscore_derive_ctx - derive a osc_ctx from oscore_conf information
void oscore_free_association(oscore_association_t *association)
int oscore_new_association(coap_session_t *session, coap_pdu_t *sent_pdu, coap_bin_const_t *token, oscore_recipient_ctx_t *recipient_ctx, coap_bin_const_t *aad, coap_bin_const_t *nonce, coap_bin_const_t *partial_iv, int is_observe)
void oscore_delete_server_associations(coap_session_t *session)
void oscore_log_char_value(coap_log_t level, const char *name, const char *value)
void oscore_free_contexts(coap_context_t *c_context)
void oscore_log_hex_value(coap_log_t level, const char *name, coap_bin_const_t *value)
void oscore_log_int_value(coap_log_t level, const char *name, int value)
oscore_ctx_t * oscore_duplicate_ctx(coap_context_t *c_context, oscore_ctx_t *o_osc_ctx, coap_bin_const_t *sender_id, coap_bin_const_t *recipient_id, coap_bin_const_t *id_context)
oscore_duplicate_ctx - duplicate a osc_ctx
int oscore_remove_context(coap_context_t *c_context, oscore_ctx_t *osc_ctx)
int oscore_derive_keystream(oscore_ctx_t *osc_ctx, cose_encrypt0_t *code, uint8_t coap_request, coap_bin_const_t *sender_key, coap_bin_const_t *id_context, size_t cs_size, uint8_t *keystream, size_t keystream_size)
oscore_association_t * oscore_find_association(coap_session_t *session, coap_bin_const_t *token)
oscore_ctx_t * oscore_find_context(const coap_context_t *c_context, const coap_bin_const_t rcpkey_id, const coap_bin_const_t *ctxkey_id, uint8_t *oscore_r2, oscore_recipient_ctx_t **recipient_ctx)
oscore_find_context - Locate recipient context (and hence OSCORE context)
uint8_t oscore_bytes_equal(uint8_t *a_ptr, uint8_t a_len, uint8_t *b_ptr, uint8_t b_len)
@ OSCORE_MODE_SINGLE
Vanilla RFC8613 support.
@ OSCORE_MODE_PAIRWISE
TODO draft-ietf-core-oscore-groupcomm.
@ OSCORE_MODE_GROUP
TODO draft-ietf-core-oscore-groupcomm.
int(* coap_oscore_save_seq_num_t)(uint64_t sender_seq_num, void *param)
Definition of the function used to save the current Sender Sequence Number.
Definition: coap_oscore.h:137
CoAP binary data definition with const data.
Definition: coap_str.h:64
The CoAP stack's global state is stored in a coap_context_t object.
The structure used to hold the OSCORE configuration information.
structure for CoAP PDUs
Abstraction of virtual session that can be attached to coap_context_t (client) or coap_endpoint_t (se...
coap_bin_const_t * partial_iv
coap_bin_const_t * aad
coap_bin_const_t * nonce
oscore_recipient_ctx_t * recipient_ctx
coap_bin_const_t * token
coap_bin_const_t * master_secret
uint32_t replay_window_size
coap_bin_const_t * common_iv
Derived from Master Secret, Master Salt, and ID Context.
struct oscore_ctx_t * next
oscore_mode_t mode
uint8_t rfc8613_b_1_2
1 if rfc8613 B.1.2 enabled else 0
void * save_seq_num_func_param
Passed to save_seq_num_func()
oscore_sender_ctx_t * sender_context
cose_hkdf_alg_t hkdf_alg
cose_alg_t aead_alg
uint8_t rfc8613_b_2
1 if rfc8613 B.2 protocol else 0
coap_bin_const_t * master_salt
coap_oscore_save_seq_num_t save_seq_num_func
Called every seq num change.
oscore_recipient_ctx_t * recipient_chain
coap_bin_const_t * id_context
contains GID in case of group
uint32_t ssn_freq
Sender Seq Num update frequency.
oscore_recipient_ctx_t * next_recipient
coap_bin_const_t * recipient_key
coap_bin_const_t * recipient_id
oscore_ctx_t * osc_ctx
coap_bin_const_t * sender_id
coap_bin_const_t * sender_key
uint64_t next_seq
Used for ssn_freq updating.