eapol_test: Add PC/SC reader and PIN command line arguments
authorJouni Malinen <j@w1.fi>
Sat, 21 Jun 2014 19:46:28 +0000 (22:46 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 21 Jun 2014 19:46:28 +0000 (22:46 +0300)
The new command line arguments -R<reader> and -P<PIN> can now be used to
specify which PC/SC reader (prefix match) and PIN are to be used.

Signed-off-by: Jouni Malinen <j@w1.fi>
wpa_supplicant/eapol_test.c

index 88d4241..06a696e 100644 (file)
@@ -73,6 +73,9 @@ struct eapol_test_data {
        struct extra_radius_attr *extra_attrs;
 
        FILE *server_cert_file;
+
+       const char *pcsc_reader;
+       const char *pcsc_pin;
 };
 
 static struct eapol_test_data eapol_test;
@@ -954,7 +957,7 @@ static void wpa_init_conf(struct eapol_test_data *e,
 }
 
 
-static int scard_test(void)
+static int scard_test(struct eapol_test_data *e)
 {
        struct scard_data *scard;
        size_t len;
@@ -985,10 +988,10 @@ static int scard_test(void)
        unsigned char aka_ik[IK_LEN];
        unsigned char aka_ck[CK_LEN];
 
-       scard = scard_init(NULL);
+       scard = scard_init(e->pcsc_reader);
        if (scard == NULL)
                return -1;
-       if (scard_set_pin(scard, "1234")) {
+       if (scard_set_pin(scard, e->pcsc_pin)) {
                wpa_printf(MSG_WARNING, "PIN validation failed");
                scard_deinit(scard);
                return -1;
@@ -1063,7 +1066,7 @@ failed:
 }
 
 
-static int scard_get_triplets(int argc, char *argv[])
+static int scard_get_triplets(struct eapol_test_data *e, int argc, char *argv[])
 {
        struct scard_data *scard;
        size_t len;
@@ -1085,7 +1088,7 @@ static int scard_get_triplets(int argc, char *argv[])
                wpa_debug_level = 99;
        }
 
-       scard = scard_init(NULL);
+       scard = scard_init(e->pcsc_reader);
        if (scard == NULL) {
                printf("Failed to open smartcard connection\n");
                return -1;
@@ -1143,7 +1146,8 @@ static void usage(void)
               "[-s<AS secret>]\\\n"
               "           [-r<count>] [-t<timeout>] [-C<Connect-Info>] \\\n"
               "           [-M<client MAC address>] [-o<server cert file] \\\n"
-              "           [-N<attr spec>] \\\n"
+              "           [-N<attr spec>] [-R<PC/SC reader>] "
+              "[-P<PC/SC PIN>] \\\n"
               "           [-A<client IP>]\n"
               "eapol_test scard\n"
               "eapol_test sim <PIN> <num triplets> [debug]\n"
@@ -1208,12 +1212,13 @@ int main(int argc, char *argv[])
        os_memset(&eapol_test, 0, sizeof(eapol_test));
        eapol_test.connect_info = "CONNECT 11Mbps 802.11b";
        os_memcpy(eapol_test.own_addr, "\x02\x00\x00\x00\x00\x01", ETH_ALEN);
+       eapol_test.pcsc_pin = "1234";
 
        wpa_debug_level = 0;
        wpa_debug_show_keys = 1;
 
        for (;;) {
-               c = getopt(argc, argv, "a:A:c:C:eM:nN:o:p:r:s:St:W");
+               c = getopt(argc, argv, "a:A:c:C:eM:nN:o:p:P:r:R:s:St:W");
                if (c < 0)
                        break;
                switch (c) {
@@ -1254,9 +1259,14 @@ int main(int argc, char *argv[])
                case 'p':
                        as_port = atoi(optarg);
                        break;
+               case 'P':
+                       eapol_test.pcsc_pin = optarg;
+                       break;
                case 'r':
                        eapol_test.eapol_test_num_reauths = atoi(optarg);
                        break;
+               case 'R':
+                       eapol_test.pcsc_reader = optarg;
                case 's':
                        as_secret = optarg;
                        break;
@@ -1304,11 +1314,11 @@ int main(int argc, char *argv[])
        }
 
        if (argc > optind && os_strcmp(argv[optind], "scard") == 0) {
-               return scard_test();
+               return scard_test(&eapol_test);
        }
 
        if (argc > optind && os_strcmp(argv[optind], "sim") == 0) {
-               return scard_get_triplets(argc - optind - 1,
+               return scard_get_triplets(&eapol_test, argc - optind - 1,
                                          &argv[optind + 1]);
        }
 
@@ -1344,6 +1354,11 @@ int main(int argc, char *argv[])
                return -1;
        }
 
+       if (eapol_test.pcsc_reader) {
+               os_free(wpa_s.conf->pcsc_reader);
+               wpa_s.conf->pcsc_reader = os_strdup(eapol_test.pcsc_reader);
+       }
+
        wpa_init_conf(&eapol_test, &wpa_s, as_addr, as_port, as_secret,
                      cli_addr);
        wpa_s.ctrl_iface = wpa_supplicant_ctrl_iface_init(&wpa_s);