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