14 static void usage(const char const *cmd)
17 "usage: %s [-f filename] {-s hexstring40 | -S file} [-u username] [-n nonce] [-l payload] [-p password]\n",
21 int main(int argc, char *argv[])
29 unsigned char secret[20];
32 char *id = getlogin();
36 unsigned char authobj[256];
37 int authsize = sizeof(authobj);
39 while ((c = getopt(argc, argv, "h"
43 "f:s:S:u:n:l:p:")) != -1) switch (c) {
49 if (pcsc_option(optarg)) {
50 fprintf(stderr, "Option \"%s\" bad\n", optarg);
62 fprintf(stderr, "-s and -S are mutually exclusive\n");
70 fprintf(stderr, "-S and -s are mutually exclusive\n");
90 if (optind == (argc - 1) && !secfn && !hsecret) {
91 hsecret = argv[optind];
102 if (!strcmp(secfn, "-")) sfp = stdin;
103 else sfp = fopen(secfn, "r");
105 fprintf(stderr, "cannot open \"%s\": %s\n",
106 secfn, strerror(errno));
109 if (!fgets(secbuf, sizeof(secbuf), sfp)) {
110 fprintf(stderr, "cannot read \"%s\": %s\n",
111 secfn, strerror(errno));
114 for (p = secbuf + strlen(secbuf) - 1;
115 *p == '\n' || *p == '\r'; p--) *p = '\n';
121 fprintf(stderr, "secret missing, specify -s or -S\n");
124 if (strlen(hsecret) != 40) {
125 fprintf(stderr, "secret wrong, must be exactly 40 chars\n");
128 for (i = 0; i < 20; i++)
129 if (sscanf(hsecret + i * 2, "%2hhx", &secret[i]) != 1) {
130 fprintf(stderr, "secret wrong, must be hexadecimal\n");
134 fprintf(stderr, "cannot determine userid\n");
137 rc = make_authobj(id, password, nonce, secret, sizeof(secret),
138 (unsigned char *)payload, strlen(payload),
141 fprintf(stderr, "error %d\n", rc);
146 fprintf(stderr, "cannot open \"%s\": %s\n",
147 fn, strerror(errno));
150 if (fprintf(fp, "%s:%s:%s:", "", id, nonce) < 0) {
151 fprintf(stderr, "cannot write to \"%s\": %s\n",
152 fn, strerror(errno));
155 for (i = 0; i < authsize; i++)
156 if (fprintf(fp, "%02x", authobj[i]) < 0) {
157 fprintf(stderr, "cannot write to \"%s\": %s\n",
158 fn, strerror(errno));
162 if (fclose(fp) < 0) {
163 fprintf(stderr, "cannot close \"%s\": %s\n",
164 fn, strerror(errno));