xref: /netbsd-src/external/bsd/pam-u2f/dist/tests/get_devices.c (revision 2dd295436a0082eb4f8d294f4aa73c223413d0f2)
1 /*
2  *  Copyright (C) 2014-2018 Yubico AB - See COPYING
3  */
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <assert.h>
8 
9 /* These #defines must be present according to PAM documentation. */
10 #define PAM_SM_AUTH
11 
12 #ifdef HAVE_SECURITY_PAM_APPL_H
13 #include <security/pam_appl.h>
14 #endif
15 #ifdef HAVE_SECURITY_PAM_MODULES_H
16 #include <security/pam_modules.h>
17 #endif
18 
19 #include <string.h>
20 #include "../util.h"
21 
22 int main(int argc, const char **argv) {
23   int rc;
24 
25   cfg_t cfg;
26 
27   memset(&cfg, 0, sizeof(cfg_t));
28   cfg.auth_file = "credentials/ssh_credential.cred";
29   cfg.debug = 1;
30   cfg.debug_file = stderr;
31   cfg.max_devs = 24;
32   cfg.sshformat = 1;
33 
34   device_t dev[24];
35   memset(dev, 0, sizeof(dev));
36   unsigned n_devs;
37   char *username;
38 
39   username = secure_getenv("USER");
40   if (username == NULL) {
41     username = secure_getenv("LOGNAME");
42   }
43   assert(username != NULL);
44 
45   rc = get_devices_from_authfile(&cfg, username /* not used for SSH format */,
46                                  dev, &n_devs);
47   assert(rc == 1);
48   assert(n_devs == 1);
49   assert(strcmp(dev[0].coseType, "es256") == 0);
50   assert(strcmp(dev[0].attributes, "+presence") == 0);
51   assert(strcmp(dev[0].keyHandle,
52                 "Li4NkUKcvFym8V6aGagSAI11MXPuKSu6kqdWhdxNmQo3i25Ab"
53                 "1Lkun2I2H2bz4EjuwLD1UQpJjLG5vjbKG8efg==") == 0);
54   assert(strcmp(dev[0].publicKey,
55                 "439pGle7126d1YORADduke347N2t2XyKzOSv8M4naCUjlFYDt"
56                 "TVhP/MXO41wzHFUIzrrzfEzzCGWoOH5FU5Adw==") == 0);
57   assert(dev[0].old_format == 0);
58 
59   free(dev[0].coseType);
60   free(dev[0].attributes);
61   free(dev[0].keyHandle);
62   free(dev[0].publicKey);
63   memset(dev, 0, sizeof(dev));
64 
65   cfg.auth_file = "credentials/new_.cred";
66   cfg.sshformat = 0;
67   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
68   assert(rc == 1);
69   assert(n_devs == 1);
70 
71   assert(strcmp(dev[0].coseType, "es256") == 0);
72   assert(
73     strcmp(dev[0].keyHandle,
74            "vlcWFQFik8gJySuxMTlRwSDvnq9u/"
75            "mlMXRIqv4rd7Kq2CJj1V9Uh9PqbTF8UkY3EcQfHeS0G3nY0ibyxXE0pdw==") == 0);
76   assert(strcmp(dev[0].publicKey, "CTTRrHrqQmqfyI7/"
77                                   "bhtAknx9TGCqhd936JdcoekUxUa6PNA6uYzsvFN0qaE+"
78                                   "j2LchLPU4vajQPdAOcvvvNfWCA==") == 0);
79   assert(strcmp(dev[0].attributes, "+presence") == 0);
80   assert(dev[0].old_format == 0);
81 
82   free(dev[0].coseType);
83   free(dev[0].attributes);
84   free(dev[0].keyHandle);
85   free(dev[0].publicKey);
86 
87   memset(dev, 0, sizeof(dev));
88 
89   cfg.auth_file = "credentials/new_-V.cred";
90   cfg.sshformat = 0;
91   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
92   assert(rc == 1);
93   assert(n_devs == 1);
94 
95   assert(strcmp(dev[0].coseType, "es256") == 0);
96   assert(
97     strcmp(dev[0].keyHandle,
98            "qf/qcQqFloToNoUMnp2cWg8pUPKoJ0CJFyP0wqpbpOgcD+hzEOJEBaHFbnnYP9d/"
99            "zLKuwTsQ1nRpSc/aDJTEeQ==") == 0);
100   assert(strcmp(dev[0].publicKey,
101                 "kwca39tt8HI+MV7skKO1W1K4y0ptbXv6lFW/nwxZ0GSVeMAwTZgf/"
102                 "XP1O7O0i9+D227F/Ppo5eIc6gquvjiXdA==") == 0);
103   assert(strcmp(dev[0].attributes, "+presence+verification") == 0);
104   assert(dev[0].old_format == 0);
105 
106   free(dev[0].coseType);
107   free(dev[0].attributes);
108   free(dev[0].keyHandle);
109   free(dev[0].publicKey);
110 
111   memset(dev, 0, sizeof(dev));
112 
113   cfg.auth_file = "credentials/new_-N.cred";
114   cfg.sshformat = 0;
115   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
116   assert(rc == 1);
117   assert(n_devs == 1);
118 
119   assert(strcmp(dev[0].coseType, "es256") == 0);
120   assert(
121     strcmp(dev[0].keyHandle,
122            "IPbgFVDLguVOr5GzdV7C5MH4Ec+"
123            "bWfG2hifOy0IWWvNsHUZyN5x0rqbAoGWQPgxbAuQTKfk/n+3U9h4AWf8QXg==") ==
124     0);
125   assert(strcmp(dev[0].publicKey,
126                 "5KfKYcZofwqflFbr+d+df0e9b8nfLulducJ1WMyTBO00Rf3rL3JInYeccS2+"
127                 "xvI+eYNsZmJ3RR6zFAPkkBUhzA==") == 0);
128   assert(strcmp(dev[0].attributes, "+presence+pin") == 0);
129   assert(dev[0].old_format == 0);
130 
131   free(dev[0].coseType);
132   free(dev[0].attributes);
133   free(dev[0].keyHandle);
134   free(dev[0].publicKey);
135 
136   memset(dev, 0, sizeof(dev));
137 
138   cfg.auth_file = "credentials/new_-V-N.cred";
139   cfg.sshformat = 0;
140   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
141   assert(rc == 1);
142   assert(n_devs == 1);
143 
144   assert(strcmp(dev[0].coseType, "es256") == 0);
145   assert(strcmp(dev[0].keyHandle,
146                 "HftI6IHewEFB4OhBMeT9WjnG097GYvpE4dTxSS33JTRzRP6V/"
147                 "oBPyj3vurnTRJwif98V8YhceMAH8lDePA1dxQ==") == 0);
148   assert(strcmp(dev[0].publicKey,
149                 "7h0f9+"
150                 "MuzG087QC8zjLK9UoEksAXHmmGmoHGPvWwfkfSsH2cqq"
151                 "p7Qyi4LO7Y58OxlEq79gbWqNYEP0H56zvZ4Q==") == 0);
152   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
153   assert(dev[0].old_format == 0);
154 
155   free(dev[0].coseType);
156   free(dev[0].attributes);
157   free(dev[0].keyHandle);
158   free(dev[0].publicKey);
159 
160   memset(dev, 0, sizeof(dev));
161 
162   cfg.auth_file = "credentials/new_-P.cred";
163   cfg.sshformat = 0;
164   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
165   assert(rc == 1);
166   assert(n_devs == 1);
167 
168   assert(strcmp(dev[0].coseType, "es256") == 0);
169   assert(strcmp(dev[0].keyHandle,
170                 "yvFPHZBdPoBcdhF86mImwNQm2DUgfPw0s26QCpm4XQO0is4ql"
171                 "x3nIdyVP9WHszpJ5uFV/1mjd09L3P6ton1fAw==") == 0);
172   assert(
173     strcmp(dev[0].publicKey,
174            "JTP+Uu9VE/79hD1H+Uzf9yqSCi9HgeMLeuc3jQ43TCxg5o+GeFL7Q6e63p3Dn4/"
175            "uch2YJ8iNNJmDlktrLouWSg==") == 0);
176   assert(strcmp(dev[0].attributes, "") == 0);
177   assert(dev[0].old_format == 0);
178 
179   free(dev[0].coseType);
180   free(dev[0].attributes);
181   free(dev[0].keyHandle);
182   free(dev[0].publicKey);
183 
184   memset(dev, 0, sizeof(dev));
185 
186   cfg.auth_file = "credentials/new_-P-V.cred";
187   cfg.sshformat = 0;
188   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
189   assert(rc == 1);
190   assert(n_devs == 1);
191 
192   assert(strcmp(dev[0].coseType, "es256") == 0);
193   assert(strcmp(dev[0].keyHandle,
194                 "WSSDFwB8Bv4wg5pOLzYNRsqyJYi6/rbuxL6nzuvPOkpSslyNX/"
195                 "8lcZSsPfBmuWkRE1CNh7xvalAlBUz1/LUcbg==") == 0);
196   assert(strcmp(dev[0].publicKey, "XUIVb5hwOunVJvtwDXAWr5/"
197                                   "FTd7tkbYN6ahTzrSwmLtd8ISBJq9LBJ9v1NwfHBMakdC"
198                                   "OBbl8LMVc7bDBSrMoZw==") == 0);
199   assert(strcmp(dev[0].attributes, "+verification") == 0);
200   assert(dev[0].old_format == 0);
201 
202   free(dev[0].coseType);
203   free(dev[0].attributes);
204   free(dev[0].keyHandle);
205   free(dev[0].publicKey);
206 
207   memset(dev, 0, sizeof(dev));
208 
209   cfg.auth_file = "credentials/new_-P-N.cred";
210   cfg.sshformat = 0;
211   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
212   assert(rc == 1);
213   assert(n_devs == 1);
214 
215   assert(strcmp(dev[0].coseType, "es256") == 0);
216   assert(strcmp(dev[0].keyHandle,
217                 "+/"
218                 "l9LJ6dwbnDLff0PqkDhMEOWsruM+aYP+"
219                 "bzQdaCq3QmTGnh0dbcblfLaYs86XgcirS9OEoEkohB5pd8mhwSMQ==") == 0);
220   assert(strcmp(dev[0].publicKey,
221                 "d7sKBe6vgaoYTEXcyovikiB/7IZXLyUPv8qfdaxwWvy7WaGYhwkMvr2H/"
222                 "q6YBBHJmRl0OCU3WTD/hfeAo2RknA==") == 0);
223   assert(strcmp(dev[0].attributes, "+pin") == 0);
224   assert(dev[0].old_format == 0);
225 
226   free(dev[0].coseType);
227   free(dev[0].attributes);
228   free(dev[0].keyHandle);
229   free(dev[0].publicKey);
230 
231   memset(dev, 0, sizeof(dev));
232 
233   cfg.auth_file = "credentials/new_-P-V-N.cred";
234   cfg.sshformat = 0;
235   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
236   assert(rc == 1);
237   assert(n_devs == 1);
238 
239   assert(strcmp(dev[0].coseType, "es256") == 0);
240   assert(strcmp(dev[0].keyHandle,
241                 "vw9z9n3ndQkTKPY3+LDy1Fd2otIsV5LgcYE+"
242                 "dR0buViSZnKcLJ1kav46mQ47jtelw82/6q3Z2/VKQ44F763tVg==") == 0);
243   assert(strcmp(dev[0].publicKey,
244                 "X+"
245                 "GY5K9BSG24K9uVnaWgE8wlRhElIPp526M0Xw8H7zqVkGJm2OF"
246                 "T1ZQeowjxqEx4agArzPTT5WvukpERNLe81Q==") == 0);
247   assert(strcmp(dev[0].attributes, "+verification+pin") == 0);
248   assert(dev[0].old_format == 0);
249 
250   free(dev[0].coseType);
251   free(dev[0].attributes);
252   free(dev[0].keyHandle);
253   free(dev[0].publicKey);
254 
255   memset(dev, 0, sizeof(dev));
256 
257   cfg.auth_file = "credentials/new_-r.cred";
258   cfg.sshformat = 0;
259   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
260   assert(rc == 1);
261   assert(n_devs == 1);
262 
263   assert(strcmp(dev[0].coseType, "es256") == 0);
264   assert(strcmp(dev[0].keyHandle, "*") == 0);
265   assert(strcmp(dev[0].publicKey,
266                 "b9G0ZYtAB4TQQBnpUfptgTzDArSqLMP3/"
267                 "LxtHYZQrIpXrUnGsqi0gYrKa8ThJoKRlj6f3EJdsJMRdnOr6323+w==") ==
268          0);
269   assert(strcmp(dev[0].attributes, "+presence") == 0);
270   assert(dev[0].old_format == 0);
271 
272   free(dev[0].coseType);
273   free(dev[0].attributes);
274   free(dev[0].keyHandle);
275   free(dev[0].publicKey);
276 
277   memset(dev, 0, sizeof(dev));
278 
279   cfg.auth_file = "credentials/new_-r-V.cred";
280   cfg.sshformat = 0;
281   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
282   assert(rc == 1);
283   assert(n_devs == 1);
284 
285   assert(strcmp(dev[0].coseType, "es256") == 0);
286   assert(strcmp(dev[0].keyHandle, "*") == 0);
287   assert(strcmp(dev[0].publicKey,
288                 "D/"
289                 "ZqT9AuR83CV07njO9NKFuzREbmec3Da+"
290                 "NS2HMG346rh8Jq2zd9rbB35tedrUC4fZiRa3yRXlWYz1L9GXku7Q==") == 0);
291   assert(strcmp(dev[0].attributes, "+presence+verification") == 0);
292   assert(dev[0].old_format == 0);
293 
294   free(dev[0].coseType);
295   free(dev[0].attributes);
296   free(dev[0].keyHandle);
297   free(dev[0].publicKey);
298 
299   memset(dev, 0, sizeof(dev));
300 
301   cfg.auth_file = "credentials/new_-r-N.cred";
302   cfg.sshformat = 0;
303   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
304   assert(rc == 1);
305   assert(n_devs == 1);
306 
307   assert(strcmp(dev[0].coseType, "es256") == 0);
308   assert(strcmp(dev[0].keyHandle, "*") == 0);
309   assert(strcmp(dev[0].publicKey, "+rrhFmn3HrQXi+TMvQbide4/"
310                                   "rE24y3feLU9wJfhHsEgmaJiLTwAfiBw5z0ASlyZu3vPU"
311                                   "5/MaNuJdAZqvz/zEJQ==") == 0);
312   assert(strcmp(dev[0].attributes, "+presence+pin") == 0);
313   assert(dev[0].old_format == 0);
314 
315   free(dev[0].coseType);
316   free(dev[0].attributes);
317   free(dev[0].keyHandle);
318   free(dev[0].publicKey);
319 
320   memset(dev, 0, sizeof(dev));
321 
322   cfg.auth_file = "credentials/new_-r-V-N.cred";
323   cfg.sshformat = 0;
324   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
325   assert(rc == 1);
326   assert(n_devs == 1);
327 
328   assert(strcmp(dev[0].coseType, "es256") == 0);
329   assert(strcmp(dev[0].keyHandle, "*") == 0);
330   assert(strcmp(dev[0].publicKey,
331                 "sDQr9MGvetCg0dfPJ3fW804stpJC5VDsPld+zv3C1k6e4I6uyOg9I2lfaZU0/"
332                 "sp83CaODgmGsMd7O3Zo80c64Q==") == 0);
333   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
334   assert(dev[0].old_format == 0);
335 
336   free(dev[0].coseType);
337   free(dev[0].attributes);
338   free(dev[0].keyHandle);
339   free(dev[0].publicKey);
340 
341   memset(dev, 0, sizeof(dev));
342 
343   cfg.auth_file = "credentials/new_-r-P.cred";
344   cfg.sshformat = 0;
345   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
346   assert(rc == 1);
347   assert(n_devs == 1);
348 
349   assert(strcmp(dev[0].coseType, "es256") == 0);
350   assert(strcmp(dev[0].keyHandle, "*") == 0);
351   assert(strcmp(dev[0].publicKey,
352                 "yBQxzNyU+UEP7nQtlyuwzLmWXslkYCAHFSl5Fq2GxKIz9V0ocqbG7vRqbU+"
353                 "RGT73M4e8OLrBoX1gAZO7/2Q82Q==") == 0);
354   assert(strcmp(dev[0].attributes, "") == 0);
355   assert(dev[0].old_format == 0);
356 
357   free(dev[0].coseType);
358   free(dev[0].attributes);
359   free(dev[0].keyHandle);
360   free(dev[0].publicKey);
361 
362   memset(dev, 0, sizeof(dev));
363 
364   cfg.auth_file = "credentials/new_-r-P-V.cred";
365   cfg.sshformat = 0;
366   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
367   assert(rc == 1);
368   assert(n_devs == 1);
369 
370   assert(strcmp(dev[0].coseType, "es256") == 0);
371   assert(strcmp(dev[0].keyHandle, "*") == 0);
372   assert(strcmp(dev[0].publicKey, "GhUPBL+KXG7F7PwhO+"
373                                   "F3WDZx4KfxoxYwh7h5rqAzsIqkFESR21CqE7vkCvoWm2"
374                                   "dFTU51aJd2qdw/VmxJ0N/vRQ==") == 0);
375   assert(strcmp(dev[0].attributes, "+verification") == 0);
376   assert(dev[0].old_format == 0);
377 
378   free(dev[0].coseType);
379   free(dev[0].attributes);
380   free(dev[0].keyHandle);
381   free(dev[0].publicKey);
382 
383   memset(dev, 0, sizeof(dev));
384 
385   cfg.auth_file = "credentials/new_-r-P-N.cred";
386   cfg.sshformat = 0;
387   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
388   assert(rc == 1);
389   assert(n_devs == 1);
390 
391   assert(strcmp(dev[0].coseType, "es256") == 0);
392   assert(strcmp(dev[0].keyHandle, "*") == 0);
393   assert(strcmp(dev[0].publicKey,
394                 "9cthNaXFY62096qpe7OF45+KKFMqPb2csGkfa1q35J/"
395                 "3l8Re7SS9gkgSwvQOOAkxaqWYIWKAP1foPr58eerF0A==") == 0);
396   assert(strcmp(dev[0].attributes, "+pin") == 0);
397   assert(dev[0].old_format == 0);
398 
399   free(dev[0].coseType);
400   free(dev[0].attributes);
401   free(dev[0].keyHandle);
402   free(dev[0].publicKey);
403 
404   memset(dev, 0, sizeof(dev));
405 
406   cfg.auth_file = "credentials/new_-r-P-V-N.cred";
407   cfg.sshformat = 0;
408   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
409   assert(rc == 1);
410   assert(n_devs == 1);
411 
412   assert(strcmp(dev[0].coseType, "es256") == 0);
413   assert(strcmp(dev[0].keyHandle, "*") == 0);
414   assert(strcmp(dev[0].publicKey,
415                 "oO3z71rtDS86RH3EdZFxr/y6ZUOZ7/"
416                 "csyhia9UhiDWWpq7oUoxqvN0qmky9R14Clm6RovaOThX89oIbI84BqxA==") ==
417          0);
418   assert(strcmp(dev[0].attributes, "+verification+pin") == 0);
419   assert(dev[0].old_format == 0);
420 
421   free(dev[0].coseType);
422   free(dev[0].attributes);
423   free(dev[0].keyHandle);
424   free(dev[0].publicKey);
425 
426   memset(dev, 0, sizeof(dev));
427 
428   cfg.auth_file = "credentials/new_double_.cred";
429   cfg.sshformat = 0;
430   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
431   assert(rc == 1);
432   assert(n_devs == 2);
433 
434   assert(strcmp(dev[0].coseType, "es256") == 0);
435   assert(strcmp(dev[0].keyHandle,
436                 "THwoppI4JkuHWwQsSvsH6E987xAokX4MjB8Vh/"
437                 "lVghzW3iBtMglBw1epdwjbVEpKMVNqwYq6h71p3sQqnaTgLQ==") == 0);
438   assert(strcmp(dev[0].publicKey,
439                 "CB2xx1o7OBmX27Ph6wiqFUodmAiSiz2EuYg3UV/"
440                 "yEE0Fe9zeMYrk3k2+Una+O9m1P2uzuU3UypOqszVG1WNvYQ==") == 0);
441   assert(strcmp(dev[0].attributes, "+presence") == 0);
442   assert(dev[0].old_format == 0);
443 
444   assert(strcmp(dev[1].coseType, "es256") == 0);
445   assert(strcmp(dev[1].keyHandle,
446                 "i1grPL1cYGGda7VDTA5C4eqaLZXaW7u8LdIIz2QR8f0L07myF"
447                 "DVWFpHmdhEzFAPGtL2kgwdXwx4NvC8VfEKwjA==") == 0);
448   assert(strcmp(dev[1].publicKey,
449                 "14+UmD2jiBtceZTsshDPl3rKvHFOWeLdNx9nfq4gTHwi+4GmzUvA+"
450                 "XwCohusQsjWocfoyTejYWKL/ZKc5wRuYQ==") == 0);
451   assert(strcmp(dev[1].attributes, "+presence") == 0);
452   assert(dev[1].old_format == 0);
453 
454   free(dev[0].coseType);
455   free(dev[0].attributes);
456   free(dev[0].keyHandle);
457   free(dev[0].publicKey);
458 
459   free(dev[1].coseType);
460   free(dev[1].attributes);
461   free(dev[1].keyHandle);
462   free(dev[1].publicKey);
463 
464   memset(dev, 0, sizeof(dev));
465 
466   cfg.auth_file = "credentials/new_double_-V.cred";
467   cfg.sshformat = 0;
468   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
469   assert(rc == 1);
470   assert(n_devs == 2);
471 
472   assert(strcmp(dev[0].coseType, "es256") == 0);
473   assert(strcmp(dev[0].keyHandle,
474                 "oBQ1hIWiYfhJ8g6DFWawe0xOAlKtcPiBDKyoS8ydd/"
475                 "zwXbIEU+fHfnzjh46gLjV67+rt1ycCTTMj+P/7EsLNhg==") == 0);
476   assert(
477     strcmp(dev[0].publicKey,
478            "exBDguUdnZhG4+sXOnKPJtrMvn+Rb7pn2E52wyEieitaLY3Yhb2mSFth5sxNjuwl7/"
479            "n+0mMN6gQtmzVxCNvTXw==") == 0);
480   assert(strcmp(dev[0].attributes, "+presence+verification") == 0);
481   assert(dev[0].old_format == 0);
482 
483   assert(strcmp(dev[1].coseType, "es256") == 0);
484   assert(strcmp(dev[1].keyHandle, "/8NBWj19H4Wr+/"
485                                   "avzu9Qg5PGwE7fmdrFWGqlNega38eV1nnajviBOS6Aba"
486                                   "HmQwqsmVcE+DPNrP7KDFI3ZqjPew==") == 0);
487   assert(strcmp(dev[1].publicKey, "+sW8XEp5RJe/"
488                                   "ZyPykO6AP2Wm5ySTuLshZ13ohwl0VsypepsyhJxfPmEQ"
489                                   "GIXysn47uK5egh4eWMvNyMA4Ww0fPg==") == 0);
490   assert(strcmp(dev[1].attributes, "+presence+verification") == 0);
491   assert(dev[1].old_format == 0);
492 
493   free(dev[0].coseType);
494   free(dev[0].attributes);
495   free(dev[0].keyHandle);
496   free(dev[0].publicKey);
497 
498   free(dev[1].coseType);
499   free(dev[1].attributes);
500   free(dev[1].keyHandle);
501   free(dev[1].publicKey);
502 
503   memset(dev, 0, sizeof(dev));
504 
505   cfg.auth_file = "credentials/new_double_-N.cred";
506   cfg.sshformat = 0;
507   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
508   assert(rc == 1);
509   assert(n_devs == 2);
510 
511   assert(strcmp(dev[0].coseType, "es256") == 0);
512   assert(strcmp(dev[0].keyHandle,
513                 "WWJqEWaCASU+nsp2bTFh4LbJVOnf1ZRgNxmDcBuThynSTxDgO1GxGcTYg0Ilo/"
514                 "RF4YXvVCur7gfALYZA69lDTg==") == 0);
515   assert(strcmp(dev[0].publicKey, "ZN+ud1nR+"
516                                   "Lk5B6CzcbhvdJztDzgaK0MRLn7MOKPbOWfYpr8bLsYRY"
517                                   "IfnVUFfSwnGPF6iMK3/FjHRe1mGhOddkg==") == 0);
518   assert(strcmp(dev[0].attributes, "+presence+pin") == 0);
519   assert(dev[0].old_format == 0);
520 
521   assert(strcmp(dev[1].coseType, "es256") == 0);
522   assert(strcmp(dev[1].keyHandle,
523                 "auU99KPIIvKGbRcVmsiEyGp/rPx1RNruXI2qS8+JgX1e7nWPczLvmlkx8/"
524                 "0Z8ZBNqy69aocwQgGHRWKEbDdwlw==") == 0);
525   assert(strcmp(dev[1].publicKey,
526                 "oG+"
527                 "oN40QezgwX3S6xFk2sR3jiQnobXxxFQy7Mo5vv9hryeIHX13z"
528                 "G0OZK0KJuhj4A71OAeNXd065P9tVHeQtOQ==") == 0);
529   assert(strcmp(dev[1].attributes, "+presence+pin") == 0);
530   assert(dev[1].old_format == 0);
531 
532   free(dev[0].coseType);
533   free(dev[0].attributes);
534   free(dev[0].keyHandle);
535   free(dev[0].publicKey);
536 
537   free(dev[1].coseType);
538   free(dev[1].attributes);
539   free(dev[1].keyHandle);
540   free(dev[1].publicKey);
541 
542   memset(dev, 0, sizeof(dev));
543 
544   cfg.auth_file = "credentials/new_double_-V-N.cred";
545   cfg.sshformat = 0;
546   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
547   assert(rc == 1);
548   assert(n_devs == 2);
549 
550   assert(strcmp(dev[0].coseType, "es256") == 0);
551   assert(strcmp(dev[0].keyHandle,
552                 "5sVKkhoc+afHBtAp7csIg/Sq4RFi1arnr/"
553                 "Qi9quwpNZ4gPhlI6FFBP4CmH8HLw/n5xt8iQxUD83aue23WbrDVA==") == 0);
554   assert(strcmp(dev[0].publicKey,
555                 "K1oB5vq8XezU8NCA9jEuuxtLjbNS8bTAFEZXeNWvCQ5vF6viE"
556                 "7hvjBPfTrf2KoLz1JtYxHAngZMW+XOZIloVzw==") == 0);
557   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
558   assert(dev[0].old_format == 0);
559 
560   assert(strcmp(dev[1].coseType, "es256") == 0);
561   assert(strcmp(dev[1].keyHandle,
562                 "RQWf8kjjCXCNrMhUHHHIeWvQVlft96SShOsfTylA0QUO8UzuS"
563                 "Y1mQQFaOPGde1wSX9b2P7tpfTlhYflfgAwkuQ==") == 0);
564   assert(strcmp(dev[1].publicKey,
565                 "SGFYgZZ0rJoAPhj7KzDKSpm2a7y4lE8PIZ6T8WYeDqrsZxrrx"
566                 "Shc2sx2cAu+r70c8sb6etjab3m9CxobV8ADcA==") == 0);
567   assert(strcmp(dev[1].attributes, "+presence+verification+pin") == 0);
568   assert(dev[1].old_format == 0);
569 
570   free(dev[0].coseType);
571   free(dev[0].attributes);
572   free(dev[0].keyHandle);
573   free(dev[0].publicKey);
574 
575   free(dev[1].coseType);
576   free(dev[1].attributes);
577   free(dev[1].keyHandle);
578   free(dev[1].publicKey);
579 
580   memset(dev, 0, sizeof(dev));
581 
582   cfg.auth_file = "credentials/new_double_-P.cred";
583   cfg.sshformat = 0;
584   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
585   assert(rc == 1);
586   assert(n_devs == 2);
587 
588   assert(strcmp(dev[0].coseType, "es256") == 0);
589   assert(strcmp(dev[0].keyHandle,
590                 "ACoC1fhEYhdOstzkaCb1PqcU4T6xMrXxe5GEQjPDsheOxJzWG"
591                 "XTpaA3abmHZ3khcJ8Off/ecyPq2kMMqh3l7Xg==") == 0);
592   assert(
593     strcmp(dev[0].publicKey,
594            "c79BTe8BahuDUaeBAATyT8NKq+"
595            "mwV87aaor4s79WI5g9gn7BQDjnyUd1C7aaQMGGtu88h/YOGvDVKMVDal6OJQ==") ==
596     0);
597   assert(strcmp(dev[0].attributes, "") == 0);
598   assert(dev[0].old_format == 0);
599 
600   assert(strcmp(dev[1].coseType, "es256") == 0);
601   assert(strcmp(dev[1].keyHandle,
602                 "0BdgF8gbsYuFfUrpI3K01LcEwnWBxZ6Ewj61GXZJPQh3IcK4H"
603                 "+QMMG6nqzBhfLipVwGqUugZxCZP2eR9151kog==") == 0);
604   assert(strcmp(dev[1].publicKey,
605                 "X0vskPE+AKWmGrp3ZGhUJVXeAm+sN6nCbMeC30IpItVhMdSosP9I0jOMmsQeF+"
606                 "rKh+00K30iNucHdXguLPYL7g==") == 0);
607   assert(strcmp(dev[1].attributes, "") == 0);
608   assert(dev[1].old_format == 0);
609 
610   free(dev[0].coseType);
611   free(dev[0].attributes);
612   free(dev[0].keyHandle);
613   free(dev[0].publicKey);
614 
615   free(dev[1].coseType);
616   free(dev[1].attributes);
617   free(dev[1].keyHandle);
618   free(dev[1].publicKey);
619 
620   memset(dev, 0, sizeof(dev));
621 
622   cfg.auth_file = "credentials/new_double_-P-V.cred";
623   cfg.sshformat = 0;
624   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
625   assert(rc == 1);
626   assert(n_devs == 2);
627 
628   assert(strcmp(dev[0].coseType, "es256") == 0);
629   assert(strcmp(dev[0].keyHandle,
630                 "7jPjHZzm/"
631                 "Ec6oKy6gpq+XXI3P435OLJFO4o3iGH8KUQlEw+"
632                 "1Zv0FmUtguJ2HIZifRsIyMILdu2rwCDgcqmuj9Q==") == 0);
633   assert(strcmp(dev[0].publicKey,
634                 "xzrbCZKe8sNdrE0F3dkRwsfkwInYUrKHEAMeeHkNrRLbQqlJH"
635                 "n9C2j5puty3FDVKMV5y1MCrwyJ8IEZHtX2H+Q==") == 0);
636   assert(strcmp(dev[0].attributes, "+verification") == 0);
637   assert(dev[0].old_format == 0);
638 
639   assert(strcmp(dev[1].coseType, "es256") == 0);
640   assert(strcmp(dev[1].keyHandle,
641                 "ghKvm1MLkHIWwr6qjzenROIPfoJCUfrFTlqOXLrMktBSqHaYh"
642                 "oA7NpqwVa3jJ86hpJFekWDOqoV1sLz+GZ9UtQ==") == 0);
643   assert(strcmp(dev[1].publicKey,
644                 "SyrD8BKIReOUHLII642tgpA+i1S8d+6MOcnfGapk32blq0/"
645                 "qYWmgzJ5lqv+BsO0nBoOG6uXLqLqMkKt3/zLj1w==") == 0);
646   assert(strcmp(dev[1].attributes, "+verification") == 0);
647   assert(dev[1].old_format == 0);
648 
649   free(dev[0].coseType);
650   free(dev[0].attributes);
651   free(dev[0].keyHandle);
652   free(dev[0].publicKey);
653 
654   free(dev[1].coseType);
655   free(dev[1].attributes);
656   free(dev[1].keyHandle);
657   free(dev[1].publicKey);
658 
659   memset(dev, 0, sizeof(dev));
660 
661   cfg.auth_file = "credentials/new_double_-P-N.cred";
662   cfg.sshformat = 0;
663   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
664   assert(rc == 1);
665   assert(n_devs == 2);
666 
667   assert(strcmp(dev[0].coseType, "es256") == 0);
668   assert(
669     strcmp(dev[0].keyHandle,
670            "USgDNJZ9Z8GXzQgWdrkFJ5S+WsqKhdg9zHmoMifow3xBd8Rn0ZH2udPuRs6Q8Y/"
671            "13BOCL9lEhdxc+1JAoP0j8w==") == 0);
672   assert(strcmp(dev[0].publicKey,
673                 "Is31uMHcVRQYiCxCe3E1tJfKSA92Q47JoppIfLcRLd9sh+e7QR9Gix4LrA2+"
674                 "RPw24eKI0iqpMm5ayvPMx2nmxA==") == 0);
675   assert(strcmp(dev[0].attributes, "+pin") == 0);
676   assert(dev[0].old_format == 0);
677 
678   assert(strcmp(dev[1].coseType, "es256") == 0);
679   assert(strcmp(dev[1].keyHandle,
680                 "uBTQIj0EUe2YoeLfVXksAo9gXTJJ2cXMyPqOMNvE2g9pDwetJ"
681                 "IdPTR9oUorMiuRZiXALAlfaayc4vMgQvWXdxw==") == 0);
682   assert(strcmp(dev[1].publicKey,
683                 "cToPi0zc8+U6g1kpqJ2pHXCKQyxyNrJAvuLqBmknwxhciBj0+"
684                 "iTDFaut0Vc1MSu/r6yrw2mHSnuYXTmPx3mhmw==") == 0);
685   assert(strcmp(dev[1].attributes, "+pin") == 0);
686   assert(dev[1].old_format == 0);
687 
688   free(dev[0].coseType);
689   free(dev[0].attributes);
690   free(dev[0].keyHandle);
691   free(dev[0].publicKey);
692 
693   free(dev[1].coseType);
694   free(dev[1].attributes);
695   free(dev[1].keyHandle);
696   free(dev[1].publicKey);
697 
698   memset(dev, 0, sizeof(dev));
699 
700   cfg.auth_file = "credentials/new_double_-P-V-N.cred";
701   cfg.sshformat = 0;
702   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
703   assert(rc == 1);
704   assert(n_devs == 2);
705 
706   assert(strcmp(dev[0].coseType, "es256") == 0);
707   assert(strcmp(dev[0].keyHandle,
708                 "Ypw0/"
709                 "A5KEPshXH0zO72Qlgt1uHvB4VnVRBpObzVGDeS8LxR9s"
710                 "mealISARIOo3rlOLgjqj6dkJxqu1LoLm22UpA==") == 0);
711   assert(strcmp(dev[0].publicKey,
712                 "dFnZLWVzEvbSw6O4ld9Fjb1Pki4NptNpvASGEthr5GsaWRp6p"
713                 "Le1Uqwm/IrVrOgwO2Q6sB0SXsQKdAIWbMrPHw==") == 0);
714   assert(strcmp(dev[0].attributes, "+verification+pin") == 0);
715   assert(dev[0].old_format == 0);
716 
717   assert(strcmp(dev[1].coseType, "es256") == 0);
718   assert(strcmp(dev[1].keyHandle,
719                 "IMaY3yG6NuO4oVjrKUrCArluNfimT+5pnxB2jA0CXD7xjmhUO+"
720                 "90lILLwxxnGYKvbq2X5wlxLNnuQLm5gpt7ig==") == 0);
721   assert(strcmp(dev[1].publicKey,
722                 "bDTCB4xWqBY9gh6BLP8b4gJmUIYIQbckvrSMDX/8lyftL/"
723                 "uesJBxblHkDVzfCIatAzqKZ6kltokEHE8saX8phA==") == 0);
724   assert(strcmp(dev[1].attributes, "+verification+pin") == 0);
725   assert(dev[1].old_format == 0);
726 
727   free(dev[0].coseType);
728   free(dev[0].attributes);
729   free(dev[0].keyHandle);
730   free(dev[0].publicKey);
731 
732   free(dev[1].coseType);
733   free(dev[1].attributes);
734   free(dev[1].keyHandle);
735   free(dev[1].publicKey);
736 
737   memset(dev, 0, sizeof(dev));
738 
739   cfg.auth_file = "credentials/new_double_-r.cred";
740   cfg.sshformat = 0;
741   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
742   assert(rc == 1);
743   assert(n_devs == 2);
744 
745   assert(strcmp(dev[0].coseType, "es256") == 0);
746   assert(strcmp(dev[0].keyHandle, "*") == 0);
747   assert(strcmp(dev[0].publicKey,
748                 "JvWtmu8JaeUNYklKkii5KflmS9vVXtTGcqLdWNXcRHza5qCuB"
749                 "oYX/QNWlKoZklPfsmjTVkXcnBh+B4DSZM55fw==") == 0);
750   assert(strcmp(dev[0].attributes, "+presence") == 0);
751   assert(dev[0].old_format == 0);
752 
753   assert(strcmp(dev[1].coseType, "es256") == 0);
754   assert(strcmp(dev[1].keyHandle, "*") == 0);
755   assert(strcmp(dev[1].publicKey,
756                 "4AXGf9eUWUXpfLNJ+2uySBvz2FmkK2EZP+wyKuTf73UDS8/"
757                 "vi+DZVllXuhrXmQA36NLwqS8YPEIq6pRLYE6m2A==") == 0);
758   assert(strcmp(dev[1].attributes, "+presence") == 0);
759   assert(dev[1].old_format == 0);
760 
761   free(dev[0].coseType);
762   free(dev[0].attributes);
763   free(dev[0].keyHandle);
764   free(dev[0].publicKey);
765 
766   free(dev[1].coseType);
767   free(dev[1].attributes);
768   free(dev[1].keyHandle);
769   free(dev[1].publicKey);
770 
771   memset(dev, 0, sizeof(dev));
772 
773   cfg.auth_file = "credentials/new_double_-r-V.cred";
774   cfg.sshformat = 0;
775   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
776   assert(rc == 1);
777   assert(n_devs == 2);
778 
779   assert(strcmp(dev[0].coseType, "es256") == 0);
780   assert(strcmp(dev[0].keyHandle, "*") == 0);
781   assert(strcmp(dev[0].publicKey,
782                 "qZywZ2yedeQu4bPAy6rk7pPcHPprUd+"
783                 "DOxGf10MgwteNYKyAWuyPd7tREc0X3ZzoDejzmM3+X0dWALnBBSVWyA==") ==
784          0);
785   assert(strcmp(dev[0].attributes, "+presence+verification") == 0);
786   assert(dev[0].old_format == 0);
787 
788   assert(strcmp(dev[1].coseType, "es256") == 0);
789   assert(strcmp(dev[1].keyHandle, "*") == 0);
790   assert(strcmp(dev[1].publicKey, "IcQsmgW/Y5UQUW/"
791                                   "Bz7eYU1azOfyhQWTr8R6mk0gpBJ4l5qq4BstimedubRF"
792                                   "voIAanumNrrqgvo1CA+9rzHG6Hg==") == 0);
793   assert(strcmp(dev[1].attributes, "+presence+verification") == 0);
794   assert(dev[1].old_format == 0);
795 
796   free(dev[0].coseType);
797   free(dev[0].attributes);
798   free(dev[0].keyHandle);
799   free(dev[0].publicKey);
800 
801   free(dev[1].coseType);
802   free(dev[1].attributes);
803   free(dev[1].keyHandle);
804   free(dev[1].publicKey);
805 
806   memset(dev, 0, sizeof(dev));
807 
808   cfg.auth_file = "credentials/new_double_-r-N.cred";
809   cfg.sshformat = 0;
810   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
811   assert(rc == 1);
812   assert(n_devs == 2);
813 
814   assert(strcmp(dev[0].coseType, "es256") == 0);
815   assert(strcmp(dev[0].keyHandle, "*") == 0);
816   assert(
817     strcmp(dev[0].publicKey,
818            "BEOf/KU74hsdWbvfUn7yIXH2aktz/"
819            "DY2ChTLpljbntz5xpwsOv+4x9r6LySuVYWuoWH11fgKv4Bqt57MHiPYUg==") == 0);
820   assert(strcmp(dev[0].attributes, "+presence+pin") == 0);
821   assert(dev[0].old_format == 0);
822 
823   assert(strcmp(dev[1].coseType, "es256") == 0);
824   assert(strcmp(dev[1].keyHandle, "*") == 0);
825   assert(strcmp(dev[1].publicKey,
826                 "4vbnuZSSrYJ/qzOpnVgy8cqm7yq6m9+GQlpNnMbPN2kXr+B0vL91O6d7/"
827                 "0VitOqW8GX2FFQaXvV3mHETtsUYAg==") == 0);
828   assert(strcmp(dev[1].attributes, "+presence+pin") == 0);
829   assert(dev[1].old_format == 0);
830 
831   free(dev[0].coseType);
832   free(dev[0].attributes);
833   free(dev[0].keyHandle);
834   free(dev[0].publicKey);
835 
836   free(dev[1].coseType);
837   free(dev[1].attributes);
838   free(dev[1].keyHandle);
839   free(dev[1].publicKey);
840 
841   memset(dev, 0, sizeof(dev));
842 
843   cfg.auth_file = "credentials/new_double_-r-V-N.cred";
844   cfg.sshformat = 0;
845   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
846   assert(rc == 1);
847   assert(n_devs == 2);
848 
849   assert(strcmp(dev[0].coseType, "es256") == 0);
850   assert(strcmp(dev[0].keyHandle, "*") == 0);
851   assert(strcmp(dev[0].publicKey,
852                 "5zx2nk/ANhsncQV0np0kDYT+jf5w3dQ8rvVM5fqwDcHbh8AzBHbcGiRcNfPE/"
853                 "6v09cEomfVrIAT+IvyAcZnuow==") == 0);
854   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
855   assert(dev[0].old_format == 0);
856 
857   assert(strcmp(dev[1].coseType, "es256") == 0);
858   assert(strcmp(dev[1].keyHandle, "*") == 0);
859   assert(strcmp(dev[1].publicKey,
860                 "FJ6553yOZoAJKnR2Ysai/5k1i6PpHz/8HusKkFjOqBSIsAK9vALAb/"
861                 "M223hz8remwuqPyNXczq1WgBcN4P9wKw==") == 0);
862   assert(strcmp(dev[1].attributes, "+presence+verification+pin") == 0);
863   assert(dev[1].old_format == 0);
864 
865   free(dev[0].coseType);
866   free(dev[0].attributes);
867   free(dev[0].keyHandle);
868   free(dev[0].publicKey);
869 
870   free(dev[1].coseType);
871   free(dev[1].attributes);
872   free(dev[1].keyHandle);
873   free(dev[1].publicKey);
874 
875   memset(dev, 0, sizeof(dev));
876 
877   cfg.auth_file = "credentials/new_double_-r-P.cred";
878   cfg.sshformat = 0;
879   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
880   assert(rc == 1);
881   assert(n_devs == 2);
882 
883   assert(strcmp(dev[0].coseType, "es256") == 0);
884   assert(strcmp(dev[0].keyHandle, "*") == 0);
885   assert(strcmp(dev[0].publicKey,
886                 "kuY0RmjxQfbzMREZM8l++bbKTFHSGTYK+"
887                 "OI0owggVKCXSaD5YHsk2EONGtwWoafg8KypNQIYhxxxT2RlWWVcGw==") ==
888          0);
889   assert(strcmp(dev[0].attributes, "") == 0);
890   assert(dev[0].old_format == 0);
891 
892   assert(strcmp(dev[1].coseType, "es256") == 0);
893   assert(strcmp(dev[1].keyHandle, "*") == 0);
894   assert(strcmp(dev[1].publicKey,
895                 "t94+brQxTF62oQw642Pq6qDFFfPx1A7GbjU/"
896                 "2i+H7OiHLeIALTzm9AwLVZuyofXURgiIrmLAG26ww2KVv6ji+A==") == 0);
897   assert(strcmp(dev[1].attributes, "") == 0);
898   assert(dev[1].old_format == 0);
899 
900   free(dev[0].coseType);
901   free(dev[0].attributes);
902   free(dev[0].keyHandle);
903   free(dev[0].publicKey);
904 
905   free(dev[1].coseType);
906   free(dev[1].attributes);
907   free(dev[1].keyHandle);
908   free(dev[1].publicKey);
909 
910   memset(dev, 0, sizeof(dev));
911 
912   cfg.auth_file = "credentials/new_double_-r-P-V.cred";
913   cfg.sshformat = 0;
914   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
915   assert(rc == 1);
916   assert(n_devs == 2);
917 
918   assert(strcmp(dev[0].coseType, "es256") == 0);
919   assert(strcmp(dev[0].keyHandle, "*") == 0);
920   assert(strcmp(dev[0].publicKey,
921                 "KBBozy1XYywARLB1AcY5hYvUN2hYHpGY2YyxAIczZ7GXrfWeZ"
922                 "8RGOW7+Z34DaozgLFeHMQSCXJuNYK+fw8khEw==") == 0);
923   assert(strcmp(dev[0].attributes, "+verification") == 0);
924   assert(dev[0].old_format == 0);
925 
926   assert(strcmp(dev[1].coseType, "es256") == 0);
927   assert(strcmp(dev[1].keyHandle, "*") == 0);
928   assert(strcmp(dev[1].publicKey, "LABCxfeOxfctKo8HmDA/"
929                                   "PYyPlwTYj3i2tQu2QWEmi7tytaPQA8ZZZP7hddzpkUQV"
930                                   "HRu2oASGigS7oBwt38WFCw==") == 0);
931   assert(strcmp(dev[1].attributes, "+verification") == 0);
932   assert(dev[1].old_format == 0);
933 
934   free(dev[0].coseType);
935   free(dev[0].attributes);
936   free(dev[0].keyHandle);
937   free(dev[0].publicKey);
938 
939   free(dev[1].coseType);
940   free(dev[1].attributes);
941   free(dev[1].keyHandle);
942   free(dev[1].publicKey);
943 
944   memset(dev, 0, sizeof(dev));
945 
946   cfg.auth_file = "credentials/new_double_-r-P-N.cred";
947   cfg.sshformat = 0;
948   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
949   assert(rc == 1);
950   assert(n_devs == 2);
951 
952   assert(strcmp(dev[0].coseType, "es256") == 0);
953   assert(strcmp(dev[0].keyHandle, "*") == 0);
954   assert(strcmp(dev[0].publicKey,
955                 "se1ih71yYTjlvF6p3Kc+wB0PtXv+5RM8O/0/"
956                 "yFy5RcvEXCvirQPbxhmSIhh5QYP17fkAFGLfJYQtmV7RNU0xDg==") == 0);
957   assert(strcmp(dev[0].attributes, "+pin") == 0);
958   assert(dev[0].old_format == 0);
959 
960   assert(strcmp(dev[1].coseType, "es256") == 0);
961   assert(strcmp(dev[1].keyHandle, "*") == 0);
962   assert(strcmp(dev[1].publicKey,
963                 "v6hgPffPopqHTh19Y0Wf11cF/lChqwlT0f5/"
964                 "6K+Dsdzq1OPZxKBqTaW6jCU0x5Pr9HgntWyTtQ1TS7EM22uhyQ==") == 0);
965   assert(strcmp(dev[1].attributes, "+pin") == 0);
966   assert(dev[1].old_format == 0);
967 
968   free(dev[0].coseType);
969   free(dev[0].attributes);
970   free(dev[0].keyHandle);
971   free(dev[0].publicKey);
972 
973   free(dev[1].coseType);
974   free(dev[1].attributes);
975   free(dev[1].keyHandle);
976   free(dev[1].publicKey);
977 
978   memset(dev, 0, sizeof(dev));
979 
980   cfg.auth_file = "credentials/new_double_-r-P-V-N.cred";
981   cfg.sshformat = 0;
982   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
983   assert(rc == 1);
984   assert(n_devs == 2);
985 
986   assert(strcmp(dev[0].coseType, "es256") == 0);
987   assert(strcmp(dev[0].keyHandle, "*") == 0);
988   assert(
989     strcmp(dev[0].publicKey,
990            "+zfrwyH/M5/"
991            "tEVfijRKzRqNh+"
992            "QoC3JBweJFa0heINIDkCjLAYqUb2hSTecTxoKh2bzpxSqeg6nJJPJNBqDD2aA==") ==
993     0);
994   assert(strcmp(dev[0].attributes, "+verification+pin") == 0);
995   assert(dev[0].old_format == 0);
996 
997   assert(strcmp(dev[1].coseType, "es256") == 0);
998   assert(strcmp(dev[1].keyHandle, "*") == 0);
999   assert(strcmp(dev[1].publicKey,
1000                 "W1vVZhmkt3KG16sraGayBP8elRXSl5UGMl+"
1001                 "oojLI15yyIAVUUzoEKNUQtf3j3s3sVtjD009nLxHOpkf2zjIpQQ==") == 0);
1002   assert(strcmp(dev[1].attributes, "+verification+pin") == 0);
1003   assert(dev[1].old_format == 0);
1004 
1005   free(dev[0].coseType);
1006   free(dev[0].attributes);
1007   free(dev[0].keyHandle);
1008   free(dev[0].publicKey);
1009 
1010   free(dev[1].coseType);
1011   free(dev[1].attributes);
1012   free(dev[1].keyHandle);
1013   free(dev[1].publicKey);
1014 
1015   memset(dev, 0, sizeof(dev));
1016 
1017   cfg.auth_file = "credentials/new_mixed_12.cred";
1018   cfg.sshformat = 0;
1019   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
1020   assert(rc == 1);
1021   assert(n_devs == 2);
1022 
1023   assert(strcmp(dev[0].coseType, "es256") == 0);
1024   assert(strcmp(dev[0].keyHandle,
1025                 "ooq2bCWeHFXzWqKwWFRliREQjOtUWKtWJbr7KwSh3FLNiCFgB"
1026                 "uie4tqq3Pee86o7ew32u1+ITLsCBEYPrTQMAg==") == 0);
1027   assert(strcmp(dev[0].publicKey,
1028                 "39hCGEGO7kqz3Pig/bL0ycZxLfcpWPtX8fKxb/"
1029                 "S8xx2BdSUs6HXTzIDmifuFv6pabpy3DxUvcA0yIygMAO1ZQw==") == 0);
1030   assert(strcmp(dev[0].attributes, "+presence") == 0);
1031   assert(dev[0].old_format == 0);
1032 
1033   assert(strcmp(dev[1].coseType, "es256") == 0);
1034   assert(strcmp(dev[1].keyHandle,
1035                 "2O2vxjSMeMl6obzQCkIE3VL2Qtija5sLJuJkMrP+/"
1036                 "bAFeoLp7m2SPKKRUFFXsO8Z44HTL7PKoFmY4+r5Qwt00w==") == 0);
1037   assert(strcmp(dev[1].publicKey,
1038                 "qZIaqR+"
1039                 "mGxEnvo04LtsX4krKV5r5PBVBfJYDXi2zS7uXSHgRr7K"
1040                 "OQHaNgx70E2IBrVmUlaFAH4QhDnDAeishBA==") == 0);
1041   assert(strcmp(dev[1].attributes, "+presence") == 0);
1042   assert(dev[1].old_format == 0);
1043 
1044   free(dev[0].coseType);
1045   free(dev[0].attributes);
1046   free(dev[0].keyHandle);
1047   free(dev[0].publicKey);
1048 
1049   free(dev[1].coseType);
1050   free(dev[1].attributes);
1051   free(dev[1].keyHandle);
1052   free(dev[1].publicKey);
1053 
1054   memset(dev, 0, sizeof(dev));
1055 
1056   cfg.auth_file = "credentials/new_mixed_1-P2.cred";
1057   cfg.sshformat = 0;
1058   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
1059   assert(rc == 1);
1060   assert(n_devs == 2);
1061 
1062   assert(strcmp(dev[0].coseType, "es256") == 0);
1063   assert(strcmp(dev[0].keyHandle, "9HY72OR/"
1064                                   "kQECy5PbwfJwSaWZFlLL1CHamlm1LMZFozCBj6hzq4V9"
1065                                   "BpkkkMObxNL9gFd8yOXKDflFiVVoGq7sWQ==") == 0);
1066   assert(strcmp(dev[0].publicKey,
1067                 "sn+"
1068                 "cAxAvdlnwwwvLCLoEjiza2G0aPniyqgomxmm1aLisMl1z9Vpv"
1069                 "dlGgO4nOPLYZSoRkW6nKvOBzztGYq/knfQ==") == 0);
1070   assert(strcmp(dev[0].attributes, "+presence") == 0);
1071   assert(dev[0].old_format == 0);
1072 
1073   assert(strcmp(dev[1].coseType, "es256") == 0);
1074   assert(strcmp(dev[1].keyHandle,
1075                 "43JAMt5EnG72Sx/4C9ptEd+6/f1RMOKWBSQj4U6pnQyVvPFI/"
1076                 "nX2jvN4EYqMQrdGYaszRbh0AL0an3hKZJNqLw==") == 0);
1077   assert(strcmp(dev[1].publicKey, "aPlEf4vR+SUrOykB1tk+"
1078                                   "H1XKsEiSIBMK252bPz7kLHusnAgqgPZLqcruFEegChmY"
1079                                   "yhytWDPluPrw1o16FFyf5Q==") == 0);
1080   assert(strcmp(dev[1].attributes, "") == 0);
1081   assert(dev[1].old_format == 0);
1082 
1083   free(dev[0].coseType);
1084   free(dev[0].attributes);
1085   free(dev[0].keyHandle);
1086   free(dev[0].publicKey);
1087 
1088   free(dev[1].coseType);
1089   free(dev[1].attributes);
1090   free(dev[1].keyHandle);
1091   free(dev[1].publicKey);
1092 
1093   memset(dev, 0, sizeof(dev));
1094 
1095   cfg.auth_file = "credentials/new_mixed_-P12.cred";
1096   cfg.sshformat = 0;
1097   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
1098   assert(rc == 1);
1099   assert(n_devs == 2);
1100 
1101   assert(strcmp(dev[0].coseType, "es256") == 0);
1102   assert(strcmp(dev[0].keyHandle,
1103                 "kNfZ8Uot7TcImjCXhji32Apur3172TYc4XLA0uDQsdW1lrIRe"
1104                 "cyZP5chyPrkNxIrRIZ58UgiMxD72fiaCiQghw==") == 0);
1105   assert(strcmp(dev[0].publicKey,
1106                 "QiscDH8fpvC9imwd7UiQ8n2XeqNRWW5sUxmboMbiNLUXWrvuG"
1107                 "7pEBvWYQA3yLdmOvvb/3MijCh6AZr/3fpwZKQ==") == 0);
1108   assert(strcmp(dev[0].attributes, "") == 0);
1109   assert(dev[0].old_format == 0);
1110 
1111   assert(strcmp(dev[1].coseType, "es256") == 0);
1112   assert(strcmp(dev[1].keyHandle,
1113                 "4ICSXy6FCp7NUErnJAOoyqGOnszEMmnIxjgH2NmiC9cyn0XqB"
1114                 "xmr1+YHt9fv6yhbrPrnn9/QLvysS+VZBc9twQ==") == 0);
1115   assert(strcmp(dev[1].publicKey,
1116                 "IJMQOa1WrUkBwZKKviNxkMlvKGkiIbXcIdWf+"
1117                 "Rv1BPWI9Xo1edi1LF7ux8sZs6mbQEn3z+v+UCSgO13ZtFzI/w==") == 0);
1118   assert(strcmp(dev[1].attributes, "+presence") == 0);
1119   assert(dev[1].old_format == 0);
1120 
1121   free(dev[0].coseType);
1122   free(dev[0].attributes);
1123   free(dev[0].keyHandle);
1124   free(dev[0].publicKey);
1125 
1126   free(dev[1].coseType);
1127   free(dev[1].attributes);
1128   free(dev[1].keyHandle);
1129   free(dev[1].publicKey);
1130 
1131   memset(dev, 0, sizeof(dev));
1132 
1133   cfg.auth_file = "credentials/new_mixed_-P1-P2.cred";
1134   cfg.sshformat = 0;
1135   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
1136   assert(rc == 1);
1137   assert(n_devs == 2);
1138 
1139   assert(strcmp(dev[0].coseType, "es256") == 0);
1140   assert(strcmp(dev[0].keyHandle,
1141                 "gqCuXGhiA9P4PhXPgrMjQCdgBPkLHHmQcDF/"
1142                 "AMOp9vMuCoreRgwWlckMvCdHnsRTohdGqKZgVT/M3HVu4/UiXA==") == 0);
1143   assert(strcmp(dev[0].publicKey,
1144                 "DJaEFTDU5XMq5+KwhEwj69zo5KthqvPRcrCE8Rhu6v1FkgFww/"
1145                 "gHYeCZi8s6IRbzmmkxSANXuBAGcpVAM6Zo3A==") == 0);
1146   assert(strcmp(dev[0].attributes, "") == 0);
1147   assert(dev[0].old_format == 0);
1148 
1149   assert(strcmp(dev[1].coseType, "es256") == 0);
1150   assert(strcmp(dev[1].keyHandle,
1151                 "RFgUluPS2nAXHy3++1dyyu5k0Rnr9KHUccYSH2oMdpw+"
1152                 "QWOu5lvHki3lyAxhKm7HTu8wfMK86qIHakTMYDiYSA==") == 0);
1153   assert(strcmp(dev[1].publicKey,
1154                 "sgoB52Vmw6fqQMDsBHKMsSeft6AfXoULH+"
1155                 "mHNi3nOS6KHnvobo82LFGjvQqxrbSNfIul/cpD3MSdz8R0Tfhl3w==") == 0);
1156   assert(strcmp(dev[1].attributes, "") == 0);
1157   assert(dev[1].old_format == 0);
1158 
1159   free(dev[0].coseType);
1160   free(dev[0].attributes);
1161   free(dev[0].keyHandle);
1162   free(dev[0].publicKey);
1163 
1164   free(dev[1].coseType);
1165   free(dev[1].attributes);
1166   free(dev[1].keyHandle);
1167   free(dev[1].publicKey);
1168 
1169   memset(dev, 0, sizeof(dev));
1170 
1171   cfg.auth_file = "credentials/old_credential.cred";
1172   cfg.sshformat = 0;
1173 
1174   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
1175   assert(rc == 1);
1176   assert(n_devs == 1);
1177   assert(strcmp(dev[0].coseType, "es256") == 0);
1178   assert(strcmp(dev[0].attributes, "+presence") == 0);
1179   printf("kh %s\n", dev[0].publicKey);
1180   assert(strcmp(dev[0].keyHandle,
1181                 "mGvXxDqTMSVkSlDnDRNTVsP5Ij9cceCkdZkSJYeaJCHCOpBtM"
1182                 "IFGQXKBBkvZpV5bWuEuJkoElIiMKirhCPAU8Q==") == 0);
1183   assert(
1184     strcmp(dev[0].publicKey,
1185            "0405a35641a6f5b63e2ef4449393e7e1cb2b96711e797fc74dbd63e99dbf410ffe7"
1186            "425e79f8c41d8f049c8f7241a803563a43c139f923f0ab9007fbd0dcc722927") ==
1187     0);
1188   assert(dev[0].old_format == 1);
1189 
1190   free(dev[0].coseType);
1191   free(dev[0].attributes);
1192   free(dev[0].keyHandle);
1193   free(dev[0].publicKey);
1194 
1195   return 0;
1196 }
1197