libcoap 4.3.5-develop-7370fcf
Loading...
Searching...
No Matches
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_uthash_internal.h"
52
53#ifdef __cplusplus
54extern "C" {
55#endif
56
63#define CONTEXT_KEY_LEN 16
64#define TOKEN_SEQ_NUM 2 /* to be set by application */
65#define EP_CTX_NUM 10 /* to be set by application */
66#define CONTEXT_INIT_VECT_LEN 13
67#define CONTEXT_SEQ_LEN sizeof(uint64_t)
68
69#define ED25519_PRIVATE_KEY_LEN 32
70#define ED25519_PUBLIC_KEY_LEN 32
71#define ED25519_SEED_LEN 32
72#define ED25519_SIGNATURE_LEN 64
73
74#define OSCORE_SEQ_MAX (((uint64_t)1 << 40) - 1)
75
81
85
109
111 /* RFC8613 3.1 */
114 uint64_t seq;
115 /* Tracking */
116 uint64_t next_seq;
117};
118
136
137#define OSCORE_ASSOCIATIONS_ADD(r, obj) \
138 HASH_ADD(hh, (r), token->s[0], (obj)->token->length, (obj))
139
140#define OSCORE_ASSOCIATIONS_DELETE(r, obj) HASH_DELETE(hh, (r), (obj))
141
142#define OSCORE_ASSOCIATIONS_ITER(r, tmp) \
143 oscore_associations_t *tmp, *rtmp; \
144 HASH_ITER (hh, (r), tmp, rtmp)
145
146#define OSCORE_ASSOCIATIONS_ITER_SAFE(e, el, rtmp) \
147 for ((el) = (e); (el) && ((rtmp) = (el)->hh.next, 1); (el) = (rtmp))
148
149#define OSCORE_ASSOCIATIONS_FIND(r, k, res) \
150 { HASH_FIND(hh, (r), (k)->s, (k)->length, (res)); }
151
165
176 coap_oscore_conf_t *oscore_conf);
177
186
200 oscore_ctx_t *o_osc_ctx,
201 coap_bin_const_t *sender_id,
202 coap_bin_const_t *recipient_id,
203 coap_bin_const_t *id_context);
204
212
214
216
218
220
228
240 coap_oscore_rcp_conf_t *rcp_conf,
241 uint32_t break_key);
242
244
246
255
262
263uint8_t oscore_bytes_equal(uint8_t *a_ptr,
264 uint8_t a_len,
265 uint8_t *b_ptr,
266 uint8_t b_len);
267
268void oscore_convert_to_hex(const uint8_t *src,
269 size_t src_len,
270 char *dest,
271 size_t dst_len);
272
274 const char *name,
275 coap_bin_const_t *value);
276
277void oscore_log_int_value(coap_log_t level, const char *name, int value);
278
279void oscore_log_char_value(coap_log_t level, const char *name,
280 const char *value);
281
294 const coap_bin_const_t rcpkey_id,
295 const coap_bin_const_t *ctxkey_id,
296 uint8_t *oscore_r2,
297 oscore_recipient_ctx_t **recipient_ctx);
298
300
302 coap_pdu_t *sent_pdu,
303 coap_bin_const_t *token,
304 oscore_recipient_ctx_t *recipient_ctx,
305 coap_bin_const_t *aad,
306 coap_bin_const_t *nonce,
307 coap_bin_const_t *partial_iv,
308 int is_observe);
309
311 coap_bin_const_t *token);
312
314 oscore_association_t *association);
315
317
319 cose_encrypt0_t *code,
320 uint8_t coap_request,
321 coap_bin_const_t *sender_key,
322 coap_bin_const_t *id_context,
323 size_t cs_size,
324 uint8_t *keystream,
325 size_t keystream_size);
326
328 coap_bin_const_t *salt,
329 coap_bin_const_t *ikm,
330 cose_alg_t aead_alg,
332 coap_str_const_t *type,
333 size_t out_len);
334
337#ifdef __cplusplus
338}
339#endif
340
341#endif /* _OSCORE_CONTEXT_H */
uint64_t coap_tick_t
This data type represents internal timer ticks with COAP_TICKS_PER_SECOND resolution.
Definition coap_time.h:149
coap_log_t
Logging type.
Definition coap_debug.h:56
cose_hkdf_alg_t
cose_alg_t
void oscore_reference_recipient_ctx(oscore_recipient_ctx_t *recipient_ctx)
Increment the recipient context reference count.
void oscore_convert_to_hex(const uint8_t *src, size_t src_len, char *dest, size_t dst_len)
oscore_ctx_t * oscore_derive_ctx_from_conf(coap_oscore_conf_t *oscore_conf)
oscore_derive_ctx_from_conf - derive a osc_ctx from oscore_conf information
int oscore_delete_association(coap_session_t *session, oscore_association_t *association)
oscore_recipient_ctx_t * oscore_add_recipient(oscore_ctx_t *ctx, coap_oscore_rcp_conf_t *rcp_conf, uint32_t break_key)
oscore_add_recipient - add in recipient information
int oscore_add_context(coap_context_t *c_context, oscore_ctx_t *osc_ctx)
void oscore_free_sender(oscore_sender_ctx_t *snd_ctx)
coap_bin_const_t * oscore_build_key(oscore_ctx_t *osc_ctx, coap_bin_const_t *salt, coap_bin_const_t *ikm, cose_alg_t aead_alg, coap_bin_const_t *id, coap_str_const_t *type, size_t out_len)
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)
oscore_ctx_t * oscore_find_context(coap_session_t *session, 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)
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)
int oscore_is_context_attached(const oscore_ctx_t *osc_ctx)
Check if oscore context is attached to a the provided context.
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)
uint8_t oscore_bytes_equal(uint8_t *a_ptr, uint8_t a_len, uint8_t *b_ptr, uint8_t b_len)
void oscore_release_recipient_ctx(oscore_recipient_ctx_t **recipient_ctx)
Cleanup recipient context, including releasing the oscore context if the oscore context referenced is...
@ 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.
CoAP binary data definition with const data.
Definition coap_str.h:65
The CoAP stack's global state is stored in a coap_context_t object.
The structure used to hold the OSCORE configuration information.
The structure used to hold the OSCORE Recipient configuration.
structure for CoAP PDUs
Abstraction of virtual session that can be attached to coap_context_t (client) or coap_endpoint_t (se...
CoAP string data definition with const data.
Definition coap_str.h:47
coap_bin_const_t * obs_partial_iv
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
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
Set to one of COSE_HKDF_ALG_*.
cose_alg_t aead_alg
Set to one of COSE_ALGORITHM_AES*.
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
This field allows recipient chaining.
unsigned ref
Reference counter to keep track of linked associations / active sessions.
coap_bin_const_t * recipient_key
coap_bin_const_t * recipient_id
coap_bin_const_t * sender_id
uint64_t seq
Sender Sequence Number.
coap_bin_const_t * sender_key
uint64_t next_seq
Used for ssn_freq updating.