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
22int 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