libcoap 4.3.5-develop-3f4d08f
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
120 /* This field allows recipient chaining */
123 /* RFC8613 3.1 */
126 uint64_t last_seq;
127 /* uint64_t highest_seq; */
131 uint8_t echo_value[8];
134};
135
136#define OSCORE_ASSOCIATIONS_ADD(r, obj) \
137 HASH_ADD(hh, (r), token->s[0], (obj)->token->length, (obj))
138
139#define OSCORE_ASSOCIATIONS_DELETE(r, obj) HASH_DELETE(hh, (r), (obj))
140
141#define OSCORE_ASSOCIATIONS_ITER(r, tmp) \
142 oscore_associations_t *tmp, *rtmp; \
143 HASH_ITER (hh, (r), tmp, rtmp)
144
145#define OSCORE_ASSOCIATIONS_ITER_SAFE(e, el, rtmp) \
146 for ((el) = (e); (el) && ((rtmp) = (el)->hh.next, 1); (el) = (rtmp))
147
148#define OSCORE_ASSOCIATIONS_FIND(r, k, res) \
149 { HASH_FIND(hh, (r), (k)->s, (k)->length, (res)); }
150
164
175 coap_oscore_conf_t *oscore_conf);
176
190 oscore_ctx_t *o_osc_ctx,
191 coap_bin_const_t *sender_id,
192 coap_bin_const_t *recipient_id,
193 coap_bin_const_t *id_context);
194
202
204
206
208
220 coap_oscore_rcp_conf_t *rcp_conf,
221 uint32_t break_key);
222
224
226
227uint8_t oscore_bytes_equal(uint8_t *a_ptr,
228 uint8_t a_len,
229 uint8_t *b_ptr,
230 uint8_t b_len);
231
232void oscore_convert_to_hex(const uint8_t *src,
233 size_t src_len,
234 char *dest,
235 size_t dst_len);
236
238 const char *name,
239 coap_bin_const_t *value);
240
241void oscore_log_int_value(coap_log_t level, const char *name, int value);
242
243void oscore_log_char_value(coap_log_t level, const char *name,
244 const char *value);
245
258 const coap_bin_const_t rcpkey_id,
259 const coap_bin_const_t *ctxkey_id,
260 uint8_t *oscore_r2,
261 oscore_recipient_ctx_t **recipient_ctx);
262
264
266 coap_pdu_t *sent_pdu,
267 coap_bin_const_t *token,
268 oscore_recipient_ctx_t *recipient_ctx,
269 coap_bin_const_t *aad,
270 coap_bin_const_t *nonce,
271 coap_bin_const_t *partial_iv,
272 int is_observe);
273
275 coap_bin_const_t *token);
276
278 oscore_association_t *association);
279
281
283 cose_encrypt0_t *code,
284 uint8_t coap_request,
285 coap_bin_const_t *sender_key,
286 coap_bin_const_t *id_context,
287 size_t cs_size,
288 uint8_t *keystream,
289 size_t keystream_size);
290
292 coap_bin_const_t *salt,
293 coap_bin_const_t *ikm,
294 cose_alg_t aead_alg,
296 coap_str_const_t *type,
297 size_t out_len);
298
301#ifdef __cplusplus
302}
303#endif
304
305#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_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_oscore_rcp_conf_t *rcp_conf, uint32_t break_key)
oscore_add_recipient - add in recipient information
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)
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_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)
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.
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
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.