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 <stdio.h>
13 : : #include <zephyr/kernel.h>
14 : : #include <zephyr/ztest.h>
15 : :
16 : : #include <edhoc.h>
17 : : #include "txrx_wrapper.h"
18 : : #include "edhoc_test_vectors_rfc9529.h"
19 : :
20 : : volatile uint8_t msg_cnt = 1;
21 : :
22 : 3 : enum err tx_fkt(void *sock, struct byte_array *data)
23 : : {
24 [ + + + - : 3 : switch (msg_cnt) {
- ]
25 : : case 1:
26 : 1 : zassert_mem_equal__(data->ptr, T1_RFC9529__MESSAGE_1, data->len,
27 : : "wrong message1");
28 : 1 : zassert_equal(data->len, T1_RFC9529__MESSAGE_1_LEN,
29 : : "wrong message1 length");
30 : 1 : break;
31 : : case 2:
32 : 1 : zassert_mem_equal__(data->ptr, T1_RFC9529__MESSAGE_2, data->len,
33 : : "wrong message2");
34 : 1 : zassert_equal(data->len, T1_RFC9529__MESSAGE_2_LEN,
35 : : "wrong message1 length");
36 : 1 : break;
37 : : case 3:
38 : 1 : zassert_mem_equal__(data->ptr, T1_RFC9529__MESSAGE_3, data->len,
39 : : "wrong message3");
40 : 1 : zassert_equal(data->len, T1_RFC9529__MESSAGE_3_LEN,
41 : : "wrong message1 length");
42 : 1 : break;
43 : : case 4:
44 : 0 : zassert_mem_equal__(data->ptr, T1_RFC9529__MESSAGE_4, data->len,
45 : : "wrong message4");
46 : 0 : zassert_equal(data->len, T1_RFC9529__MESSAGE_4_LEN,
47 : : "wrong message1 length");
48 : 0 : break;
49 : :
50 : : default:
51 : : break;
52 : : }
53 : :
54 : 3 : msg_cnt++;
55 : 3 : return ok;
56 : : }
57 : :
58 : 3 : enum err rx_fkt(void *sock, struct byte_array *data)
59 : : {
60 [ + + + - : 3 : switch (msg_cnt) {
- ]
61 : 1 : case 1:
62 : :
63 [ - + ]: 1 : TRY(_memcpy_s(data->ptr, data->len, T1_RFC9529__MESSAGE_1,
64 : : T1_RFC9529__MESSAGE_1_LEN));
65 : 1 : data->len = T1_RFC9529__MESSAGE_1_LEN;
66 : 1 : break;
67 : 1 : case 2:
68 [ - + ]: 1 : TRY(_memcpy_s(data->ptr, data->len, T1_RFC9529__MESSAGE_2,
69 : : T1_RFC9529__MESSAGE_2_LEN));
70 : 1 : data->len = T1_RFC9529__MESSAGE_2_LEN;
71 : 1 : break;
72 : 1 : case 3:
73 [ - + ]: 1 : TRY(_memcpy_s(data->ptr, data->len, T1_RFC9529__MESSAGE_3,
74 : : T1_RFC9529__MESSAGE_3_LEN));
75 : 1 : data->len = T1_RFC9529__MESSAGE_3_LEN;
76 : 1 : break;
77 : 0 : case 4:
78 [ # # ]: 0 : TRY(_memcpy_s(data->ptr, data->len, T1_RFC9529__MESSAGE_4,
79 : : T1_RFC9529__MESSAGE_4_LEN));
80 : 0 : data->len = T1_RFC9529__MESSAGE_4_LEN;
81 : 0 : break;
82 : :
83 : : default:
84 : : break;
85 : : }
86 : :
87 : 3 : msg_cnt++;
88 : 3 : return ok;
89 : : }
90 : :
91 : 3 : enum err ead_fkt(void *params, struct byte_array *ead13)
92 : : {
93 : 3 : return ok;
94 : : }
95 : :
96 : 1 : void test_edhoc_initiator_x509_x5t_rfc9529(void)
97 : : {
98 : 1 : enum err r;
99 : 1 : struct other_party_cred cred_r;
100 : 1 : struct edhoc_initiator_context c_i;
101 : :
102 : 1 : uint8_t I_PRK_out_buf[32];
103 : 1 : struct byte_array I_PRK_out = { .ptr = I_PRK_out_buf,
104 : : .len = sizeof(I_PRK_out_buf) };
105 : :
106 : 1 : uint8_t I_err_msg_buf[0];
107 : 1 : struct byte_array I_err_msg = { .ptr = I_err_msg_buf,
108 : : .len = sizeof(I_err_msg_buf) };
109 : :
110 : 1 : c_i.sock = NULL;
111 : 1 : c_i.c_i.len = T1_RFC9529__C_I_LEN;
112 : 1 : c_i.c_i.ptr = (uint8_t *)T1_RFC9529__C_I;
113 : 1 : c_i.method = (enum method_type)T1_RFC9529__METHOD;
114 : 1 : c_i.suites_i.len = T1_RFC9529__SUITES_I_LEN;
115 : 1 : c_i.suites_i.ptr = (uint8_t *)T1_RFC9529__SUITES_I;
116 : 1 : c_i.ead_1.len = 0;
117 : 1 : c_i.ead_1.ptr = NULL;
118 : 1 : c_i.ead_3.len = 0;
119 : 1 : c_i.ead_3.ptr = NULL;
120 : 1 : c_i.id_cred_i.len = T1_RFC9529__ID_CRED_I_LEN;
121 : 1 : c_i.id_cred_i.ptr = (uint8_t *)T1_RFC9529__ID_CRED_I;
122 : 1 : c_i.cred_i.len = T1_RFC9529__CRED_I_LEN;
123 : 1 : c_i.cred_i.ptr = (uint8_t *)T1_RFC9529__CRED_I;
124 : 1 : c_i.g_x.len = T1_RFC9529__G_X_LEN;
125 : 1 : c_i.g_x.ptr = (uint8_t *)T1_RFC9529__G_X;
126 : 1 : c_i.x.len = T1_RFC9529__X_LEN;
127 : 1 : c_i.x.ptr = (uint8_t *)T1_RFC9529__X;
128 : 1 : c_i.g_i.len = 0;
129 : 1 : c_i.g_i.ptr = NULL;
130 : 1 : c_i.i.len = 0;
131 : 1 : c_i.i.ptr = NULL;
132 : 1 : c_i.sk_i.len = T1_RFC9529__SK_I_LEN;
133 : 1 : c_i.sk_i.ptr = (uint8_t *)T1_RFC9529__SK_I;
134 : 1 : c_i.pk_i.len = T1_RFC9529__PK_I_LEN;
135 : 1 : c_i.pk_i.ptr = (uint8_t *)T1_RFC9529__PK_I;
136 : :
137 : 1 : cred_r.id_cred.len = T1_RFC9529__ID_CRED_R_LEN;
138 : 1 : cred_r.id_cred.ptr = (uint8_t *)T1_RFC9529__ID_CRED_R;
139 : 1 : cred_r.cred.len = T1_RFC9529__CRED_R_LEN;
140 : 1 : cred_r.cred.ptr = (uint8_t *)T1_RFC9529__CRED_R;
141 : 1 : cred_r.g.len = 0;
142 : 1 : cred_r.g.ptr = NULL;
143 : 1 : cred_r.pk.len = T1_RFC9529__PK_R_LEN;
144 : 1 : cred_r.pk.ptr = (uint8_t *)T1_RFC9529__PK_R;
145 : 1 : cred_r.ca.len = 0;
146 : 1 : cred_r.ca.ptr = NULL;
147 : 1 : cred_r.ca_pk.len = 0;
148 : 1 : cred_r.ca_pk.ptr = NULL;
149 : :
150 : 1 : struct cred_array cred_r_array = { .len = 1, .ptr = &cred_r };
151 : :
152 : 1 : r = edhoc_initiator_run(&c_i, &cred_r_array, &I_err_msg, &I_PRK_out,
153 : : tx_fkt, rx_fkt, ead_fkt);
154 : :
155 : 1 : zassert_mem_equal__(I_PRK_out.ptr, T1_RFC9529__PRK_out, I_PRK_out.len,
156 : : "wrong PRK_out");
157 : :
158 : 1 : msg_cnt = 1;
159 : 1 : }
160 : :
161 : 1 : void test_edhoc_responder_x509_x5t_rfc9529(void)
162 : : {
163 : 1 : enum err r;
164 : 1 : struct other_party_cred cred_i;
165 : 1 : struct edhoc_responder_context c_r;
166 : :
167 : 1 : uint8_t R_PRK_out_buf[32];
168 : 1 : struct byte_array R_PRK_out = { .ptr = R_PRK_out_buf,
169 : : .len = sizeof(R_PRK_out_buf) };
170 : :
171 : 1 : uint8_t R_err_msg_buf[0];
172 : 1 : struct byte_array R_err_msg = { .ptr = R_err_msg_buf,
173 : : .len = sizeof(R_err_msg_buf) };
174 : :
175 : 1 : c_r.sock = NULL;
176 : 1 : c_r.c_r.ptr = (uint8_t *)T1_RFC9529__C_R;
177 : 1 : c_r.c_r.len = T1_RFC9529__C_R_LEN;
178 : 1 : c_r.suites_r.len = T1_RFC9529__SUITES_R_LEN;
179 : 1 : c_r.suites_r.ptr = (uint8_t *)T1_RFC9529__SUITES_R;
180 : 1 : c_r.ead_2.len = 0;
181 : 1 : c_r.ead_2.ptr = NULL;
182 : 1 : c_r.ead_4.len = 0;
183 : 1 : c_r.ead_4.ptr = NULL;
184 : 1 : c_r.id_cred_r.len = T1_RFC9529__ID_CRED_R_LEN;
185 : 1 : c_r.id_cred_r.ptr = (uint8_t *)T1_RFC9529__ID_CRED_R;
186 : 1 : c_r.cred_r.len = T1_RFC9529__CRED_R_LEN;
187 : 1 : c_r.cred_r.ptr = (uint8_t *)T1_RFC9529__CRED_R;
188 : 1 : c_r.g_y.len = T1_RFC9529__G_Y_LEN;
189 : 1 : c_r.g_y.ptr = (uint8_t *)T1_RFC9529__G_Y;
190 : 1 : c_r.y.len = T1_RFC9529__Y_LEN;
191 : 1 : c_r.y.ptr = (uint8_t *)T1_RFC9529__Y;
192 : 1 : c_r.g_r.len = 0;
193 : 1 : c_r.g_r.ptr = NULL;
194 : 1 : c_r.r.len = 0;
195 : 1 : c_r.r.ptr = NULL;
196 : 1 : c_r.sk_r.len = T1_RFC9529__SK_R_LEN;
197 : 1 : c_r.sk_r.ptr = (uint8_t *)T1_RFC9529__SK_R;
198 : 1 : c_r.pk_r.len = T1_RFC9529__PK_R_LEN;
199 : 1 : c_r.pk_r.ptr = (uint8_t *)T1_RFC9529__PK_R;
200 : :
201 : 1 : cred_i.id_cred.len = T1_RFC9529__ID_CRED_I_LEN;
202 : 1 : cred_i.id_cred.ptr = (uint8_t *)T1_RFC9529__ID_CRED_I;
203 : 1 : cred_i.cred.len = T1_RFC9529__CRED_I_LEN;
204 : 1 : cred_i.cred.ptr = (uint8_t *)T1_RFC9529__CRED_I;
205 : 1 : cred_i.g.len = 0;
206 : 1 : cred_i.g.ptr = NULL;
207 : 1 : cred_i.pk.len = T1_RFC9529__PK_I_LEN;
208 : 1 : cred_i.pk.ptr = (uint8_t *)T1_RFC9529__PK_I;
209 : 1 : cred_i.ca.len = 0;
210 : 1 : cred_i.ca.ptr = NULL;
211 : 1 : cred_i.ca_pk.len = 0;
212 : 1 : cred_i.ca_pk.ptr = NULL;
213 : :
214 : 1 : struct cred_array cred_i_array = { .len = 1, .ptr = &cred_i };
215 : :
216 : 1 : r = edhoc_responder_run(&c_r, &cred_i_array, &R_err_msg, &R_PRK_out,
217 : : tx_fkt, rx_fkt, ead_fkt);
218 : :
219 : 1 : zassert_mem_equal__(R_PRK_out.ptr, T1_RFC9529__PRK_out, R_PRK_out.len,
220 : : "wrong PRK_out");
221 : :
222 : 1 : msg_cnt = 1;
223 : 1 : }
|