xref: /netbsd-src/external/bsd/libfido2/dist/regress/cred.c (revision a8c74629f602faa0ccf8a463757d7baf858bbf3a)
1 /*
2  * Copyright (c) 2018 Yubico AB. All rights reserved.
3  * Use of this source code is governed by a BSD-style
4  * license that can be found in the LICENSE file.
5  */
6 
7 #include <assert.h>
8 #include <fido.h>
9 #include <string.h>
10 
11 #define FAKE_DEV_HANDLE	((void *)0xdeadbeef)
12 
13 static const unsigned char cdh[32] = {
14 	0xf9, 0x64, 0x57, 0xe7, 0x2d, 0x97, 0xf6, 0xbb,
15 	0xdd, 0xd7, 0xfb, 0x06, 0x37, 0x62, 0xea, 0x26,
16 	0x20, 0x44, 0x8e, 0x69, 0x7c, 0x03, 0xf2, 0x31,
17 	0x2f, 0x99, 0xdc, 0xaf, 0x3e, 0x8a, 0x91, 0x6b,
18 };
19 
20 static const unsigned char authdata[198] = {
21 	0x58, 0xc4, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e,
22 	0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76,
23 	0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86,
24 	0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d,
25 	0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8,
26 	0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80,
27 	0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00,
28 	0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde,
29 	0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d,
30 	0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e,
31 	0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda,
32 	0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83,
33 	0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76,
34 	0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6,
35 	0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f,
36 	0x25, 0xa5, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01,
37 	0x21, 0x58, 0x20, 0x17, 0x5b, 0x27, 0xa6, 0x56,
38 	0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55, 0x42, 0x78,
39 	0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd, 0x1b, 0xb9,
40 	0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22, 0x64, 0xf5,
41 	0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20, 0x87, 0x5f,
42 	0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f, 0xeb, 0xe3,
43 	0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6, 0x1c, 0x31,
44 	0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1, 0xfe, 0x5d,
45 	0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2,
46 };
47 
48 static const unsigned char authdata_dupkeys[200] = {
49 	0x58, 0xc6, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e,
50 	0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76,
51 	0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86,
52 	0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d,
53 	0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8,
54 	0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80,
55 	0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00,
56 	0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde,
57 	0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d,
58 	0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e,
59 	0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda,
60 	0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83,
61 	0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76,
62 	0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6,
63 	0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f,
64 	0x25, 0xa6, 0x01, 0x02, 0x01, 0x02, 0x03, 0x26,
65 	0x20, 0x01, 0x21, 0x58, 0x20, 0x17, 0x5b, 0x27,
66 	0xa6, 0x56, 0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55,
67 	0x42, 0x78, 0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd,
68 	0x1b, 0xb9, 0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22,
69 	0x64, 0xf5, 0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20,
70 	0x87, 0x5f, 0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f,
71 	0xeb, 0xe3, 0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6,
72 	0x1c, 0x31, 0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1,
73 	0xfe, 0x5d, 0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2,
74 };
75 
76 static const unsigned char authdata_unsorted_keys[198] = {
77 	0x58, 0xc4, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e,
78 	0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76,
79 	0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86,
80 	0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d,
81 	0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8,
82 	0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80,
83 	0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00,
84 	0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde,
85 	0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d,
86 	0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e,
87 	0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda,
88 	0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83,
89 	0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76,
90 	0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6,
91 	0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f,
92 	0x25, 0xa5, 0x03, 0x26, 0x01, 0x02, 0x20, 0x01,
93 	0x21, 0x58, 0x20, 0x17, 0x5b, 0x27, 0xa6, 0x56,
94 	0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55, 0x42, 0x78,
95 	0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd, 0x1b, 0xb9,
96 	0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22, 0x64, 0xf5,
97 	0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20, 0x87, 0x5f,
98 	0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f, 0xeb, 0xe3,
99 	0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6, 0x1c, 0x31,
100 	0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1, 0xfe, 0x5d,
101 	0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2,
102 };
103 
104 static const unsigned char x509[742] = {
105 	0x30, 0x82, 0x02, 0xe2, 0x30, 0x81, 0xcb, 0x02,
106 	0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
107 	0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
108 	0x00, 0x30, 0x1d, 0x31, 0x1b, 0x30, 0x19, 0x06,
109 	0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x59, 0x75,
110 	0x62, 0x69, 0x63, 0x6f, 0x20, 0x55, 0x32, 0x46,
111 	0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41,
112 	0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x35,
113 	0x31, 0x35, 0x31, 0x32, 0x35, 0x38, 0x35, 0x34,
114 	0x5a, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x36, 0x31,
115 	0x34, 0x31, 0x32, 0x35, 0x38, 0x35, 0x34, 0x5a,
116 	0x30, 0x1d, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03,
117 	0x55, 0x04, 0x03, 0x13, 0x12, 0x59, 0x75, 0x62,
118 	0x69, 0x63, 0x6f, 0x20, 0x55, 0x32, 0x46, 0x20,
119 	0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x45, 0x30,
120 	0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48,
121 	0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86,
122 	0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42,
123 	0x00, 0x04, 0xdb, 0x0a, 0xdb, 0xf5, 0x21, 0xc7,
124 	0x5c, 0xce, 0x63, 0xdc, 0xa6, 0xe1, 0xe8, 0x25,
125 	0x06, 0x0d, 0x94, 0xe6, 0x27, 0x54, 0x19, 0x4f,
126 	0x9d, 0x24, 0xaf, 0x26, 0x1a, 0xbe, 0xad, 0x99,
127 	0x44, 0x1f, 0x95, 0xa3, 0x71, 0x91, 0x0a, 0x3a,
128 	0x20, 0xe7, 0x3e, 0x91, 0x5e, 0x13, 0xe8, 0xbe,
129 	0x38, 0x05, 0x7a, 0xd5, 0x7a, 0xa3, 0x7e, 0x76,
130 	0x90, 0x8f, 0xaf, 0xe2, 0x8a, 0x94, 0xb6, 0x30,
131 	0xeb, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
132 	0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
133 	0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x95, 0x40,
134 	0x6b, 0x50, 0x61, 0x7d, 0xad, 0x84, 0xa3, 0xb4,
135 	0xeb, 0x88, 0x0f, 0xe3, 0x30, 0x0f, 0x2d, 0xa2,
136 	0x0a, 0x00, 0xd9, 0x25, 0x04, 0xee, 0x72, 0xfa,
137 	0x67, 0xdf, 0x58, 0x51, 0x0f, 0x0b, 0x47, 0x02,
138 	0x9c, 0x3e, 0x41, 0x29, 0x4a, 0x93, 0xac, 0x29,
139 	0x85, 0x89, 0x2d, 0xa4, 0x7a, 0x81, 0x32, 0x28,
140 	0x57, 0x71, 0x01, 0xef, 0xa8, 0x42, 0x88, 0x16,
141 	0x96, 0x37, 0x91, 0xd5, 0xdf, 0xe0, 0x8f, 0xc9,
142 	0x3c, 0x8d, 0xb0, 0xcd, 0x89, 0x70, 0x82, 0xec,
143 	0x79, 0xd3, 0xc6, 0x78, 0x73, 0x29, 0x32, 0xe5,
144 	0xab, 0x6c, 0xbd, 0x56, 0x9f, 0xd5, 0x45, 0x91,
145 	0xce, 0xc1, 0xdd, 0x8d, 0x64, 0xdc, 0xe9, 0x9c,
146 	0x1f, 0x5e, 0x3c, 0xd2, 0xaf, 0x51, 0xa5, 0x82,
147 	0x18, 0xaf, 0xe0, 0x37, 0xe7, 0x32, 0x9e, 0x76,
148 	0x05, 0x77, 0x02, 0x7b, 0xe6, 0x24, 0xa0, 0x31,
149 	0x56, 0x1b, 0xfd, 0x19, 0xc5, 0x71, 0xd3, 0xf0,
150 	0x9e, 0xc0, 0x73, 0x05, 0x4e, 0xbc, 0x85, 0xb8,
151 	0x53, 0x9e, 0xef, 0xc5, 0xbc, 0x9c, 0x56, 0xa3,
152 	0xba, 0xd9, 0x27, 0x6a, 0xbb, 0xa9, 0x7a, 0x40,
153 	0xd7, 0x47, 0x8b, 0x55, 0x72, 0x6b, 0xe3, 0xfe,
154 	0x28, 0x49, 0x71, 0x24, 0xf4, 0x8f, 0xf4, 0x20,
155 	0x81, 0xea, 0x38, 0xff, 0x7c, 0x0a, 0x4f, 0xdf,
156 	0x02, 0x82, 0x39, 0x81, 0x82, 0x3b, 0xca, 0x09,
157 	0xdd, 0xca, 0xaa, 0x0f, 0x27, 0xf5, 0xa4, 0x83,
158 	0x55, 0x6c, 0x9a, 0x39, 0x9b, 0x15, 0x3a, 0x16,
159 	0x63, 0xdc, 0x5b, 0xf9, 0xac, 0x5b, 0xbc, 0xf7,
160 	0x9f, 0xbe, 0x0f, 0x8a, 0xa2, 0x3c, 0x31, 0x13,
161 	0xa3, 0x32, 0x48, 0xca, 0x58, 0x87, 0xf8, 0x7b,
162 	0xa0, 0xa1, 0x0a, 0x6a, 0x60, 0x96, 0x93, 0x5f,
163 	0x5d, 0x26, 0x9e, 0x63, 0x1d, 0x09, 0xae, 0x9a,
164 	0x41, 0xe5, 0xbd, 0x08, 0x47, 0xfe, 0xe5, 0x09,
165 	0x9b, 0x20, 0xfd, 0x12, 0xe2, 0xe6, 0x40, 0x7f,
166 	0xba, 0x4a, 0x61, 0x33, 0x66, 0x0d, 0x0e, 0x73,
167 	0xdb, 0xb0, 0xd5, 0xa2, 0x9a, 0x9a, 0x17, 0x0d,
168 	0x34, 0x30, 0x85, 0x6a, 0x42, 0x46, 0x9e, 0xff,
169 	0x34, 0x8f, 0x5f, 0x87, 0x6c, 0x35, 0xe7, 0xa8,
170 	0x4d, 0x35, 0xeb, 0xc1, 0x41, 0xaa, 0x8a, 0xd2,
171 	0xda, 0x19, 0xaa, 0x79, 0xa2, 0x5f, 0x35, 0x2c,
172 	0xa0, 0xfd, 0x25, 0xd3, 0xf7, 0x9d, 0x25, 0x18,
173 	0x2d, 0xfa, 0xb4, 0xbc, 0xbb, 0x07, 0x34, 0x3c,
174 	0x8d, 0x81, 0xbd, 0xf4, 0xe9, 0x37, 0xdb, 0x39,
175 	0xe9, 0xd1, 0x45, 0x5b, 0x20, 0x41, 0x2f, 0x2d,
176 	0x27, 0x22, 0xdc, 0x92, 0x74, 0x8a, 0x92, 0xd5,
177 	0x83, 0xfd, 0x09, 0xfb, 0x13, 0x9b, 0xe3, 0x39,
178 	0x7a, 0x6b, 0x5c, 0xfa, 0xe6, 0x76, 0x9e, 0xe0,
179 	0xe4, 0xe3, 0xef, 0xad, 0xbc, 0xfd, 0x42, 0x45,
180 	0x9a, 0xd4, 0x94, 0xd1, 0x7e, 0x8d, 0xa7, 0xd8,
181 	0x05, 0xd5, 0xd3, 0x62, 0xcf, 0x15, 0xcf, 0x94,
182 	0x7d, 0x1f, 0x5b, 0x58, 0x20, 0x44, 0x20, 0x90,
183 	0x71, 0xbe, 0x66, 0xe9, 0x9a, 0xab, 0x74, 0x32,
184 	0x70, 0x53, 0x1d, 0x69, 0xed, 0x87, 0x66, 0xf4,
185 	0x09, 0x4f, 0xca, 0x25, 0x30, 0xc2, 0x63, 0x79,
186 	0x00, 0x3c, 0xb1, 0x9b, 0x39, 0x3f, 0x00, 0xe0,
187 	0xa8, 0x88, 0xef, 0x7a, 0x51, 0x5b, 0xe7, 0xbd,
188 	0x49, 0x64, 0xda, 0x41, 0x7b, 0x24, 0xc3, 0x71,
189 	0x22, 0xfd, 0xd1, 0xd1, 0x20, 0xb3, 0x3f, 0x97,
190 	0xd3, 0x97, 0xb2, 0xaa, 0x18, 0x1c, 0x9e, 0x03,
191 	0x77, 0x7b, 0x5b, 0x7e, 0xf9, 0xa3, 0xa0, 0xd6,
192 	0x20, 0x81, 0x2c, 0x38, 0x8f, 0x9d, 0x25, 0xde,
193 	0xe9, 0xc8, 0xf5, 0xdd, 0x6a, 0x47, 0x9c, 0x65,
194 	0x04, 0x5a, 0x56, 0xe6, 0xc2, 0xeb, 0xf2, 0x02,
195 	0x97, 0xe1, 0xb9, 0xd8, 0xe1, 0x24, 0x76, 0x9f,
196 	0x23, 0x62, 0x39, 0x03, 0x4b, 0xc8, 0xf7, 0x34,
197 	0x07, 0x49, 0xd6, 0xe7, 0x4d, 0x9a,
198 };
199 
200 const unsigned char sig[70] = {
201 	0x30, 0x44, 0x02, 0x20, 0x54, 0x92, 0x28, 0x3b,
202 	0x83, 0x33, 0x47, 0x56, 0x68, 0x79, 0xb2, 0x0c,
203 	0x84, 0x80, 0xcc, 0x67, 0x27, 0x8b, 0xfa, 0x48,
204 	0x43, 0x0d, 0x3c, 0xb4, 0x02, 0x36, 0x87, 0x97,
205 	0x3e, 0xdf, 0x2f, 0x65, 0x02, 0x20, 0x1b, 0x56,
206 	0x17, 0x06, 0xe2, 0x26, 0x0f, 0x6a, 0xe9, 0xa9,
207 	0x70, 0x99, 0x62, 0xeb, 0x3a, 0x04, 0x1a, 0xc4,
208 	0xa7, 0x03, 0x28, 0x56, 0x7c, 0xed, 0x47, 0x08,
209 	0x68, 0x73, 0x6a, 0xb6, 0x89, 0x0d,
210 };
211 
212 const unsigned char pubkey[64] = {
213 	0x17, 0x5b, 0x27, 0xa6, 0x56, 0xb2, 0x26, 0x0c,
214 	0x26, 0x0c, 0x55, 0x42, 0x78, 0x17, 0x5d, 0x4c,
215 	0xf8, 0xa2, 0xfd, 0x1b, 0xb9, 0x54, 0xdf, 0xd5,
216 	0xeb, 0xbf, 0x22, 0x64, 0xf5, 0x21, 0x9a, 0xc6,
217 	0x87, 0x5f, 0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f,
218 	0xeb, 0xe3, 0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6,
219 	0x1c, 0x31, 0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1,
220 	0xfe, 0x5d, 0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2,
221 };
222 
223 const unsigned char id[64] = {
224 	0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde, 0xc5,
225 	0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d, 0x53,
226 	0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e, 0x7f,
227 	0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda, 0x68,
228 	0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83, 0x2c,
229 	0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76, 0x90,
230 	0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6, 0x3c,
231 	0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f, 0x25,
232 };
233 
234 const char rp_id[] = "localhost";
235 const char rp_name[] = "sweet home localhost";
236 
237 static void *
238 dummy_open(const char *path)
239 {
240 	(void)path;
241 
242 	return (FAKE_DEV_HANDLE);
243 }
244 
245 static void
246 dummy_close(void *handle)
247 {
248 	assert(handle == FAKE_DEV_HANDLE);
249 }
250 
251 static int
252 dummy_read(void *handle, unsigned char *buf, size_t len, int ms)
253 {
254 	(void)handle;
255 	(void)buf;
256 	(void)len;
257 	(void)ms;
258 
259 	abort();
260 	/* NOTREACHED */
261 }
262 
263 static int
264 dummy_write(void *handle, const unsigned char *buf, size_t len)
265 {
266 	(void)handle;
267 	(void)buf;
268 	(void)len;
269 
270 	abort();
271 	/* NOTREACHED */
272 }
273 
274 static fido_cred_t *
275 alloc_cred(void)
276 {
277 	fido_cred_t *c;
278 
279 	c = fido_cred_new();
280 	assert(c != NULL);
281 
282 	return (c);
283 }
284 
285 static void
286 free_cred(fido_cred_t *c)
287 {
288 	fido_cred_free(&c);
289 	assert(c == NULL);
290 }
291 
292 static fido_dev_t *
293 alloc_dev(void)
294 {
295 	fido_dev_t *d;
296 
297 	d = fido_dev_new();
298 	assert(d != NULL);
299 
300 	return (d);
301 }
302 
303 static void
304 free_dev(fido_dev_t *d)
305 {
306 	fido_dev_free(&d);
307 	assert(d == NULL);
308 }
309 
310 static void
311 empty_cred(void)
312 {
313 	fido_cred_t *c;
314 	fido_dev_t *d;
315 	fido_dev_io_t io_f;
316 
317 	c = alloc_cred();
318 	assert(fido_cred_authdata_len(c) == 0);
319 	assert(fido_cred_authdata_ptr(c) == NULL);
320 	assert(fido_cred_clientdata_hash_len(c) == 0);
321 	assert(fido_cred_clientdata_hash_ptr(c) == NULL);
322 	assert(fido_cred_flags(c) == 0);
323 	assert(fido_cred_fmt(c) == NULL);
324 	assert(fido_cred_id_len(c) == 0);
325 	assert(fido_cred_id_ptr(c) == NULL);
326 	assert(fido_cred_pubkey_len(c) == 0);
327 	assert(fido_cred_pubkey_ptr(c) == NULL);
328 	assert(fido_cred_rp_id(c) == NULL);
329 	assert(fido_cred_rp_name(c) == NULL);
330 	assert(fido_cred_sig_len(c) == 0);
331 	assert(fido_cred_sig_ptr(c) == NULL);
332 	assert(fido_cred_x5c_len(c) == 0);
333 	assert(fido_cred_x5c_ptr(c) == NULL);
334 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
335 
336 	memset(&io_f, 0, sizeof(io_f));
337 
338 	io_f.open = dummy_open;
339 	io_f.close = dummy_close;
340 	io_f.read = dummy_read;
341 	io_f.write = dummy_write;
342 
343 	d = alloc_dev();
344 
345 	fido_dev_force_u2f(d);
346 	assert(fido_dev_set_io_functions(d, &io_f) == FIDO_OK);
347 	assert(fido_dev_make_cred(d, c, NULL) == FIDO_ERR_INVALID_ARGUMENT);
348 	assert(fido_dev_make_cred(d, c, "") == FIDO_ERR_UNSUPPORTED_OPTION);
349 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
350 
351 	fido_dev_force_fido2(d);
352 	assert(fido_dev_set_io_functions(d, &io_f) == FIDO_OK);
353 	assert(fido_dev_make_cred(d, c, NULL) == FIDO_ERR_INVALID_ARGUMENT);
354 	assert(fido_dev_make_cred(d, c, "") == FIDO_ERR_INVALID_ARGUMENT);
355 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
356 
357 	free_cred(c);
358 	free_dev(d);
359 }
360 
361 static void
362 valid_cred(void)
363 {
364 	fido_cred_t *c;
365 
366 	c = alloc_cred();
367 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
368 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
369 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
370 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
371 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
372 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
373 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
374 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
375 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
376 	assert(fido_cred_verify(c) == FIDO_OK);
377 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
378 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
379 	assert(fido_cred_id_len(c) == sizeof(id));
380 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
381 	free_cred(c);
382 }
383 
384 static void
385 no_cdh(void)
386 {
387 	fido_cred_t *c;
388 
389 	c = alloc_cred();
390 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
391 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
392 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
393 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
394 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
395 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
396 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
397 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
398 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
399 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
400 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
401 	assert(fido_cred_id_len(c) == sizeof(id));
402 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
403 	free_cred(c);
404 }
405 
406 static void
407 no_rp_id(void)
408 {
409 	fido_cred_t *c;
410 
411 	c = alloc_cred();
412 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
413 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
414 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
415 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
416 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
417 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
418 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
419 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
420 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
421 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
422 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
423 	assert(fido_cred_id_len(c) == sizeof(id));
424 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
425 	free_cred(c);
426 }
427 
428 static void
429 no_rp_name(void)
430 {
431 	fido_cred_t *c;
432 
433 	c = alloc_cred();
434 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
435 	assert(fido_cred_set_rp(c, rp_id, NULL) == FIDO_OK);
436 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
437 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
438 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
439 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
440 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
441 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
442 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
443 	assert(fido_cred_verify(c) == FIDO_OK);
444 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
445 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
446 	assert(fido_cred_id_len(c) == sizeof(id));
447 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
448 	free_cred(c);
449 }
450 
451 static void
452 no_authdata(void)
453 {
454 	fido_cred_t *c;
455 
456 	c = alloc_cred();
457 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
458 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
459 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
460 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
461 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
462 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
463 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
464 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
465 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
466 	assert(fido_cred_pubkey_len(c) == 0);
467 	assert(fido_cred_pubkey_ptr(c) == NULL);
468 	assert(fido_cred_id_len(c) == 0);
469 	assert(fido_cred_id_ptr(c) == NULL);
470 	free_cred(c);
471 }
472 
473 static void
474 no_x509(void)
475 {
476 	fido_cred_t *c;
477 
478 	c = alloc_cred();
479 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
480 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
481 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
482 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
483 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
484 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
485 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
486 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
487 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
488 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
489 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
490 	assert(fido_cred_id_len(c) == sizeof(id));
491 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
492 	free_cred(c);
493 }
494 
495 static void
496 no_sig(void)
497 {
498 	fido_cred_t *c;
499 
500 	c = alloc_cred();
501 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
502 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
503 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
504 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
505 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
506 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
507 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
508 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
509 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
510 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
511 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
512 	assert(fido_cred_id_len(c) == sizeof(id));
513 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
514 	free_cred(c);
515 }
516 
517 static void
518 no_fmt(void)
519 {
520 	fido_cred_t *c;
521 
522 	c = alloc_cred();
523 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
524 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
525 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
526 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
527 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
528 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
529 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
530 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
531 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
532 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
533 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
534 	assert(fido_cred_id_len(c) == sizeof(id));
535 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
536 	free_cred(c);
537 }
538 
539 static void
540 wrong_options(void)
541 {
542 	fido_cred_t *c;
543 
544 	c = alloc_cred();
545 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
546 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
547 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
548 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
549 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
550 	assert(fido_cred_set_uv(c, FIDO_OPT_TRUE) == FIDO_OK);
551 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
552 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
553 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
554 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_PARAM);
555 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
556 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
557 	assert(fido_cred_id_len(c) == sizeof(id));
558 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
559 	free_cred(c);
560 }
561 
562 static void
563 junk_cdh(void)
564 {
565 	fido_cred_t *c;
566 	unsigned char *junk;
567 
568 	junk = malloc(sizeof(cdh));
569 	assert(junk != NULL);
570 	memcpy(junk, cdh, sizeof(cdh));
571 	junk[0] = ~junk[0];
572 
573 	c = alloc_cred();
574 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
575 	assert(fido_cred_set_clientdata_hash(c, junk, sizeof(cdh)) == FIDO_OK);
576 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
577 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
578 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
579 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
580 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
581 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
582 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
583 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG);
584 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
585 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
586 	assert(fido_cred_id_len(c) == sizeof(id));
587 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
588 	free_cred(c);
589 	free(junk);
590 }
591 
592 static void
593 junk_rp_id(void)
594 {
595 	fido_cred_t *c;
596 
597 	c = alloc_cred();
598 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
599 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
600 	assert(fido_cred_set_rp(c, "potato", rp_name) == FIDO_OK);
601 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
602 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
603 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
604 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
605 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
606 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
607 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_PARAM);
608 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
609 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
610 	assert(fido_cred_id_len(c) == sizeof(id));
611 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
612 	free_cred(c);
613 }
614 
615 static void
616 junk_rp_name(void)
617 {
618 	fido_cred_t *c;
619 
620 	c = alloc_cred();
621 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
622 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
623 	assert(fido_cred_set_rp(c, rp_id, "potato") == FIDO_OK);
624 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
625 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
626 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
627 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
628 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
629 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
630 	assert(fido_cred_verify(c) == FIDO_OK);
631 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
632 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
633 	assert(fido_cred_id_len(c) == sizeof(id));
634 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
635 	free_cred(c);
636 }
637 
638 static void
639 junk_authdata(void)
640 {
641 	fido_cred_t *c;
642 	unsigned char *junk;
643 
644 	junk = malloc(sizeof(authdata));
645 	assert(junk != NULL);
646 	memcpy(junk, authdata, sizeof(authdata));
647 	junk[0] = ~junk[0];
648 
649 	c = alloc_cred();
650 	assert(fido_cred_set_authdata(c, junk,
651 	    sizeof(authdata)) == FIDO_ERR_INVALID_ARGUMENT);
652 	assert(fido_cred_authdata_len(c) == 0);
653 	assert(fido_cred_authdata_ptr(c) == NULL);
654 	assert(fido_cred_flags(c) == 0);
655 	assert(fido_cred_fmt(c) == NULL);
656 	assert(fido_cred_id_len(c) == 0);
657 	assert(fido_cred_id_ptr(c) == NULL);
658 	assert(fido_cred_pubkey_len(c) == 0);
659 	assert(fido_cred_pubkey_ptr(c) == NULL);
660 	assert(fido_cred_rp_id(c) == NULL);
661 	assert(fido_cred_rp_name(c) == NULL);
662 	assert(fido_cred_sig_len(c) == 0);
663 	assert(fido_cred_sig_ptr(c) == NULL);
664 	assert(fido_cred_x5c_len(c) == 0);
665 	assert(fido_cred_x5c_ptr(c) == NULL);
666 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
667 	free_cred(c);
668 	free(junk);
669 }
670 
671 static void
672 junk_sig(void)
673 {
674 	fido_cred_t *c;
675 	unsigned char *junk;
676 
677 	junk = malloc(sizeof(sig));
678 	assert(junk != NULL);
679 	memcpy(junk, sig, sizeof(sig));
680 	junk[0] = ~junk[0];
681 
682 	c = alloc_cred();
683 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
684 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
685 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
686 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
687 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
688 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
689 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
690 	assert(fido_cred_set_sig(c, junk, sizeof(sig)) == FIDO_OK);
691 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
692 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG);
693 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
694 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
695 	assert(fido_cred_id_len(c) == sizeof(id));
696 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
697 	free_cred(c);
698 	free(junk);
699 }
700 
701 static void
702 junk_x509(void)
703 {
704 	fido_cred_t *c;
705 	unsigned char *junk;
706 
707 	junk = malloc(sizeof(x509));
708 	assert(junk != NULL);
709 	memcpy(junk, x509, sizeof(x509));
710 	junk[0] = ~junk[0];
711 
712 	c = alloc_cred();
713 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
714 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
715 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
716 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
717 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
718 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
719 	assert(fido_cred_set_x509(c, junk, sizeof(x509)) == FIDO_OK);
720 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
721 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
722 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG);
723 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
724 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
725 	assert(fido_cred_id_len(c) == sizeof(id));
726 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
727 	free_cred(c);
728 	free(junk);
729 }
730 
731 /* github issue #6 */
732 static void
733 invalid_type(void)
734 {
735 	fido_cred_t *c;
736 
737 	c = alloc_cred();
738 	assert(fido_cred_set_type(c, COSE_RS256) == FIDO_OK);
739 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
740 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
741 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_ERR_INVALID_ARGUMENT);
742 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
743 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
744 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
745 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
746 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
747 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
748 	assert(fido_cred_pubkey_len(c) == 0);
749 	assert(fido_cred_pubkey_ptr(c) == NULL);
750 	assert(fido_cred_id_len(c) == 0);
751 	assert(fido_cred_id_ptr(c) == NULL);
752 	free_cred(c);
753 }
754 
755 /* cbor_serialize_alloc misuse */
756 static void
757 bad_cbor_serialize(void)
758 {
759 	fido_cred_t *c;
760 
761 	c = alloc_cred();
762 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
763 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
764 	assert(fido_cred_authdata_len(c) == sizeof(authdata));
765 	free_cred(c);
766 }
767 
768 static void
769 duplicate_keys(void)
770 {
771 	fido_cred_t *c;
772 
773 	c = alloc_cred();
774 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
775 	assert(fido_cred_set_authdata(c, authdata_dupkeys,
776 	    sizeof(authdata_dupkeys)) == FIDO_ERR_INVALID_ARGUMENT);
777 	free_cred(c);
778 }
779 
780 static void
781 unsorted_keys(void)
782 {
783 	fido_cred_t *c;
784 
785 	c = alloc_cred();
786 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
787 	assert(fido_cred_set_authdata(c, authdata_unsorted_keys,
788 	    sizeof(authdata_unsorted_keys)) == FIDO_ERR_INVALID_ARGUMENT);
789 	free_cred(c);
790 }
791 
792 int
793 main(void)
794 {
795 	fido_init(0);
796 
797 	empty_cred();
798 	valid_cred();
799 	no_cdh();
800 	no_rp_id();
801 	no_rp_name();
802 	no_authdata();
803 	no_x509();
804 	no_sig();
805 	no_fmt();
806 	junk_cdh();
807 	junk_rp_id();
808 	junk_rp_name();
809 	junk_authdata();
810 	junk_x509();
811 	junk_sig();
812 	wrong_options();
813 	invalid_type();
814 	bad_cbor_serialize();
815 	duplicate_keys();
816 	unsorted_keys();
817 
818 	exit(0);
819 }
820