1/*
2 * lws-api-test-jose - RFC8152 cose_sign tests
3 *
4 * Written in 2010-2021 by Andy Green <andy@warmcat.com>
5 *
6 * This file is made available under the Creative Commons CC0 1.0
7 * Universal Public Domain Dedication.
8 *
9 * Raw key CBOR created from descriptions at
10 *
11 * https://github.com/cose-wg/Examples/blob/master/KeySet.txt
12 */
13
14#include <libwebsockets.h>
15#include <stdlib.h>
16#include <fcntl.h>
17
18static const uint8_t
19	sign1_pass_01[] = {
20		/*
21		 * https://github.com/cose-wg/Examples/blob/master/
22		 * sign1-tests/sign-pass-01.json
23		 */
24		0xd2, 0x84, 0x41, 0xa0, 0xa2,
25		0x01, 0x26, 0x04, 0x42, 0x31,
26		0x31, 0x54, 0x54, 0x68, 0x69,
27		0x73, 0x20, 0x69, 0x73, 0x20,
28		0x74, 0x68, 0x65, 0x20, 0x63,
29		0x6f, 0x6e, 0x74, 0x65, 0x6e,
30		0x74, 0x2e, 0x58, 0x40, 0x87,
31		0xdb, 0x0d, 0x2e, 0x55, 0x71,
32		0x84, 0x3b, 0x78, 0xac, 0x33,
33		0xec, 0xb2, 0x83, 0x0d, 0xf7,
34		0xb6, 0xe0, 0xa4, 0xd5, 0xb7,
35		0x37, 0x6d, 0xe3, 0x36, 0xb2,
36		0x3c, 0x59, 0x1c, 0x90, 0xc4,
37		0x25, 0x31, 0x7e, 0x56, 0x12,
38		0x7f, 0xbe, 0x04, 0x37, 0x00,
39		0x97, 0xce, 0x34, 0x70, 0x87,
40		0xb2, 0x33, 0xbf, 0x72, 0x2b,
41		0x64, 0x07, 0x2b, 0xeb, 0x44,
42		0x86, 0xbd, 0xa4, 0x03, 0x1d,
43		0x27, 0x24, 0x4f },
44	sign1_pass_02[] = {
45		0xd2, 0x84, 0x43, 0xa1, 0x01,
46		0x26, 0xa1, 0x04, 0x42, 0x31,
47		0x31, 0x54, 0x54, 0x68, 0x69,
48		0x73, 0x20, 0x69, 0x73, 0x20,
49		0x74, 0x68, 0x65, 0x20, 0x63,
50		0x6f, 0x6e, 0x74, 0x65, 0x6e,
51		0x74, 0x2e, 0x58, 0x40, 0x10,
52		0x72, 0x9c, 0xd7, 0x11, 0xcb,
53		0x38, 0x13, 0xd8, 0xd8, 0xe9,
54		0x44, 0xa8, 0xda, 0x71, 0x11,
55		0xe7, 0xb2, 0x58, 0xc9, 0xbd,
56		0xca, 0x61, 0x35, 0xf7, 0xae,
57		0x1a, 0xdb, 0xee, 0x95, 0x09,
58		0x89, 0x12, 0x67, 0x83, 0x7e,
59		0x1e, 0x33, 0xbd, 0x36, 0xc1,
60		0x50, 0x32, 0x6a, 0xe6, 0x27,
61		0x55, 0xc6, 0xbd, 0x8e, 0x54,
62		0x0c, 0x3e, 0x8f, 0x92, 0xd7,
63		0xd2, 0x25, 0xe8, 0xdb, 0x72,
64		0xb8, 0x82, 0x0b },
65
66	sign1_pass_02_ext[] = {
67		0x11, 0xaa, 0x22, 0xbb, 0x33,
68		0xcc, 0x44, 0xdd, 0x55, 0x00,
69		0x66, 0x99 },
70
71	sign1_pass_03[] = {
72		0x84, 0x43, 0xa1, 0x01, 0x26,
73		0xa1, 0x04, 0x42, 0x31, 0x31,
74		0x54, 0x54, 0x68, 0x69, 0x73,
75		0x20, 0x69, 0x73, 0x20, 0x74,
76		0x68, 0x65, 0x20, 0x63, 0x6f,
77		0x6e, 0x74, 0x65, 0x6e, 0x74,
78		0x2e, 0x58, 0x40, 0x8e, 0xb3,
79		0x3e, 0x4c, 0xa3, 0x1d, 0x1c,
80		0x46, 0x5a, 0xb0, 0x5a, 0xac,
81		0x34, 0xcc, 0x6b, 0x23, 0xd5,
82		0x8f, 0xef, 0x5c, 0x08, 0x31,
83		0x06, 0xc4, 0xd2, 0x5a, 0x91,
84		0xae, 0xf0, 0xb0, 0x11, 0x7e,
85		0x2a, 0xf9, 0xa2, 0x91, 0xaa,
86		0x32, 0xe1, 0x4a, 0xb8, 0x34,
87		0xdc, 0x56, 0xed, 0x2a, 0x22,
88		0x34, 0x44, 0x54, 0x7e, 0x01,
89		0xf1, 0x1d, 0x3b, 0x09, 0x16,
90		0xe5, 0xa4, 0xc3, 0x45, 0xca,
91		0xcb, 0x36 },
92	sign1_fail_01[] = {
93		0xd9, 0x03, 0xe6, 0x84, 0x43,
94		0xa1, 0x01, 0x26, 0xa1, 0x04,
95		0x42, 0x31, 0x31, 0x54, 0x54,
96		0x68, 0x69, 0x73, 0x20, 0x69,
97		0x73, 0x20, 0x74, 0x68, 0x65,
98		0x20, 0x63, 0x6f, 0x6e, 0x74,
99		0x65, 0x6e, 0x74, 0x2e, 0x58,
100		0x40, 0x8e, 0xb3, 0x3e, 0x4c,
101		0xa3, 0x1d, 0x1c, 0x46, 0x5a,
102		0xb0, 0x5a, 0xac, 0x34, 0xcc,
103		0x6b, 0x23, 0xd5, 0x8f, 0xef,
104		0x5c, 0x08, 0x31, 0x06, 0xc4,
105		0xd2, 0x5a, 0x91, 0xae, 0xf0,
106		0xb0, 0x11, 0x7e, 0x2a, 0xf9,
107		0xa2, 0x91, 0xaa, 0x32, 0xe1,
108		0x4a, 0xb8, 0x34, 0xdc, 0x56,
109		0xed, 0x2a, 0x22, 0x34, 0x44,
110		0x54, 0x7e, 0x01, 0xf1, 0x1d,
111		0x3b, 0x09, 0x16, 0xe5, 0xa4,
112		0xc3, 0x45, 0xca, 0xcb, 0x36 },
113	sign1_fail_02[] = {
114		0xd2, 0x84, 0x43, 0xa1, 0x01,
115		0x26, 0xa1, 0x04, 0x42, 0x31,
116		0x31, 0x54, 0x54, 0x68, 0x69,
117		0x73, 0x20, 0x69, 0x73, 0x20,
118		0x74, 0x68, 0x65, 0x20, 0x63,
119		0x6f, 0x6e, 0x74, 0x65, 0x6e,
120		0x74, 0x2f, 0x58, 0x40, 0x8e,
121		0xb3, 0x3e, 0x4c, 0xa3, 0x1d,
122		0x1c, 0x46, 0x5a, 0xb0, 0x5a,
123		0xac, 0x34, 0xcc, 0x6b, 0x23,
124		0xd5, 0x8f, 0xef, 0x5c, 0x08,
125		0x31, 0x06, 0xc4, 0xd2, 0x5a,
126		0x91, 0xae, 0xf0, 0xb0, 0x11,
127		0x7e, 0x2a, 0xf9, 0xa2, 0x91,
128		0xaa, 0x32, 0xe1, 0x4a, 0xb8,
129		0x34, 0xdc, 0x56, 0xed, 0x2a,
130		0x22, 0x34, 0x44, 0x54, 0x7e,
131		0x01, 0xf1, 0x1d, 0x3b, 0x09,
132		0x16, 0xe5, 0xa4, 0xc3, 0x45,
133		0xca, 0xcb, 0x36 },
134	sign1_fail_03[] = {
135		0xd2, 0x84, 0x45, 0xa1, 0x01,
136		0x39, 0x03, 0xe6, 0xa1, 0x04,
137		0x42, 0x31, 0x31, 0x54, 0x54,
138		0x68, 0x69, 0x73, 0x20, 0x69,
139		0x73, 0x20, 0x74, 0x68, 0x65,
140		0x20, 0x63, 0x6f, 0x6e, 0x74,
141		0x65, 0x6e, 0x74, 0x2e, 0x58,
142		0x40, 0x8e, 0xb3, 0x3e, 0x4c,
143		0xa3, 0x1d, 0x1c, 0x46, 0x5a,
144		0xb0, 0x5a, 0xac, 0x34, 0xcc,
145		0x6b, 0x23, 0xd5, 0x8f, 0xef,
146		0x5c, 0x08, 0x31, 0x06, 0xc4,
147		0xd2, 0x5a, 0x91, 0xae, 0xf0,
148		0xb0, 0x11, 0x7e, 0x2a, 0xf9,
149		0xa2, 0x91, 0xaa, 0x32, 0xe1,
150		0x4a, 0xb8, 0x34, 0xdc, 0x56,
151		0xed, 0x2a, 0x22, 0x34, 0x44,
152		0x54, 0x7e, 0x01, 0xf1, 0x1d,
153		0x3b, 0x09, 0x16, 0xe5, 0xa4,
154		0xc3, 0x45, 0xca, 0xcb, 0x36 },
155	sign1_fail_04[] = {
156		0xd2, 0x84, 0x4a, 0xa1, 0x01,
157		0x67, 0x75, 0x6e, 0x6b, 0x6e,
158		0x6f, 0x77, 0x6e, 0xa1, 0x04,
159		0x42, 0x31, 0x31, 0x54, 0x54,
160		0x68, 0x69, 0x73, 0x20, 0x69,
161		0x73, 0x20, 0x74, 0x68, 0x65,
162		0x20, 0x63, 0x6f, 0x6e, 0x74,
163		0x65, 0x6e, 0x74, 0x2e, 0x58,
164		0x40, 0x8e, 0xb3, 0x3e, 0x4c,
165		0xa3, 0x1d, 0x1c, 0x46, 0x5a,
166		0xb0, 0x5a, 0xac, 0x34, 0xcc,
167		0x6b, 0x23, 0xd5, 0x8f, 0xef,
168		0x5c, 0x08, 0x31, 0x06, 0xc4,
169		0xd2, 0x5a, 0x91, 0xae, 0xf0,
170		0xb0, 0x11, 0x7e, 0x2a, 0xf9,
171		0xa2, 0x91, 0xaa, 0x32, 0xe1,
172		0x4a, 0xb8, 0x34, 0xdc, 0x56,
173		0xed, 0x2a, 0x22, 0x34, 0x44,
174		0x54, 0x7e, 0x01, 0xf1, 0x1d,
175		0x3b, 0x09, 0x16, 0xe5, 0xa4,
176		0xc3, 0x45, 0xca, 0xcb, 0x36 },
177
178		/* sign1/fail05 is missing upstream */
179
180	sign1_fail_06[] = {
181		0xd2, 0x84, 0x45, 0xa2, 0x01,
182		0x26, 0x03, 0x00, 0xa1, 0x04,
183		0x42, 0x31, 0x31, 0x54, 0x54,
184		0x68, 0x69, 0x73, 0x20, 0x69,
185		0x73, 0x20, 0x74, 0x68, 0x65,
186		0x20, 0x63, 0x6f, 0x6e, 0x74,
187		0x65, 0x6e, 0x74, 0x2e, 0x58,
188		0x40, 0x8e, 0xb3, 0x3e, 0x4c,
189		0xa3, 0x1d, 0x1c, 0x46, 0x5a,
190		0xb0, 0x5a, 0xac, 0x34, 0xcc,
191		0x6b, 0x23, 0xd5, 0x8f, 0xef,
192		0x5c, 0x08, 0x31, 0x06, 0xc4,
193		0xd2, 0x5a, 0x91, 0xae, 0xf0,
194		0xb0, 0x11, 0x7e, 0x2a, 0xf9,
195		0xa2, 0x91, 0xaa, 0x32, 0xe1,
196		0x4a, 0xb8, 0x34, 0xdc, 0x56,
197		0xed, 0x2a, 0x22, 0x34, 0x44,
198		0x54, 0x7e, 0x01, 0xf1, 0x1d,
199		0x3b, 0x09, 0x16, 0xe5, 0xa4,
200		0xc3, 0x45, 0xca, 0xcb, 0x36 },
201
202	sign1_fail_07[] = {
203		0xd2, 0x84, 0x43, 0xa1, 0x01,
204		0x26, 0xa1, 0x04, 0x42, 0x31,
205		0x31, 0x54, 0x54, 0x68, 0x69,
206		0x73, 0x20, 0x69, 0x73, 0x20,
207		0x74, 0x68, 0x65, 0x20, 0x63,
208		0x6f, 0x6e, 0x74, 0x65, 0x6e,
209		0x74, 0x2e, 0x58, 0x40, 0x65,
210		0x20, 0xbb, 0xaf, 0x20, 0x81,
211		0xd7, 0xe0, 0xed, 0x0f, 0x95,
212		0xf7, 0x6e, 0xb0, 0x73, 0x3d,
213		0x66, 0x70, 0x05, 0xf7, 0x46,
214		0x7c, 0xec, 0x4b, 0x87, 0xb9,
215		0x38, 0x1a, 0x6b, 0xa1, 0xed,
216		0xe8, 0xe0, 0x0d, 0xf2, 0x9f,
217		0x32, 0xa3, 0x72, 0x30, 0xf3,
218		0x9a, 0x84, 0x2a, 0x54, 0x82,
219		0x1f, 0xdd, 0x22, 0x30, 0x92,
220		0x81, 0x9d, 0x77, 0x28, 0xef,
221		0xb9, 0xd3, 0xa0, 0x08, 0x0b,
222		0x75, 0x38, 0x0b },
223
224	sign_pass_01[] = {
225		0xd8, 0x62, 0x84, 0x41, 0xa0,
226		0xa0, 0x54, 0x54, 0x68, 0x69,
227		0x73, 0x20, 0x69, 0x73, 0x20,
228		0x74, 0x68, 0x65, 0x20, 0x63,
229		0x6f, 0x6e, 0x74, 0x65, 0x6e,
230		0x74, 0x2e, 0x81, 0x83, 0x43,
231		0xa1, 0x01, 0x26, 0xa1, 0x04,
232		0x42, 0x31, 0x31, 0x58, 0x40,
233		0xe2, 0xae, 0xaf, 0xd4, 0x0d,
234		0x69, 0xd1, 0x9d, 0xfe, 0x6e,
235		0x52, 0x07, 0x7c, 0x5d, 0x7f,
236		0xf4, 0xe4, 0x08, 0x28, 0x2c,
237		0xbe, 0xfb, 0x5d, 0x06, 0xcb,
238		0xf4, 0x14, 0xaf, 0x2e, 0x19,
239		0xd9, 0x82, 0xac, 0x45, 0xac,
240		0x98, 0xb8, 0x54, 0x4c, 0x90,
241		0x8b, 0x45, 0x07, 0xde, 0x1e,
242		0x90, 0xb7, 0x17, 0xc3, 0xd3,
243		0x48, 0x16, 0xfe, 0x92, 0x6a,
244		0x2b, 0x98, 0xf5, 0x3a, 0xfd,
245		0x2f, 0xa0, 0xf3, 0x0a },
246
247	sign_pass_02[] = {
248		0xd8, 0x62, 0x84, 0x40, 0xa0,
249		0x54, 0x54, 0x68, 0x69, 0x73,
250		0x20, 0x69, 0x73, 0x20, 0x74,
251		0x68, 0x65, 0x20, 0x63, 0x6f,
252		0x6e, 0x74, 0x65, 0x6e, 0x74,
253		0x2e, 0x81, 0x83, 0x43, 0xa1,
254		0x01, 0x26, 0xa1, 0x04, 0x42,
255		0x31, 0x31, 0x58, 0x40, 0xcb,
256		0xb8, 0xda, 0xd9, 0xbe, 0xaf,
257		0xb8, 0x90, 0xe1, 0xa4, 0x14,
258		0x12, 0x4d, 0x8b, 0xfb, 0xc2,
259		0x6b, 0xed, 0xf2, 0xa9, 0x4f,
260		0xcb, 0x5a, 0x88, 0x24, 0x32,
261		0xbf, 0xf6, 0xd6, 0x3e, 0x15,
262		0xf5, 0x74, 0xee, 0xb2, 0xab,
263		0x51, 0xd8, 0x3f, 0xa2, 0xcb,
264		0xf6, 0x26, 0x72, 0xeb, 0xf4,
265		0xc7, 0xd9, 0x93, 0xb0, 0xf4,
266		0xc2, 0x44, 0x76, 0x47, 0xd8,
267		0x31, 0xba, 0x57, 0xcc, 0xa8,
268		0x6b, 0x93, 0x0a },
269
270	sign_pass_03[] = {
271		0x84, 0x40, 0xa0, 0x54, 0x54,
272		0x68, 0x69, 0x73, 0x20, 0x69,
273		0x73, 0x20, 0x74, 0x68, 0x65,
274		0x20, 0x63, 0x6f, 0x6e, 0x74,
275		0x65, 0x6e, 0x74, 0x2e, 0x81,
276		0x83, 0x43, 0xa1, 0x01, 0x26,
277		0xa1, 0x04, 0x42, 0x31, 0x31,
278		0x58, 0x40, 0xe2, 0xae, 0xaf,
279		0xd4, 0x0d, 0x69, 0xd1, 0x9d,
280		0xfe, 0x6e, 0x52, 0x07, 0x7c,
281		0x5d, 0x7f, 0xf4, 0xe4, 0x08,
282		0x28, 0x2c, 0xbe, 0xfb, 0x5d,
283		0x06, 0xcb, 0xf4, 0x14, 0xaf,
284		0x2e, 0x19, 0xd9, 0x82, 0xac,
285		0x45, 0xac, 0x98, 0xb8, 0x54,
286		0x4c, 0x90, 0x8b, 0x45, 0x07,
287		0xde, 0x1e, 0x90, 0xb7, 0x17,
288		0xc3, 0xd3, 0x48, 0x16, 0xfe,
289		0x92, 0x6a, 0x2b, 0x98, 0xf5,
290		0x3a, 0xfd, 0x2f, 0xa0, 0xf3,
291		0x0a },
292
293	sign_fail_01[] = {
294		0xd9, 0x03, 0xe6, 0x84, 0x40,
295		0xa0, 0x54, 0x54, 0x68, 0x69,
296		0x73, 0x20, 0x69, 0x73, 0x20,
297		0x74, 0x68, 0x65, 0x20, 0x63,
298		0x6f, 0x6e, 0x74, 0x65, 0x6e,
299		0x74, 0x2e, 0x81, 0x83, 0x43,
300		0xa1, 0x01, 0x26, 0xa1, 0x04,
301		0x42, 0x31, 0x31, 0x58, 0x40,
302		0xe2, 0xae, 0xaf, 0xd4, 0x0d,
303		0x69, 0xd1, 0x9d, 0xfe, 0x6e,
304		0x52, 0x07, 0x7c, 0x5d, 0x7f,
305		0xf4, 0xe4, 0x08, 0x28, 0x2c,
306		0xbe, 0xfb, 0x5d, 0x06, 0xcb,
307		0xf4, 0x14, 0xaf, 0x2e, 0x19,
308		0xd9, 0x82, 0xac, 0x45, 0xac,
309		0x98, 0xb8, 0x54, 0x4c, 0x90,
310		0x8b, 0x45, 0x07, 0xde, 0x1e,
311		0x90, 0xb7, 0x17, 0xc3, 0xd3,
312		0x48, 0x16, 0xfe, 0x92, 0x6a,
313		0x2b, 0x98, 0xf5, 0x3a, 0xfd,
314		0x2f, 0xa0, 0xf3, 0x0a },
315
316	sign_fail_02[] = {
317		0xd8, 0x62, 0x84, 0x40, 0xa0,
318		0x54, 0x54, 0x68, 0x69, 0x73,
319		0x20, 0x69, 0x73, 0x20, 0x74,
320		0x68, 0x65, 0x20, 0x63, 0x6f,
321		0x6e, 0x74, 0x65, 0x6e, 0x74,
322		0x2e, 0x81, 0x83, 0x43, 0xa1,
323		0x01, 0x26, 0xa1, 0x04, 0x42,
324		0x31, 0x31, 0x58, 0x40, 0xe2,
325		0xae, 0xaf, 0xd4, 0x0d, 0x69,
326		0xd1, 0x9d, 0xfe, 0x6e, 0x52,
327		0x07, 0x7c, 0x5d, 0x7f, 0xf4,
328		0xe4, 0x08, 0x28, 0x2c, 0xbe,
329		0xfb, 0x5d, 0x06, 0xcb, 0xf4,
330		0x14, 0xaf, 0x2e, 0x19, 0xd9,
331		0x82, 0xac, 0x45, 0xac, 0x98,
332		0xb8, 0x54, 0x4c, 0x90, 0x8b,
333		0x45, 0x07, 0xde, 0x1e, 0x90,
334		0xb7, 0x17, 0xc3, 0xd3, 0x48,
335		0x16, 0xfe, 0x92, 0x6a, 0x2b,
336		0x98, 0xf5, 0x3a, 0xfd, 0x2f,
337		0xa0, 0xf3, 0x0b },
338
339	sign_fail_03[] = {
340		0xd8, 0x62, 0x84, 0x40, 0xa0,
341		0x54, 0x54, 0x68, 0x69, 0x73,
342		0x20, 0x69, 0x73, 0x20, 0x74,
343		0x68, 0x65, 0x20, 0x63, 0x6f,
344		0x6e, 0x74, 0x65, 0x6e, 0x74,
345		0x2e, 0x81, 0x83, 0x45, 0xa1,
346		0x01, 0x39, 0x03, 0xe6, 0xa1,
347		0x04, 0x42, 0x31, 0x31, 0x58,
348		0x40, 0xe2, 0xae, 0xaf, 0xd4,
349		0x0d, 0x69, 0xd1, 0x9d, 0xfe,
350		0x6e, 0x52, 0x07, 0x7c, 0x5d,
351		0x7f, 0xf4, 0xe4, 0x08, 0x28,
352		0x2c, 0xbe, 0xfb, 0x5d, 0x06,
353		0xcb, 0xf4, 0x14, 0xaf, 0x2e,
354		0x19, 0xd9, 0x82, 0xac, 0x45,
355		0xac, 0x98, 0xb8, 0x54, 0x4c,
356		0x90, 0x8b, 0x45, 0x07, 0xde,
357		0x1e, 0x90, 0xb7, 0x17, 0xc3,
358		0xd3, 0x48, 0x16, 0xfe, 0x92,
359		0x6a, 0x2b, 0x98, 0xf5, 0x3a,
360		0xfd, 0x2f, 0xa0, 0xf3, 0x0a },
361
362	sign_fail_04[] = {
363		0xd8, 0x62, 0x84, 0x40, 0xa0,
364		0x54, 0x54, 0x68, 0x69, 0x73,
365		0x20, 0x69, 0x73, 0x20, 0x74,
366		0x68, 0x65, 0x20, 0x63, 0x6f,
367		0x6e, 0x74, 0x65, 0x6e, 0x74,
368		0x2e, 0x81, 0x83, 0x4a, 0xa1,
369		0x01, 0x67, 0x75, 0x6e, 0x6b,
370		0x6e, 0x6f, 0x77, 0x6e, 0xa1,
371		0x04, 0x42, 0x31, 0x31, 0x58,
372		0x40, 0xe2, 0xae, 0xaf, 0xd4,
373		0x0d, 0x69, 0xd1, 0x9d, 0xfe,
374		0x6e, 0x52, 0x07, 0x7c, 0x5d,
375		0x7f, 0xf4, 0xe4, 0x08, 0x28,
376		0x2c, 0xbe, 0xfb, 0x5d, 0x06,
377		0xcb, 0xf4, 0x14, 0xaf, 0x2e,
378		0x19, 0xd9, 0x82, 0xac, 0x45,
379		0xac, 0x98, 0xb8, 0x54, 0x4c,
380		0x90, 0x8b, 0x45, 0x07, 0xde,
381		0x1e, 0x90, 0xb7, 0x17, 0xc3,
382		0xd3, 0x48, 0x16, 0xfe, 0x92,
383		0x6a, 0x2b, 0x98, 0xf5, 0x3a,
384		0xfd, 0x2f, 0xa0, 0xf3, 0x0a },
385
386		/* fail 5 missing upstream */
387
388	sign_fail_06[] = {
389		0xd8, 0x62, 0x84, 0x43, 0xa1,
390		0x03, 0x00, 0xa0, 0x54, 0x54,
391		0x68, 0x69, 0x73, 0x20, 0x69,
392		0x73, 0x20, 0x74, 0x68, 0x65,
393		0x20, 0x63, 0x6f, 0x6e, 0x74,
394		0x65, 0x6e, 0x74, 0x2e, 0x81,
395		0x83, 0x43, 0xa1, 0x01, 0x26,
396		0xa1, 0x04, 0x42, 0x31, 0x31,
397		0x58, 0x40, 0xe2, 0xae, 0xaf,
398		0xd4, 0x0d, 0x69, 0xd1, 0x9d,
399		0xfe, 0x6e, 0x52, 0x07, 0x7c,
400		0x5d, 0x7f, 0xf4, 0xe4, 0x08,
401		0x28, 0x2c, 0xbe, 0xfb, 0x5d,
402		0x06, 0xcb, 0xf4, 0x14, 0xaf,
403		0x2e, 0x19, 0xd9, 0x82, 0xac,
404		0x45, 0xac, 0x98, 0xb8, 0x54,
405		0x4c, 0x90, 0x8b, 0x45, 0x07,
406		0xde, 0x1e, 0x90, 0xb7, 0x17,
407		0xc3, 0xd3, 0x48, 0x16, 0xfe,
408		0x92, 0x6a, 0x2b, 0x98, 0xf5,
409		0x3a, 0xfd, 0x2f, 0xa0, 0xf3,
410		0x0a },
411
412	sign_fail_07[] = {
413		0xd8, 0x62, 0x84, 0x41, 0xa0,
414		0xa0, 0x54, 0x54, 0x68, 0x69,
415		0x73, 0x20, 0x69, 0x73, 0x20,
416		0x74, 0x68, 0x65, 0x20, 0x63,
417		0x6f, 0x6e, 0x74, 0x65, 0x6e,
418		0x74, 0x2e, 0x81, 0x83, 0x43,
419		0xa1, 0x01, 0x26, 0xa1, 0x04,
420		0x42, 0x31, 0x31, 0x58, 0x40,
421		0xd7, 0x1c, 0x05, 0xdb, 0x52,
422		0xc9, 0xce, 0x7f, 0x1b, 0xf5,
423		0xaa, 0xc0, 0x13, 0x34, 0xbb,
424		0xea, 0xca, 0xc1, 0xd8, 0x6a,
425		0x23, 0x03, 0xe6, 0xee, 0xaa,
426		0x89, 0x26, 0x6f, 0x45, 0xc0,
427		0x1e, 0xd6, 0x02, 0xca, 0x64,
428		0x9e, 0xaf, 0x79, 0x0d, 0x8b,
429		0xc9, 0x9d, 0x24, 0x58, 0x45,
430		0x7c, 0xa6, 0xa8, 0x72, 0x06,
431		0x19, 0x40, 0xe7, 0xaf, 0xbe,
432		0x48, 0xe2, 0x89, 0xdf, 0xac,
433		0x14, 0x6a, 0xe2, 0x58 },
434
435	sign_hmac_01[] = {
436		0xd8, 0x61, 0x85, 0x43, 0xa1,
437		0x01, 0x05, 0xa0, 0x54, 0x54,
438		0x68, 0x69, 0x73, 0x20, 0x69,
439		0x73, 0x20, 0x74, 0x68, 0x65,
440		0x20, 0x63, 0x6f, 0x6e, 0x74,
441		0x65, 0x6e, 0x74, 0x2e, 0x58,
442		0x20, 0x2b, 0xdc, 0xc8, 0x9f,
443		0x05, 0x82, 0x16, 0xb8, 0xa2,
444		0x08, 0xdd, 0xc6, 0xd8, 0xb5,
445		0x4a, 0xa9, 0x1f, 0x48, 0xbd,
446		0x63, 0x48, 0x49, 0x86, 0x56,
447		0x51, 0x05, 0xc9, 0xad, 0x5a,
448		0x66, 0x82, 0xf6, 0x81, 0x83,
449		0x40, 0xa2, 0x01, 0x25, 0x04,
450		0x4a, 0x6f, 0x75, 0x72, 0x2d,
451		0x73, 0x65, 0x63, 0x72, 0x65,
452		0x74, 0x40 },
453
454	sign_hmac_02[] = {
455		0xd8, 0x61, 0x85, 0x43, 0xa1,
456		0x01, 0x06, 0xa0, 0x54, 0x54,
457		0x68, 0x69, 0x73, 0x20, 0x69,
458		0x73, 0x20, 0x74, 0x68, 0x65,
459		0x20, 0x63, 0x6f, 0x6e, 0x74,
460		0x65, 0x6e, 0x74, 0x2e, 0x58,
461		0x30, 0xb3, 0x09, 0x7f, 0x70,
462		0x00, 0x9a, 0x11, 0x50, 0x74,
463		0x09, 0x59, 0x8a, 0x83, 0xe1,
464		0x5b, 0xbb, 0xbf, 0x19, 0x82,
465		0xdc, 0xe2, 0x8e, 0x5a, 0xb6,
466		0xd5, 0xa6, 0xaf, 0xf6, 0x89,
467		0x7b, 0xd2, 0x4b, 0xb8, 0xb7,
468		0x47, 0x96, 0x22, 0xc9, 0x40,
469		0x1b, 0x24, 0x09, 0x0d, 0x45,
470		0x82, 0x06, 0xd5, 0x87, 0x81,
471		0x83, 0x40, 0xa2, 0x01, 0x25,
472		0x04, 0x46, 0x73, 0x65, 0x63,
473		0x2d, 0x34, 0x38, 0x40 },
474
475	sign_hmac_03[] = {
476		0xd8, 0x61, 0x85, 0x43, 0xa1,
477		0x01, 0x07, 0xa0, 0x54, 0x54,
478		0x68, 0x69, 0x73, 0x20, 0x69,
479		0x73, 0x20, 0x74, 0x68, 0x65,
480		0x20, 0x63, 0x6f, 0x6e, 0x74,
481		0x65, 0x6e, 0x74, 0x2e, 0x58,
482		0x40, 0xcd, 0x28, 0xa6, 0xb3,
483		0xcf, 0xbb, 0xbf, 0x21, 0x48,
484		0x51, 0xb9, 0x06, 0xe0, 0x50,
485		0x05, 0x6c, 0xb4, 0x38, 0xa8,
486		0xb8, 0x89, 0x05, 0xb8, 0xb7,
487		0x46, 0x19, 0x77, 0x02, 0x27,
488		0x11, 0xa9, 0xd8, 0xac, 0x5d,
489		0xbc, 0x54, 0xe2, 0x9a, 0x56,
490		0xd9, 0x26, 0x04, 0x6b, 0x40,
491		0xfc, 0x26, 0x07, 0xc2, 0x5b,
492		0x34, 0x44, 0x54, 0xaa, 0x5f,
493		0x68, 0xde, 0x09, 0xa3, 0xe5,
494		0x25, 0xd3, 0x86, 0x5a, 0x05,
495		0x81, 0x83, 0x40, 0xa2, 0x01,
496		0x25, 0x04, 0x46, 0x73, 0x65,
497		0x63, 0x2d, 0x36, 0x34, 0x40 },
498
499	sign_hmac_04[] = {
500		0xd8, 0x61, 0x85, 0x43, 0xa1,
501		0x01, 0x05, 0xa0, 0x54, 0x54,
502		0x68, 0x69, 0x73, 0x20, 0x69,
503		0x73, 0x20, 0x74, 0x68, 0x65,
504		0x20, 0x63, 0x6f, 0x6e, 0x74,
505		0x65, 0x6e, 0x74, 0x2e, 0x58,
506		0x20, 0x2b, 0xdc, 0xc8, 0x9f,
507		0x05, 0x82, 0x16, 0xb8, 0xa2,
508		0x08, 0xdd, 0xc6, 0xd8, 0xb5,
509		0x4a, 0xa9, 0x1f, 0x48, 0xbd,
510		0x63, 0x48, 0x49, 0x86, 0x56,
511		0x51, 0x05, 0xc9, 0xad, 0x5a,
512		0x66, 0x82, 0xf7, 0x81, 0x83,
513		0x40, 0xa2, 0x01, 0x25, 0x04,
514		0x4a, 0x6f, 0x75, 0x72, 0x2d,
515		0x73, 0x65, 0x63, 0x72, 0x65,
516		0x74, 0x40 },
517
518	sign_hmac_05[] = {
519		0xd8, 0x61, 0x85, 0x43, 0xa1,
520		0x01, 0x04, 0xa0, 0x54, 0x54,
521		0x68, 0x69, 0x73, 0x20, 0x69,
522		0x73, 0x20, 0x74, 0x68, 0x65,
523		0x20, 0x63, 0x6f, 0x6e, 0x74,
524		0x65, 0x6e, 0x74, 0x2e, 0x48,
525		0x6f, 0x35, 0xca, 0xb7, 0x79,
526		0xf7, 0x78, 0x33, 0x81, 0x83,
527		0x40, 0xa2, 0x01, 0x25, 0x04,
528		0x4a, 0x6f, 0x75, 0x72, 0x2d,
529		0x73, 0x65, 0x63, 0x72, 0x65,
530		0x74, 0x40 },
531
532	enc_hmac_01[] = {
533		0xd1, 0x84, 0x43, 0xa1, 0x01,
534		0x05, 0xa0, 0x54, 0x54, 0x68,
535		0x69, 0x73, 0x20, 0x69, 0x73,
536		0x20, 0x74, 0x68, 0x65, 0x20,
537		0x63, 0x6f, 0x6e, 0x74, 0x65,
538		0x6e, 0x74, 0x2e, 0x58, 0x20,
539		0xa1, 0xa8, 0x48, 0xd3, 0x47,
540		0x1f, 0x9d, 0x61, 0xee, 0x49,
541		0x01, 0x8d, 0x24, 0x4c, 0x82,
542		0x47, 0x72, 0xf2, 0x23, 0xad,
543		0x4f, 0x93, 0x52, 0x93, 0xf1,
544		0x78, 0x9f, 0xc3, 0xa0, 0x8d,
545		0x8c, 0x58 },
546
547	enc_hmac_02[] = {
548		0xd1, 0x84, 0x43, 0xa1, 0x01,
549		0x06, 0xa0, 0x54, 0x54, 0x68,
550		0x69, 0x73, 0x20, 0x69, 0x73,
551		0x20, 0x74, 0x68, 0x65, 0x20,
552		0x63, 0x6f, 0x6e, 0x74, 0x65,
553		0x6e, 0x74, 0x2e, 0x58, 0x30,
554		0x99, 0x8d, 0x26, 0xc6, 0x45,
555		0x9a, 0xae, 0xec, 0xf4, 0x4e,
556		0xd2, 0x0c, 0xe0, 0x0c, 0x8c,
557		0xce, 0xdf, 0x0a, 0x1f, 0x3d,
558		0x22, 0xa9, 0x2f, 0xc0, 0x5d,
559		0xb0, 0x8c, 0x5a, 0xeb, 0x1c,
560		0xb5, 0x94, 0xca, 0xaf, 0x5a,
561		0x5c, 0x5e, 0x2e, 0x9d, 0x01,
562		0xcc, 0xe7, 0xe7, 0x7a, 0x93,
563		0xaa, 0x8c, 0x62 },
564
565	enc_hmac_03[] = {
566		0xd1, 0x84, 0x43, 0xa1, 0x01,
567		0x07, 0xa0, 0x54, 0x54, 0x68,
568		0x69, 0x73, 0x20, 0x69, 0x73,
569		0x20, 0x74, 0x68, 0x65, 0x20,
570		0x63, 0x6f, 0x6e, 0x74, 0x65,
571		0x6e, 0x74, 0x2e, 0x58, 0x40,
572		0x4a, 0x55, 0x5b, 0xf9, 0x71,
573		0xf7, 0xc1, 0x89, 0x1d, 0x9d,
574		0xdf, 0x30, 0x4a, 0x1a, 0x13,
575		0x2e, 0x2d, 0x6f, 0x81, 0x74,
576		0x49, 0x47, 0x4d, 0x81, 0x3e,
577		0x6d, 0x04, 0xd6, 0x59, 0x62,
578		0xbe, 0xd8, 0xbb, 0xa7, 0x0c,
579		0x17, 0xe1, 0xf5, 0x30, 0x8f,
580		0xa3, 0x99, 0x62, 0x95, 0x9a,
581		0x4b, 0x9b, 0x8d, 0x7d, 0xa8,
582		0xe6, 0xd8, 0x49, 0xb2, 0x09,
583		0xdc, 0xd3, 0xe9, 0x8c, 0xc0,
584		0xf1, 0x1e, 0xdd, 0xf2 },
585
586	enc_hmac_04[] = {
587		0xd1, 0x84, 0x43, 0xa1, 0x01,
588		0x05, 0xa0, 0x54, 0x54, 0x68,
589		0x69, 0x73, 0x20, 0x69, 0x73,
590		0x20, 0x74, 0x68, 0x65, 0x20,
591		0x63, 0x6f, 0x6e, 0x74, 0x65,
592		0x6e, 0x74, 0x2e, 0x58, 0x20,
593		0xa1, 0xa8, 0x48, 0xd3, 0x47,
594		0x1f, 0x9d, 0x61, 0xee, 0x49,
595		0x01, 0x8d, 0x24, 0x4c, 0x82,
596		0x47, 0x72, 0xf2, 0x23, 0xad,
597		0x4f, 0x93, 0x52, 0x93, 0xf1,
598		0x78, 0x9f, 0xc3, 0xa0, 0x8d,
599		0x8c, 0x59 },
600
601	enc_hmac_05[] = {
602		0xd1, 0x84, 0x43, 0xa1, 0x01,
603		0x04, 0xa0, 0x54, 0x54, 0x68,
604		0x69, 0x73, 0x20, 0x69, 0x73,
605		0x20, 0x74, 0x68, 0x65, 0x20,
606		0x63, 0x6f, 0x6e, 0x74, 0x65,
607		0x6e, 0x74, 0x2e, 0x48, 0x11,
608		0xf9, 0xe3, 0x57, 0x97, 0x5f,
609		0xb8, 0x49 }
610#if 0
611,
612
613	countersign_sign_01[] = {
614		0xd8, 0x62, 0x84, 0x43, 0xa1,
615		0x03, 0x00, 0xa0, 0x54, 0x54,
616		0x68, 0x69, 0x73, 0x20, 0x69,
617		0x73, 0x20, 0x74, 0x68, 0x65,
618		0x20, 0x63, 0x6f, 0x6e, 0x74,
619		0x65, 0x6e, 0x74, 0x2e, 0x81,
620		0x83, 0x43, 0xa1, 0x01, 0x27,
621		0xa2, 0x07, 0x83, 0x43, 0xa1,
622		0x01, 0x27, 0xa1, 0x04, 0x42,
623		0x31, 0x31, 0x58, 0x40, 0x8e,
624		0x1b, 0xe2, 0xf9, 0x45, 0x3d,
625		0x26, 0x48, 0x12, 0xe5, 0x90,
626		0x49, 0x91, 0x32, 0xbe, 0xf3,
627		0xfb, 0xf9, 0xee, 0x9d, 0xb2,
628		0x7c, 0x2c, 0x16, 0x87, 0x88,
629		0xe3, 0xb7, 0xeb, 0xe5, 0x06,
630		0xc0, 0x4f, 0xd3, 0xd1, 0x9f,
631		0xaa, 0x9f, 0x51, 0x23, 0x2a,
632		0xf5, 0xc9, 0x59, 0xe4, 0xef,
633		0x47, 0x92, 0x88, 0x34, 0x64,
634		0x7f, 0x56, 0xdf, 0xbe, 0x93,
635		0x91, 0x12, 0x88, 0x4d, 0x08,
636		0xef, 0x25, 0x05, 0x04, 0x42,
637		0x31, 0x31, 0x58, 0x40, 0x77,
638		0xf3, 0xea, 0xcd, 0x11, 0x85,
639		0x2c, 0x4b, 0xf9, 0xcb, 0x1d,
640		0x72, 0xfa, 0xbe, 0x6b, 0x26,
641		0xfb, 0xa1, 0xd7, 0x60, 0x92,
642		0xb2, 0xb5, 0xb7, 0xec, 0x83,
643		0xb8, 0x35, 0x57, 0x65, 0x22,
644		0x64, 0xe6, 0x96, 0x90, 0xdb,
645		0xc1, 0x17, 0x2d, 0xdc, 0x0b,
646		0xf8, 0x84, 0x11, 0xc0, 0xd2,
647		0x5a, 0x50, 0x7f, 0xdb, 0x24,
648		0x7a, 0x20, 0xc4, 0x0d, 0x5e,
649		0x24, 0x5f, 0xab, 0xd3, 0xfc,
650		0x9e, 0xc1, 0x06 }
651#endif
652;
653
654extern const struct {
655	const uint8_t		*set;
656	size_t			len;
657} keyset1, key3, key8, key9, key10;
658
659static int
660xcb(lws_cose_sig_ext_pay_t *x)
661{
662	x->ext = sign1_pass_02_ext;
663	x->xl = sizeof(sign1_pass_02_ext);
664
665	return LCOSESIGEXTCB_RET_FINISHED;
666}
667
668
669
670int
671test_cose_sign(struct lws_context *context)
672{
673	struct lws_cose_validate_context *cps;
674	lws_cose_validate_create_info_t info;
675	lws_cose_validate_res_t *res;
676	lws_dll2_owner_t set;
677	lws_dll2_owner_t *o;
678	int n;
679
680	memset(&info, 0, sizeof(info));
681	info.cx = context;
682	info.keyset = &set;
683
684#if 1
685	{
686		int fd = open("sign_hmac01.sig",
687			      LWS_O_CREAT | LWS_O_TRUNC | LWS_O_WRONLY, 0600);
688
689		if (fd >= 0) {
690			write(fd, sign_hmac_01, sizeof(sign_hmac_01));
691			close(fd);
692		}
693	}
694#endif
695
696	/*
697	 * valid sign1 we have key for
698	 */
699
700	lwsl_user("%s: sign1/sign-pass-01\n", __func__);
701
702	lws_dll2_owner_clear(&set);
703	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
704		lwsl_notice("%s: key import fail\n", __func__);
705		return 1;
706	}
707
708	info.sigtype = SIGTYPE_SINGLE;
709	cps = lws_cose_validate_create(&info);
710	if (!cps) {
711		lwsl_notice("%s: sign_val_create fail\n", __func__);
712		goto bail;
713	}
714
715	n = lws_cose_validate_chunk(cps, sign1_pass_01, sizeof(sign1_pass_01),
716				    NULL);
717	if (n) {
718		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
719		goto bail1;
720	}
721
722	o = lws_cose_validate_results(cps);
723	if (o->count != 1)
724		goto bail1;
725
726	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
727	if (res->result)
728		goto bail1;
729
730	lws_cose_validate_destroy(&cps);
731	lws_cose_key_set_destroy(&set);
732
733	/*
734	 * valid sign1 but empty key set, so can't judge it
735	 */
736
737	lwsl_user("%s: sign1/sign-pass-01 - no key\n", __func__);
738
739	lws_dll2_owner_clear(&set);
740
741	info.sigtype = SIGTYPE_SINGLE;
742	cps = lws_cose_validate_create(&info);
743	if (!cps) {
744		lwsl_notice("%s: sign_val_create fail\n", __func__);
745		goto bail;
746	}
747
748	n = lws_cose_validate_chunk(cps, sign1_pass_01, sizeof(sign1_pass_01),
749				    NULL);
750	if (n) {
751		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
752		goto bail1;
753	}
754
755	o = lws_cose_validate_results(cps);
756	if (o->count != 1)
757		goto bail1;
758
759	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
760	if (!res->result)
761		goto bail1;
762
763	lws_cose_validate_destroy(&cps);
764	lws_cose_key_set_destroy(&set);
765
766	/*
767	 * valid sign1
768	 */
769
770	lwsl_user("%s: sign1/sign-pass-02\n", __func__);
771
772	lws_dll2_owner_clear(&set);
773	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
774		lwsl_notice("%s: key import fail\n", __func__);
775		return 1;
776	}
777
778	info.sigtype = SIGTYPE_SINGLE;
779	info.ext_cb = xcb;
780	info.ext_len = sizeof(sign1_pass_02_ext);
781	cps = lws_cose_validate_create(&info);
782	if (!cps) {
783		lwsl_notice("%s: sign_val_create fail\n", __func__);
784		goto bail;
785	}
786
787	n = lws_cose_validate_chunk(cps, sign1_pass_02, sizeof(sign1_pass_02),
788				    NULL);
789	if (n) {
790		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
791		goto bail1;
792	}
793
794	o = lws_cose_validate_results(cps);
795	if (o->count != 1)
796		goto bail1;
797
798	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
799	if (res->result)
800		goto bail1;
801
802	lws_cose_validate_destroy(&cps);
803	lws_cose_key_set_destroy(&set);
804
805	/*
806	 * valid sign1 without enclosing tag
807	 */
808
809	lwsl_user("%s: sign1/sign-pass-03\n", __func__);
810
811	lws_dll2_owner_clear(&set);
812	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
813		lwsl_notice("%s: key import fail\n", __func__);
814		return 1;
815	}
816
817	info.sigtype = SIGTYPE_SINGLE;
818	info.ext_cb = NULL;
819	info.ext_len = 0;
820	cps = lws_cose_validate_create(&info);
821	if (!cps) {
822		lwsl_notice("%s: sign_val_create fail\n", __func__);
823		goto bail;
824	}
825
826	n = lws_cose_validate_chunk(cps, sign1_pass_03, sizeof(sign1_pass_03),
827				    NULL);
828	if (n) {
829		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
830		goto bail1;
831	}
832
833	o = lws_cose_validate_results(cps);
834	if (o->count != 1)
835		goto bail1;
836
837	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
838	if (res->result)
839		goto bail1;
840
841	lws_cose_validate_destroy(&cps);
842	lws_cose_key_set_destroy(&set);
843
844	/*
845	 * sign1 with wrong tag
846	 */
847
848	lwsl_user("%s: sign1/sign-fail-01\n", __func__);
849
850	lws_dll2_owner_clear(&set);
851	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
852		lwsl_notice("%s: key import fail\n", __func__);
853		return 1;
854	}
855
856	info.sigtype = SIGTYPE_SINGLE;
857	cps = lws_cose_validate_create(&info);
858	if (!cps) {
859		lwsl_notice("%s: sign_val_create fail\n", __func__);
860		goto bail;
861	}
862
863	n = lws_cose_validate_chunk(cps, sign1_fail_01, sizeof(sign1_fail_01),
864				    NULL);
865	if (!n) {
866		lwsl_notice("%s: sign_val_chunk should have failed\n", __func__);
867		goto bail1;
868	}
869
870	lws_cose_validate_destroy(&cps);
871	lws_cose_key_set_destroy(&set);
872
873	/*
874	 * invalid sign1, signature tampered
875	 */
876
877	lwsl_user("%s: sign1/sign-fail-02\n", __func__);
878
879	lws_dll2_owner_clear(&set);
880	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
881		lwsl_notice("%s: key import fail\n", __func__);
882		return 1;
883	}
884
885	info.sigtype = SIGTYPE_SINGLE;
886	cps = lws_cose_validate_create(&info);
887	if (!cps) {
888		lwsl_notice("%s: sign_val_create fail\n", __func__);
889		goto bail;
890	}
891
892	n = lws_cose_validate_chunk(cps, sign1_fail_02, sizeof(sign1_fail_02),
893				    NULL);
894	if (n) {
895		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
896		goto bail1;
897	}
898
899	o = lws_cose_validate_results(cps);
900	if (o->count != 1)
901		goto bail1;
902
903	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
904	if (!res->result)
905		/* validation result must be fail */
906		goto bail1;
907
908	lws_cose_validate_destroy(&cps);
909	lws_cose_key_set_destroy(&set);
910
911	/*
912	 * invalid sign1, alg tampered
913	 */
914
915	lwsl_user("%s: sign1/sign-fail-03\n", __func__);
916
917	lws_dll2_owner_clear(&set);
918	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
919		lwsl_notice("%s: key import fail\n", __func__);
920		return 1;
921	}
922
923	info.sigtype = SIGTYPE_SINGLE;
924	cps = lws_cose_validate_create(&info);
925	if (!cps) {
926		lwsl_notice("%s: sign_val_create fail\n", __func__);
927		goto bail;
928	}
929
930	n = lws_cose_validate_chunk(cps, sign1_fail_03, sizeof(sign1_fail_03),
931				    NULL);
932	if (n) {
933		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
934		goto bail1;
935	}
936
937	o = lws_cose_validate_results(cps);
938	if (o->count != 1)
939		goto bail1;
940
941	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
942	if (!res->result)
943		/* validation result must be fail */
944		goto bail1;
945
946	lws_cose_validate_destroy(&cps);
947	lws_cose_key_set_destroy(&set);
948
949	/*
950	 * invalid sign1, alg sign tampered
951	 */
952
953	lwsl_user("%s: sign1/sign-fail-04\n", __func__);
954
955	lws_dll2_owner_clear(&set);
956	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
957		lwsl_notice("%s: key import fail\n", __func__);
958		return 1;
959	}
960
961	info.sigtype = SIGTYPE_SINGLE;
962	cps = lws_cose_validate_create(&info);
963	if (!cps) {
964		lwsl_notice("%s: sign_val_create fail\n", __func__);
965		goto bail;
966	}
967
968	n = lws_cose_validate_chunk(cps, sign1_fail_04, sizeof(sign1_fail_04),
969				    NULL);
970	if (n) {
971		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
972		goto bail1;
973	}
974
975	o = lws_cose_validate_results(cps);
976	if (o->count != 1)
977		goto bail1;
978
979	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
980	if (!res->result)
981		/* validation result must be fail */
982		goto bail1;
983
984	lws_cose_validate_destroy(&cps);
985	lws_cose_key_set_destroy(&set);
986
987	/*
988	 * invalid sign1, protected attributes tampered
989	 */
990
991	lwsl_user("%s: sign1/sign-fail-06\n", __func__);
992
993	lws_dll2_owner_clear(&set);
994	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
995		lwsl_notice("%s: key import fail\n", __func__);
996		return 1;
997	}
998
999	info.sigtype = SIGTYPE_SINGLE;
1000	cps = lws_cose_validate_create(&info);
1001	if (!cps) {
1002		lwsl_notice("%s: sign_val_create fail\n", __func__);
1003		goto bail;
1004	}
1005
1006	n = lws_cose_validate_chunk(cps, sign1_fail_06, sizeof(sign1_fail_06),
1007				    NULL);
1008	if (n) {
1009		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1010		goto bail1;
1011	}
1012
1013	o = lws_cose_validate_results(cps);
1014	if (o->count != 1)
1015		goto bail1;
1016
1017	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1018	if (!res->result)
1019		/* validation result must be fail */
1020		goto bail1;
1021
1022	lws_cose_validate_destroy(&cps);
1023	lws_cose_key_set_destroy(&set);
1024
1025	/*
1026	 * invalid sign1, protected attribute removed
1027	 */
1028
1029	lwsl_user("%s: sign1/sign-fail-07\n", __func__);
1030
1031	lws_dll2_owner_clear(&set);
1032	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1033		lwsl_notice("%s: key import fail\n", __func__);
1034		return 1;
1035	}
1036
1037	info.sigtype = SIGTYPE_SINGLE;
1038	cps = lws_cose_validate_create(&info);
1039	if (!cps) {
1040		lwsl_notice("%s: sign_val_create fail\n", __func__);
1041		goto bail;
1042	}
1043
1044	n = lws_cose_validate_chunk(cps, sign1_fail_07, sizeof(sign1_fail_07),
1045				    NULL);
1046	if (n) {
1047		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1048		goto bail1;
1049	}
1050
1051	o = lws_cose_validate_results(cps);
1052	if (o->count != 1)
1053		goto bail1;
1054
1055	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1056	if (!res->result)
1057		/* validation result must be fail */
1058		goto bail1;
1059
1060	lws_cose_validate_destroy(&cps);
1061	lws_cose_key_set_destroy(&set);
1062
1063	/*
1064	 * valid sign we have key for
1065	 */
1066
1067	lwsl_user("%s: sign/sign-pass-01\n", __func__);
1068
1069	lws_dll2_owner_clear(&set);
1070	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1071		lwsl_notice("%s: key import fail\n", __func__);
1072		return 1;
1073	}
1074
1075	info.sigtype = SIGTYPE_MULTI;
1076	cps = lws_cose_validate_create(&info);
1077	if (!cps) {
1078		lwsl_notice("%s: sign_val_create fail\n", __func__);
1079		goto bail;
1080	}
1081
1082	n = lws_cose_validate_chunk(cps, sign_pass_01, sizeof(sign_pass_01),
1083				    NULL);
1084	if (n) {
1085		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1086		goto bail1;
1087	}
1088
1089	o = lws_cose_validate_results(cps);
1090	if (o->count != 1) {
1091		lwsl_notice("%s: results: %d\n", __func__, o->count);
1092		goto bail1;
1093	}
1094
1095	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1096	if (res->result)
1097		goto bail1;
1098
1099	lws_cose_validate_destroy(&cps);
1100	lws_cose_key_set_destroy(&set);
1101
1102	/*
1103	 * valid sign we have key for
1104	 */
1105
1106	lwsl_user("%s: sign/sign-pass-02\n", __func__);
1107
1108	lws_dll2_owner_clear(&set);
1109	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1110		lwsl_notice("%s: key import fail\n", __func__);
1111		return 1;
1112	}
1113
1114	info.sigtype = SIGTYPE_MULTI;
1115	info.ext_cb = xcb;
1116	info.ext_len = sizeof(sign1_pass_02_ext);
1117	cps = lws_cose_validate_create(&info);
1118	if (!cps) {
1119		lwsl_notice("%s: sign_val_create fail\n", __func__);
1120		goto bail;
1121	}
1122
1123	n = lws_cose_validate_chunk(cps, sign_pass_02, sizeof(sign_pass_02),
1124				    NULL);
1125	if (n) {
1126		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1127		goto bail1;
1128	}
1129
1130	o = lws_cose_validate_results(cps);
1131	if (o->count != 1) {
1132		lwsl_notice("%s: results: %d\n", __func__, o->count);
1133		goto bail1;
1134	}
1135
1136	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1137	if (res->result)
1138		goto bail1;
1139
1140	lws_cose_validate_destroy(&cps);
1141	lws_cose_key_set_destroy(&set);
1142
1143	/*
1144	 * valid sign we have key for
1145	 */
1146
1147	lwsl_user("%s: sign/sign-pass-03\n", __func__);
1148
1149	lws_dll2_owner_clear(&set);
1150	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1151		lwsl_notice("%s: key import fail\n", __func__);
1152		return 1;
1153	}
1154
1155	info.sigtype = SIGTYPE_MULTI;
1156	info.ext_cb = NULL;
1157	info.ext_len = 0;
1158	cps = lws_cose_validate_create(&info);
1159	if (!cps) {
1160		lwsl_notice("%s: sign_val_create fail\n", __func__);
1161		goto bail;
1162	}
1163
1164	n = lws_cose_validate_chunk(cps, sign_pass_03, sizeof(sign_pass_03),
1165				    NULL);
1166	if (n) {
1167		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1168		goto bail1;
1169	}
1170
1171	o = lws_cose_validate_results(cps);
1172	if (o->count != 1) {
1173		lwsl_notice("%s: results: %d\n", __func__, o->count);
1174		goto bail1;
1175	}
1176
1177	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1178	if (res->result)
1179		goto bail1;
1180
1181	lws_cose_validate_destroy(&cps);
1182	lws_cose_key_set_destroy(&set);
1183
1184	/*
1185	 * wrong cbor tag
1186	 */
1187
1188	lwsl_user("%s: sign/sign-fail-01\n", __func__);
1189
1190	lws_dll2_owner_clear(&set);
1191	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1192		lwsl_notice("%s: key import fail\n", __func__);
1193		return 1;
1194	}
1195
1196	info.sigtype = SIGTYPE_MULTI;
1197	cps = lws_cose_validate_create(&info);
1198	if (!cps) {
1199		lwsl_notice("%s: sign_val_create fail\n", __func__);
1200		goto bail;
1201	}
1202
1203	n = lws_cose_validate_chunk(cps, sign_fail_01, sizeof(sign_fail_01),
1204				    NULL);
1205	if (!n) {
1206		lwsl_notice("%s: sign_val_chunk should fail\n", __func__);
1207		goto bail1;
1208	}
1209
1210	lws_cose_validate_destroy(&cps);
1211	lws_cose_key_set_destroy(&set);
1212
1213	/*
1214	 * tampered signature
1215	 */
1216
1217	lwsl_user("%s: sign/sign-fail-02\n", __func__);
1218
1219	lws_dll2_owner_clear(&set);
1220	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1221		lwsl_notice("%s: key import fail\n", __func__);
1222		return 1;
1223	}
1224
1225	info.sigtype = SIGTYPE_MULTI;
1226	cps = lws_cose_validate_create(&info);
1227	if (!cps) {
1228		lwsl_notice("%s: sign_val_create fail\n", __func__);
1229		goto bail;
1230	}
1231
1232	n = lws_cose_validate_chunk(cps, sign_fail_02, sizeof(sign_fail_02),
1233				    NULL);
1234	if (n) {
1235		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1236		goto bail1;
1237	}
1238
1239	o = lws_cose_validate_results(cps);
1240	if (o->count != 1) {
1241		lwsl_notice("%s: results: %d\n", __func__, o->count);
1242		goto bail1;
1243	}
1244
1245	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1246	if (!res->result)
1247		goto bail1;
1248
1249	lws_cose_validate_destroy(&cps);
1250	lws_cose_key_set_destroy(&set);
1251
1252	/*
1253	 * tampered sign alg -999
1254	 */
1255
1256	lwsl_user("%s: sign/sign-fail-03\n", __func__);
1257
1258	lws_dll2_owner_clear(&set);
1259	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1260		lwsl_notice("%s: key import fail\n", __func__);
1261		return 1;
1262	}
1263
1264	info.sigtype = SIGTYPE_MULTI;
1265	cps = lws_cose_validate_create(&info);
1266	if (!cps) {
1267		lwsl_notice("%s: sign_val_create fail\n", __func__);
1268		goto bail;
1269	}
1270
1271	n = lws_cose_validate_chunk(cps, sign_fail_03, sizeof(sign_fail_03),
1272				    NULL);
1273	if (n) {
1274		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1275		goto bail1;
1276	}
1277
1278	o = lws_cose_validate_results(cps);
1279	if (o->count != 1) {
1280		lwsl_notice("%s: results: %d\n", __func__, o->count);
1281		goto bail1;
1282	}
1283
1284	lws_cose_validate_destroy(&cps);
1285	lws_cose_key_set_destroy(&set);
1286
1287	/*
1288	 * tampered sign alg 0
1289	 */
1290
1291	lwsl_user("%s: sign/sign-fail-04\n", __func__);
1292
1293	lws_dll2_owner_clear(&set);
1294	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1295		lwsl_notice("%s: key import fail\n", __func__);
1296		return 1;
1297	}
1298
1299	info.sigtype = SIGTYPE_MULTI;
1300	cps = lws_cose_validate_create(&info);
1301	if (!cps) {
1302		lwsl_notice("%s: sign_val_create fail\n", __func__);
1303		goto bail;
1304	}
1305
1306	n = lws_cose_validate_chunk(cps, sign_fail_04, sizeof(sign_fail_04),
1307				    NULL);
1308	if (n) {
1309		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1310		goto bail1;
1311	}
1312
1313	o = lws_cose_validate_results(cps);
1314	if (o->count != 1) {
1315		lwsl_notice("%s: results: %d\n", __func__, o->count);
1316		goto bail1;
1317	}
1318
1319	lws_cose_validate_destroy(&cps);
1320	lws_cose_key_set_destroy(&set);
1321
1322	/*
1323	 * add protected attribute
1324	 */
1325
1326	lwsl_user("%s: sign/sign-fail-06\n", __func__);
1327
1328	lws_dll2_owner_clear(&set);
1329	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1330		lwsl_notice("%s: key import fail\n", __func__);
1331		return 1;
1332	}
1333
1334	info.sigtype = SIGTYPE_MULTI;
1335	cps = lws_cose_validate_create(&info);
1336	if (!cps) {
1337		lwsl_notice("%s: sign_val_create fail\n", __func__);
1338		goto bail;
1339	}
1340
1341	n = lws_cose_validate_chunk(cps, sign_fail_06, sizeof(sign_fail_06),
1342				    NULL);
1343	if (n) {
1344		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1345		goto bail1;
1346	}
1347
1348	o = lws_cose_validate_results(cps);
1349	if (o->count != 1) {
1350		lwsl_notice("%s: results: %d\n", __func__, o->count);
1351		goto bail1;
1352	}
1353
1354	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1355	if (!res->result)
1356		goto bail1;
1357
1358	lws_cose_validate_destroy(&cps);
1359	lws_cose_key_set_destroy(&set);
1360
1361	/*
1362	 * remove protected attribute
1363	 */
1364
1365	lwsl_user("%s: sign/sign-fail-07\n", __func__);
1366
1367	lws_dll2_owner_clear(&set);
1368	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1369		lwsl_notice("%s: key import fail\n", __func__);
1370		return 1;
1371	}
1372
1373	info.sigtype = SIGTYPE_MULTI;
1374	cps = lws_cose_validate_create(&info);
1375	if (!cps) {
1376		lwsl_notice("%s: sign_val_create fail\n", __func__);
1377		goto bail;
1378	}
1379
1380	n = lws_cose_validate_chunk(cps, sign_fail_07, sizeof(sign_fail_07),
1381				    NULL);
1382	if (n) {
1383		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1384		goto bail1;
1385	}
1386
1387	o = lws_cose_validate_results(cps);
1388	if (o->count != 1) {
1389		lwsl_notice("%s: results: %d\n", __func__, o->count);
1390		goto bail1;
1391	}
1392
1393	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1394	if (!res->result)
1395		goto bail1;
1396
1397	lws_cose_validate_destroy(&cps);
1398	lws_cose_key_set_destroy(&set);
1399
1400
1401	/*
1402	 * valid HMAC sign we have key for
1403	 */
1404
1405	lwsl_user("%s: hmac-examples/hmac-01\n", __func__);
1406
1407	lws_dll2_owner_clear(&set);
1408	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1409		lwsl_notice("%s: key import fail\n", __func__);
1410		return 1;
1411	}
1412
1413	info.sigtype = SIGTYPE_MAC;
1414	cps = lws_cose_validate_create(&info);
1415	if (!cps) {
1416		lwsl_notice("%s: sign_val_create fail\n", __func__);
1417		goto bail;
1418	}
1419
1420	n = lws_cose_validate_chunk(cps, sign_hmac_01, sizeof(sign_hmac_01),
1421				    NULL);
1422	if (n) {
1423		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1424		goto bail1;
1425	}
1426
1427	o = lws_cose_validate_results(cps);
1428	if (o->count != 1) {
1429		lwsl_err("%s: count %d\n", __func__, o->count);
1430		goto bail1;
1431	}
1432
1433	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1434	if (res->result) {
1435		lwsl_err("%s: result is fail\n", __func__);
1436		goto bail1;
1437	}
1438
1439	lws_cose_validate_destroy(&cps);
1440	lws_cose_key_set_destroy(&set);
1441
1442	/*
1443	 * valid HMAC sign we have key for
1444	 */
1445
1446	lwsl_user("%s: hmac-examples/hmac-02\n", __func__);
1447
1448	lws_dll2_owner_clear(&set);
1449	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1450		lwsl_notice("%s: key import fail\n", __func__);
1451		return 1;
1452	}
1453
1454	info.sigtype = SIGTYPE_MAC;
1455	cps = lws_cose_validate_create(&info);
1456	if (!cps) {
1457		lwsl_notice("%s: sign_val_create fail\n", __func__);
1458		goto bail;
1459	}
1460
1461	n = lws_cose_validate_chunk(cps, sign_hmac_02, sizeof(sign_hmac_02),
1462				    NULL);
1463	if (n) {
1464		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1465		goto bail1;
1466	}
1467
1468	o = lws_cose_validate_results(cps);
1469	if (o->count != 1) {
1470		lwsl_err("%s: count %d\n", __func__, o->count);
1471		goto bail1;
1472	}
1473
1474	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1475	if (res->result) {
1476		lwsl_err("%s: result is fail\n", __func__);
1477		goto bail1;
1478	}
1479
1480	lws_cose_validate_destroy(&cps);
1481	lws_cose_key_set_destroy(&set);
1482
1483
1484	/*
1485	 * valid HMAC sign we have key for
1486	 */
1487
1488	lwsl_user("%s: hmac-examples/hmac-03\n", __func__);
1489
1490	lws_dll2_owner_clear(&set);
1491	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1492		lwsl_notice("%s: key import fail\n", __func__);
1493		return 1;
1494	}
1495
1496	info.sigtype = SIGTYPE_MAC;
1497	cps = lws_cose_validate_create(&info);
1498	if (!cps) {
1499		lwsl_notice("%s: sign_val_create fail\n", __func__);
1500		goto bail;
1501	}
1502
1503	n = lws_cose_validate_chunk(cps, sign_hmac_03, sizeof(sign_hmac_03),
1504				    NULL);
1505	if (n) {
1506		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1507		goto bail1;
1508	}
1509
1510	o = lws_cose_validate_results(cps);
1511	if (o->count != 1) {
1512		lwsl_err("%s: count %d\n", __func__, o->count);
1513		goto bail1;
1514	}
1515
1516	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1517	if (res->result) {
1518		lwsl_err("%s: result is fail\n", __func__);
1519		goto bail1;
1520	}
1521
1522	lws_cose_validate_destroy(&cps);
1523	lws_cose_key_set_destroy(&set);
1524
1525	/*
1526	 * invalid HMAC sign we have key for
1527	 */
1528
1529	lwsl_user("%s: hmac-examples/hmac-04 fail mac tag\n", __func__);
1530
1531	lws_dll2_owner_clear(&set);
1532	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1533		lwsl_notice("%s: key import fail\n", __func__);
1534		return 1;
1535	}
1536
1537	info.sigtype = SIGTYPE_MAC;
1538	cps = lws_cose_validate_create(&info);
1539	if (!cps) {
1540		lwsl_notice("%s: sign_val_create fail\n", __func__);
1541		goto bail;
1542	}
1543
1544	n = lws_cose_validate_chunk(cps, sign_hmac_04, sizeof(sign_hmac_04),
1545				    NULL);
1546	if (n) {
1547		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1548		goto bail1;
1549	}
1550
1551	o = lws_cose_validate_results(cps);
1552	if (o->count != 1) {
1553		lwsl_err("%s: count %d\n", __func__, o->count);
1554		goto bail1;
1555	}
1556
1557	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1558	if (!res->result) {
1559		lwsl_err("%s: result is wrongly succeeding\n", __func__);
1560		goto bail1;
1561	}
1562
1563	lws_cose_validate_destroy(&cps);
1564	lws_cose_key_set_destroy(&set);
1565
1566	/*
1567	 * valid HMAC sign we have key for HS256/64
1568	 */
1569
1570	lwsl_user("%s: hmac-examples/hmac-05\n", __func__);
1571
1572	lws_dll2_owner_clear(&set);
1573	if (!lws_cose_key_import(&set, NULL, NULL, keyset1.set, keyset1.len)) {
1574		lwsl_notice("%s: key import fail\n", __func__);
1575		return 1;
1576	}
1577
1578	info.sigtype = SIGTYPE_MAC;
1579	cps = lws_cose_validate_create(&info);
1580	if (!cps) {
1581		lwsl_notice("%s: sign_val_create fail\n", __func__);
1582		goto bail;
1583	}
1584
1585	n = lws_cose_validate_chunk(cps, sign_hmac_05, sizeof(sign_hmac_05),
1586				    NULL);
1587	if (n) {
1588		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1589		goto bail1;
1590	}
1591
1592	o = lws_cose_validate_results(cps);
1593	if (o->count != 1) {
1594		lwsl_err("%s: count %d\n", __func__, o->count);
1595		goto bail1;
1596	}
1597
1598	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1599	if (res->result) {
1600		lwsl_err("%s: result is fail\n", __func__);
1601		goto bail1;
1602	}
1603
1604	lws_cose_validate_destroy(&cps);
1605	lws_cose_key_set_destroy(&set);
1606
1607	/*
1608	 * valid HMAC sign with implicit HS256 key
1609	 */
1610
1611	lwsl_user("%s: hmac-examples/enc-01\n", __func__);
1612
1613	lws_dll2_owner_clear(&set);
1614	if (!lws_cose_key_import(&set, NULL, NULL, key3.set, key3.len)) {
1615		lwsl_notice("%s: key import fail\n", __func__);
1616		return 1;
1617	}
1618
1619	info.sigtype = SIGTYPE_MAC0;
1620	cps = lws_cose_validate_create(&info);
1621	if (!cps) {
1622		lwsl_notice("%s: sign_val_create fail\n", __func__);
1623		goto bail;
1624	}
1625
1626	n = lws_cose_validate_chunk(cps, enc_hmac_01, sizeof(enc_hmac_01),
1627				    NULL);
1628	if (n) {
1629		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1630		goto bail1;
1631	}
1632
1633	o = lws_cose_validate_results(cps);
1634	if (o->count != 1) {
1635		lwsl_err("%s: count %d\n", __func__, o->count);
1636		goto bail1;
1637	}
1638
1639	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1640	if (res->result) {
1641		lwsl_err("%s: result is fail\n", __func__);
1642		goto bail1;
1643	}
1644
1645	lws_cose_validate_destroy(&cps);
1646	lws_cose_key_set_destroy(&set);
1647
1648	/*
1649	 * valid HMAC sign with implicit HS384 key
1650	 */
1651
1652	lwsl_user("%s: hmac-examples/enc-02\n", __func__);
1653
1654	lws_dll2_owner_clear(&set);
1655	if (!lws_cose_key_import(&set, NULL, NULL, key8.set, key8.len)) {
1656		lwsl_notice("%s: key import fail\n", __func__);
1657		return 1;
1658	}
1659
1660	info.sigtype = SIGTYPE_MAC0;
1661	cps = lws_cose_validate_create(&info);
1662	if (!cps) {
1663		lwsl_notice("%s: sign_val_create fail\n", __func__);
1664		goto bail;
1665	}
1666
1667	n = lws_cose_validate_chunk(cps, enc_hmac_02, sizeof(enc_hmac_02),
1668				    NULL);
1669	if (n) {
1670		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1671		goto bail1;
1672	}
1673
1674	o = lws_cose_validate_results(cps);
1675	if (o->count != 1) {
1676		lwsl_err("%s: count %d\n", __func__, o->count);
1677		goto bail1;
1678	}
1679
1680	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1681	if (res->result) {
1682		lwsl_err("%s: result is fail\n", __func__);
1683		goto bail1;
1684	}
1685
1686	lws_cose_validate_destroy(&cps);
1687	lws_cose_key_set_destroy(&set);
1688
1689	/*
1690	 * valid HMAC sign with implicit HS512 key
1691	 */
1692
1693	lwsl_user("%s: hmac-examples/enc-03\n", __func__);
1694
1695	lws_dll2_owner_clear(&set);
1696	if (!lws_cose_key_import(&set, NULL, NULL, key9.set, key9.len)) {
1697		lwsl_notice("%s: key import fail\n", __func__);
1698		return 1;
1699	}
1700
1701	info.sigtype = SIGTYPE_MAC0;
1702	cps = lws_cose_validate_create(&info);
1703	if (!cps) {
1704		lwsl_notice("%s: sign_val_create fail\n", __func__);
1705		goto bail;
1706	}
1707
1708	n = lws_cose_validate_chunk(cps, enc_hmac_03, sizeof(enc_hmac_03),
1709				    NULL);
1710	if (n) {
1711		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1712		goto bail1;
1713	}
1714
1715	o = lws_cose_validate_results(cps);
1716	if (o->count != 1) {
1717		lwsl_err("%s: count %d\n", __func__, o->count);
1718		goto bail1;
1719	}
1720
1721	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1722	if (res->result) {
1723		lwsl_err("%s: result is fail\n", __func__);
1724		goto bail1;
1725	}
1726
1727	lws_cose_validate_destroy(&cps);
1728	lws_cose_key_set_destroy(&set);
1729
1730	/*
1731	 * invalid HMAC sign with implicit HS256 key, tampered hmac tag
1732	 */
1733
1734	lwsl_user("%s: hmac-examples/enc-04\n", __func__);
1735
1736	lws_dll2_owner_clear(&set);
1737	if (!lws_cose_key_import(&set, NULL, NULL, key3.set, key3.len)) {
1738		lwsl_notice("%s: key import fail\n", __func__);
1739		return 1;
1740	}
1741
1742	info.sigtype = SIGTYPE_MAC0;
1743	cps = lws_cose_validate_create(&info);
1744	if (!cps) {
1745		lwsl_notice("%s: sign_val_create fail\n", __func__);
1746		goto bail;
1747	}
1748
1749	n = lws_cose_validate_chunk(cps, enc_hmac_04, sizeof(enc_hmac_04),
1750				    NULL);
1751	if (n) {
1752		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1753		goto bail1;
1754	}
1755
1756	o = lws_cose_validate_results(cps);
1757	if (o->count != 1) {
1758		lwsl_err("%s: count %d\n", __func__, o->count);
1759		goto bail1;
1760	}
1761
1762	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1763	if (!res->result) {
1764		lwsl_err("%s: result wrongly succeeds\n", __func__);
1765		goto bail1;
1766	}
1767
1768	lws_cose_validate_destroy(&cps);
1769	lws_cose_key_set_destroy(&set);
1770
1771	/*
1772	 * valid HMAC sign with implicit HS256 key, HS256/64
1773	 */
1774
1775	lwsl_user("%s: hmac-examples/enc-05\n", __func__);
1776
1777	lws_dll2_owner_clear(&set);
1778	if (!lws_cose_key_import(&set, NULL, NULL, key3.set, key3.len)) {
1779		lwsl_notice("%s: key import fail\n", __func__);
1780		return 1;
1781	}
1782
1783	info.sigtype = SIGTYPE_MAC0;
1784	cps = lws_cose_validate_create(&info);
1785	if (!cps) {
1786		lwsl_notice("%s: sign_val_create fail\n", __func__);
1787		goto bail;
1788	}
1789
1790	n = lws_cose_validate_chunk(cps, enc_hmac_05, sizeof(enc_hmac_05),
1791				    NULL);
1792	if (n) {
1793		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1794		goto bail1;
1795	}
1796
1797	o = lws_cose_validate_results(cps);
1798	if (o->count != 1) {
1799		lwsl_err("%s: count %d\n", __func__, o->count);
1800		goto bail1;
1801	}
1802
1803	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1804	if (res->result) {
1805		lwsl_err("%s: result is fail\n", __func__);
1806		goto bail1;
1807	}
1808
1809	lws_cose_validate_destroy(&cps);
1810	lws_cose_key_set_destroy(&set);
1811#if 0
1812	/*
1813	 * valid Ed25519 signature with countersignature from same key + alg
1814	 */
1815
1816	lwsl_user("%s: countersign/sign-01\n", __func__);
1817
1818	lws_dll2_owner_clear(&set);
1819	if (!lws_cose_key_import(&set, NULL, NULL, key10.set, key10.len)) {
1820		lwsl_notice("%s: key import fail\n", __func__);
1821		return 1;
1822	}
1823
1824	info.sigtype = SIGTYPE_COUNTERSIGNED;
1825	cps = lws_cose_validate_create(&info);
1826	if (!cps) {
1827		lwsl_notice("%s: sign_val_create fail\n", __func__);
1828		goto bail;
1829	}
1830
1831	n = lws_cose_validate_chunk(cps, countersign_sign_01,
1832					 sizeof(countersign_sign_01), NULL);
1833	if (n) {
1834		lwsl_notice("%s: sign_val_chunk failed\n", __func__);
1835		goto bail1;
1836	}
1837
1838	o = lws_cose_validate_results(cps);
1839	if (o->count != 1) {
1840		lwsl_err("%s: result count %d\n", __func__, o->count);
1841		goto bail1;
1842	}
1843
1844	res = lws_container_of(o->head, lws_cose_validate_res_t, list);
1845	if (res->result) {
1846		lwsl_err("%s: result is fail\n", __func__);
1847		goto bail1;
1848	}
1849
1850	lws_cose_validate_destroy(&cps);
1851	lws_cose_key_set_destroy(&set);
1852#endif
1853
1854	return 0;
1855
1856bail1:
1857	lws_cose_validate_destroy(&cps);
1858bail:
1859	lws_cose_key_set_destroy(&set);
1860
1861	return 1;
1862}
1863