Branch data Line data Source code
1 : : /*
2 : : Copyright (c) 2022 Eriptic Technologies. 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 <zephyr/kernel.h>
15 : : #include <zephyr/ztest.h>
16 : :
17 : : #include "common/byte_array.h"
18 : : #include "common/unit_test.h"
19 : :
20 : : #include "oscore/option.h"
21 : :
22 : 1 : void t300_oscore_option_parser_no_piv(void)
23 : : {
24 : 1 : enum err r;
25 : :
26 : : /*No PIV, some KID and some KID context*/
27 : :
28 : 1 : struct compressed_oscore_option result;
29 : :
30 : 1 : uint8_t kid_context[] = { "test KID context" };
31 : 1 : uint8_t kid[] = { "test KID" };
32 : :
33 : 1 : struct compressed_oscore_option expected_result = {
34 : : .h = 1,
35 : : .k = 1,
36 : : .n = 0,
37 : : .piv.ptr = NULL,
38 : : .piv.len = 0,
39 : : .kid_context.ptr = kid_context,
40 : : .kid_context.len = sizeof(kid_context),
41 : : .kid.ptr = kid,
42 : : .kid.len = sizeof(kid),
43 : : };
44 : :
45 : 1 : uint8_t val[2 + sizeof(kid_context) + sizeof(kid)];
46 : 1 : val[0] = 0b11000; /*set h and k flags */
47 : 1 : val[1] = sizeof(kid_context);
48 : 1 : memcpy(&val[2], kid_context, sizeof(kid_context));
49 : 1 : memcpy(&val[2 + sizeof(kid_context)], kid, sizeof(kid));
50 : :
51 : 1 : struct o_coap_option opt = { .delta = 9,
52 : : .len = sizeof(val),
53 : : .value = val,
54 : : .option_number = OSCORE };
55 : :
56 : 1 : r = oscore_option_parser(&opt, 1, &result);
57 : :
58 : 1 : zassert_equal(r, ok, "Error in oscore_option_parser. r: %d", r);
59 : :
60 : 1 : zassert_equal(result.h, expected_result.h, "wrong h");
61 : 1 : zassert_equal(result.k, expected_result.k, "wrong k");
62 : 1 : zassert_equal(result.n, expected_result.n, "wrong n");
63 : :
64 : 1 : zassert_is_null(result.piv.ptr, "piv pointer not NULL");
65 : 1 : zassert_equal(result.piv.len, 0, "wrong piv len");
66 : 1 : zassert_mem_equal__(result.kid.ptr, expected_result.kid.ptr,
67 : : result.kid.len, "wrong kid");
68 : 1 : zassert_mem_equal__(result.kid_context.ptr,
69 : : expected_result.kid_context.ptr,
70 : : result.kid_context.len, "wrong kid_context");
71 : 1 : }
72 : :
73 : 1 : void t301_oscore_option_parser_wrong_n(void)
74 : : {
75 : 1 : struct compressed_oscore_option result;
76 : 1 : enum err r;
77 : 1 : uint8_t val[] = { 6 }; /*set n = 6 */
78 : 1 : struct o_coap_option opt = { .delta = 9,
79 : : .len = sizeof(val),
80 : : .value = val,
81 : : .option_number = OSCORE };
82 : :
83 : 1 : r = oscore_option_parser(&opt, 1, &result);
84 : 1 : zassert_equal(r, oscore_inpkt_invalid_piv,
85 : : "Error in oscore_option_parser. r: %d", r);
86 : :
87 : 1 : val[0] = 7; /*set n = 7 */
88 : 1 : r = oscore_option_parser(&opt, 1, &result);
89 : 1 : zassert_equal(r, oscore_inpkt_invalid_piv,
90 : : "Error in oscore_option_parser. r: %d", r);
91 : 1 : }
92 : :
93 : 1 : void t302_oscore_option_parser_no_kid(void)
94 : : {
95 : 1 : enum err r;
96 : :
97 : : /*No KID, some KID and some PIV context*/
98 : :
99 : 1 : struct compressed_oscore_option result;
100 : :
101 : 1 : uint8_t kid_context[] = { "test KID context" };
102 : 1 : uint8_t piv[] = { 0x01 };
103 : :
104 : 1 : struct compressed_oscore_option expected_result = {
105 : : .h = 1,
106 : : .k = 0,
107 : : .n = 1,
108 : : .piv.ptr = piv,
109 : : .piv.len = sizeof(piv),
110 : : .kid_context.ptr = kid_context,
111 : : .kid_context.len = sizeof(kid_context),
112 : : .kid.ptr = NULL,
113 : : .kid.len = 0,
114 : : };
115 : :
116 : 1 : uint8_t val[2 + sizeof(kid_context) + sizeof(piv)];
117 : 1 : val[0] = 0b10001; /*set h and n flags */
118 : 1 : memcpy(&val[1], piv, sizeof(piv));
119 : 1 : val[1 + sizeof(piv)] = sizeof(kid_context);
120 : 1 : memcpy(&val[2 + sizeof(piv)], kid_context, sizeof(kid_context));
121 : :
122 : 1 : struct o_coap_option opt = { .delta = 9,
123 : : .len = sizeof(val),
124 : : .value = val,
125 : : .option_number = OSCORE };
126 : :
127 : 1 : r = oscore_option_parser(&opt, 1, &result);
128 : :
129 : 1 : zassert_equal(r, ok, "Error in oscore_option_parser. r: %d", r);
130 : :
131 : 1 : zassert_equal(result.h, expected_result.h, "wrong h");
132 : 1 : zassert_equal(result.k, expected_result.k, "wrong k");
133 : 1 : zassert_equal(result.n, expected_result.n, "wrong n");
134 : :
135 : 1 : zassert_is_null(result.kid.ptr, "piv pointer not NULL");
136 : 1 : zassert_equal(result.kid.len, 0, "wrong piv len");
137 : 1 : zassert_mem_equal__(result.piv.ptr, expected_result.piv.ptr,
138 : : result.piv.len, "wrong kid");
139 : 1 : zassert_mem_equal__(result.kid_context.ptr,
140 : : expected_result.kid_context.ptr,
141 : : result.kid_context.len, "wrong kid_context");
142 : 1 : }
143 : :
144 : 1 : void t303_options_reorder(void)
145 : : {
146 : 1 : enum err r;
147 : :
148 : 1 : struct o_coap_option u_options[] = {
149 : : { .delta = 7, .len = 0, .value = NULL, .option_number = 7 },
150 : : { .delta = 5, .len = 0, .value = NULL, .option_number = 12 }
151 : : };
152 : :
153 : 1 : struct o_coap_option e_options[] = {
154 : : { .delta = 2, .len = 0, .value = NULL, .option_number = 2 },
155 : : { .delta = 2, .len = 0, .value = NULL, .option_number = 4 }
156 : : };
157 : :
158 : 1 : struct o_coap_option expected[] = {
159 : : { .delta = 2, .len = 0, .value = NULL, .option_number = 2 },
160 : : { .delta = 2, .len = 0, .value = NULL, .option_number = 4 },
161 : : { .delta = 3, .len = 0, .value = NULL, .option_number = 7 },
162 : : { .delta = 5, .len = 0, .value = NULL, .option_number = 12 }
163 : : };
164 : :
165 : 1 : struct o_coap_option out[4];
166 : 1 : memset(&out, 0, sizeof(out));
167 : 1 : uint8_t out_cnt;
168 : :
169 : 1 : r = options_reorder(u_options, 2, e_options, 2, out, &out_cnt);
170 : :
171 : 1 : zassert_equal(r, ok, "Error in options_reorder. r: %d", r);
172 : :
173 : : //PRINT_ARRAY("out", out, sizeof(out));
174 : : //PRINT_ARRAY("expected", expected, sizeof(expected));
175 : :
176 : 1 : uint8_t i;
177 : 1 : uint8_t len = sizeof(out) / sizeof(out[0]);
178 : :
179 : 1 : zassert_equal(out_cnt, len, "wrong option count");
180 : :
181 [ + + ]: 6 : for (i = 0; i < len; i++) {
182 : 4 : zassert_equal(expected[i].delta, out[i].delta, "wrong delta");
183 : 4 : zassert_equal(expected[i].len, out[i].len, "wrong len");
184 : 4 : zassert_equal(expected[i].value, out[i].value, "wrong value");
185 : 4 : zassert_equal(expected[i].option_number, out[i].option_number,
186 : : "wrong option_number");
187 : : }
188 : 1 : }
|