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 <zephyr/kernel.h>
13 : : #include <zephyr/ztest.h>
14 : :
15 : : #include "common/unit_test.h"
16 : :
17 : : #include "oscore.h"
18 : : #include "oscore/security_context.h"
19 : :
20 : 7 : static void test_single_piv2ssn(uint8_t *piv_ptr, uint32_t piv_size, uint64_t expected_ssn)
21 : : {
22 : 7 : uint64_t ssn;
23 : 7 : struct byte_array piv = BYTE_ARRAY_INIT(piv_ptr, piv_size);
24 : 7 : enum err result = piv2ssn(&piv, &ssn);
25 : 7 : zassert_equal(result, ok, "Error in piv2ssn (code=%d)", result);
26 : 7 : zassert_equal(ssn, expected_ssn, "wrong SSN calculation");
27 : 7 : }
28 : :
29 : 5 : static void test_single_ssn2piv(uint64_t ssn, uint8_t *expected_piv, uint32_t expected_size)
30 : : {
31 : 5 : static uint8_t buf[5];
32 : 5 : struct byte_array piv = BYTE_ARRAY_INIT(buf, sizeof(buf));
33 : 5 : enum err result = ssn2piv(ssn, &piv);
34 : :
35 : 5 : zassert_equal(result, ok, "Error in ssn2piv (code=%d)", result);
36 : 5 : zassert_equal(piv.len, expected_size, "wrong PIV size");
37 : 5 : zassert_mem_equal(piv.ptr, expected_piv, expected_size, "wrong PIV value");
38 : 5 : }
39 : :
40 : 1 : void t500_oscore_context_init_corner_cases(void)
41 : : {
42 : 1 : enum err r;
43 : 1 : struct context c;
44 : :
45 : : /*test unsupported AEAD algorithm*/
46 : 1 : struct oscore_init_params params = {
47 : : .aead_alg = 15, //15 is not supported. Only 10 is supported
48 : : };
49 : :
50 : 1 : r = oscore_context_init(¶ms, &c);
51 : 1 : zassert_equal(r, oscore_invalid_algorithm_aead,
52 : : "Error in oscore_context_init. r: %d", r);
53 : :
54 : : /*test unsupported SHA algorithm*/
55 : 1 : struct oscore_init_params params1 = {
56 : : .aead_alg = 10,
57 : : .hkdf = 15, //15 is not supported. Only 10 is supported
58 : : };
59 : :
60 : 1 : r = oscore_context_init(¶ms1, &c);
61 : 1 : zassert_equal(r, oscore_invalid_algorithm_hkdf,
62 : : "Error in oscore_context_init. r: %d", r);
63 : 1 : }
64 : :
65 : 1 : void t501_piv2ssn(void)
66 : : {
67 : 1 : enum err r;
68 : 1 : uint64_t ssn;
69 : 1 : uint8_t piv1[] = { 0x00 };
70 : 1 : uint8_t piv2[] = { 0xFF };
71 : 1 : uint8_t piv3[] = { 0x02, 0xF0 };
72 : 1 : uint8_t piv4[] = { 0xDE, 0xAD, 0xBE, 0xEF };
73 : 1 : uint8_t piv5[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
74 : :
75 : : /*test with valid parameters*/
76 : 1 : test_single_piv2ssn(piv1, sizeof(piv1), 0x00);
77 : 1 : test_single_piv2ssn(piv2, sizeof(piv2), 0xFF);
78 : 1 : test_single_piv2ssn(piv3, sizeof(piv3), 0x02F0);
79 : 1 : test_single_piv2ssn(piv4, sizeof(piv4), 0xDEADBEEF);
80 : 1 : test_single_piv2ssn(piv5, sizeof(piv5), MAX_PIV_FIELD_VALUE);
81 : 1 : test_single_piv2ssn(NULL, 0, 0);
82 : 1 : test_single_piv2ssn(NULL, 1, 0);
83 : :
84 : : /*test with invalid parameters*/
85 : 1 : r = piv2ssn(NULL, &ssn);
86 : 1 : zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //nullpointer for input value
87 : :
88 : 1 : struct byte_array piv_ba1 = BYTE_ARRAY_INIT(piv1, sizeof(piv1));
89 : 1 : r = piv2ssn(&piv_ba1, NULL);
90 : 1 : zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //nullpointer for output value
91 : :
92 : 1 : struct byte_array piv_ba2 = BYTE_ARRAY_INIT(piv1, 10);
93 : 1 : r = piv2ssn(&piv_ba2, &ssn);
94 : 1 : zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //buffer size exceeds maximum
95 : 1 : }
96 : :
97 : 1 : void t502_ssn2piv(void)
98 : : {
99 : 1 : enum err r;
100 : 1 : uint8_t piv1[] = { 0x00 };
101 : 1 : uint8_t piv2[] = { 0x20 };
102 : 1 : uint8_t piv3[] = { 0x20, 0xAA };
103 : 1 : uint8_t piv4[] = { 0xDE, 0xAD, 0xBE, 0xEF };
104 : 1 : uint8_t piv5[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
105 : :
106 : : /*test with valid parameters*/
107 : 1 : test_single_ssn2piv(0, piv1, sizeof(piv1));
108 : 1 : test_single_ssn2piv(0x20, piv2, sizeof(piv2));
109 : 1 : test_single_ssn2piv(0x20AA, piv3, sizeof(piv3));
110 : 1 : test_single_ssn2piv(0xDEADBEEF, piv4, sizeof(piv4));
111 : 1 : test_single_ssn2piv(MAX_PIV_FIELD_VALUE, piv5, sizeof(piv5));
112 : :
113 : : /*test with invalid parameters*/
114 : 1 : r = ssn2piv(0, NULL);
115 : 1 : zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //nullpointer for input value
116 : :
117 : 1 : struct byte_array piv_ba1 = BYTE_ARRAY_INIT(NULL, 10);
118 : 1 : r = ssn2piv(0, &piv_ba1);
119 : 1 : zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //nullpointer for input value
120 : :
121 : 1 : struct byte_array piv_ba2 = BYTE_ARRAY_INIT(piv5, sizeof(piv5));
122 : 1 : r = ssn2piv(MAX_PIV_FIELD_VALUE + 1, &piv_ba2);
123 : 1 : zassert_equal(r, wrong_parameter, "Error in piv2ssn. r: %d", r); //max value of ssn exceeded
124 : 1 : }
125 : :
126 : : /*
127 : : * @brief test with wrong kdf
128 : : */
129 : 1 : void t503_derive_corner_case(void)
130 : : {
131 : 1 : enum err r;
132 : 1 : struct common_context cc;
133 : :
134 : 1 : uint8_t id_buf[] = { 5 };
135 : 1 : uint8_t id_context[] = { 5 };
136 : 1 : uint8_t out_buf[40];
137 : :
138 : 1 : struct byte_array id = BYTE_ARRAY_INIT(id_buf, sizeof(id_buf));
139 : 1 : struct byte_array out = BYTE_ARRAY_INIT(out_buf, sizeof(out_buf));
140 : :
141 : 1 : cc.kdf = 15;
142 : 1 : cc.aead_alg = 10;
143 : 1 : cc.id_context.ptr = id_context;
144 : 1 : cc.id_context.len = sizeof(id_context);
145 : :
146 : 1 : r = derive(&cc, &id, KEY, &out);
147 : 1 : zassert_equal(r, oscore_unknown_hkdf, "Error in derive. r: %d", r);
148 : 1 : }
149 : :
150 : : /**
151 : : * @brief Test catching the SSN overflow event.
152 : : *
153 : : */
154 : 0 : void t504_context_freshness(void)
155 : : {
156 : 0 : enum err result;
157 : 0 : struct context security_context;
158 : :
159 : 0 : result = check_context_freshness(NULL);
160 : 0 : zassert_equal(result, wrong_parameter, "");
161 : :
162 : 0 : security_context.sc.ssn = 100;
163 : 0 : result = check_context_freshness(&security_context);
164 : 0 : zassert_equal(result, ok, "");
165 : :
166 : : /* mimic reaching final value of SSN */
167 : 0 : security_context.sc.ssn = OSCORE_SSN_OVERFLOW_VALUE;
168 : 0 : result = check_context_freshness(&security_context);
169 : 0 : zassert_equal(result, oscore_ssn_overflow, "");
170 : 0 : }
|