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