xref: /src/contrib/libfido2/regress/cred.c (revision f540a43052c12c76d3453ead881248d5467a1ab0)
1 /*
2  * Copyright (c) 2018-2021 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 <cbor.h>
9 #include <fido.h>
10 #include <string.h>
11 
12 #define FAKE_DEV_HANDLE	((void *)0xdeadbeef)
13 
14 static const unsigned char cdh[32] = {
15 	0xf9, 0x64, 0x57, 0xe7, 0x2d, 0x97, 0xf6, 0xbb,
16 	0xdd, 0xd7, 0xfb, 0x06, 0x37, 0x62, 0xea, 0x26,
17 	0x20, 0x44, 0x8e, 0x69, 0x7c, 0x03, 0xf2, 0x31,
18 	0x2f, 0x99, 0xdc, 0xaf, 0x3e, 0x8a, 0x91, 0x6b,
19 };
20 
21 static const unsigned char authdata[198] = {
22 	0x58, 0xc4, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e,
23 	0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76,
24 	0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86,
25 	0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d,
26 	0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8,
27 	0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80,
28 	0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00,
29 	0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde,
30 	0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d,
31 	0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e,
32 	0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda,
33 	0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83,
34 	0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76,
35 	0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6,
36 	0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f,
37 	0x25, 0xa5, 0x01, 0x02, 0x03, 0x26, 0x20, 0x01,
38 	0x21, 0x58, 0x20, 0x17, 0x5b, 0x27, 0xa6, 0x56,
39 	0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55, 0x42, 0x78,
40 	0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd, 0x1b, 0xb9,
41 	0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22, 0x64, 0xf5,
42 	0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20, 0x87, 0x5f,
43 	0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f, 0xeb, 0xe3,
44 	0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6, 0x1c, 0x31,
45 	0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1, 0xfe, 0x5d,
46 	0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2,
47 };
48 
49 static const unsigned char authdata_dupkeys[200] = {
50 	0x58, 0xc6, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e,
51 	0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76,
52 	0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86,
53 	0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d,
54 	0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8,
55 	0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80,
56 	0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00,
57 	0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde,
58 	0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d,
59 	0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e,
60 	0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda,
61 	0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83,
62 	0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76,
63 	0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6,
64 	0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f,
65 	0x25, 0xa6, 0x01, 0x02, 0x01, 0x02, 0x03, 0x26,
66 	0x20, 0x01, 0x21, 0x58, 0x20, 0x17, 0x5b, 0x27,
67 	0xa6, 0x56, 0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55,
68 	0x42, 0x78, 0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd,
69 	0x1b, 0xb9, 0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22,
70 	0x64, 0xf5, 0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20,
71 	0x87, 0x5f, 0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f,
72 	0xeb, 0xe3, 0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6,
73 	0x1c, 0x31, 0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1,
74 	0xfe, 0x5d, 0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2,
75 };
76 
77 static const unsigned char authdata_unsorted_keys[198] = {
78 	0x58, 0xc4, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e,
79 	0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76,
80 	0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86,
81 	0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d,
82 	0x97, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xf8,
83 	0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15, 0x80,
84 	0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d, 0x00,
85 	0x40, 0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde,
86 	0xc5, 0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d,
87 	0x53, 0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e,
88 	0x7f, 0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda,
89 	0x68, 0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83,
90 	0x2c, 0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76,
91 	0x90, 0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6,
92 	0x3c, 0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f,
93 	0x25, 0xa5, 0x03, 0x26, 0x01, 0x02, 0x20, 0x01,
94 	0x21, 0x58, 0x20, 0x17, 0x5b, 0x27, 0xa6, 0x56,
95 	0xb2, 0x26, 0x0c, 0x26, 0x0c, 0x55, 0x42, 0x78,
96 	0x17, 0x5d, 0x4c, 0xf8, 0xa2, 0xfd, 0x1b, 0xb9,
97 	0x54, 0xdf, 0xd5, 0xeb, 0xbf, 0x22, 0x64, 0xf5,
98 	0x21, 0x9a, 0xc6, 0x22, 0x58, 0x20, 0x87, 0x5f,
99 	0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f, 0xeb, 0xe3,
100 	0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6, 0x1c, 0x31,
101 	0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1, 0xfe, 0x5d,
102 	0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2,
103 };
104 
105 const unsigned char authdata_tpm[362] = {
106 	0x59, 0x01, 0x67, 0x49, 0x96, 0x0d, 0xe5, 0x88,
107 	0x0e, 0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64,
108 	0x76, 0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2,
109 	0x86, 0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83,
110 	0x1d, 0x97, 0x63, 0x45, 0x00, 0x00, 0x00, 0x00,
111 	0x08, 0x98, 0x70, 0x58, 0xca, 0xdc, 0x4b, 0x81,
112 	0xb6, 0xe1, 0x30, 0xde, 0x50, 0xdc, 0xbe, 0x96,
113 	0x00, 0x20, 0x89, 0x99, 0x6d, 0x5a, 0x00, 0x29,
114 	0xe5, 0x3e, 0x6a, 0x1c, 0x72, 0x6d, 0x71, 0x4a,
115 	0x4f, 0x03, 0x9b, 0x68, 0x17, 0xdb, 0x29, 0x1a,
116 	0x6b, 0x02, 0x6c, 0x26, 0xf9, 0xbd, 0xc3, 0x0e,
117 	0x38, 0x1a, 0xa4, 0x01, 0x03, 0x03, 0x39, 0x01,
118 	0x00, 0x20, 0x59, 0x01, 0x00, 0xc5, 0xb6, 0x9c,
119 	0x06, 0x1d, 0xcf, 0xb9, 0xf2, 0x5e, 0x99, 0x7d,
120 	0x6d, 0x73, 0xd8, 0x36, 0xc1, 0x4a, 0x90, 0x05,
121 	0x4d, 0x82, 0x57, 0xc1, 0xb6, 0x6a, 0xd1, 0x43,
122 	0x03, 0x85, 0xf8, 0x52, 0x4f, 0xd2, 0x27, 0x91,
123 	0x0b, 0xb5, 0x93, 0xa0, 0x68, 0xf8, 0x80, 0x1b,
124 	0xaa, 0x65, 0x97, 0x45, 0x11, 0x86, 0x34, 0xd6,
125 	0x67, 0xf8, 0xd5, 0x12, 0x79, 0x84, 0xee, 0x70,
126 	0x99, 0x00, 0x63, 0xa8, 0xb4, 0x43, 0x0b, 0x4c,
127 	0x57, 0x4a, 0xd6, 0x9b, 0x75, 0x63, 0x8a, 0x46,
128 	0x57, 0xdb, 0x14, 0xc8, 0x71, 0xd1, 0xb3, 0x07,
129 	0x68, 0x58, 0xbc, 0x55, 0x84, 0x80, 0x2a, 0xd2,
130 	0x36, 0x9f, 0xc1, 0x64, 0xa0, 0x11, 0x4b, 0xc9,
131 	0x32, 0x31, 0x3a, 0xd6, 0x87, 0x26, 0x1a, 0x3a,
132 	0x78, 0x3d, 0x89, 0xdb, 0x00, 0x28, 0x3b, 0xae,
133 	0x2b, 0x1b, 0x56, 0xe2, 0x8c, 0x4c, 0x63, 0xac,
134 	0x6e, 0x6c, 0xf7, 0xb5, 0x7d, 0x4d, 0x0b, 0x9f,
135 	0x06, 0xa0, 0x10, 0x35, 0x38, 0x20, 0x4d, 0xcc,
136 	0x07, 0xd7, 0x00, 0x4e, 0x86, 0xba, 0xfe, 0x8b,
137 	0xe4, 0x3f, 0x4a, 0xd6, 0xca, 0xbf, 0x67, 0x40,
138 	0x1a, 0xa4, 0xda, 0x82, 0x52, 0x15, 0xb8, 0x14,
139 	0x3a, 0x7c, 0xa9, 0x02, 0xc1, 0x01, 0x69, 0xc6,
140 	0x51, 0xd4, 0xbc, 0x1f, 0x95, 0xb2, 0xee, 0x1f,
141 	0xdd, 0xb5, 0x73, 0x16, 0x5e, 0x29, 0x3f, 0x47,
142 	0xac, 0x65, 0xfb, 0x63, 0x5c, 0xb9, 0xc8, 0x13,
143 	0x2d, 0xec, 0x85, 0xde, 0x71, 0x0d, 0x84, 0x93,
144 	0x74, 0x76, 0x91, 0xdd, 0x1d, 0x6d, 0x3d, 0xc7,
145 	0x36, 0x19, 0x19, 0x86, 0xde, 0x7c, 0xca, 0xd6,
146 	0xc6, 0x65, 0x7e, 0x4b, 0x24, 0x9c, 0xce, 0x92,
147 	0x6b, 0x1c, 0xe0, 0xa0, 0xa9, 0x6c, 0xc3, 0xed,
148 	0x4f, 0x2a, 0x54, 0x07, 0x00, 0x32, 0x5e, 0x1b,
149 	0x94, 0x37, 0xcd, 0xe2, 0x32, 0xa8, 0xd5, 0x2c,
150 	0xfb, 0x03, 0x9d, 0x79, 0xdf, 0x21, 0x43, 0x01,
151 	0x00, 0x01
152 };
153 
154 static const unsigned char x509[742] = {
155 	0x30, 0x82, 0x02, 0xe2, 0x30, 0x81, 0xcb, 0x02,
156 	0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
157 	0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
158 	0x00, 0x30, 0x1d, 0x31, 0x1b, 0x30, 0x19, 0x06,
159 	0x03, 0x55, 0x04, 0x03, 0x13, 0x12, 0x59, 0x75,
160 	0x62, 0x69, 0x63, 0x6f, 0x20, 0x55, 0x32, 0x46,
161 	0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41,
162 	0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x35,
163 	0x31, 0x35, 0x31, 0x32, 0x35, 0x38, 0x35, 0x34,
164 	0x5a, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x36, 0x31,
165 	0x34, 0x31, 0x32, 0x35, 0x38, 0x35, 0x34, 0x5a,
166 	0x30, 0x1d, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03,
167 	0x55, 0x04, 0x03, 0x13, 0x12, 0x59, 0x75, 0x62,
168 	0x69, 0x63, 0x6f, 0x20, 0x55, 0x32, 0x46, 0x20,
169 	0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x45, 0x30,
170 	0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48,
171 	0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86,
172 	0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42,
173 	0x00, 0x04, 0xdb, 0x0a, 0xdb, 0xf5, 0x21, 0xc7,
174 	0x5c, 0xce, 0x63, 0xdc, 0xa6, 0xe1, 0xe8, 0x25,
175 	0x06, 0x0d, 0x94, 0xe6, 0x27, 0x54, 0x19, 0x4f,
176 	0x9d, 0x24, 0xaf, 0x26, 0x1a, 0xbe, 0xad, 0x99,
177 	0x44, 0x1f, 0x95, 0xa3, 0x71, 0x91, 0x0a, 0x3a,
178 	0x20, 0xe7, 0x3e, 0x91, 0x5e, 0x13, 0xe8, 0xbe,
179 	0x38, 0x05, 0x7a, 0xd5, 0x7a, 0xa3, 0x7e, 0x76,
180 	0x90, 0x8f, 0xaf, 0xe2, 0x8a, 0x94, 0xb6, 0x30,
181 	0xeb, 0x9d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
182 	0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
183 	0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x95, 0x40,
184 	0x6b, 0x50, 0x61, 0x7d, 0xad, 0x84, 0xa3, 0xb4,
185 	0xeb, 0x88, 0x0f, 0xe3, 0x30, 0x0f, 0x2d, 0xa2,
186 	0x0a, 0x00, 0xd9, 0x25, 0x04, 0xee, 0x72, 0xfa,
187 	0x67, 0xdf, 0x58, 0x51, 0x0f, 0x0b, 0x47, 0x02,
188 	0x9c, 0x3e, 0x41, 0x29, 0x4a, 0x93, 0xac, 0x29,
189 	0x85, 0x89, 0x2d, 0xa4, 0x7a, 0x81, 0x32, 0x28,
190 	0x57, 0x71, 0x01, 0xef, 0xa8, 0x42, 0x88, 0x16,
191 	0x96, 0x37, 0x91, 0xd5, 0xdf, 0xe0, 0x8f, 0xc9,
192 	0x3c, 0x8d, 0xb0, 0xcd, 0x89, 0x70, 0x82, 0xec,
193 	0x79, 0xd3, 0xc6, 0x78, 0x73, 0x29, 0x32, 0xe5,
194 	0xab, 0x6c, 0xbd, 0x56, 0x9f, 0xd5, 0x45, 0x91,
195 	0xce, 0xc1, 0xdd, 0x8d, 0x64, 0xdc, 0xe9, 0x9c,
196 	0x1f, 0x5e, 0x3c, 0xd2, 0xaf, 0x51, 0xa5, 0x82,
197 	0x18, 0xaf, 0xe0, 0x37, 0xe7, 0x32, 0x9e, 0x76,
198 	0x05, 0x77, 0x02, 0x7b, 0xe6, 0x24, 0xa0, 0x31,
199 	0x56, 0x1b, 0xfd, 0x19, 0xc5, 0x71, 0xd3, 0xf0,
200 	0x9e, 0xc0, 0x73, 0x05, 0x4e, 0xbc, 0x85, 0xb8,
201 	0x53, 0x9e, 0xef, 0xc5, 0xbc, 0x9c, 0x56, 0xa3,
202 	0xba, 0xd9, 0x27, 0x6a, 0xbb, 0xa9, 0x7a, 0x40,
203 	0xd7, 0x47, 0x8b, 0x55, 0x72, 0x6b, 0xe3, 0xfe,
204 	0x28, 0x49, 0x71, 0x24, 0xf4, 0x8f, 0xf4, 0x20,
205 	0x81, 0xea, 0x38, 0xff, 0x7c, 0x0a, 0x4f, 0xdf,
206 	0x02, 0x82, 0x39, 0x81, 0x82, 0x3b, 0xca, 0x09,
207 	0xdd, 0xca, 0xaa, 0x0f, 0x27, 0xf5, 0xa4, 0x83,
208 	0x55, 0x6c, 0x9a, 0x39, 0x9b, 0x15, 0x3a, 0x16,
209 	0x63, 0xdc, 0x5b, 0xf9, 0xac, 0x5b, 0xbc, 0xf7,
210 	0x9f, 0xbe, 0x0f, 0x8a, 0xa2, 0x3c, 0x31, 0x13,
211 	0xa3, 0x32, 0x48, 0xca, 0x58, 0x87, 0xf8, 0x7b,
212 	0xa0, 0xa1, 0x0a, 0x6a, 0x60, 0x96, 0x93, 0x5f,
213 	0x5d, 0x26, 0x9e, 0x63, 0x1d, 0x09, 0xae, 0x9a,
214 	0x41, 0xe5, 0xbd, 0x08, 0x47, 0xfe, 0xe5, 0x09,
215 	0x9b, 0x20, 0xfd, 0x12, 0xe2, 0xe6, 0x40, 0x7f,
216 	0xba, 0x4a, 0x61, 0x33, 0x66, 0x0d, 0x0e, 0x73,
217 	0xdb, 0xb0, 0xd5, 0xa2, 0x9a, 0x9a, 0x17, 0x0d,
218 	0x34, 0x30, 0x85, 0x6a, 0x42, 0x46, 0x9e, 0xff,
219 	0x34, 0x8f, 0x5f, 0x87, 0x6c, 0x35, 0xe7, 0xa8,
220 	0x4d, 0x35, 0xeb, 0xc1, 0x41, 0xaa, 0x8a, 0xd2,
221 	0xda, 0x19, 0xaa, 0x79, 0xa2, 0x5f, 0x35, 0x2c,
222 	0xa0, 0xfd, 0x25, 0xd3, 0xf7, 0x9d, 0x25, 0x18,
223 	0x2d, 0xfa, 0xb4, 0xbc, 0xbb, 0x07, 0x34, 0x3c,
224 	0x8d, 0x81, 0xbd, 0xf4, 0xe9, 0x37, 0xdb, 0x39,
225 	0xe9, 0xd1, 0x45, 0x5b, 0x20, 0x41, 0x2f, 0x2d,
226 	0x27, 0x22, 0xdc, 0x92, 0x74, 0x8a, 0x92, 0xd5,
227 	0x83, 0xfd, 0x09, 0xfb, 0x13, 0x9b, 0xe3, 0x39,
228 	0x7a, 0x6b, 0x5c, 0xfa, 0xe6, 0x76, 0x9e, 0xe0,
229 	0xe4, 0xe3, 0xef, 0xad, 0xbc, 0xfd, 0x42, 0x45,
230 	0x9a, 0xd4, 0x94, 0xd1, 0x7e, 0x8d, 0xa7, 0xd8,
231 	0x05, 0xd5, 0xd3, 0x62, 0xcf, 0x15, 0xcf, 0x94,
232 	0x7d, 0x1f, 0x5b, 0x58, 0x20, 0x44, 0x20, 0x90,
233 	0x71, 0xbe, 0x66, 0xe9, 0x9a, 0xab, 0x74, 0x32,
234 	0x70, 0x53, 0x1d, 0x69, 0xed, 0x87, 0x66, 0xf4,
235 	0x09, 0x4f, 0xca, 0x25, 0x30, 0xc2, 0x63, 0x79,
236 	0x00, 0x3c, 0xb1, 0x9b, 0x39, 0x3f, 0x00, 0xe0,
237 	0xa8, 0x88, 0xef, 0x7a, 0x51, 0x5b, 0xe7, 0xbd,
238 	0x49, 0x64, 0xda, 0x41, 0x7b, 0x24, 0xc3, 0x71,
239 	0x22, 0xfd, 0xd1, 0xd1, 0x20, 0xb3, 0x3f, 0x97,
240 	0xd3, 0x97, 0xb2, 0xaa, 0x18, 0x1c, 0x9e, 0x03,
241 	0x77, 0x7b, 0x5b, 0x7e, 0xf9, 0xa3, 0xa0, 0xd6,
242 	0x20, 0x81, 0x2c, 0x38, 0x8f, 0x9d, 0x25, 0xde,
243 	0xe9, 0xc8, 0xf5, 0xdd, 0x6a, 0x47, 0x9c, 0x65,
244 	0x04, 0x5a, 0x56, 0xe6, 0xc2, 0xeb, 0xf2, 0x02,
245 	0x97, 0xe1, 0xb9, 0xd8, 0xe1, 0x24, 0x76, 0x9f,
246 	0x23, 0x62, 0x39, 0x03, 0x4b, 0xc8, 0xf7, 0x34,
247 	0x07, 0x49, 0xd6, 0xe7, 0x4d, 0x9a,
248 };
249 
250 const unsigned char sig[70] = {
251 	0x30, 0x44, 0x02, 0x20, 0x54, 0x92, 0x28, 0x3b,
252 	0x83, 0x33, 0x47, 0x56, 0x68, 0x79, 0xb2, 0x0c,
253 	0x84, 0x80, 0xcc, 0x67, 0x27, 0x8b, 0xfa, 0x48,
254 	0x43, 0x0d, 0x3c, 0xb4, 0x02, 0x36, 0x87, 0x97,
255 	0x3e, 0xdf, 0x2f, 0x65, 0x02, 0x20, 0x1b, 0x56,
256 	0x17, 0x06, 0xe2, 0x26, 0x0f, 0x6a, 0xe9, 0xa9,
257 	0x70, 0x99, 0x62, 0xeb, 0x3a, 0x04, 0x1a, 0xc4,
258 	0xa7, 0x03, 0x28, 0x56, 0x7c, 0xed, 0x47, 0x08,
259 	0x68, 0x73, 0x6a, 0xb6, 0x89, 0x0d,
260 };
261 
262 const unsigned char pubkey[64] = {
263 	0x17, 0x5b, 0x27, 0xa6, 0x56, 0xb2, 0x26, 0x0c,
264 	0x26, 0x0c, 0x55, 0x42, 0x78, 0x17, 0x5d, 0x4c,
265 	0xf8, 0xa2, 0xfd, 0x1b, 0xb9, 0x54, 0xdf, 0xd5,
266 	0xeb, 0xbf, 0x22, 0x64, 0xf5, 0x21, 0x9a, 0xc6,
267 	0x87, 0x5f, 0x90, 0xe6, 0xfd, 0x71, 0x27, 0x9f,
268 	0xeb, 0xe3, 0x03, 0x44, 0xbc, 0x8d, 0x49, 0xc6,
269 	0x1c, 0x31, 0x3b, 0x72, 0xae, 0xd4, 0x53, 0xb1,
270 	0xfe, 0x5d, 0xe1, 0x30, 0xfc, 0x2b, 0x1e, 0xd2,
271 };
272 
273 const unsigned char pubkey_tpm[259] = {
274 	0xc5, 0xb6, 0x9c, 0x06, 0x1d, 0xcf, 0xb9, 0xf2,
275 	0x5e, 0x99, 0x7d, 0x6d, 0x73, 0xd8, 0x36, 0xc1,
276 	0x4a, 0x90, 0x05, 0x4d, 0x82, 0x57, 0xc1, 0xb6,
277 	0x6a, 0xd1, 0x43, 0x03, 0x85, 0xf8, 0x52, 0x4f,
278 	0xd2, 0x27, 0x91, 0x0b, 0xb5, 0x93, 0xa0, 0x68,
279 	0xf8, 0x80, 0x1b, 0xaa, 0x65, 0x97, 0x45, 0x11,
280 	0x86, 0x34, 0xd6, 0x67, 0xf8, 0xd5, 0x12, 0x79,
281 	0x84, 0xee, 0x70, 0x99, 0x00, 0x63, 0xa8, 0xb4,
282 	0x43, 0x0b, 0x4c, 0x57, 0x4a, 0xd6, 0x9b, 0x75,
283 	0x63, 0x8a, 0x46, 0x57, 0xdb, 0x14, 0xc8, 0x71,
284 	0xd1, 0xb3, 0x07, 0x68, 0x58, 0xbc, 0x55, 0x84,
285 	0x80, 0x2a, 0xd2, 0x36, 0x9f, 0xc1, 0x64, 0xa0,
286 	0x11, 0x4b, 0xc9, 0x32, 0x31, 0x3a, 0xd6, 0x87,
287 	0x26, 0x1a, 0x3a, 0x78, 0x3d, 0x89, 0xdb, 0x00,
288 	0x28, 0x3b, 0xae, 0x2b, 0x1b, 0x56, 0xe2, 0x8c,
289 	0x4c, 0x63, 0xac, 0x6e, 0x6c, 0xf7, 0xb5, 0x7d,
290 	0x4d, 0x0b, 0x9f, 0x06, 0xa0, 0x10, 0x35, 0x38,
291 	0x20, 0x4d, 0xcc, 0x07, 0xd7, 0x00, 0x4e, 0x86,
292 	0xba, 0xfe, 0x8b, 0xe4, 0x3f, 0x4a, 0xd6, 0xca,
293 	0xbf, 0x67, 0x40, 0x1a, 0xa4, 0xda, 0x82, 0x52,
294 	0x15, 0xb8, 0x14, 0x3a, 0x7c, 0xa9, 0x02, 0xc1,
295 	0x01, 0x69, 0xc6, 0x51, 0xd4, 0xbc, 0x1f, 0x95,
296 	0xb2, 0xee, 0x1f, 0xdd, 0xb5, 0x73, 0x16, 0x5e,
297 	0x29, 0x3f, 0x47, 0xac, 0x65, 0xfb, 0x63, 0x5c,
298 	0xb9, 0xc8, 0x13, 0x2d, 0xec, 0x85, 0xde, 0x71,
299 	0x0d, 0x84, 0x93, 0x74, 0x76, 0x91, 0xdd, 0x1d,
300 	0x6d, 0x3d, 0xc7, 0x36, 0x19, 0x19, 0x86, 0xde,
301 	0x7c, 0xca, 0xd6, 0xc6, 0x65, 0x7e, 0x4b, 0x24,
302 	0x9c, 0xce, 0x92, 0x6b, 0x1c, 0xe0, 0xa0, 0xa9,
303 	0x6c, 0xc3, 0xed, 0x4f, 0x2a, 0x54, 0x07, 0x00,
304 	0x32, 0x5e, 0x1b, 0x94, 0x37, 0xcd, 0xe2, 0x32,
305 	0xa8, 0xd5, 0x2c, 0xfb, 0x03, 0x9d, 0x79, 0xdf,
306 	0x01, 0x00, 0x01,
307 };
308 
309 const unsigned char id[64] = {
310 	0x53, 0xfb, 0xdf, 0xaa, 0xce, 0x63, 0xde, 0xc5,
311 	0xfe, 0x47, 0xe6, 0x52, 0xeb, 0xf3, 0x5d, 0x53,
312 	0xa8, 0xbf, 0x9d, 0xd6, 0x09, 0x6b, 0x5e, 0x7f,
313 	0xe0, 0x0d, 0x51, 0x30, 0x85, 0x6a, 0xda, 0x68,
314 	0x70, 0x85, 0xb0, 0xdb, 0x08, 0x0b, 0x83, 0x2c,
315 	0xef, 0x44, 0xe2, 0x36, 0x88, 0xee, 0x76, 0x90,
316 	0x6e, 0x7b, 0x50, 0x3e, 0x9a, 0xa0, 0xd6, 0x3c,
317 	0x34, 0xe3, 0x83, 0xe7, 0xd1, 0xbd, 0x9f, 0x25,
318 };
319 
320 const unsigned char id_tpm[32] = {
321 	0x89, 0x99, 0x6d, 0x5a, 0x00, 0x29, 0xe5, 0x3e,
322 	0x6a, 0x1c, 0x72, 0x6d, 0x71, 0x4a, 0x4f, 0x03,
323 	0x9b, 0x68, 0x17, 0xdb, 0x29, 0x1a, 0x6b, 0x02,
324 	0x6c, 0x26, 0xf9, 0xbd, 0xc3, 0x0e, 0x38, 0x1a
325 };
326 
327 const unsigned char attstmt_tpm[4034] = {
328 	0xa6, 0x63, 0x61, 0x6c, 0x67, 0x39, 0xff, 0xfe,
329 	0x63, 0x73, 0x69, 0x67, 0x59, 0x01, 0x00, 0x1c,
330 	0x09, 0x0d, 0x35, 0x97, 0x22, 0xfc, 0xfe, 0xc0,
331 	0x58, 0x49, 0x9e, 0xd4, 0x7e, 0x6a, 0x7d, 0xdb,
332 	0x6d, 0x20, 0x95, 0x5c, 0x0b, 0xd0, 0xd5, 0x72,
333 	0x4f, 0x15, 0x22, 0x38, 0x97, 0xb2, 0x4b, 0xd0,
334 	0xef, 0x31, 0x7c, 0xf2, 0x42, 0x19, 0x41, 0xa1,
335 	0xe2, 0xc5, 0xca, 0xc6, 0x74, 0x95, 0xcf, 0xf9,
336 	0x41, 0x75, 0x0b, 0x56, 0x39, 0x82, 0x78, 0xf6,
337 	0x59, 0xf1, 0x09, 0x96, 0x9e, 0x38, 0x7f, 0x14,
338 	0x9b, 0xf5, 0x36, 0xbb, 0x92, 0x32, 0xc4, 0x64,
339 	0xe8, 0xff, 0xb4, 0xc7, 0xcf, 0xcd, 0x17, 0x48,
340 	0x0f, 0x83, 0xd9, 0x44, 0x03, 0x35, 0x26, 0xad,
341 	0x01, 0xb7, 0x57, 0x06, 0xb3, 0x9c, 0xa0, 0x6e,
342 	0x2f, 0x58, 0xcb, 0x5c, 0xaa, 0x7c, 0xea, 0x7e,
343 	0x3f, 0xbc, 0x76, 0xc9, 0x0e, 0x52, 0x39, 0x81,
344 	0xa9, 0x9e, 0x37, 0x14, 0x1f, 0x50, 0x6a, 0x4f,
345 	0xd7, 0xfc, 0xd4, 0xfa, 0xf2, 0x18, 0x60, 0xd5,
346 	0xc3, 0x57, 0x7d, 0x6d, 0x05, 0x28, 0x25, 0xc3,
347 	0xde, 0x86, 0x85, 0x06, 0x71, 0xfb, 0x84, 0xa2,
348 	0x07, 0xb6, 0x77, 0xc9, 0x68, 0x41, 0x53, 0x32,
349 	0x4c, 0xa8, 0x4b, 0xf7, 0x08, 0x84, 0x62, 0x6c,
350 	0x8a, 0xb6, 0xcf, 0xc1, 0xde, 0x6b, 0x61, 0xc8,
351 	0xdd, 0xc0, 0x13, 0x70, 0x22, 0x28, 0xe1, 0x0f,
352 	0x46, 0x02, 0xc6, 0xb1, 0xfa, 0x30, 0xcb, 0xec,
353 	0xd1, 0x82, 0xfa, 0x51, 0xcb, 0x71, 0x5e, 0x1f,
354 	0x1b, 0x5f, 0xe0, 0xb0, 0x02, 0x8a, 0x7c, 0x78,
355 	0xd1, 0xb7, 0x4d, 0x56, 0xb0, 0x92, 0x3e, 0xda,
356 	0xc7, 0xb1, 0x74, 0xcf, 0x6a, 0x40, 0xeb, 0x98,
357 	0x1c, 0x2e, 0xf2, 0x86, 0x76, 0xf8, 0x2e, 0x6a,
358 	0x9f, 0x77, 0x51, 0x64, 0xce, 0xdc, 0x12, 0x85,
359 	0x84, 0x6b, 0x01, 0xc8, 0xeb, 0xbc, 0x57, 0x6c,
360 	0x32, 0x26, 0xcb, 0xb2, 0x84, 0x02, 0x2a, 0x33,
361 	0x15, 0xd9, 0xe3, 0x15, 0xfc, 0x3a, 0x24, 0x63,
362 	0x76, 0x65, 0x72, 0x63, 0x32, 0x2e, 0x30, 0x63,
363 	0x78, 0x35, 0x63, 0x82, 0x59, 0x05, 0xc4, 0x30,
364 	0x82, 0x05, 0xc0, 0x30, 0x82, 0x03, 0xa8, 0xa0,
365 	0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x78, 0xd9,
366 	0xa8, 0xb2, 0x64, 0xf9, 0x4d, 0x28, 0x82, 0xc0,
367 	0xd3, 0x1b, 0x40, 0x3c, 0xc8, 0xd9, 0x30, 0x0d,
368 	0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
369 	0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x41, 0x31,
370 	0x3f, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x04, 0x03,
371 	0x13, 0x36, 0x45, 0x55, 0x53, 0x2d, 0x53, 0x54,
372 	0x4d, 0x2d, 0x4b, 0x45, 0x59, 0x49, 0x44, 0x2d,
373 	0x31, 0x41, 0x44, 0x42, 0x39, 0x39, 0x34, 0x41,
374 	0x42, 0x35, 0x38, 0x42, 0x45, 0x35, 0x37, 0x41,
375 	0x30, 0x43, 0x43, 0x39, 0x42, 0x39, 0x30, 0x30,
376 	0x45, 0x37, 0x38, 0x35, 0x31, 0x45, 0x31, 0x41,
377 	0x34, 0x33, 0x43, 0x30, 0x38, 0x36, 0x36, 0x30,
378 	0x30, 0x1e, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x37,
379 	0x31, 0x35, 0x31, 0x31, 0x31, 0x32, 0x31, 0x33,
380 	0x5a, 0x17, 0x0d, 0x32, 0x35, 0x30, 0x33, 0x32,
381 	0x31, 0x32, 0x30, 0x32, 0x39, 0x31, 0x35, 0x5a,
382 	0x30, 0x00, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,
383 	0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
384 	0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,
385 	0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,
386 	0x01, 0x01, 0x00, 0xca, 0xbe, 0x77, 0x9f, 0x45,
387 	0x97, 0x17, 0x8d, 0x01, 0xe1, 0x18, 0xcc, 0xf0,
388 	0xb5, 0xed, 0x9a, 0xb7, 0x36, 0xac, 0x05, 0x26,
389 	0xbe, 0x35, 0xd9, 0x5c, 0x00, 0x5c, 0x5d, 0x8b,
390 	0x6f, 0x2a, 0xb8, 0xf6, 0x02, 0x4f, 0x33, 0xfe,
391 	0x84, 0x45, 0x4c, 0x4f, 0x7a, 0xdb, 0xa9, 0x6a,
392 	0x62, 0x0f, 0x19, 0x35, 0x5d, 0xd2, 0x34, 0x1a,
393 	0x9d, 0x73, 0x55, 0xe5, 0x3e, 0x04, 0xa2, 0xd6,
394 	0xbe, 0xe7, 0x5a, 0xb9, 0x16, 0x6c, 0x55, 0x18,
395 	0xa8, 0x4b, 0xb2, 0x37, 0xb9, 0xa3, 0x87, 0xfc,
396 	0x76, 0xa8, 0x55, 0xc9, 0xe7, 0x30, 0xe5, 0x0e,
397 	0x3c, 0x7b, 0x74, 0xd2, 0x1e, 0xa8, 0x05, 0xd5,
398 	0xe2, 0xe3, 0xcb, 0xaf, 0x63, 0x33, 0x12, 0xaa,
399 	0xfd, 0x31, 0x32, 0x71, 0x4f, 0x41, 0x96, 0x05,
400 	0xb5, 0x69, 0x73, 0x45, 0xbe, 0x6f, 0x90, 0xd9,
401 	0x10, 0x36, 0xaf, 0x7a, 0x1c, 0xf1, 0x6d, 0x14,
402 	0xb0, 0x1e, 0xbb, 0xae, 0x1c, 0x35, 0xec, 0x1c,
403 	0xb5, 0x0e, 0xf6, 0x33, 0x98, 0x13, 0x4e, 0x44,
404 	0x7b, 0x5c, 0x97, 0x47, 0xed, 0x4f, 0xfe, 0xbd,
405 	0x08, 0xd2, 0xa9, 0xc6, 0xbe, 0x8c, 0x04, 0x9e,
406 	0xdc, 0x3d, 0xbe, 0x98, 0xe9, 0x2a, 0xb1, 0xf4,
407 	0xfa, 0x45, 0xf9, 0xc8, 0x9a, 0x55, 0x85, 0x26,
408 	0xfc, 0x5f, 0xad, 0x00, 0x8b, 0xc8, 0x41, 0xf2,
409 	0x86, 0x4e, 0xba, 0x55, 0x1c, 0xb2, 0x89, 0xe8,
410 	0x85, 0x6e, 0x1e, 0x02, 0x9f, 0x55, 0x70, 0xbe,
411 	0xfd, 0xe7, 0x9f, 0xba, 0x59, 0xa0, 0x2e, 0x9a,
412 	0x74, 0x11, 0xe7, 0xad, 0xa9, 0xc7, 0x7b, 0x58,
413 	0xc4, 0x16, 0xd3, 0x35, 0xcb, 0x61, 0x00, 0xec,
414 	0x36, 0x4a, 0xa3, 0x51, 0xa3, 0xdd, 0x61, 0xb6,
415 	0xd6, 0x29, 0xcb, 0x76, 0xe1, 0xab, 0x51, 0x3a,
416 	0xe8, 0xbf, 0xdb, 0x09, 0x4a, 0x39, 0x96, 0xd9,
417 	0xac, 0x8f, 0x6c, 0x62, 0xe0, 0x03, 0x23, 0x24,
418 	0xbe, 0xd4, 0x83, 0x02, 0x03, 0x01, 0x00, 0x01,
419 	0xa3, 0x82, 0x01, 0xf3, 0x30, 0x82, 0x01, 0xef,
420 	0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,
421 	0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80,
422 	0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,
423 	0x01, 0xff, 0x04, 0x02, 0x30, 0x00, 0x30, 0x6d,
424 	0x06, 0x03, 0x55, 0x1d, 0x20, 0x01, 0x01, 0xff,
425 	0x04, 0x63, 0x30, 0x61, 0x30, 0x5f, 0x06, 0x09,
426 	0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15,
427 	0x1f, 0x30, 0x52, 0x30, 0x50, 0x06, 0x08, 0x2b,
428 	0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30,
429 	0x44, 0x1e, 0x42, 0x00, 0x54, 0x00, 0x43, 0x00,
430 	0x50, 0x00, 0x41, 0x00, 0x20, 0x00, 0x20, 0x00,
431 	0x54, 0x00, 0x72, 0x00, 0x75, 0x00, 0x73, 0x00,
432 	0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00,
433 	0x20, 0x00, 0x50, 0x00, 0x6c, 0x00, 0x61, 0x00,
434 	0x74, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00,
435 	0x6d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x49, 0x00,
436 	0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00,
437 	0x69, 0x00, 0x74, 0x00, 0x79, 0x30, 0x10, 0x06,
438 	0x03, 0x55, 0x1d, 0x25, 0x04, 0x09, 0x30, 0x07,
439 	0x06, 0x05, 0x67, 0x81, 0x05, 0x08, 0x03, 0x30,
440 	0x59, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x01, 0x01,
441 	0xff, 0x04, 0x4f, 0x30, 0x4d, 0xa4, 0x4b, 0x30,
442 	0x49, 0x31, 0x16, 0x30, 0x14, 0x06, 0x05, 0x67,
443 	0x81, 0x05, 0x02, 0x01, 0x0c, 0x0b, 0x69, 0x64,
444 	0x3a, 0x35, 0x33, 0x35, 0x34, 0x34, 0x44, 0x32,
445 	0x30, 0x31, 0x17, 0x30, 0x15, 0x06, 0x05, 0x67,
446 	0x81, 0x05, 0x02, 0x02, 0x0c, 0x0c, 0x53, 0x54,
447 	0x33, 0x33, 0x48, 0x54, 0x50, 0x48, 0x41, 0x48,
448 	0x42, 0x34, 0x31, 0x16, 0x30, 0x14, 0x06, 0x05,
449 	0x67, 0x81, 0x05, 0x02, 0x03, 0x0c, 0x0b, 0x69,
450 	0x64, 0x3a, 0x30, 0x30, 0x34, 0x39, 0x30, 0x30,
451 	0x30, 0x34, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,
452 	0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb8,
453 	0x5f, 0xd5, 0x67, 0xca, 0x92, 0xc4, 0x0e, 0xcf,
454 	0x0c, 0xd8, 0x1f, 0x6d, 0x3f, 0x03, 0x55, 0x6f,
455 	0x38, 0xa6, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55,
456 	0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd4, 0x04,
457 	0x64, 0xfc, 0x6e, 0x50, 0x0a, 0x56, 0x48, 0x0f,
458 	0x05, 0xa9, 0x00, 0xb7, 0x1d, 0x5e, 0x57, 0x08,
459 	0xd5, 0xdc, 0x30, 0x81, 0xb2, 0x06, 0x08, 0x2b,
460 	0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04,
461 	0x81, 0xa5, 0x30, 0x81, 0xa2, 0x30, 0x81, 0x9f,
462 	0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
463 	0x30, 0x02, 0x86, 0x81, 0x92, 0x68, 0x74, 0x74,
464 	0x70, 0x3a, 0x2f, 0x2f, 0x61, 0x7a, 0x63, 0x73,
465 	0x70, 0x72, 0x6f, 0x64, 0x65, 0x75, 0x73, 0x61,
466 	0x69, 0x6b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73,
467 	0x68, 0x2e, 0x62, 0x6c, 0x6f, 0x62, 0x2e, 0x63,
468 	0x6f, 0x72, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64,
469 	0x6f, 0x77, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x2f,
470 	0x65, 0x75, 0x73, 0x2d, 0x73, 0x74, 0x6d, 0x2d,
471 	0x6b, 0x65, 0x79, 0x69, 0x64, 0x2d, 0x31, 0x61,
472 	0x64, 0x62, 0x39, 0x39, 0x34, 0x61, 0x62, 0x35,
473 	0x38, 0x62, 0x65, 0x35, 0x37, 0x61, 0x30, 0x63,
474 	0x63, 0x39, 0x62, 0x39, 0x30, 0x30, 0x65, 0x37,
475 	0x38, 0x35, 0x31, 0x65, 0x31, 0x61, 0x34, 0x33,
476 	0x63, 0x30, 0x38, 0x36, 0x36, 0x30, 0x2f, 0x61,
477 	0x62, 0x64, 0x36, 0x31, 0x35, 0x66, 0x32, 0x2d,
478 	0x31, 0x35, 0x38, 0x61, 0x2d, 0x34, 0x35, 0x38,
479 	0x65, 0x2d, 0x61, 0x31, 0x35, 0x35, 0x2d, 0x37,
480 	0x63, 0x34, 0x63, 0x38, 0x63, 0x62, 0x31, 0x33,
481 	0x63, 0x36, 0x35, 0x2e, 0x63, 0x65, 0x72, 0x30,
482 	0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
483 	0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82,
484 	0x02, 0x01, 0x00, 0xa2, 0x10, 0xc5, 0xbf, 0x41,
485 	0xa6, 0xba, 0x8c, 0x72, 0xca, 0x0f, 0x3e, 0x5e,
486 	0x7f, 0xe2, 0xcb, 0x60, 0xb8, 0x3f, 0xfb, 0xde,
487 	0x03, 0xe2, 0xfe, 0x20, 0x29, 0xdf, 0x11, 0xf5,
488 	0xb0, 0x50, 0x6d, 0x32, 0xe8, 0x1b, 0x05, 0xad,
489 	0x6b, 0x60, 0xb5, 0xed, 0xf3, 0xa4, 0x4a, 0xea,
490 	0x09, 0xe5, 0x65, 0x7e, 0xe0, 0xd5, 0x3a, 0x6a,
491 	0xdb, 0x64, 0xb7, 0x07, 0x8f, 0xa1, 0x63, 0xb3,
492 	0x89, 0x8a, 0xac, 0x49, 0x97, 0xa0, 0x9a, 0xa3,
493 	0xd3, 0x3a, 0xc2, 0x13, 0xb2, 0xbb, 0xab, 0x0d,
494 	0xf2, 0x35, 0xc5, 0x03, 0xde, 0x1c, 0xad, 0x6a,
495 	0x03, 0x0a, 0x4c, 0xe1, 0x37, 0x8f, 0xbc, 0x13,
496 	0xc0, 0x9a, 0x17, 0xd4, 0x2e, 0x36, 0x17, 0x51,
497 	0x12, 0xb0, 0x79, 0xbf, 0x9b, 0xb3, 0xb0, 0x74,
498 	0x25, 0x81, 0x7e, 0x21, 0x31, 0xb7, 0xc2, 0x5e,
499 	0xfb, 0x36, 0xab, 0xf3, 0x7a, 0x5f, 0xa4, 0x5e,
500 	0x8f, 0x0c, 0xbd, 0xcf, 0xf5, 0x50, 0xe7, 0x0c,
501 	0x51, 0x55, 0x48, 0xe6, 0x15, 0xb6, 0xd4, 0xaf,
502 	0x95, 0x72, 0x56, 0x94, 0xf7, 0x0e, 0xd6, 0x90,
503 	0xe3, 0xd3, 0x5d, 0xbd, 0x93, 0xa1, 0xbd, 0x6c,
504 	0xe4, 0xf2, 0x39, 0x4d, 0x54, 0x74, 0xcf, 0xf5,
505 	0xeb, 0x70, 0xdb, 0x4f, 0x52, 0xcd, 0x39, 0x8f,
506 	0x11, 0x54, 0x28, 0x06, 0x29, 0x8f, 0x23, 0xde,
507 	0x9e, 0x2f, 0x7b, 0xb6, 0x5f, 0xa3, 0x89, 0x04,
508 	0x99, 0x0a, 0xf1, 0x2d, 0xf9, 0x66, 0xd3, 0x13,
509 	0x45, 0xbd, 0x6c, 0x22, 0x57, 0xf5, 0xb1, 0xb9,
510 	0xdf, 0x5b, 0x7b, 0x1a, 0x3a, 0xdd, 0x6b, 0xc7,
511 	0x35, 0x88, 0xed, 0xc4, 0x09, 0x70, 0x4e, 0x5f,
512 	0xb5, 0x3e, 0xd1, 0x0b, 0xd0, 0xca, 0xef, 0x0b,
513 	0xe9, 0x8b, 0x6f, 0xc3, 0x16, 0xc3, 0x3d, 0x79,
514 	0x06, 0xef, 0x81, 0xf0, 0x60, 0x0b, 0x32, 0xe3,
515 	0x86, 0x6b, 0x92, 0x38, 0x90, 0x62, 0xed, 0x84,
516 	0x3a, 0xb7, 0x45, 0x43, 0x2e, 0xd0, 0x3a, 0x71,
517 	0x9e, 0x80, 0xcc, 0x9c, 0xac, 0x27, 0x10, 0x91,
518 	0xb7, 0xb2, 0xbd, 0x41, 0x40, 0xa7, 0xb7, 0xcf,
519 	0xe7, 0x38, 0xca, 0x68, 0xdd, 0x62, 0x09, 0xff,
520 	0x68, 0xce, 0xba, 0xe2, 0x07, 0x49, 0x09, 0xe7,
521 	0x1f, 0xdf, 0xe6, 0x26, 0xe5, 0x0f, 0xa9, 0xbf,
522 	0x2a, 0x5b, 0x67, 0x92, 0xa1, 0x10, 0x53, 0xb2,
523 	0x7a, 0x07, 0x29, 0x9d, 0xfd, 0x6d, 0xb6, 0x3b,
524 	0x45, 0xc1, 0x94, 0xcb, 0x1c, 0xc3, 0xce, 0xf6,
525 	0x8a, 0x1a, 0x81, 0x66, 0xb0, 0xa5, 0x14, 0xc7,
526 	0x9e, 0x1f, 0x6e, 0xb6, 0xff, 0x8b, 0x90, 0x87,
527 	0x3a, 0x3f, 0xa8, 0xc2, 0x2d, 0x8f, 0x6f, 0xdb,
528 	0xb4, 0xc4, 0x14, 0x3c, 0x1d, 0x12, 0x1d, 0x6d,
529 	0xcf, 0xa6, 0x04, 0x6a, 0xa8, 0x13, 0x5e, 0xf2,
530 	0x5e, 0x77, 0x80, 0x6b, 0x85, 0x83, 0xfe, 0xbb,
531 	0xeb, 0x70, 0xcb, 0x5f, 0xe4, 0x95, 0xaa, 0x0f,
532 	0x61, 0x36, 0x7c, 0xbb, 0x22, 0x1e, 0xba, 0x98,
533 	0x43, 0x52, 0x33, 0xae, 0xed, 0x5d, 0x10, 0x2c,
534 	0xb3, 0xa9, 0x31, 0x8e, 0x60, 0x54, 0xaf, 0x40,
535 	0x6d, 0x2e, 0x18, 0xc2, 0x6a, 0xf4, 0x7b, 0x9a,
536 	0x73, 0x0f, 0x58, 0x69, 0x23, 0xbb, 0xc4, 0x84,
537 	0x53, 0x30, 0xe2, 0xd6, 0x1e, 0x10, 0xc1, 0xec,
538 	0x82, 0x13, 0xab, 0x53, 0x86, 0xa2, 0xb9, 0xda,
539 	0xbb, 0x3a, 0xa2, 0xbe, 0xb0, 0x10, 0x99, 0x0e,
540 	0xe5, 0x9c, 0xc9, 0xf1, 0xce, 0x76, 0x46, 0xea,
541 	0x86, 0xaa, 0x36, 0x83, 0x99, 0x09, 0x9b, 0x30,
542 	0xd3, 0x26, 0xc7, 0xdf, 0x66, 0xc7, 0xf0, 0xdd,
543 	0x08, 0x09, 0x15, 0x15, 0x21, 0x49, 0x46, 0xd8,
544 	0x8a, 0x66, 0xca, 0x62, 0x9c, 0x79, 0x1d, 0x81,
545 	0xea, 0x5d, 0x82, 0xb0, 0xa6, 0x6b, 0x5c, 0xf5,
546 	0xb8, 0x8c, 0xf6, 0x16, 0x01, 0x2c, 0xf8, 0x27,
547 	0xf8, 0xcf, 0x88, 0xfe, 0xf3, 0xa4, 0xfc, 0x17,
548 	0x97, 0xe7, 0x07, 0x59, 0x06, 0xef, 0x30, 0x82,
549 	0x06, 0xeb, 0x30, 0x82, 0x04, 0xd3, 0xa0, 0x03,
550 	0x02, 0x01, 0x02, 0x02, 0x13, 0x33, 0x00, 0x00,
551 	0x02, 0x39, 0xf9, 0xbb, 0x6a, 0x1d, 0x49, 0x64,
552 	0x47, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x39,
553 	0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
554 	0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,
555 	0x81, 0x8c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
556 	0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,
557 	0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
558 	0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e,
559 	0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e,
560 	0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52,
561 	0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e,
562 	0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
563 	0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
564 	0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f,
565 	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x36,
566 	0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
567 	0x2d, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
568 	0x66, 0x74, 0x20, 0x54, 0x50, 0x4d, 0x20, 0x52,
569 	0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74,
570 	0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20,
571 	0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,
572 	0x79, 0x20, 0x32, 0x30, 0x31, 0x34, 0x30, 0x1e,
573 	0x17, 0x0d, 0x31, 0x39, 0x30, 0x33, 0x32, 0x31,
574 	0x32, 0x30, 0x32, 0x39, 0x31, 0x35, 0x5a, 0x17,
575 	0x0d, 0x32, 0x35, 0x30, 0x33, 0x32, 0x31, 0x32,
576 	0x30, 0x32, 0x39, 0x31, 0x35, 0x5a, 0x30, 0x41,
577 	0x31, 0x3f, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x04,
578 	0x03, 0x13, 0x36, 0x45, 0x55, 0x53, 0x2d, 0x53,
579 	0x54, 0x4d, 0x2d, 0x4b, 0x45, 0x59, 0x49, 0x44,
580 	0x2d, 0x31, 0x41, 0x44, 0x42, 0x39, 0x39, 0x34,
581 	0x41, 0x42, 0x35, 0x38, 0x42, 0x45, 0x35, 0x37,
582 	0x41, 0x30, 0x43, 0x43, 0x39, 0x42, 0x39, 0x30,
583 	0x30, 0x45, 0x37, 0x38, 0x35, 0x31, 0x45, 0x31,
584 	0x41, 0x34, 0x33, 0x43, 0x30, 0x38, 0x36, 0x36,
585 	0x30, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06,
586 	0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
587 	0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f,
588 	0x00, 0x30, 0x82, 0x02, 0x0a, 0x02, 0x82, 0x02,
589 	0x01, 0x00, 0xdb, 0xe2, 0x23, 0xf9, 0x86, 0x8f,
590 	0xa9, 0x71, 0x9f, 0x8b, 0xf9, 0x7c, 0xe9, 0x45,
591 	0x2d, 0x59, 0x56, 0x5e, 0x96, 0xf4, 0xdd, 0x9a,
592 	0x12, 0xcd, 0x90, 0x1a, 0x0c, 0xb5, 0x03, 0xbf,
593 	0x09, 0xbe, 0xbf, 0xf7, 0x55, 0x52, 0xe8, 0x39,
594 	0x4c, 0xbe, 0x2a, 0x28, 0x88, 0x78, 0x39, 0xa7,
595 	0xcb, 0xf9, 0x4c, 0x55, 0xd2, 0x31, 0x96, 0x3b,
596 	0x48, 0xa2, 0xf3, 0xf6, 0xd3, 0x1a, 0x81, 0x7f,
597 	0x90, 0x62, 0xab, 0xec, 0x5a, 0xc7, 0xa0, 0x7f,
598 	0x81, 0x32, 0x27, 0x9b, 0x29, 0x75, 0x7d, 0x1e,
599 	0x96, 0xc5, 0xfa, 0x0e, 0x7c, 0xe0, 0x60, 0x96,
600 	0x7a, 0xca, 0x94, 0xba, 0xe6, 0xb2, 0x69, 0xdd,
601 	0xc4, 0x7d, 0xbb, 0xd3, 0xc4, 0xb4, 0x6e, 0x00,
602 	0x86, 0x1f, 0x9d, 0x25, 0xe8, 0xae, 0xc7, 0x10,
603 	0x84, 0xdc, 0xc0, 0x34, 0x24, 0x6e, 0xf7, 0xfc,
604 	0xdd, 0x3d, 0x32, 0x7a, 0x43, 0x96, 0xd6, 0xc8,
605 	0x7b, 0xf4, 0x9b, 0x3d, 0xa7, 0x1e, 0xba, 0x4d,
606 	0xd0, 0x3b, 0x3d, 0x84, 0x9a, 0xd1, 0x25, 0x22,
607 	0x5d, 0x00, 0x44, 0xb0, 0x59, 0xb7, 0x40, 0xc5,
608 	0xa3, 0x53, 0x53, 0xaf, 0x8f, 0x9e, 0xfd, 0x8f,
609 	0x1e, 0x02, 0xd3, 0x4f, 0xf7, 0x09, 0xce, 0xc5,
610 	0xc6, 0x71, 0x5c, 0xe9, 0xe8, 0x7a, 0xb5, 0x6b,
611 	0xa4, 0xbf, 0x0b, 0xd9, 0xb6, 0xfa, 0x24, 0xb0,
612 	0xcd, 0x52, 0x22, 0x1d, 0x7e, 0xe8, 0x15, 0x2f,
613 	0x1e, 0x5e, 0xa2, 0xec, 0xd3, 0xa8, 0x02, 0x77,
614 	0xb9, 0x55, 0x9a, 0xcf, 0xcc, 0xd7, 0x08, 0x20,
615 	0xa5, 0xda, 0x39, 0x9a, 0x30, 0x76, 0x90, 0x37,
616 	0xa7, 0x60, 0xdf, 0x18, 0x12, 0x65, 0x17, 0xaa,
617 	0xdd, 0x48, 0xd5, 0x12, 0x1d, 0x4c, 0x83, 0x5d,
618 	0x81, 0x07, 0x1d, 0x18, 0x81, 0x40, 0x55, 0x60,
619 	0x8f, 0xa3, 0x6b, 0x34, 0x1e, 0xd5, 0xe6, 0xcf,
620 	0x52, 0x73, 0x77, 0x4a, 0x50, 0x4f, 0x1b, 0x0f,
621 	0x39, 0xc3, 0x0d, 0x16, 0xf9, 0xbb, 0x4c, 0x77,
622 	0xf6, 0x4e, 0xac, 0x9c, 0xfe, 0xe8, 0xbb, 0x52,
623 	0xa5, 0x0a, 0x0e, 0x9b, 0xf0, 0x0d, 0xef, 0xfb,
624 	0x6f, 0x89, 0x34, 0x7d, 0x47, 0xec, 0x14, 0x6a,
625 	0xf4, 0x0a, 0xe1, 0x60, 0x44, 0x73, 0x7b, 0xa0,
626 	0xab, 0x5b, 0x8c, 0x43, 0xa6, 0x05, 0x42, 0x61,
627 	0x46, 0xaa, 0x1c, 0xf5, 0xec, 0x2c, 0x86, 0x85,
628 	0x21, 0x99, 0xdf, 0x45, 0x8e, 0xf4, 0xd1, 0x1e,
629 	0xfb, 0xcd, 0x9b, 0x94, 0x32, 0xe0, 0xa0, 0xcc,
630 	0x4f, 0xad, 0xae, 0x44, 0x8b, 0x86, 0x27, 0x91,
631 	0xfe, 0x60, 0x9f, 0xf2, 0x63, 0x30, 0x6c, 0x5d,
632 	0x8d, 0xbc, 0xab, 0xd4, 0xf5, 0xa2, 0xb2, 0x74,
633 	0xe8, 0xd4, 0x95, 0xf2, 0xd6, 0x03, 0x8b, 0xc9,
634 	0xa3, 0x52, 0xe7, 0x63, 0x05, 0x64, 0x50, 0xe5,
635 	0x0a, 0x6a, 0xa0, 0x6c, 0x50, 0xcd, 0x37, 0x98,
636 	0xa8, 0x87, 0x02, 0x38, 0x5b, 0x6c, 0x02, 0x69,
637 	0x3d, 0x1f, 0x95, 0x74, 0x4d, 0x46, 0x76, 0x2a,
638 	0x9d, 0x62, 0xd4, 0xc7, 0x1b, 0xf9, 0x31, 0xa6,
639 	0x51, 0xee, 0x7b, 0xc8, 0xe4, 0x6e, 0x3a, 0xcf,
640 	0x4f, 0x4f, 0x49, 0x8a, 0xf5, 0x4f, 0x25, 0x93,
641 	0x23, 0x02, 0xef, 0x79, 0xa6, 0x27, 0xbe, 0x5a,
642 	0xe7, 0x74, 0xb7, 0xd7, 0xa8, 0xc1, 0xae, 0x55,
643 	0x88, 0xa4, 0xc7, 0x4d, 0xb7, 0x62, 0xf0, 0xf9,
644 	0x5b, 0xbf, 0x47, 0x5b, 0xfe, 0xcc, 0x0b, 0x89,
645 	0x19, 0x65, 0x4b, 0x6f, 0xdf, 0x4f, 0x7d, 0x4d,
646 	0x96, 0x42, 0x0d, 0x2a, 0xa1, 0xbd, 0x3e, 0x70,
647 	0x92, 0xba, 0xc8, 0x59, 0xd5, 0x1d, 0x3a, 0x98,
648 	0x53, 0x75, 0xa6, 0x32, 0xc8, 0x72, 0x03, 0x46,
649 	0x5f, 0x5c, 0x13, 0xa4, 0xdb, 0xc7, 0x55, 0x35,
650 	0x22, 0x0d, 0xc6, 0x17, 0x85, 0xbd, 0x46, 0x4b,
651 	0xfa, 0x1e, 0x49, 0xc2, 0xfe, 0x1e, 0xf9, 0x62,
652 	0x89, 0x56, 0x84, 0xdf, 0xa0, 0xfb, 0xfd, 0x93,
653 	0xa4, 0x25, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,
654 	0x82, 0x01, 0x8e, 0x30, 0x82, 0x01, 0x8a, 0x30,
655 	0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,
656 	0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x84, 0x30,
657 	0x1b, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x14,
658 	0x30, 0x12, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04,
659 	0x01, 0x82, 0x37, 0x15, 0x24, 0x06, 0x05, 0x67,
660 	0x81, 0x05, 0x08, 0x03, 0x30, 0x16, 0x06, 0x03,
661 	0x55, 0x1d, 0x20, 0x04, 0x0f, 0x30, 0x0d, 0x30,
662 	0x0b, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01,
663 	0x82, 0x37, 0x15, 0x1f, 0x30, 0x12, 0x06, 0x03,
664 	0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08,
665 	0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00,
666 	0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,
667 	0x16, 0x04, 0x14, 0xb8, 0x5f, 0xd5, 0x67, 0xca,
668 	0x92, 0xc4, 0x0e, 0xcf, 0x0c, 0xd8, 0x1f, 0x6d,
669 	0x3f, 0x03, 0x55, 0x6f, 0x38, 0xa6, 0x51, 0x30,
670 	0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18,
671 	0x30, 0x16, 0x80, 0x14, 0x7a, 0x8c, 0x0a, 0xce,
672 	0x2f, 0x48, 0x62, 0x17, 0xe2, 0x94, 0xd1, 0xae,
673 	0x55, 0xc1, 0x52, 0xec, 0x71, 0x74, 0xa4, 0x56,
674 	0x30, 0x70, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04,
675 	0x69, 0x30, 0x67, 0x30, 0x65, 0xa0, 0x63, 0xa0,
676 	0x61, 0x86, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x3a,
677 	0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69,
678 	0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e,
679 	0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x6f,
680 	0x70, 0x73, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x4d,
681 	0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,
682 	0x25, 0x32, 0x30, 0x54, 0x50, 0x4d, 0x25, 0x32,
683 	0x30, 0x52, 0x6f, 0x6f, 0x74, 0x25, 0x32, 0x30,
684 	0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
685 	0x61, 0x74, 0x65, 0x25, 0x32, 0x30, 0x41, 0x75,
686 	0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x25,
687 	0x32, 0x30, 0x32, 0x30, 0x31, 0x34, 0x2e, 0x63,
688 	0x72, 0x6c, 0x30, 0x7d, 0x06, 0x08, 0x2b, 0x06,
689 	0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x71,
690 	0x30, 0x6f, 0x30, 0x6d, 0x06, 0x08, 0x2b, 0x06,
691 	0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x61,
692 	0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
693 	0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f,
694 	0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d,
695 	0x2f, 0x70, 0x6b, 0x69, 0x6f, 0x70, 0x73, 0x2f,
696 	0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x4d, 0x69,
697 	0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x25,
698 	0x32, 0x30, 0x54, 0x50, 0x4d, 0x25, 0x32, 0x30,
699 	0x52, 0x6f, 0x6f, 0x74, 0x25, 0x32, 0x30, 0x43,
700 	0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
701 	0x74, 0x65, 0x25, 0x32, 0x30, 0x41, 0x75, 0x74,
702 	0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x25, 0x32,
703 	0x30, 0x32, 0x30, 0x31, 0x34, 0x2e, 0x63, 0x72,
704 	0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
705 	0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,
706 	0x03, 0x82, 0x02, 0x01, 0x00, 0x41, 0xaa, 0xfe,
707 	0x28, 0x6c, 0xf7, 0x6b, 0x53, 0xde, 0x77, 0xc0,
708 	0x80, 0x50, 0x94, 0xd9, 0xdb, 0x46, 0x8e, 0x6a,
709 	0x93, 0xa9, 0x10, 0x37, 0x27, 0x1f, 0xf5, 0x70,
710 	0xf1, 0xa8, 0xcf, 0xa1, 0x45, 0x86, 0x2a, 0xdd,
711 	0x8f, 0xb8, 0xb5, 0xc1, 0xe6, 0xcf, 0x8a, 0xfa,
712 	0x32, 0xa1, 0x4b, 0xb7, 0xa4, 0xbf, 0x0a, 0x48,
713 	0xcb, 0x42, 0x63, 0x71, 0xc1, 0x96, 0xb9, 0x3a,
714 	0x37, 0x84, 0x0e, 0x24, 0x39, 0xeb, 0x58, 0xce,
715 	0x3d, 0xb7, 0xa9, 0x44, 0x92, 0x59, 0xb9, 0xff,
716 	0xdb, 0x18, 0xbe, 0x6a, 0x5e, 0xe7, 0xce, 0xef,
717 	0xb8, 0x40, 0x53, 0xaf, 0xc1, 0x9b, 0xfb, 0x42,
718 	0x99, 0x7e, 0x9d, 0x05, 0x2b, 0x71, 0x0a, 0x7a,
719 	0x7a, 0x44, 0xd1, 0x31, 0xca, 0xf0, 0x5f, 0x74,
720 	0x85, 0xa9, 0xe2, 0xbc, 0xc8, 0x0c, 0xad, 0x57,
721 	0xd1, 0xe9, 0x48, 0x90, 0x88, 0x57, 0x86, 0xd7,
722 	0xc5, 0xc9, 0xe6, 0xb2, 0x5e, 0x5f, 0x13, 0xdc,
723 	0x10, 0x7f, 0xdf, 0x63, 0x8a, 0xd5, 0x9e, 0x90,
724 	0xc2, 0x75, 0x53, 0x1e, 0x68, 0x17, 0x2b, 0x03,
725 	0x29, 0x15, 0x03, 0xc5, 0x8c, 0x66, 0x3e, 0xae,
726 	0xbd, 0x4a, 0x32, 0x7e, 0x59, 0x89, 0x0b, 0x84,
727 	0xc2, 0xd9, 0x90, 0xfa, 0x02, 0x22, 0x90, 0x8d,
728 	0x9c, 0xb6, 0x0c, 0x4d, 0xe1, 0x28, 0x76, 0xd7,
729 	0x82, 0xc3, 0x36, 0xc2, 0xa3, 0x2a, 0x52, 0xe5,
730 	0xfe, 0x3c, 0x8f, 0xe3, 0x4b, 0xda, 0x6a, 0xdb,
731 	0xc0, 0x7a, 0x3c, 0x57, 0xfa, 0x85, 0x8f, 0xfb,
732 	0x62, 0xc3, 0xa1, 0x38, 0xce, 0x84, 0xf2, 0xba,
733 	0x12, 0xf4, 0x30, 0x2a, 0x4a, 0x94, 0xa9, 0x35,
734 	0x2c, 0x7d, 0x11, 0xc7, 0x68, 0x1f, 0x47, 0xaa,
735 	0x57, 0x43, 0x06, 0x70, 0x79, 0x8c, 0xb6, 0x3b,
736 	0x5d, 0x57, 0xf3, 0xf3, 0xc0, 0x2c, 0xc5, 0xde,
737 	0x41, 0x99, 0xf6, 0xdd, 0x55, 0x8a, 0xe4, 0x13,
738 	0xca, 0xc9, 0xec, 0x69, 0x93, 0x13, 0x48, 0xf0,
739 	0x5f, 0xda, 0x2e, 0xfd, 0xfb, 0xa9, 0x1b, 0x92,
740 	0xde, 0x49, 0x71, 0x37, 0x8c, 0x3f, 0xc2, 0x08,
741 	0x0a, 0x83, 0x25, 0xf1, 0x6e, 0x0a, 0xe3, 0x55,
742 	0x85, 0x96, 0x9a, 0x2d, 0xa2, 0xc0, 0xa1, 0xee,
743 	0xfe, 0x23, 0x3b, 0x69, 0x22, 0x03, 0xfd, 0xcc,
744 	0x8a, 0xdd, 0xb4, 0x53, 0x8d, 0x84, 0xa6, 0xac,
745 	0xe0, 0x1e, 0x07, 0xe5, 0xd7, 0xf9, 0xcb, 0xb9,
746 	0xe3, 0x9a, 0xb7, 0x84, 0x70, 0xa1, 0x93, 0xd6,
747 	0x02, 0x1e, 0xfe, 0xdb, 0x28, 0x7c, 0xf7, 0xd4,
748 	0x62, 0x6f, 0x80, 0x75, 0xc8, 0xd8, 0x35, 0x26,
749 	0x0c, 0xcb, 0x84, 0xed, 0xbb, 0x95, 0xdf, 0x7f,
750 	0xd5, 0xbb, 0x00, 0x96, 0x97, 0x32, 0xe7, 0xba,
751 	0xe8, 0x29, 0xb5, 0x1a, 0x51, 0x81, 0xbb, 0x04,
752 	0xd1, 0x21, 0x76, 0x34, 0x6d, 0x1e, 0x93, 0x96,
753 	0x1f, 0x96, 0x53, 0x5f, 0x5c, 0x9e, 0xf3, 0x9d,
754 	0x82, 0x1c, 0x39, 0x36, 0x59, 0xae, 0xc9, 0x3c,
755 	0x53, 0x4a, 0x67, 0x65, 0x6e, 0xbf, 0xa6, 0xac,
756 	0x3e, 0xda, 0xb2, 0xa7, 0x63, 0x07, 0x17, 0xe1,
757 	0x5b, 0xda, 0x6a, 0x31, 0x9f, 0xfb, 0xb4, 0xea,
758 	0xa1, 0x97, 0x08, 0x6e, 0xb2, 0x68, 0xf3, 0x72,
759 	0x76, 0x99, 0xe8, 0x00, 0x46, 0x88, 0x26, 0xe1,
760 	0x3c, 0x07, 0x2b, 0x78, 0x49, 0xda, 0x79, 0x3a,
761 	0xbd, 0x6f, 0xca, 0x5c, 0xa0, 0xa8, 0xed, 0x34,
762 	0xcc, 0xdb, 0x13, 0xe2, 0x51, 0x9b, 0x3d, 0x03,
763 	0xac, 0xc7, 0xf6, 0x32, 0xe1, 0x11, 0x5d, 0xe1,
764 	0xc5, 0xfd, 0x9e, 0x7a, 0xcd, 0x06, 0xb9, 0xe6,
765 	0xfc, 0xe0, 0x03, 0x31, 0xf4, 0x4a, 0xa9, 0x3b,
766 	0x79, 0x01, 0xb0, 0x64, 0x68, 0x9f, 0x6e, 0x76,
767 	0xa1, 0xcc, 0xec, 0x17, 0x41, 0x9d, 0xd4, 0x5b,
768 	0x4e, 0x9d, 0xe5, 0x46, 0xd4, 0x6b, 0x60, 0x2a,
769 	0x23, 0xb5, 0x7a, 0x89, 0x7c, 0x27, 0x96, 0x65,
770 	0x97, 0x56, 0xec, 0x98, 0xe3, 0x67, 0x70, 0x75,
771 	0x62, 0x41, 0x72, 0x65, 0x61, 0x59, 0x01, 0x36,
772 	0x00, 0x01, 0x00, 0x0b, 0x00, 0x06, 0x04, 0x72,
773 	0x00, 0x20, 0x9d, 0xff, 0xcb, 0xf3, 0x6c, 0x38,
774 	0x3a, 0xe6, 0x99, 0xfb, 0x98, 0x68, 0xdc, 0x6d,
775 	0xcb, 0x89, 0xd7, 0x15, 0x38, 0x84, 0xbe, 0x28,
776 	0x03, 0x92, 0x2c, 0x12, 0x41, 0x58, 0xbf, 0xad,
777 	0x22, 0xae, 0x00, 0x10, 0x00, 0x10, 0x08, 0x00,
778 	0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc5, 0xb6,
779 	0x9c, 0x06, 0x1d, 0xcf, 0xb9, 0xf2, 0x5e, 0x99,
780 	0x7d, 0x6d, 0x73, 0xd8, 0x36, 0xc1, 0x4a, 0x90,
781 	0x05, 0x4d, 0x82, 0x57, 0xc1, 0xb6, 0x6a, 0xd1,
782 	0x43, 0x03, 0x85, 0xf8, 0x52, 0x4f, 0xd2, 0x27,
783 	0x91, 0x0b, 0xb5, 0x93, 0xa0, 0x68, 0xf8, 0x80,
784 	0x1b, 0xaa, 0x65, 0x97, 0x45, 0x11, 0x86, 0x34,
785 	0xd6, 0x67, 0xf8, 0xd5, 0x12, 0x79, 0x84, 0xee,
786 	0x70, 0x99, 0x00, 0x63, 0xa8, 0xb4, 0x43, 0x0b,
787 	0x4c, 0x57, 0x4a, 0xd6, 0x9b, 0x75, 0x63, 0x8a,
788 	0x46, 0x57, 0xdb, 0x14, 0xc8, 0x71, 0xd1, 0xb3,
789 	0x07, 0x68, 0x58, 0xbc, 0x55, 0x84, 0x80, 0x2a,
790 	0xd2, 0x36, 0x9f, 0xc1, 0x64, 0xa0, 0x11, 0x4b,
791 	0xc9, 0x32, 0x31, 0x3a, 0xd6, 0x87, 0x26, 0x1a,
792 	0x3a, 0x78, 0x3d, 0x89, 0xdb, 0x00, 0x28, 0x3b,
793 	0xae, 0x2b, 0x1b, 0x56, 0xe2, 0x8c, 0x4c, 0x63,
794 	0xac, 0x6e, 0x6c, 0xf7, 0xb5, 0x7d, 0x4d, 0x0b,
795 	0x9f, 0x06, 0xa0, 0x10, 0x35, 0x38, 0x20, 0x4d,
796 	0xcc, 0x07, 0xd7, 0x00, 0x4e, 0x86, 0xba, 0xfe,
797 	0x8b, 0xe4, 0x3f, 0x4a, 0xd6, 0xca, 0xbf, 0x67,
798 	0x40, 0x1a, 0xa4, 0xda, 0x82, 0x52, 0x15, 0xb8,
799 	0x14, 0x3a, 0x7c, 0xa9, 0x02, 0xc1, 0x01, 0x69,
800 	0xc6, 0x51, 0xd4, 0xbc, 0x1f, 0x95, 0xb2, 0xee,
801 	0x1f, 0xdd, 0xb5, 0x73, 0x16, 0x5e, 0x29, 0x3f,
802 	0x47, 0xac, 0x65, 0xfb, 0x63, 0x5c, 0xb9, 0xc8,
803 	0x13, 0x2d, 0xec, 0x85, 0xde, 0x71, 0x0d, 0x84,
804 	0x93, 0x74, 0x76, 0x91, 0xdd, 0x1d, 0x6d, 0x3d,
805 	0xc7, 0x36, 0x19, 0x19, 0x86, 0xde, 0x7c, 0xca,
806 	0xd6, 0xc6, 0x65, 0x7e, 0x4b, 0x24, 0x9c, 0xce,
807 	0x92, 0x6b, 0x1c, 0xe0, 0xa0, 0xa9, 0x6c, 0xc3,
808 	0xed, 0x4f, 0x2a, 0x54, 0x07, 0x00, 0x32, 0x5e,
809 	0x1b, 0x94, 0x37, 0xcd, 0xe2, 0x32, 0xa8, 0xd5,
810 	0x2c, 0xfb, 0x03, 0x9d, 0x79, 0xdf, 0x68, 0x63,
811 	0x65, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x58,
812 	0xa1, 0xff, 0x54, 0x43, 0x47, 0x80, 0x17, 0x00,
813 	0x22, 0x00, 0x0b, 0xdb, 0x1f, 0x74, 0x21, 0x4f,
814 	0xa9, 0x0d, 0x90, 0x64, 0xa2, 0x33, 0xbe, 0x3f,
815 	0xf1, 0x95, 0xb0, 0x4e, 0x3f, 0x02, 0xdc, 0xad,
816 	0xb0, 0x05, 0x13, 0xe6, 0x32, 0x5f, 0xed, 0x90,
817 	0x2c, 0xad, 0xc0, 0x00, 0x14, 0x58, 0x52, 0x07,
818 	0x5d, 0x64, 0x6c, 0x1f, 0xd1, 0x13, 0x7f, 0xc3,
819 	0x74, 0xf6, 0x4b, 0xe3, 0xa0, 0x2e, 0xb7, 0x71,
820 	0xda, 0x00, 0x00, 0x00, 0x00, 0x29, 0x3c, 0x64,
821 	0xdf, 0x95, 0x38, 0xba, 0x73, 0xe3, 0x57, 0x61,
822 	0xa0, 0x01, 0x24, 0x01, 0x08, 0xc9, 0xd6, 0xea,
823 	0x60, 0xe4, 0x00, 0x22, 0x00, 0x0b, 0xe1, 0x86,
824 	0xbb, 0x79, 0x27, 0xe5, 0x01, 0x19, 0x90, 0xb3,
825 	0xe9, 0x08, 0xb0, 0xee, 0xfa, 0x3a, 0x67, 0xa9,
826 	0xf3, 0xc8, 0x9e, 0x03, 0x41, 0x07, 0x75, 0x60,
827 	0xbc, 0x94, 0x0c, 0x2a, 0xb7, 0xad, 0x00, 0x22,
828 	0x00, 0x0b, 0x35, 0xb1, 0x72, 0xd6, 0x3c, 0xe9,
829 	0x85, 0xe8, 0x66, 0xed, 0x10, 0x7a, 0x5c, 0xa3,
830 	0xe6, 0xd9, 0x4d, 0xf0, 0x52, 0x69, 0x26, 0x14,
831 	0xb4, 0x36, 0x7e, 0xad, 0x76, 0x9e, 0x58, 0x68,
832 	0x3e, 0x91
833 };
834 
835 /*
836  * Security Key By Yubico
837  * 5.1.X
838  * f8a011f3-8c0a-4d15-8006-17111f9edc7d
839  */
840 const unsigned char aaguid[16] = {
841 	0xf8, 0xa0, 0x11, 0xf3, 0x8c, 0x0a, 0x4d, 0x15,
842 	0x80, 0x06, 0x17, 0x11, 0x1f, 0x9e, 0xdc, 0x7d,
843 };
844 
845 /*
846  * Windows Hello by Microsoft
847  */
848 const unsigned char aaguid_tpm[16] = {
849 	0x08, 0x98, 0x70, 0x58, 0xca, 0xdc, 0x4b, 0x81,
850 	0xb6, 0xe1, 0x30, 0xde, 0x50, 0xdc, 0xbe, 0x96,
851 };
852 
853 const char rp_id[] = "localhost";
854 const char rp_name[] = "sweet home localhost";
855 
856 static void *
857 dummy_open(const char *path)
858 {
859 	(void)path;
860 
861 	return (FAKE_DEV_HANDLE);
862 }
863 
864 static void
865 dummy_close(void *handle)
866 {
867 	assert(handle == FAKE_DEV_HANDLE);
868 }
869 
870 static int
871 dummy_read(void *handle, unsigned char *buf, size_t len, int ms)
872 {
873 	(void)handle;
874 	(void)buf;
875 	(void)len;
876 	(void)ms;
877 
878 	abort();
879 	/* NOTREACHED */
880 }
881 
882 static int
883 dummy_write(void *handle, const unsigned char *buf, size_t len)
884 {
885 	(void)handle;
886 	(void)buf;
887 	(void)len;
888 
889 	abort();
890 	/* NOTREACHED */
891 }
892 
893 static fido_cred_t *
894 alloc_cred(void)
895 {
896 	fido_cred_t *c;
897 
898 	c = fido_cred_new();
899 	assert(c != NULL);
900 
901 	return (c);
902 }
903 
904 static void
905 free_cred(fido_cred_t *c)
906 {
907 	fido_cred_free(&c);
908 	assert(c == NULL);
909 }
910 
911 static fido_dev_t *
912 alloc_dev(void)
913 {
914 	fido_dev_t *d;
915 
916 	d = fido_dev_new();
917 	assert(d != NULL);
918 
919 	return (d);
920 }
921 
922 static void
923 free_dev(fido_dev_t *d)
924 {
925 	fido_dev_free(&d);
926 	assert(d == NULL);
927 }
928 
929 static void
930 empty_cred(void)
931 {
932 	fido_cred_t *c;
933 	fido_dev_t *d;
934 	fido_dev_io_t io_f;
935 
936 	c = alloc_cred();
937 	assert(fido_cred_authdata_len(c) == 0);
938 	assert(fido_cred_authdata_ptr(c) == NULL);
939 	assert(fido_cred_authdata_raw_len(c) == 0);
940 	assert(fido_cred_authdata_raw_ptr(c) == NULL);
941 	assert(fido_cred_clientdata_hash_len(c) == 0);
942 	assert(fido_cred_clientdata_hash_ptr(c) == NULL);
943 	assert(fido_cred_flags(c) == 0);
944 	assert(fido_cred_fmt(c) == NULL);
945 	assert(fido_cred_id_len(c) == 0);
946 	assert(fido_cred_id_ptr(c) == NULL);
947 	assert(fido_cred_prot(c) == 0);
948 	assert(fido_cred_pubkey_len(c) == 0);
949 	assert(fido_cred_pubkey_ptr(c) == NULL);
950 	assert(fido_cred_rp_id(c) == NULL);
951 	assert(fido_cred_rp_name(c) == NULL);
952 	assert(fido_cred_sig_len(c) == 0);
953 	assert(fido_cred_sig_ptr(c) == NULL);
954 	assert(fido_cred_x5c_len(c) == 0);
955 	assert(fido_cred_x5c_ptr(c) == NULL);
956 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
957 
958 	memset(&io_f, 0, sizeof(io_f));
959 
960 	io_f.open = dummy_open;
961 	io_f.close = dummy_close;
962 	io_f.read = dummy_read;
963 	io_f.write = dummy_write;
964 
965 	d = alloc_dev();
966 
967 	fido_dev_force_u2f(d);
968 	assert(fido_dev_set_io_functions(d, &io_f) == FIDO_OK);
969 	assert(fido_dev_make_cred(d, c, NULL) == FIDO_ERR_INVALID_ARGUMENT);
970 	assert(fido_dev_make_cred(d, c, "") == FIDO_ERR_UNSUPPORTED_OPTION);
971 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
972 
973 	fido_dev_force_fido2(d);
974 	assert(fido_dev_set_io_functions(d, &io_f) == FIDO_OK);
975 	assert(fido_dev_make_cred(d, c, NULL) == FIDO_ERR_INVALID_ARGUMENT);
976 	assert(fido_dev_make_cred(d, c, "") == FIDO_ERR_INVALID_ARGUMENT);
977 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
978 
979 	free_cred(c);
980 	free_dev(d);
981 }
982 
983 static void
984 valid_cred(void)
985 {
986 	fido_cred_t *c;
987 
988 	c = alloc_cred();
989 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
990 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
991 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
992 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
993 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
994 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
995 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
996 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
997 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
998 	assert(fido_cred_verify(c) == FIDO_OK);
999 	assert(fido_cred_prot(c) == 0);
1000 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1001 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1002 	assert(fido_cred_id_len(c) == sizeof(id));
1003 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1004 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1005 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1006 	free_cred(c);
1007 }
1008 
1009 static void
1010 no_cdh(void)
1011 {
1012 	fido_cred_t *c;
1013 
1014 	c = alloc_cred();
1015 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1016 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1017 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1018 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1019 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1020 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1021 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1022 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1023 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1024 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1025 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1026 	assert(fido_cred_id_len(c) == sizeof(id));
1027 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1028 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1029 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1030 	free_cred(c);
1031 }
1032 
1033 static void
1034 no_rp_id(void)
1035 {
1036 	fido_cred_t *c;
1037 
1038 	c = alloc_cred();
1039 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1040 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1041 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1042 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1043 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1044 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1045 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1046 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1047 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1048 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1049 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1050 	assert(fido_cred_id_len(c) == sizeof(id));
1051 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1052 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1053 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1054 	free_cred(c);
1055 }
1056 
1057 static void
1058 no_rp_name(void)
1059 {
1060 	fido_cred_t *c;
1061 
1062 	c = alloc_cred();
1063 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1064 	assert(fido_cred_set_rp(c, rp_id, NULL) == FIDO_OK);
1065 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1066 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1067 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1068 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1069 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1070 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1071 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1072 	assert(fido_cred_verify(c) == FIDO_OK);
1073 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1074 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1075 	assert(fido_cred_id_len(c) == sizeof(id));
1076 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1077 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1078 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1079 	free_cred(c);
1080 }
1081 
1082 static void
1083 no_authdata(void)
1084 {
1085 	fido_cred_t *c;
1086 	unsigned char *unset;
1087 
1088 	unset = calloc(1, sizeof(aaguid));
1089 	assert(unset != NULL);
1090 
1091 	c = alloc_cred();
1092 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1093 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1094 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1095 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1096 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1097 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1098 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1099 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1100 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1101 	assert(fido_cred_pubkey_len(c) == 0);
1102 	assert(fido_cred_pubkey_ptr(c) == NULL);
1103 	assert(fido_cred_id_len(c) == 0);
1104 	assert(fido_cred_id_ptr(c) == NULL);
1105 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1106 	assert(memcmp(fido_cred_aaguid_ptr(c), unset, sizeof(aaguid)) == 0);
1107 	free_cred(c);
1108 	free(unset);
1109 }
1110 
1111 static void
1112 no_x509(void)
1113 {
1114 	fido_cred_t *c;
1115 
1116 	c = alloc_cred();
1117 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1118 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1119 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1120 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1121 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1122 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1123 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1124 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1125 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1126 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1127 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1128 	assert(fido_cred_id_len(c) == sizeof(id));
1129 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1130 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1131 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1132 	free_cred(c);
1133 }
1134 
1135 static void
1136 no_sig(void)
1137 {
1138 	fido_cred_t *c;
1139 
1140 	c = alloc_cred();
1141 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1142 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1143 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1144 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1145 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1146 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1147 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1148 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1149 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1150 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1151 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1152 	assert(fido_cred_id_len(c) == sizeof(id));
1153 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1154 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1155 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1156 	free_cred(c);
1157 }
1158 
1159 static void
1160 no_fmt(void)
1161 {
1162 	fido_cred_t *c;
1163 
1164 	c = alloc_cred();
1165 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1166 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1167 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1168 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1169 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1170 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1171 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1172 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1173 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1174 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1175 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1176 	assert(fido_cred_id_len(c) == sizeof(id));
1177 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1178 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1179 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1180 	free_cred(c);
1181 }
1182 
1183 static void
1184 wrong_options(void)
1185 {
1186 	fido_cred_t *c;
1187 
1188 	c = alloc_cred();
1189 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1190 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1191 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1192 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1193 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1194 	assert(fido_cred_set_uv(c, FIDO_OPT_TRUE) == FIDO_OK);
1195 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1196 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1197 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1198 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_PARAM);
1199 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1200 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1201 	assert(fido_cred_id_len(c) == sizeof(id));
1202 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1203 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1204 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1205 	free_cred(c);
1206 }
1207 
1208 static void
1209 junk_cdh(void)
1210 {
1211 	fido_cred_t *c;
1212 	unsigned char *junk;
1213 
1214 	junk = malloc(sizeof(cdh));
1215 	assert(junk != NULL);
1216 	memcpy(junk, cdh, sizeof(cdh));
1217 	junk[0] = (unsigned char)~junk[0];
1218 
1219 	c = alloc_cred();
1220 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1221 	assert(fido_cred_set_clientdata_hash(c, junk, sizeof(cdh)) == FIDO_OK);
1222 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1223 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1224 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1225 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1226 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1227 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1228 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1229 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG);
1230 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1231 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1232 	assert(fido_cred_id_len(c) == sizeof(id));
1233 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1234 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1235 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1236 	free_cred(c);
1237 	free(junk);
1238 }
1239 
1240 static void
1241 junk_fmt(void)
1242 {
1243 	fido_cred_t *c;
1244 
1245 	c = alloc_cred();
1246 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1247 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1248 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1249 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1250 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1251 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1252 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1253 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1254 	assert(fido_cred_set_fmt(c, "junk") == FIDO_ERR_INVALID_ARGUMENT);
1255 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1256 	free_cred(c);
1257 }
1258 
1259 static void
1260 junk_rp_id(void)
1261 {
1262 	fido_cred_t *c;
1263 
1264 	c = alloc_cred();
1265 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1266 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1267 	assert(fido_cred_set_rp(c, "potato", rp_name) == FIDO_OK);
1268 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1269 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1270 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1271 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1272 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1273 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1274 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_PARAM);
1275 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1276 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1277 	assert(fido_cred_id_len(c) == sizeof(id));
1278 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1279 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1280 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1281 	free_cred(c);
1282 }
1283 
1284 static void
1285 junk_rp_name(void)
1286 {
1287 	fido_cred_t *c;
1288 
1289 	c = alloc_cred();
1290 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1291 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1292 	assert(fido_cred_set_rp(c, rp_id, "potato") == FIDO_OK);
1293 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1294 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1295 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1296 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1297 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1298 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1299 	assert(fido_cred_verify(c) == FIDO_OK);
1300 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1301 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1302 	assert(fido_cred_id_len(c) == sizeof(id));
1303 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1304 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1305 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1306 	free_cred(c);
1307 }
1308 
1309 static void
1310 junk_authdata(void)
1311 {
1312 	fido_cred_t *c;
1313 	unsigned char *junk;
1314 	unsigned char *unset;
1315 
1316 	junk = malloc(sizeof(authdata));
1317 	assert(junk != NULL);
1318 	memcpy(junk, authdata, sizeof(authdata));
1319 	junk[0] = (unsigned char)~junk[0];
1320 
1321 	unset = calloc(1, sizeof(aaguid));
1322 	assert(unset != NULL);
1323 
1324 	c = alloc_cred();
1325 	assert(fido_cred_set_authdata(c, junk,
1326 	    sizeof(authdata)) == FIDO_ERR_INVALID_ARGUMENT);
1327 	assert(fido_cred_authdata_len(c) == 0);
1328 	assert(fido_cred_authdata_ptr(c) == NULL);
1329 	assert(fido_cred_authdata_raw_len(c) == 0);
1330 	assert(fido_cred_authdata_raw_ptr(c) == NULL);
1331 	assert(fido_cred_flags(c) == 0);
1332 	assert(fido_cred_fmt(c) == NULL);
1333 	assert(fido_cred_id_len(c) == 0);
1334 	assert(fido_cred_id_ptr(c) == NULL);
1335 	assert(fido_cred_pubkey_len(c) == 0);
1336 	assert(fido_cred_pubkey_ptr(c) == NULL);
1337 	assert(fido_cred_rp_id(c) == NULL);
1338 	assert(fido_cred_rp_name(c) == NULL);
1339 	assert(fido_cred_sig_len(c) == 0);
1340 	assert(fido_cred_sig_ptr(c) == NULL);
1341 	assert(fido_cred_x5c_len(c) == 0);
1342 	assert(fido_cred_x5c_ptr(c) == NULL);
1343 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1344 	assert(memcmp(fido_cred_aaguid_ptr(c), unset, sizeof(aaguid)) == 0);
1345 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1346 	free_cred(c);
1347 	free(junk);
1348 	free(unset);
1349 }
1350 
1351 static void
1352 junk_sig(void)
1353 {
1354 	fido_cred_t *c;
1355 	unsigned char *junk;
1356 
1357 	junk = malloc(sizeof(sig));
1358 	assert(junk != NULL);
1359 	memcpy(junk, sig, sizeof(sig));
1360 	junk[0] = (unsigned char)~junk[0];
1361 
1362 	c = alloc_cred();
1363 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1364 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1365 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1366 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1367 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1368 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1369 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1370 	assert(fido_cred_set_sig(c, junk, sizeof(sig)) == FIDO_OK);
1371 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1372 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG);
1373 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1374 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1375 	assert(fido_cred_id_len(c) == sizeof(id));
1376 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1377 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1378 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1379 	free_cred(c);
1380 	free(junk);
1381 }
1382 
1383 static void
1384 junk_x509(void)
1385 {
1386 	fido_cred_t *c;
1387 	unsigned char *junk;
1388 
1389 	junk = malloc(sizeof(x509));
1390 	assert(junk != NULL);
1391 	memcpy(junk, x509, sizeof(x509));
1392 	junk[0] = (unsigned char)~junk[0];
1393 
1394 	c = alloc_cred();
1395 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1396 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1397 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1398 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1399 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1400 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1401 	assert(fido_cred_set_x509(c, junk, sizeof(x509)) == FIDO_OK);
1402 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1403 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1404 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_SIG);
1405 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1406 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1407 	assert(fido_cred_id_len(c) == sizeof(id));
1408 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1409 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1410 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1411 	free_cred(c);
1412 	free(junk);
1413 }
1414 
1415 /* github issue #6 */
1416 static void
1417 invalid_type(void)
1418 {
1419 	fido_cred_t *c;
1420 	unsigned char *unset;
1421 
1422 	unset = calloc(1, sizeof(aaguid));
1423 	assert(unset != NULL);
1424 
1425 	c = alloc_cred();
1426 	assert(fido_cred_set_type(c, COSE_RS256) == FIDO_OK);
1427 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1428 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1429 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_ERR_INVALID_ARGUMENT);
1430 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1431 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1432 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1433 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1434 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1435 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1436 	assert(fido_cred_pubkey_len(c) == 0);
1437 	assert(fido_cred_pubkey_ptr(c) == NULL);
1438 	assert(fido_cred_id_len(c) == 0);
1439 	assert(fido_cred_id_ptr(c) == NULL);
1440 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1441 	assert(memcmp(fido_cred_aaguid_ptr(c), unset, sizeof(aaguid)) == 0);
1442 	free_cred(c);
1443 	free(unset);
1444 }
1445 
1446 /* cbor_serialize_alloc misuse */
1447 static void
1448 bad_cbor_serialize(void)
1449 {
1450 	fido_cred_t *c;
1451 
1452 	c = alloc_cred();
1453 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1454 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1455 	assert(fido_cred_authdata_len(c) == sizeof(authdata));
1456 	free_cred(c);
1457 }
1458 
1459 static void
1460 duplicate_keys(void)
1461 {
1462 	fido_cred_t *c;
1463 
1464 	c = alloc_cred();
1465 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1466 	assert(fido_cred_set_authdata(c, authdata_dupkeys,
1467 	    sizeof(authdata_dupkeys)) == FIDO_ERR_INVALID_ARGUMENT);
1468 	free_cred(c);
1469 }
1470 
1471 static void
1472 unsorted_keys(void)
1473 {
1474 	fido_cred_t *c;
1475 
1476 	c = alloc_cred();
1477 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1478 	assert(fido_cred_set_authdata(c, authdata_unsorted_keys,
1479 	    sizeof(authdata_unsorted_keys)) == FIDO_ERR_INVALID_ARGUMENT);
1480 	free_cred(c);
1481 }
1482 
1483 static void
1484 wrong_credprot(void)
1485 {
1486 	fido_cred_t *c;
1487 
1488 	c = alloc_cred();
1489 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1490 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1491 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1492 	assert(fido_cred_set_x509(c, x509, sizeof(x509)) == FIDO_OK);
1493 	assert(fido_cred_set_sig(c, sig, sizeof(sig)) == FIDO_OK);
1494 	assert(fido_cred_set_fmt(c, "packed") == FIDO_OK);
1495 	assert(fido_cred_set_prot(c, FIDO_CRED_PROT_UV_OPTIONAL_WITH_ID) == FIDO_OK);
1496 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1497 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_PARAM);
1498 	free_cred(c);
1499 }
1500 
1501 static void
1502 raw_authdata(void)
1503 {
1504 	fido_cred_t *c;
1505 	cbor_item_t *item;
1506 	struct cbor_load_result cbor_result;
1507 	const unsigned char *ptr;
1508 	unsigned char *cbor;
1509 	size_t len;
1510 	size_t cbor_len;
1511 	size_t alloclen;
1512 
1513 	c = alloc_cred();
1514 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1515 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1516 	assert((ptr = fido_cred_authdata_ptr(c)) != NULL);
1517 	assert((len = fido_cred_authdata_len(c)) != 0);
1518 	assert((item = cbor_load(ptr, len, &cbor_result)) != NULL);
1519 	assert(cbor_result.read == len);
1520 	assert(cbor_isa_bytestring(item));
1521 	assert((ptr = fido_cred_authdata_raw_ptr(c)) != NULL);
1522 	assert((len = fido_cred_authdata_raw_len(c)) != 0);
1523 	assert(cbor_bytestring_length(item) == len);
1524 	assert(memcmp(ptr, cbor_bytestring_handle(item), len) == 0);
1525 	assert((len = fido_cred_authdata_len(c)) != 0);
1526 	assert((cbor_len = cbor_serialize_alloc(item, &cbor, &alloclen)) == len);
1527 	assert((ptr = cbor_bytestring_handle(item)) != NULL);
1528 	assert((len = cbor_bytestring_length(item)) != 0);
1529 	assert(fido_cred_set_authdata_raw(c, ptr, len) == FIDO_OK);
1530 	assert((ptr = fido_cred_authdata_ptr(c)) != NULL);
1531 	assert((len = fido_cred_authdata_len(c)) != 0);
1532 	assert(len == cbor_len);
1533 	assert(memcmp(cbor, ptr, len) == 0);
1534 	assert(cbor_len == sizeof(authdata));
1535 	assert(memcmp(cbor, authdata, cbor_len) == 0);
1536 	cbor_decref(&item);
1537 	free(cbor);
1538 	free_cred(c);
1539 }
1540 
1541 static void
1542 fmt_none(void)
1543 {
1544 	fido_cred_t *c;
1545 
1546 	c = alloc_cred();
1547 	assert(fido_cred_set_type(c, COSE_ES256) == FIDO_OK);
1548 	assert(fido_cred_set_clientdata_hash(c, cdh, sizeof(cdh)) == FIDO_OK);
1549 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1550 	assert(fido_cred_set_authdata(c, authdata, sizeof(authdata)) == FIDO_OK);
1551 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1552 	assert(fido_cred_set_uv(c, FIDO_OPT_FALSE) == FIDO_OK);
1553 	assert(fido_cred_set_fmt(c, "none") == FIDO_OK);
1554 	assert(fido_cred_verify(c) == FIDO_ERR_INVALID_ARGUMENT);
1555 	assert(fido_cred_prot(c) == 0);
1556 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey));
1557 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey, sizeof(pubkey)) == 0);
1558 	assert(fido_cred_id_len(c) == sizeof(id));
1559 	assert(memcmp(fido_cred_id_ptr(c), id, sizeof(id)) == 0);
1560 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid));
1561 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid, sizeof(aaguid)) == 0);
1562 	free_cred(c);
1563 }
1564 
1565 static void
1566 valid_tpm_cred(void)
1567 {
1568 	fido_cred_t *c;
1569 
1570 	c = alloc_cred();
1571 	assert(fido_cred_set_type(c, COSE_RS256) == FIDO_OK);
1572 	assert(fido_cred_set_clientdata(c, cdh, sizeof(cdh)) == FIDO_OK);
1573 	assert(fido_cred_set_rp(c, rp_id, rp_name) == FIDO_OK);
1574 	assert(fido_cred_set_authdata(c, authdata_tpm, sizeof(authdata_tpm)) == FIDO_OK);
1575 	assert(fido_cred_set_rk(c, FIDO_OPT_FALSE) == FIDO_OK);
1576 	assert(fido_cred_set_uv(c, FIDO_OPT_TRUE) == FIDO_OK);
1577 	assert(fido_cred_set_fmt(c, "tpm") == FIDO_OK);
1578 	assert(fido_cred_set_attstmt(c, attstmt_tpm, sizeof(attstmt_tpm)) == FIDO_OK);
1579 	assert(fido_cred_verify(c) == FIDO_OK);
1580 	assert(fido_cred_prot(c) == 0);
1581 	assert(fido_cred_pubkey_len(c) == sizeof(pubkey_tpm));
1582 	assert(memcmp(fido_cred_pubkey_ptr(c), pubkey_tpm, sizeof(pubkey_tpm)) == 0);
1583 	assert(fido_cred_id_len(c) == sizeof(id_tpm));
1584 	assert(memcmp(fido_cred_id_ptr(c), id_tpm, sizeof(id_tpm)) == 0);
1585 	assert(fido_cred_aaguid_len(c) == sizeof(aaguid_tpm));
1586 	assert(memcmp(fido_cred_aaguid_ptr(c), aaguid_tpm, sizeof(aaguid_tpm)) == 0);
1587 	free_cred(c);
1588 }
1589 
1590 int
1591 main(void)
1592 {
1593 	fido_init(0);
1594 
1595 	empty_cred();
1596 	valid_cred();
1597 	no_cdh();
1598 	no_rp_id();
1599 	no_rp_name();
1600 	no_authdata();
1601 	no_x509();
1602 	no_sig();
1603 	no_fmt();
1604 	junk_cdh();
1605 	junk_fmt();
1606 	junk_rp_id();
1607 	junk_rp_name();
1608 	junk_authdata();
1609 	junk_x509();
1610 	junk_sig();
1611 	wrong_options();
1612 	invalid_type();
1613 	bad_cbor_serialize();
1614 	duplicate_keys();
1615 	unsorted_keys();
1616 	wrong_credprot();
1617 	raw_authdata();
1618 	fmt_none();
1619 	valid_tpm_cred();
1620 
1621 	exit(0);
1622 }
1623