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 "oscore/aad.h"
15 : : #include "oscore/oscore_hkdf_info.h"
16 : :
17 : : #include "common/oscore_edhoc_error.h"
18 : :
19 : : #include "cbor/oscore_info.h"
20 : :
21 : : /*
22 : : HKDF = composition of HKDF-Extract and HKDF-Expand (RFC5869)
23 : : output = HKDF(salt, IKM, info, L
24 : : * salt = Master Salt
25 : : * IKM = Master Secret
26 : : * info = CBOR-array [
27 : : id: bstr,
28 : : alg_aead: int / tstr,
29 : : type: tstr,
30 : : L: uint,
31 : : ]
32 : : + id: SenderID / RecipientID for keys; empty string for CommonIV
33 : : + alg_aead: AEAD Algorithm
34 : : + type: "Key" / "IV", ascii string without nul-terminator
35 : : + L: size of key/iv for AEAD alg
36 : : - in bytes
37 : : * https://www.iana.org/assignments/cose/cose.xhtml
38 : : */
39 : :
40 : 34 : enum err oscore_create_hkdf_info(struct byte_array *id,
41 : : struct byte_array *id_context,
42 : : enum AEAD_algorithm aead_alg,
43 : : enum derive_type type, struct byte_array *out)
44 : : {
45 : : struct oscore_info info_struct;
46 : :
47 : : char type_enc[10];
48 : 34 : uint8_t len = 0;
49 [ + + - ]: 34 : switch (type) {
50 : 23 : case KEY:
51 : 23 : strncpy(type_enc, "Key", 10);
52 : 23 : len = 16;
53 : 23 : break;
54 : 11 : case IV:
55 : 11 : strncpy(type_enc, "IV", 10);
56 : 11 : len = 13;
57 : 11 : break;
58 : : }
59 : :
60 : 34 : info_struct.oscore_info_id.value = id->ptr;
61 : 34 : info_struct.oscore_info_id.len = id->len;
62 : :
63 [ + + ]: 34 : if (id_context->len == 0) {
64 : 27 : info_struct.oscore_info_id_context_choice =
65 : : oscore_info_id_context_nil_c;
66 : : } else {
67 : 7 : info_struct.oscore_info_id_context_choice =
68 : : oscore_info_id_context_bstr_c;
69 : 7 : info_struct.oscore_info_id_context_bstr.value =
70 : 7 : id_context->ptr;
71 : 7 : info_struct.oscore_info_id_context_bstr.len = id_context->len;
72 : : }
73 : 34 : info_struct.oscore_info_alg_aead_choice = oscore_info_alg_aead_int_c;
74 : 34 : info_struct.oscore_info_alg_aead_int = (int32_t)aead_alg;
75 : :
76 : 34 : info_struct.oscore_info_type.value = (uint8_t *)type_enc;
77 : 34 : info_struct.oscore_info_type.len = (uint32_t)strlen(type_enc);
78 : 34 : info_struct.oscore_info_L = len;
79 : :
80 : : size_t payload_len_out;
81 : :
82 [ - + ]: 34 : TRY_EXPECT(cbor_encode_oscore_info(out->ptr, out->len, &info_struct,
83 : : &payload_len_out),
84 : : 0);
85 : :
86 : 34 : out->len = (uint32_t)payload_len_out;
87 : 34 : return ok;
88 : : }
|