Branch data Line data Source code
1 : : /*
2 : : Copyright (c) 2021 Fraunhofer AISEC. See the COPYRIGHT
3 : : file at the top-level directory of this distribution.
4 : :
5 : : Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 : : http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 : : <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 : : option. This file may not be copied, modified, or distributed
9 : : except according to those terms.
10 : : */
11 : :
12 : : #include <string.h>
13 : :
14 : : #include "edhoc/suites.h"
15 : : #include "edhoc/hkdf_info.h"
16 : :
17 : : #include "common/byte_array.h"
18 : : #include "common/oscore_edhoc_error.h"
19 : :
20 : : #include "cbor/edhoc_encode_info.h"
21 : :
22 : 52 : enum err create_hkdf_info(uint8_t label, struct byte_array *context,
23 : : uint32_t okm_len, struct byte_array *out)
24 : : {
25 : : struct info info;
26 : :
27 : 52 : info.info_label = label;
28 : :
29 : : /* NULL context with zero size is acceptable from EDHOC point of view,
30 : : * but CBOR encoder does not accept NULL as input argument.
31 : : * Internally it calls memmove that generates runtime error when input
32 : : * is NULL even if length is set to 0.
33 : : * Workaround is to provide dummy buffer to avoid passing NULL. It does not
34 : : * impact the EDHOC process, since context length is set to 0 and no value
35 : : * is copied to the EDHOC message. */
36 : : const char dummy_buffer;
37 : :
38 [ + + ]: 52 : if (NULL == context->ptr) {
39 [ - + ]: 15 : if (0 != context->len) {
40 : 0 : return wrong_parameter;
41 : : } else {
42 : 15 : info.info_context.value =
43 : : (const uint8_t *)&dummy_buffer;
44 : : }
45 : : } else {
46 : 37 : info.info_context.value = context->ptr;
47 : : }
48 : :
49 : 52 : info.info_context.len = context->len;
50 : :
51 : 52 : info.info_length = okm_len;
52 : :
53 : 52 : size_t payload_len_out = 0;
54 [ - + ]: 52 : TRY_EXPECT(cbor_encode_info(out->ptr, out->len, &info,
55 : : &payload_len_out),
56 : : 0);
57 : :
58 : 52 : out->len = (uint32_t)payload_len_out;
59 : :
60 : 52 : return ok;
61 : : }
|