Home | History | Annotate | Line # | Download | only in tests
      1 /*
      2  *  Copyright (C) 2014-2022 Yubico AB - See COPYING
      3  */
      4 
      5 #undef NDEBUG
      6 #include <sys/types.h>
      7 #include <assert.h>
      8 #include <pwd.h>
      9 #include <stdio.h>
     10 #include <stdlib.h>
     11 #include <unistd.h>
     12 
     13 #include <string.h>
     14 #include "../util.h"
     15 
     16 #include "openbsd-compat.h"
     17 
     18 static void test_nouserok(const char *username) {
     19   device_t *dev;
     20   unsigned ndevs;
     21   cfg_t cfg;
     22   int rc;
     23 
     24   memset(&cfg, 0, sizeof(cfg_t));
     25   cfg.auth_file = "credentials/this_file_does_not_exist.cred";
     26   cfg.debug = 1;
     27   cfg.debug_file = stderr;
     28   cfg.max_devs = 1;
     29   cfg.nouserok = 1;
     30 
     31   dev = calloc(cfg.max_devs, sizeof(*dev));
     32   assert(dev != NULL);
     33 
     34   rc = get_devices_from_authfile(&cfg, username, dev, &ndevs);
     35   assert(rc == PAM_IGNORE);
     36 
     37   cfg.auth_file = "credentials/empty.cred";
     38   rc = get_devices_from_authfile(&cfg, username, dev, &ndevs);
     39   assert(rc == PAM_IGNORE);
     40 
     41   free_devices(dev, ndevs);
     42 }
     43 
     44 static void test_ssh_credential(const char *username) {
     45   device_t *dev;
     46   unsigned ndevs;
     47   cfg_t cfg;
     48   int rc;
     49 
     50   memset(&cfg, 0, sizeof(cfg_t));
     51   cfg.auth_file = "credentials/ssh_credential.cred";
     52   cfg.debug = 1;
     53   cfg.debug_file = stderr;
     54   cfg.max_devs = 1;
     55   cfg.sshformat = 1;
     56 
     57   dev = calloc(cfg.max_devs, sizeof(*dev));
     58   assert(dev != NULL);
     59 
     60   rc = get_devices_from_authfile(&cfg, username, dev, &ndevs);
     61   assert(rc == PAM_SUCCESS);
     62   assert(ndevs == 1);
     63   assert(strcmp(dev[0].coseType, "es256") == 0);
     64   assert(strcmp(dev[0].attributes, "+presence") == 0);
     65   assert(strcmp(dev[0].keyHandle,
     66                 "Li4NkUKcvFym8V6aGagSAI11MXPuKSu6kqdWhdxNmQo3i25Ab"
     67                 "1Lkun2I2H2bz4EjuwLD1UQpJjLG5vjbKG8efg==") == 0);
     68   assert(strcmp(dev[0].publicKey,
     69                 "439pGle7126d1YORADduke347N2t2XyKzOSv8M4naCUjlFYDt"
     70                 "TVhP/MXO41wzHFUIzrrzfEzzCGWoOH5FU5Adw==") == 0);
     71   assert(dev[0].old_format == 0);
     72   free_devices(dev, ndevs);
     73 }
     74 
     75 static void test_old_credential(const char *username) {
     76   device_t *dev;
     77   unsigned ndevs;
     78   cfg_t cfg;
     79   int rc;
     80 
     81   memset(&cfg, 0, sizeof(cfg_t));
     82   cfg.auth_file = "credentials/old_credential.cred";
     83   cfg.sshformat = 0;
     84   cfg.debug = 1;
     85   cfg.debug_file = stderr;
     86   cfg.max_devs = 1;
     87   cfg.sshformat = 0;
     88 
     89   dev = calloc(cfg.max_devs, sizeof(*dev));
     90   rc = get_devices_from_authfile(&cfg, username, dev, &ndevs);
     91   assert(rc == PAM_SUCCESS);
     92   assert(ndevs == 1);
     93   assert(strcmp(dev[0].coseType, "es256") == 0);
     94   assert(strcmp(dev[0].attributes, "+presence") == 0);
     95   assert(strcmp(dev[0].keyHandle,
     96                 "mGvXxDqTMSVkSlDnDRNTVsP5Ij9cceCkdZkSJYeaJCHCOpBtM"
     97                 "IFGQXKBBkvZpV5bWuEuJkoElIiMKirhCPAU8Q==") == 0);
     98   assert(
     99     strcmp(dev[0].publicKey,
    100            "0405a35641a6f5b63e2ef4449393e7e1cb2b96711e797fc74dbd63e99dbf410ffe7"
    101            "425e79f8c41d8f049c8f7241a803563a43c139f923f0ab9007fbd0dcc722927") ==
    102     0);
    103   assert(dev[0].old_format == 1);
    104   free_devices(dev, ndevs);
    105 }
    106 
    107 static void test_limited_count(const char *username) {
    108   cfg_t cfg;
    109   device_t *dev;
    110   int rc;
    111   unsigned ndevs;
    112 
    113   memset(&cfg, 0, sizeof(cfg_t));
    114   cfg.debug = 1;
    115   cfg.debug_file = stderr;
    116 
    117   /* authfile contains three credentials (eddsa, es256, eddsa) */
    118   cfg.auth_file = "credentials/new_limited_count.cred";
    119   cfg.max_devs = 1;
    120 
    121   dev = calloc(cfg.max_devs, sizeof(*dev));
    122   assert(dev != NULL);
    123   rc = get_devices_from_authfile(&cfg, username, dev, &ndevs);
    124   assert(rc == PAM_SUCCESS);
    125   assert(ndevs == 1);
    126   assert(strcmp(dev[0].coseType, "eddsa") == 0);
    127   assert(strcmp(dev[0].keyHandle,
    128                 "3mh1qzbVrSyy+zp4rM5JSIQzGAnzolAnqEp/13wt0Ea/"
    129                 "V0q6rDcoRC3Eyw6tx71mBKDiT5k1fSvtqGYf49r+"
    130                 "lcnk6kyYQrWBoBaUhrgmF89EUkpXQk59Z+HysoW3HJ/"
    131                 "S6N56DMmElFRMrmf0n3uTNBE9Y5/lHfWT+5gvCvmgd/0=") == 0);
    132   assert(strcmp(dev[0].publicKey,
    133                 "LpQP+xyOjupzQTMQ2L6B5kv1SnAntUC5zANmZ8Zntdo=") == 0);
    134   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
    135   assert(dev[0].old_format == 0);
    136   free_devices(dev, ndevs);
    137 
    138   cfg.max_devs = 2;
    139   dev = calloc(cfg.max_devs, sizeof(*dev));
    140   assert(dev != NULL);
    141   rc = get_devices_from_authfile(&cfg, username, dev, &ndevs);
    142   assert(rc == PAM_SUCCESS);
    143   assert(ndevs == 2);
    144   assert(strcmp(dev[0].coseType, "eddsa") == 0);
    145   assert(strcmp(dev[0].keyHandle,
    146                 "3mh1qzbVrSyy+zp4rM5JSIQzGAnzolAnqEp/13wt0Ea/"
    147                 "V0q6rDcoRC3Eyw6tx71mBKDiT5k1fSvtqGYf49r+"
    148                 "lcnk6kyYQrWBoBaUhrgmF89EUkpXQk59Z+HysoW3HJ/"
    149                 "S6N56DMmElFRMrmf0n3uTNBE9Y5/lHfWT+5gvCvmgd/0=") == 0);
    150   assert(strcmp(dev[0].publicKey,
    151                 "LpQP+xyOjupzQTMQ2L6B5kv1SnAntUC5zANmZ8Zntdo=") == 0);
    152   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
    153   assert(dev[0].old_format == 0);
    154   assert(strcmp(dev[1].coseType, "es256") == 0);
    155   assert(strcmp(dev[1].keyHandle,
    156                 "vCM/NAYjRqhbodPhR3wA0ElFEvAtGLH20WpRuGPb/MOYEQskUZgq6Jm51x5m/"
    157                 "CnbmPYp/KDjy8kOZgwssgCCew==") == 0);
    158   assert(strcmp(dev[1].publicKey,
    159                 "qqx7ciL1kv4Tdg6Nxs99sx6u3gLE9rQcYoOwcOJymcp5ikQQH"
    160                 "7Ijh+D3gIQ89FGUUgmNWlteaXS9VtDsmN16Wg==") == 0);
    161   assert(strcmp(dev[1].attributes, "+presence+verification+pin") == 0);
    162   assert(dev[1].old_format == 0);
    163   free_devices(dev, ndevs);
    164 }
    165 
    166 static void test_new_credentials(const char *username) {
    167   cfg_t cfg;
    168   device_t *dev;
    169   unsigned n_devs;
    170   int rc;
    171 
    172   memset(&cfg, 0, sizeof(cfg_t));
    173   cfg.debug = 1;
    174   cfg.debug_file = stderr;
    175   cfg.max_devs = 24;
    176 
    177   /* clang-format off */
    178   /* BEGIN REGENERATE_CREDENTIALS.PY */
    179   dev = calloc(cfg.max_devs, sizeof(*dev));
    180   assert(dev != NULL);
    181   cfg.auth_file = "credentials/new_.cred";
    182   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    183   assert(rc == PAM_SUCCESS);
    184   assert(n_devs == 1);
    185   assert(strcmp(dev[0].coseType, "es256") == 0);
    186   assert(strcmp(dev[0].keyHandle, "vlcWFQFik8gJySuxMTlRwSDvnq9u/mlMXRIqv4rd7Kq2CJj1V9Uh9PqbTF8UkY3EcQfHeS0G3nY0ibyxXE0pdw==") == 0);
    187   assert(strcmp(dev[0].publicKey, "CTTRrHrqQmqfyI7/bhtAknx9TGCqhd936JdcoekUxUa6PNA6uYzsvFN0qaE+j2LchLPU4vajQPdAOcvvvNfWCA==") == 0);
    188   assert(strcmp(dev[0].attributes, "+presence") == 0);
    189   assert(dev[0].old_format == 0);
    190   free_devices(dev, n_devs);
    191 
    192   dev = calloc(cfg.max_devs, sizeof(*dev));
    193   assert(dev != NULL);
    194   cfg.auth_file = "credentials/new_-V.cred";
    195   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    196   assert(rc == PAM_SUCCESS);
    197   assert(n_devs == 1);
    198   assert(strcmp(dev[0].coseType, "es256") == 0);
    199   assert(strcmp(dev[0].keyHandle, "qf/qcQqFloToNoUMnp2cWg8pUPKoJ0CJFyP0wqpbpOgcD+hzEOJEBaHFbnnYP9d/zLKuwTsQ1nRpSc/aDJTEeQ==") == 0);
    200   assert(strcmp(dev[0].publicKey, "kwca39tt8HI+MV7skKO1W1K4y0ptbXv6lFW/nwxZ0GSVeMAwTZgf/XP1O7O0i9+D227F/Ppo5eIc6gquvjiXdA==") == 0);
    201   assert(strcmp(dev[0].attributes, "+presence+verification") == 0);
    202   assert(dev[0].old_format == 0);
    203   free_devices(dev, n_devs);
    204 
    205   dev = calloc(cfg.max_devs, sizeof(*dev));
    206   assert(dev != NULL);
    207   cfg.auth_file = "credentials/new_-N.cred";
    208   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    209   assert(rc == PAM_SUCCESS);
    210   assert(n_devs == 1);
    211   assert(strcmp(dev[0].coseType, "es256") == 0);
    212   assert(strcmp(dev[0].keyHandle, "IPbgFVDLguVOr5GzdV7C5MH4Ec+bWfG2hifOy0IWWvNsHUZyN5x0rqbAoGWQPgxbAuQTKfk/n+3U9h4AWf8QXg==") == 0);
    213   assert(strcmp(dev[0].publicKey, "5KfKYcZofwqflFbr+d+df0e9b8nfLulducJ1WMyTBO00Rf3rL3JInYeccS2+xvI+eYNsZmJ3RR6zFAPkkBUhzA==") == 0);
    214   assert(strcmp(dev[0].attributes, "+presence+pin") == 0);
    215   assert(dev[0].old_format == 0);
    216   free_devices(dev, n_devs);
    217 
    218   dev = calloc(cfg.max_devs, sizeof(*dev));
    219   assert(dev != NULL);
    220   cfg.auth_file = "credentials/new_-V-N.cred";
    221   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    222   assert(rc == PAM_SUCCESS);
    223   assert(n_devs == 1);
    224   assert(strcmp(dev[0].coseType, "es256") == 0);
    225   assert(strcmp(dev[0].keyHandle, "HftI6IHewEFB4OhBMeT9WjnG097GYvpE4dTxSS33JTRzRP6V/oBPyj3vurnTRJwif98V8YhceMAH8lDePA1dxQ==") == 0);
    226   assert(strcmp(dev[0].publicKey, "7h0f9+MuzG087QC8zjLK9UoEksAXHmmGmoHGPvWwfkfSsH2cqqp7Qyi4LO7Y58OxlEq79gbWqNYEP0H56zvZ4Q==") == 0);
    227   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
    228   assert(dev[0].old_format == 0);
    229   free_devices(dev, n_devs);
    230 
    231   dev = calloc(cfg.max_devs, sizeof(*dev));
    232   assert(dev != NULL);
    233   cfg.auth_file = "credentials/new_-P.cred";
    234   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    235   assert(rc == PAM_SUCCESS);
    236   assert(n_devs == 1);
    237   assert(strcmp(dev[0].coseType, "es256") == 0);
    238   assert(strcmp(dev[0].keyHandle, "yvFPHZBdPoBcdhF86mImwNQm2DUgfPw0s26QCpm4XQO0is4qlx3nIdyVP9WHszpJ5uFV/1mjd09L3P6ton1fAw==") == 0);
    239   assert(strcmp(dev[0].publicKey, "JTP+Uu9VE/79hD1H+Uzf9yqSCi9HgeMLeuc3jQ43TCxg5o+GeFL7Q6e63p3Dn4/uch2YJ8iNNJmDlktrLouWSg==") == 0);
    240   assert(strcmp(dev[0].attributes, "") == 0);
    241   assert(dev[0].old_format == 0);
    242   free_devices(dev, n_devs);
    243 
    244   dev = calloc(cfg.max_devs, sizeof(*dev));
    245   assert(dev != NULL);
    246   cfg.auth_file = "credentials/new_-P-V.cred";
    247   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    248   assert(rc == PAM_SUCCESS);
    249   assert(n_devs == 1);
    250   assert(strcmp(dev[0].coseType, "es256") == 0);
    251   assert(strcmp(dev[0].keyHandle, "WSSDFwB8Bv4wg5pOLzYNRsqyJYi6/rbuxL6nzuvPOkpSslyNX/8lcZSsPfBmuWkRE1CNh7xvalAlBUz1/LUcbg==") == 0);
    252   assert(strcmp(dev[0].publicKey, "XUIVb5hwOunVJvtwDXAWr5/FTd7tkbYN6ahTzrSwmLtd8ISBJq9LBJ9v1NwfHBMakdCOBbl8LMVc7bDBSrMoZw==") == 0);
    253   assert(strcmp(dev[0].attributes, "+verification") == 0);
    254   assert(dev[0].old_format == 0);
    255   free_devices(dev, n_devs);
    256 
    257   dev = calloc(cfg.max_devs, sizeof(*dev));
    258   assert(dev != NULL);
    259   cfg.auth_file = "credentials/new_-P-N.cred";
    260   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    261   assert(rc == PAM_SUCCESS);
    262   assert(n_devs == 1);
    263   assert(strcmp(dev[0].coseType, "es256") == 0);
    264   assert(strcmp(dev[0].keyHandle, "+/l9LJ6dwbnDLff0PqkDhMEOWsruM+aYP+bzQdaCq3QmTGnh0dbcblfLaYs86XgcirS9OEoEkohB5pd8mhwSMQ==") == 0);
    265   assert(strcmp(dev[0].publicKey, "d7sKBe6vgaoYTEXcyovikiB/7IZXLyUPv8qfdaxwWvy7WaGYhwkMvr2H/q6YBBHJmRl0OCU3WTD/hfeAo2RknA==") == 0);
    266   assert(strcmp(dev[0].attributes, "+pin") == 0);
    267   assert(dev[0].old_format == 0);
    268   free_devices(dev, n_devs);
    269 
    270   dev = calloc(cfg.max_devs, sizeof(*dev));
    271   assert(dev != NULL);
    272   cfg.auth_file = "credentials/new_-P-V-N.cred";
    273   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    274   assert(rc == PAM_SUCCESS);
    275   assert(n_devs == 1);
    276   assert(strcmp(dev[0].coseType, "es256") == 0);
    277   assert(strcmp(dev[0].keyHandle, "vw9z9n3ndQkTKPY3+LDy1Fd2otIsV5LgcYE+dR0buViSZnKcLJ1kav46mQ47jtelw82/6q3Z2/VKQ44F763tVg==") == 0);
    278   assert(strcmp(dev[0].publicKey, "X+GY5K9BSG24K9uVnaWgE8wlRhElIPp526M0Xw8H7zqVkGJm2OFT1ZQeowjxqEx4agArzPTT5WvukpERNLe81Q==") == 0);
    279   assert(strcmp(dev[0].attributes, "+verification+pin") == 0);
    280   assert(dev[0].old_format == 0);
    281   free_devices(dev, n_devs);
    282 
    283   dev = calloc(cfg.max_devs, sizeof(*dev));
    284   assert(dev != NULL);
    285   cfg.auth_file = "credentials/new_-r.cred";
    286   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    287   assert(rc == PAM_SUCCESS);
    288   assert(n_devs == 1);
    289   assert(strcmp(dev[0].coseType, "es256") == 0);
    290   assert(strcmp(dev[0].keyHandle, "*") == 0);
    291   assert(strcmp(dev[0].publicKey, "b9G0ZYtAB4TQQBnpUfptgTzDArSqLMP3/LxtHYZQrIpXrUnGsqi0gYrKa8ThJoKRlj6f3EJdsJMRdnOr6323+w==") == 0);
    292   assert(strcmp(dev[0].attributes, "+presence") == 0);
    293   assert(dev[0].old_format == 0);
    294   free_devices(dev, n_devs);
    295 
    296   dev = calloc(cfg.max_devs, sizeof(*dev));
    297   assert(dev != NULL);
    298   cfg.auth_file = "credentials/new_-r-V.cred";
    299   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    300   assert(rc == PAM_SUCCESS);
    301   assert(n_devs == 1);
    302   assert(strcmp(dev[0].coseType, "es256") == 0);
    303   assert(strcmp(dev[0].keyHandle, "*") == 0);
    304   assert(strcmp(dev[0].publicKey, "D/ZqT9AuR83CV07njO9NKFuzREbmec3Da+NS2HMG346rh8Jq2zd9rbB35tedrUC4fZiRa3yRXlWYz1L9GXku7Q==") == 0);
    305   assert(strcmp(dev[0].attributes, "+presence+verification") == 0);
    306   assert(dev[0].old_format == 0);
    307   free_devices(dev, n_devs);
    308 
    309   dev = calloc(cfg.max_devs, sizeof(*dev));
    310   assert(dev != NULL);
    311   cfg.auth_file = "credentials/new_-r-N.cred";
    312   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    313   assert(rc == PAM_SUCCESS);
    314   assert(n_devs == 1);
    315   assert(strcmp(dev[0].coseType, "es256") == 0);
    316   assert(strcmp(dev[0].keyHandle, "*") == 0);
    317   assert(strcmp(dev[0].publicKey, "+rrhFmn3HrQXi+TMvQbide4/rE24y3feLU9wJfhHsEgmaJiLTwAfiBw5z0ASlyZu3vPU5/MaNuJdAZqvz/zEJQ==") == 0);
    318   assert(strcmp(dev[0].attributes, "+presence+pin") == 0);
    319   assert(dev[0].old_format == 0);
    320   free_devices(dev, n_devs);
    321 
    322   dev = calloc(cfg.max_devs, sizeof(*dev));
    323   assert(dev != NULL);
    324   cfg.auth_file = "credentials/new_-r-V-N.cred";
    325   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    326   assert(rc == PAM_SUCCESS);
    327   assert(n_devs == 1);
    328   assert(strcmp(dev[0].coseType, "es256") == 0);
    329   assert(strcmp(dev[0].keyHandle, "*") == 0);
    330   assert(strcmp(dev[0].publicKey, "sDQr9MGvetCg0dfPJ3fW804stpJC5VDsPld+zv3C1k6e4I6uyOg9I2lfaZU0/sp83CaODgmGsMd7O3Zo80c64Q==") == 0);
    331   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
    332   assert(dev[0].old_format == 0);
    333   free_devices(dev, n_devs);
    334 
    335   dev = calloc(cfg.max_devs, sizeof(*dev));
    336   assert(dev != NULL);
    337   cfg.auth_file = "credentials/new_-r-P.cred";
    338   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    339   assert(rc == PAM_SUCCESS);
    340   assert(n_devs == 1);
    341   assert(strcmp(dev[0].coseType, "es256") == 0);
    342   assert(strcmp(dev[0].keyHandle, "*") == 0);
    343   assert(strcmp(dev[0].publicKey, "yBQxzNyU+UEP7nQtlyuwzLmWXslkYCAHFSl5Fq2GxKIz9V0ocqbG7vRqbU+RGT73M4e8OLrBoX1gAZO7/2Q82Q==") == 0);
    344   assert(strcmp(dev[0].attributes, "") == 0);
    345   assert(dev[0].old_format == 0);
    346   free_devices(dev, n_devs);
    347 
    348   dev = calloc(cfg.max_devs, sizeof(*dev));
    349   assert(dev != NULL);
    350   cfg.auth_file = "credentials/new_-r-P-V.cred";
    351   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    352   assert(rc == PAM_SUCCESS);
    353   assert(n_devs == 1);
    354   assert(strcmp(dev[0].coseType, "es256") == 0);
    355   assert(strcmp(dev[0].keyHandle, "*") == 0);
    356   assert(strcmp(dev[0].publicKey, "GhUPBL+KXG7F7PwhO+F3WDZx4KfxoxYwh7h5rqAzsIqkFESR21CqE7vkCvoWm2dFTU51aJd2qdw/VmxJ0N/vRQ==") == 0);
    357   assert(strcmp(dev[0].attributes, "+verification") == 0);
    358   assert(dev[0].old_format == 0);
    359   free_devices(dev, n_devs);
    360 
    361   dev = calloc(cfg.max_devs, sizeof(*dev));
    362   assert(dev != NULL);
    363   cfg.auth_file = "credentials/new_-r-P-N.cred";
    364   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    365   assert(rc == PAM_SUCCESS);
    366   assert(n_devs == 1);
    367   assert(strcmp(dev[0].coseType, "es256") == 0);
    368   assert(strcmp(dev[0].keyHandle, "*") == 0);
    369   assert(strcmp(dev[0].publicKey, "9cthNaXFY62096qpe7OF45+KKFMqPb2csGkfa1q35J/3l8Re7SS9gkgSwvQOOAkxaqWYIWKAP1foPr58eerF0A==") == 0);
    370   assert(strcmp(dev[0].attributes, "+pin") == 0);
    371   assert(dev[0].old_format == 0);
    372   free_devices(dev, n_devs);
    373 
    374   dev = calloc(cfg.max_devs, sizeof(*dev));
    375   assert(dev != NULL);
    376   cfg.auth_file = "credentials/new_-r-P-V-N.cred";
    377   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    378   assert(rc == PAM_SUCCESS);
    379   assert(n_devs == 1);
    380   assert(strcmp(dev[0].coseType, "es256") == 0);
    381   assert(strcmp(dev[0].keyHandle, "*") == 0);
    382   assert(strcmp(dev[0].publicKey, "oO3z71rtDS86RH3EdZFxr/y6ZUOZ7/csyhia9UhiDWWpq7oUoxqvN0qmky9R14Clm6RovaOThX89oIbI84BqxA==") == 0);
    383   assert(strcmp(dev[0].attributes, "+verification+pin") == 0);
    384   assert(dev[0].old_format == 0);
    385   free_devices(dev, n_devs);
    386 
    387   dev = calloc(cfg.max_devs, sizeof(*dev));
    388   assert(dev != NULL);
    389   cfg.auth_file = "credentials/new_double_.cred";
    390   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    391   assert(rc == PAM_SUCCESS);
    392   assert(n_devs == 2);
    393   assert(strcmp(dev[0].coseType, "es256") == 0);
    394   assert(strcmp(dev[0].keyHandle, "THwoppI4JkuHWwQsSvsH6E987xAokX4MjB8Vh/lVghzW3iBtMglBw1epdwjbVEpKMVNqwYq6h71p3sQqnaTgLQ==") == 0);
    395   assert(strcmp(dev[0].publicKey, "CB2xx1o7OBmX27Ph6wiqFUodmAiSiz2EuYg3UV/yEE0Fe9zeMYrk3k2+Una+O9m1P2uzuU3UypOqszVG1WNvYQ==") == 0);
    396   assert(strcmp(dev[0].attributes, "+presence") == 0);
    397   assert(dev[0].old_format == 0);
    398   assert(strcmp(dev[1].coseType, "es256") == 0);
    399   assert(strcmp(dev[1].keyHandle, "i1grPL1cYGGda7VDTA5C4eqaLZXaW7u8LdIIz2QR8f0L07myFDVWFpHmdhEzFAPGtL2kgwdXwx4NvC8VfEKwjA==") == 0);
    400   assert(strcmp(dev[1].publicKey, "14+UmD2jiBtceZTsshDPl3rKvHFOWeLdNx9nfq4gTHwi+4GmzUvA+XwCohusQsjWocfoyTejYWKL/ZKc5wRuYQ==") == 0);
    401   assert(strcmp(dev[1].attributes, "+presence") == 0);
    402   assert(dev[1].old_format == 0);
    403   free_devices(dev, n_devs);
    404 
    405   dev = calloc(cfg.max_devs, sizeof(*dev));
    406   assert(dev != NULL);
    407   cfg.auth_file = "credentials/new_double_-V.cred";
    408   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    409   assert(rc == PAM_SUCCESS);
    410   assert(n_devs == 2);
    411   assert(strcmp(dev[0].coseType, "es256") == 0);
    412   assert(strcmp(dev[0].keyHandle, "oBQ1hIWiYfhJ8g6DFWawe0xOAlKtcPiBDKyoS8ydd/zwXbIEU+fHfnzjh46gLjV67+rt1ycCTTMj+P/7EsLNhg==") == 0);
    413   assert(strcmp(dev[0].publicKey, "exBDguUdnZhG4+sXOnKPJtrMvn+Rb7pn2E52wyEieitaLY3Yhb2mSFth5sxNjuwl7/n+0mMN6gQtmzVxCNvTXw==") == 0);
    414   assert(strcmp(dev[0].attributes, "+presence+verification") == 0);
    415   assert(dev[0].old_format == 0);
    416   assert(strcmp(dev[1].coseType, "es256") == 0);
    417   assert(strcmp(dev[1].keyHandle, "/8NBWj19H4Wr+/avzu9Qg5PGwE7fmdrFWGqlNega38eV1nnajviBOS6AbaHmQwqsmVcE+DPNrP7KDFI3ZqjPew==") == 0);
    418   assert(strcmp(dev[1].publicKey, "+sW8XEp5RJe/ZyPykO6AP2Wm5ySTuLshZ13ohwl0VsypepsyhJxfPmEQGIXysn47uK5egh4eWMvNyMA4Ww0fPg==") == 0);
    419   assert(strcmp(dev[1].attributes, "+presence+verification") == 0);
    420   assert(dev[1].old_format == 0);
    421   free_devices(dev, n_devs);
    422 
    423   dev = calloc(cfg.max_devs, sizeof(*dev));
    424   assert(dev != NULL);
    425   cfg.auth_file = "credentials/new_double_-N.cred";
    426   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    427   assert(rc == PAM_SUCCESS);
    428   assert(n_devs == 2);
    429   assert(strcmp(dev[0].coseType, "es256") == 0);
    430   assert(strcmp(dev[0].keyHandle, "WWJqEWaCASU+nsp2bTFh4LbJVOnf1ZRgNxmDcBuThynSTxDgO1GxGcTYg0Ilo/RF4YXvVCur7gfALYZA69lDTg==") == 0);
    431   assert(strcmp(dev[0].publicKey, "ZN+ud1nR+Lk5B6CzcbhvdJztDzgaK0MRLn7MOKPbOWfYpr8bLsYRYIfnVUFfSwnGPF6iMK3/FjHRe1mGhOddkg==") == 0);
    432   assert(strcmp(dev[0].attributes, "+presence+pin") == 0);
    433   assert(dev[0].old_format == 0);
    434   assert(strcmp(dev[1].coseType, "es256") == 0);
    435   assert(strcmp(dev[1].keyHandle, "auU99KPIIvKGbRcVmsiEyGp/rPx1RNruXI2qS8+JgX1e7nWPczLvmlkx8/0Z8ZBNqy69aocwQgGHRWKEbDdwlw==") == 0);
    436   assert(strcmp(dev[1].publicKey, "oG+oN40QezgwX3S6xFk2sR3jiQnobXxxFQy7Mo5vv9hryeIHX13zG0OZK0KJuhj4A71OAeNXd065P9tVHeQtOQ==") == 0);
    437   assert(strcmp(dev[1].attributes, "+presence+pin") == 0);
    438   assert(dev[1].old_format == 0);
    439   free_devices(dev, n_devs);
    440 
    441   dev = calloc(cfg.max_devs, sizeof(*dev));
    442   assert(dev != NULL);
    443   cfg.auth_file = "credentials/new_double_-V-N.cred";
    444   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    445   assert(rc == PAM_SUCCESS);
    446   assert(n_devs == 2);
    447   assert(strcmp(dev[0].coseType, "es256") == 0);
    448   assert(strcmp(dev[0].keyHandle, "5sVKkhoc+afHBtAp7csIg/Sq4RFi1arnr/Qi9quwpNZ4gPhlI6FFBP4CmH8HLw/n5xt8iQxUD83aue23WbrDVA==") == 0);
    449   assert(strcmp(dev[0].publicKey, "K1oB5vq8XezU8NCA9jEuuxtLjbNS8bTAFEZXeNWvCQ5vF6viE7hvjBPfTrf2KoLz1JtYxHAngZMW+XOZIloVzw==") == 0);
    450   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
    451   assert(dev[0].old_format == 0);
    452   assert(strcmp(dev[1].coseType, "es256") == 0);
    453   assert(strcmp(dev[1].keyHandle, "RQWf8kjjCXCNrMhUHHHIeWvQVlft96SShOsfTylA0QUO8UzuSY1mQQFaOPGde1wSX9b2P7tpfTlhYflfgAwkuQ==") == 0);
    454   assert(strcmp(dev[1].publicKey, "SGFYgZZ0rJoAPhj7KzDKSpm2a7y4lE8PIZ6T8WYeDqrsZxrrxShc2sx2cAu+r70c8sb6etjab3m9CxobV8ADcA==") == 0);
    455   assert(strcmp(dev[1].attributes, "+presence+verification+pin") == 0);
    456   assert(dev[1].old_format == 0);
    457   free_devices(dev, n_devs);
    458 
    459   dev = calloc(cfg.max_devs, sizeof(*dev));
    460   assert(dev != NULL);
    461   cfg.auth_file = "credentials/new_double_-P.cred";
    462   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    463   assert(rc == PAM_SUCCESS);
    464   assert(n_devs == 2);
    465   assert(strcmp(dev[0].coseType, "es256") == 0);
    466   assert(strcmp(dev[0].keyHandle, "ACoC1fhEYhdOstzkaCb1PqcU4T6xMrXxe5GEQjPDsheOxJzWGXTpaA3abmHZ3khcJ8Off/ecyPq2kMMqh3l7Xg==") == 0);
    467   assert(strcmp(dev[0].publicKey, "c79BTe8BahuDUaeBAATyT8NKq+mwV87aaor4s79WI5g9gn7BQDjnyUd1C7aaQMGGtu88h/YOGvDVKMVDal6OJQ==") == 0);
    468   assert(strcmp(dev[0].attributes, "") == 0);
    469   assert(dev[0].old_format == 0);
    470   assert(strcmp(dev[1].coseType, "es256") == 0);
    471   assert(strcmp(dev[1].keyHandle, "0BdgF8gbsYuFfUrpI3K01LcEwnWBxZ6Ewj61GXZJPQh3IcK4H+QMMG6nqzBhfLipVwGqUugZxCZP2eR9151kog==") == 0);
    472   assert(strcmp(dev[1].publicKey, "X0vskPE+AKWmGrp3ZGhUJVXeAm+sN6nCbMeC30IpItVhMdSosP9I0jOMmsQeF+rKh+00K30iNucHdXguLPYL7g==") == 0);
    473   assert(strcmp(dev[1].attributes, "") == 0);
    474   assert(dev[1].old_format == 0);
    475   free_devices(dev, n_devs);
    476 
    477   dev = calloc(cfg.max_devs, sizeof(*dev));
    478   assert(dev != NULL);
    479   cfg.auth_file = "credentials/new_double_-P-V.cred";
    480   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    481   assert(rc == PAM_SUCCESS);
    482   assert(n_devs == 2);
    483   assert(strcmp(dev[0].coseType, "es256") == 0);
    484   assert(strcmp(dev[0].keyHandle, "7jPjHZzm/Ec6oKy6gpq+XXI3P435OLJFO4o3iGH8KUQlEw+1Zv0FmUtguJ2HIZifRsIyMILdu2rwCDgcqmuj9Q==") == 0);
    485   assert(strcmp(dev[0].publicKey, "xzrbCZKe8sNdrE0F3dkRwsfkwInYUrKHEAMeeHkNrRLbQqlJHn9C2j5puty3FDVKMV5y1MCrwyJ8IEZHtX2H+Q==") == 0);
    486   assert(strcmp(dev[0].attributes, "+verification") == 0);
    487   assert(dev[0].old_format == 0);
    488   assert(strcmp(dev[1].coseType, "es256") == 0);
    489   assert(strcmp(dev[1].keyHandle, "ghKvm1MLkHIWwr6qjzenROIPfoJCUfrFTlqOXLrMktBSqHaYhoA7NpqwVa3jJ86hpJFekWDOqoV1sLz+GZ9UtQ==") == 0);
    490   assert(strcmp(dev[1].publicKey, "SyrD8BKIReOUHLII642tgpA+i1S8d+6MOcnfGapk32blq0/qYWmgzJ5lqv+BsO0nBoOG6uXLqLqMkKt3/zLj1w==") == 0);
    491   assert(strcmp(dev[1].attributes, "+verification") == 0);
    492   assert(dev[1].old_format == 0);
    493   free_devices(dev, n_devs);
    494 
    495   dev = calloc(cfg.max_devs, sizeof(*dev));
    496   assert(dev != NULL);
    497   cfg.auth_file = "credentials/new_double_-P-N.cred";
    498   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    499   assert(rc == PAM_SUCCESS);
    500   assert(n_devs == 2);
    501   assert(strcmp(dev[0].coseType, "es256") == 0);
    502   assert(strcmp(dev[0].keyHandle, "USgDNJZ9Z8GXzQgWdrkFJ5S+WsqKhdg9zHmoMifow3xBd8Rn0ZH2udPuRs6Q8Y/13BOCL9lEhdxc+1JAoP0j8w==") == 0);
    503   assert(strcmp(dev[0].publicKey, "Is31uMHcVRQYiCxCe3E1tJfKSA92Q47JoppIfLcRLd9sh+e7QR9Gix4LrA2+RPw24eKI0iqpMm5ayvPMx2nmxA==") == 0);
    504   assert(strcmp(dev[0].attributes, "+pin") == 0);
    505   assert(dev[0].old_format == 0);
    506   assert(strcmp(dev[1].coseType, "es256") == 0);
    507   assert(strcmp(dev[1].keyHandle, "uBTQIj0EUe2YoeLfVXksAo9gXTJJ2cXMyPqOMNvE2g9pDwetJIdPTR9oUorMiuRZiXALAlfaayc4vMgQvWXdxw==") == 0);
    508   assert(strcmp(dev[1].publicKey, "cToPi0zc8+U6g1kpqJ2pHXCKQyxyNrJAvuLqBmknwxhciBj0+iTDFaut0Vc1MSu/r6yrw2mHSnuYXTmPx3mhmw==") == 0);
    509   assert(strcmp(dev[1].attributes, "+pin") == 0);
    510   assert(dev[1].old_format == 0);
    511   free_devices(dev, n_devs);
    512 
    513   dev = calloc(cfg.max_devs, sizeof(*dev));
    514   assert(dev != NULL);
    515   cfg.auth_file = "credentials/new_double_-P-V-N.cred";
    516   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    517   assert(rc == PAM_SUCCESS);
    518   assert(n_devs == 2);
    519   assert(strcmp(dev[0].coseType, "es256") == 0);
    520   assert(strcmp(dev[0].keyHandle, "Ypw0/A5KEPshXH0zO72Qlgt1uHvB4VnVRBpObzVGDeS8LxR9smealISARIOo3rlOLgjqj6dkJxqu1LoLm22UpA==") == 0);
    521   assert(strcmp(dev[0].publicKey, "dFnZLWVzEvbSw6O4ld9Fjb1Pki4NptNpvASGEthr5GsaWRp6pLe1Uqwm/IrVrOgwO2Q6sB0SXsQKdAIWbMrPHw==") == 0);
    522   assert(strcmp(dev[0].attributes, "+verification+pin") == 0);
    523   assert(dev[0].old_format == 0);
    524   assert(strcmp(dev[1].coseType, "es256") == 0);
    525   assert(strcmp(dev[1].keyHandle, "IMaY3yG6NuO4oVjrKUrCArluNfimT+5pnxB2jA0CXD7xjmhUO+90lILLwxxnGYKvbq2X5wlxLNnuQLm5gpt7ig==") == 0);
    526   assert(strcmp(dev[1].publicKey, "bDTCB4xWqBY9gh6BLP8b4gJmUIYIQbckvrSMDX/8lyftL/uesJBxblHkDVzfCIatAzqKZ6kltokEHE8saX8phA==") == 0);
    527   assert(strcmp(dev[1].attributes, "+verification+pin") == 0);
    528   assert(dev[1].old_format == 0);
    529   free_devices(dev, n_devs);
    530 
    531   dev = calloc(cfg.max_devs, sizeof(*dev));
    532   assert(dev != NULL);
    533   cfg.auth_file = "credentials/new_double_-r.cred";
    534   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    535   assert(rc == PAM_SUCCESS);
    536   assert(n_devs == 2);
    537   assert(strcmp(dev[0].coseType, "es256") == 0);
    538   assert(strcmp(dev[0].keyHandle, "*") == 0);
    539   assert(strcmp(dev[0].publicKey, "JvWtmu8JaeUNYklKkii5KflmS9vVXtTGcqLdWNXcRHza5qCuBoYX/QNWlKoZklPfsmjTVkXcnBh+B4DSZM55fw==") == 0);
    540   assert(strcmp(dev[0].attributes, "+presence") == 0);
    541   assert(dev[0].old_format == 0);
    542   assert(strcmp(dev[1].coseType, "es256") == 0);
    543   assert(strcmp(dev[1].keyHandle, "*") == 0);
    544   assert(strcmp(dev[1].publicKey, "4AXGf9eUWUXpfLNJ+2uySBvz2FmkK2EZP+wyKuTf73UDS8/vi+DZVllXuhrXmQA36NLwqS8YPEIq6pRLYE6m2A==") == 0);
    545   assert(strcmp(dev[1].attributes, "+presence") == 0);
    546   assert(dev[1].old_format == 0);
    547   free_devices(dev, n_devs);
    548 
    549   dev = calloc(cfg.max_devs, sizeof(*dev));
    550   assert(dev != NULL);
    551   cfg.auth_file = "credentials/new_double_-r-V.cred";
    552   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    553   assert(rc == PAM_SUCCESS);
    554   assert(n_devs == 2);
    555   assert(strcmp(dev[0].coseType, "es256") == 0);
    556   assert(strcmp(dev[0].keyHandle, "*") == 0);
    557   assert(strcmp(dev[0].publicKey, "qZywZ2yedeQu4bPAy6rk7pPcHPprUd+DOxGf10MgwteNYKyAWuyPd7tREc0X3ZzoDejzmM3+X0dWALnBBSVWyA==") == 0);
    558   assert(strcmp(dev[0].attributes, "+presence+verification") == 0);
    559   assert(dev[0].old_format == 0);
    560   assert(strcmp(dev[1].coseType, "es256") == 0);
    561   assert(strcmp(dev[1].keyHandle, "*") == 0);
    562   assert(strcmp(dev[1].publicKey, "IcQsmgW/Y5UQUW/Bz7eYU1azOfyhQWTr8R6mk0gpBJ4l5qq4BstimedubRFvoIAanumNrrqgvo1CA+9rzHG6Hg==") == 0);
    563   assert(strcmp(dev[1].attributes, "+presence+verification") == 0);
    564   assert(dev[1].old_format == 0);
    565   free_devices(dev, n_devs);
    566 
    567   dev = calloc(cfg.max_devs, sizeof(*dev));
    568   assert(dev != NULL);
    569   cfg.auth_file = "credentials/new_double_-r-N.cred";
    570   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    571   assert(rc == PAM_SUCCESS);
    572   assert(n_devs == 2);
    573   assert(strcmp(dev[0].coseType, "es256") == 0);
    574   assert(strcmp(dev[0].keyHandle, "*") == 0);
    575   assert(strcmp(dev[0].publicKey, "BEOf/KU74hsdWbvfUn7yIXH2aktz/DY2ChTLpljbntz5xpwsOv+4x9r6LySuVYWuoWH11fgKv4Bqt57MHiPYUg==") == 0);
    576   assert(strcmp(dev[0].attributes, "+presence+pin") == 0);
    577   assert(dev[0].old_format == 0);
    578   assert(strcmp(dev[1].coseType, "es256") == 0);
    579   assert(strcmp(dev[1].keyHandle, "*") == 0);
    580   assert(strcmp(dev[1].publicKey, "4vbnuZSSrYJ/qzOpnVgy8cqm7yq6m9+GQlpNnMbPN2kXr+B0vL91O6d7/0VitOqW8GX2FFQaXvV3mHETtsUYAg==") == 0);
    581   assert(strcmp(dev[1].attributes, "+presence+pin") == 0);
    582   assert(dev[1].old_format == 0);
    583   free_devices(dev, n_devs);
    584 
    585   dev = calloc(cfg.max_devs, sizeof(*dev));
    586   assert(dev != NULL);
    587   cfg.auth_file = "credentials/new_double_-r-V-N.cred";
    588   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    589   assert(rc == PAM_SUCCESS);
    590   assert(n_devs == 2);
    591   assert(strcmp(dev[0].coseType, "es256") == 0);
    592   assert(strcmp(dev[0].keyHandle, "*") == 0);
    593   assert(strcmp(dev[0].publicKey, "5zx2nk/ANhsncQV0np0kDYT+jf5w3dQ8rvVM5fqwDcHbh8AzBHbcGiRcNfPE/6v09cEomfVrIAT+IvyAcZnuow==") == 0);
    594   assert(strcmp(dev[0].attributes, "+presence+verification+pin") == 0);
    595   assert(dev[0].old_format == 0);
    596   assert(strcmp(dev[1].coseType, "es256") == 0);
    597   assert(strcmp(dev[1].keyHandle, "*") == 0);
    598   assert(strcmp(dev[1].publicKey, "FJ6553yOZoAJKnR2Ysai/5k1i6PpHz/8HusKkFjOqBSIsAK9vALAb/M223hz8remwuqPyNXczq1WgBcN4P9wKw==") == 0);
    599   assert(strcmp(dev[1].attributes, "+presence+verification+pin") == 0);
    600   assert(dev[1].old_format == 0);
    601   free_devices(dev, n_devs);
    602 
    603   dev = calloc(cfg.max_devs, sizeof(*dev));
    604   assert(dev != NULL);
    605   cfg.auth_file = "credentials/new_double_-r-P.cred";
    606   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    607   assert(rc == PAM_SUCCESS);
    608   assert(n_devs == 2);
    609   assert(strcmp(dev[0].coseType, "es256") == 0);
    610   assert(strcmp(dev[0].keyHandle, "*") == 0);
    611   assert(strcmp(dev[0].publicKey, "kuY0RmjxQfbzMREZM8l++bbKTFHSGTYK+OI0owggVKCXSaD5YHsk2EONGtwWoafg8KypNQIYhxxxT2RlWWVcGw==") == 0);
    612   assert(strcmp(dev[0].attributes, "") == 0);
    613   assert(dev[0].old_format == 0);
    614   assert(strcmp(dev[1].coseType, "es256") == 0);
    615   assert(strcmp(dev[1].keyHandle, "*") == 0);
    616   assert(strcmp(dev[1].publicKey, "t94+brQxTF62oQw642Pq6qDFFfPx1A7GbjU/2i+H7OiHLeIALTzm9AwLVZuyofXURgiIrmLAG26ww2KVv6ji+A==") == 0);
    617   assert(strcmp(dev[1].attributes, "") == 0);
    618   assert(dev[1].old_format == 0);
    619   free_devices(dev, n_devs);
    620 
    621   dev = calloc(cfg.max_devs, sizeof(*dev));
    622   assert(dev != NULL);
    623   cfg.auth_file = "credentials/new_double_-r-P-V.cred";
    624   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    625   assert(rc == PAM_SUCCESS);
    626   assert(n_devs == 2);
    627   assert(strcmp(dev[0].coseType, "es256") == 0);
    628   assert(strcmp(dev[0].keyHandle, "*") == 0);
    629   assert(strcmp(dev[0].publicKey, "KBBozy1XYywARLB1AcY5hYvUN2hYHpGY2YyxAIczZ7GXrfWeZ8RGOW7+Z34DaozgLFeHMQSCXJuNYK+fw8khEw==") == 0);
    630   assert(strcmp(dev[0].attributes, "+verification") == 0);
    631   assert(dev[0].old_format == 0);
    632   assert(strcmp(dev[1].coseType, "es256") == 0);
    633   assert(strcmp(dev[1].keyHandle, "*") == 0);
    634   assert(strcmp(dev[1].publicKey, "LABCxfeOxfctKo8HmDA/PYyPlwTYj3i2tQu2QWEmi7tytaPQA8ZZZP7hddzpkUQVHRu2oASGigS7oBwt38WFCw==") == 0);
    635   assert(strcmp(dev[1].attributes, "+verification") == 0);
    636   assert(dev[1].old_format == 0);
    637   free_devices(dev, n_devs);
    638 
    639   dev = calloc(cfg.max_devs, sizeof(*dev));
    640   assert(dev != NULL);
    641   cfg.auth_file = "credentials/new_double_-r-P-N.cred";
    642   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    643   assert(rc == PAM_SUCCESS);
    644   assert(n_devs == 2);
    645   assert(strcmp(dev[0].coseType, "es256") == 0);
    646   assert(strcmp(dev[0].keyHandle, "*") == 0);
    647   assert(strcmp(dev[0].publicKey, "se1ih71yYTjlvF6p3Kc+wB0PtXv+5RM8O/0/yFy5RcvEXCvirQPbxhmSIhh5QYP17fkAFGLfJYQtmV7RNU0xDg==") == 0);
    648   assert(strcmp(dev[0].attributes, "+pin") == 0);
    649   assert(dev[0].old_format == 0);
    650   assert(strcmp(dev[1].coseType, "es256") == 0);
    651   assert(strcmp(dev[1].keyHandle, "*") == 0);
    652   assert(strcmp(dev[1].publicKey, "v6hgPffPopqHTh19Y0Wf11cF/lChqwlT0f5/6K+Dsdzq1OPZxKBqTaW6jCU0x5Pr9HgntWyTtQ1TS7EM22uhyQ==") == 0);
    653   assert(strcmp(dev[1].attributes, "+pin") == 0);
    654   assert(dev[1].old_format == 0);
    655   free_devices(dev, n_devs);
    656 
    657   dev = calloc(cfg.max_devs, sizeof(*dev));
    658   assert(dev != NULL);
    659   cfg.auth_file = "credentials/new_double_-r-P-V-N.cred";
    660   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    661   assert(rc == PAM_SUCCESS);
    662   assert(n_devs == 2);
    663   assert(strcmp(dev[0].coseType, "es256") == 0);
    664   assert(strcmp(dev[0].keyHandle, "*") == 0);
    665   assert(strcmp(dev[0].publicKey, "+zfrwyH/M5/tEVfijRKzRqNh+QoC3JBweJFa0heINIDkCjLAYqUb2hSTecTxoKh2bzpxSqeg6nJJPJNBqDD2aA==") == 0);
    666   assert(strcmp(dev[0].attributes, "+verification+pin") == 0);
    667   assert(dev[0].old_format == 0);
    668   assert(strcmp(dev[1].coseType, "es256") == 0);
    669   assert(strcmp(dev[1].keyHandle, "*") == 0);
    670   assert(strcmp(dev[1].publicKey, "W1vVZhmkt3KG16sraGayBP8elRXSl5UGMl+oojLI15yyIAVUUzoEKNUQtf3j3s3sVtjD009nLxHOpkf2zjIpQQ==") == 0);
    671   assert(strcmp(dev[1].attributes, "+verification+pin") == 0);
    672   assert(dev[1].old_format == 0);
    673   free_devices(dev, n_devs);
    674 
    675   dev = calloc(cfg.max_devs, sizeof(*dev));
    676   assert(dev != NULL);
    677   cfg.auth_file = "credentials/new_mixed_12.cred";
    678   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    679   assert(rc == PAM_SUCCESS);
    680   assert(n_devs == 2);
    681   assert(strcmp(dev[0].coseType, "es256") == 0);
    682   assert(strcmp(dev[0].keyHandle, "ooq2bCWeHFXzWqKwWFRliREQjOtUWKtWJbr7KwSh3FLNiCFgBuie4tqq3Pee86o7ew32u1+ITLsCBEYPrTQMAg==") == 0);
    683   assert(strcmp(dev[0].publicKey, "39hCGEGO7kqz3Pig/bL0ycZxLfcpWPtX8fKxb/S8xx2BdSUs6HXTzIDmifuFv6pabpy3DxUvcA0yIygMAO1ZQw==") == 0);
    684   assert(strcmp(dev[0].attributes, "+presence") == 0);
    685   assert(dev[0].old_format == 0);
    686   assert(strcmp(dev[1].coseType, "es256") == 0);
    687   assert(strcmp(dev[1].keyHandle, "2O2vxjSMeMl6obzQCkIE3VL2Qtija5sLJuJkMrP+/bAFeoLp7m2SPKKRUFFXsO8Z44HTL7PKoFmY4+r5Qwt00w==") == 0);
    688   assert(strcmp(dev[1].publicKey, "qZIaqR+mGxEnvo04LtsX4krKV5r5PBVBfJYDXi2zS7uXSHgRr7KOQHaNgx70E2IBrVmUlaFAH4QhDnDAeishBA==") == 0);
    689   assert(strcmp(dev[1].attributes, "+presence") == 0);
    690   assert(dev[1].old_format == 0);
    691   free_devices(dev, n_devs);
    692 
    693   dev = calloc(cfg.max_devs, sizeof(*dev));
    694   assert(dev != NULL);
    695   cfg.auth_file = "credentials/new_mixed_1-P2.cred";
    696   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    697   assert(rc == PAM_SUCCESS);
    698   assert(n_devs == 2);
    699   assert(strcmp(dev[0].coseType, "es256") == 0);
    700   assert(strcmp(dev[0].keyHandle, "9HY72OR/kQECy5PbwfJwSaWZFlLL1CHamlm1LMZFozCBj6hzq4V9BpkkkMObxNL9gFd8yOXKDflFiVVoGq7sWQ==") == 0);
    701   assert(strcmp(dev[0].publicKey, "sn+cAxAvdlnwwwvLCLoEjiza2G0aPniyqgomxmm1aLisMl1z9VpvdlGgO4nOPLYZSoRkW6nKvOBzztGYq/knfQ==") == 0);
    702   assert(strcmp(dev[0].attributes, "+presence") == 0);
    703   assert(dev[0].old_format == 0);
    704   assert(strcmp(dev[1].coseType, "es256") == 0);
    705   assert(strcmp(dev[1].keyHandle, "43JAMt5EnG72Sx/4C9ptEd+6/f1RMOKWBSQj4U6pnQyVvPFI/nX2jvN4EYqMQrdGYaszRbh0AL0an3hKZJNqLw==") == 0);
    706   assert(strcmp(dev[1].publicKey, "aPlEf4vR+SUrOykB1tk+H1XKsEiSIBMK252bPz7kLHusnAgqgPZLqcruFEegChmYyhytWDPluPrw1o16FFyf5Q==") == 0);
    707   assert(strcmp(dev[1].attributes, "") == 0);
    708   assert(dev[1].old_format == 0);
    709   free_devices(dev, n_devs);
    710 
    711   dev = calloc(cfg.max_devs, sizeof(*dev));
    712   assert(dev != NULL);
    713   cfg.auth_file = "credentials/new_mixed_-P12.cred";
    714   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    715   assert(rc == PAM_SUCCESS);
    716   assert(n_devs == 2);
    717   assert(strcmp(dev[0].coseType, "es256") == 0);
    718   assert(strcmp(dev[0].keyHandle, "kNfZ8Uot7TcImjCXhji32Apur3172TYc4XLA0uDQsdW1lrIRecyZP5chyPrkNxIrRIZ58UgiMxD72fiaCiQghw==") == 0);
    719   assert(strcmp(dev[0].publicKey, "QiscDH8fpvC9imwd7UiQ8n2XeqNRWW5sUxmboMbiNLUXWrvuG7pEBvWYQA3yLdmOvvb/3MijCh6AZr/3fpwZKQ==") == 0);
    720   assert(strcmp(dev[0].attributes, "") == 0);
    721   assert(dev[0].old_format == 0);
    722   assert(strcmp(dev[1].coseType, "es256") == 0);
    723   assert(strcmp(dev[1].keyHandle, "4ICSXy6FCp7NUErnJAOoyqGOnszEMmnIxjgH2NmiC9cyn0XqBxmr1+YHt9fv6yhbrPrnn9/QLvysS+VZBc9twQ==") == 0);
    724   assert(strcmp(dev[1].publicKey, "IJMQOa1WrUkBwZKKviNxkMlvKGkiIbXcIdWf+Rv1BPWI9Xo1edi1LF7ux8sZs6mbQEn3z+v+UCSgO13ZtFzI/w==") == 0);
    725   assert(strcmp(dev[1].attributes, "+presence") == 0);
    726   assert(dev[1].old_format == 0);
    727   free_devices(dev, n_devs);
    728 
    729   dev = calloc(cfg.max_devs, sizeof(*dev));
    730   assert(dev != NULL);
    731   cfg.auth_file = "credentials/new_mixed_-P1-P2.cred";
    732   rc = get_devices_from_authfile(&cfg, username, dev, &n_devs);
    733   assert(rc == PAM_SUCCESS);
    734   assert(n_devs == 2);
    735   assert(strcmp(dev[0].coseType, "es256") == 0);
    736   assert(strcmp(dev[0].keyHandle, "gqCuXGhiA9P4PhXPgrMjQCdgBPkLHHmQcDF/AMOp9vMuCoreRgwWlckMvCdHnsRTohdGqKZgVT/M3HVu4/UiXA==") == 0);
    737   assert(strcmp(dev[0].publicKey, "DJaEFTDU5XMq5+KwhEwj69zo5KthqvPRcrCE8Rhu6v1FkgFww/gHYeCZi8s6IRbzmmkxSANXuBAGcpVAM6Zo3A==") == 0);
    738   assert(strcmp(dev[0].attributes, "") == 0);
    739   assert(dev[0].old_format == 0);
    740   assert(strcmp(dev[1].coseType, "es256") == 0);
    741   assert(strcmp(dev[1].keyHandle, "RFgUluPS2nAXHy3++1dyyu5k0Rnr9KHUccYSH2oMdpw+QWOu5lvHki3lyAxhKm7HTu8wfMK86qIHakTMYDiYSA==") == 0);
    742   assert(strcmp(dev[1].publicKey, "sgoB52Vmw6fqQMDsBHKMsSeft6AfXoULH+mHNi3nOS6KHnvobo82LFGjvQqxrbSNfIul/cpD3MSdz8R0Tfhl3w==") == 0);
    743   assert(strcmp(dev[1].attributes, "") == 0);
    744   assert(dev[1].old_format == 0);
    745   free_devices(dev, n_devs);
    746 
    747   /* END REGENERATE_CREDENTIALS.PY */
    748   /* clang-format on*/
    749 }
    750 
    751 int main(void) {
    752   struct passwd *pwd;
    753   char *username;
    754 
    755   assert((pwd = getpwuid(geteuid())) != NULL);
    756   assert((username = strdup(pwd->pw_name)) != NULL);
    757 
    758   test_nouserok(username);
    759   test_ssh_credential(username);
    760   test_old_credential(username);
    761   test_limited_count(username);
    762   test_new_credentials(username);
    763 
    764   free(username);
    765 }
    766