commit - 2c94c16dbc0677f53eb84b29ef77763a525dd333
commit + 604a321f5fbf3db2e50b41afdd4d25f2040658da
blob - 913e60c8b5c7a6b0f6fc32fac79a7c126b6ee00a
blob + 06b892e8e14c648210bc660916c2b7e10593f537
--- totp.c
+++ totp.c
#include <ctype.h>
#include <err.h>
#include <errno.h>
+#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#endif
static __dead void
-usage(void)
+usage(const char *argv0)
{
- fprintf(stderr, "usage: %s\n", getprogname());
+ const char *me;
+
+ if ((me = strrchr(argv0, '/')) != NULL)
+ me++;
+ else
+ me = argv0;
+
+ fprintf(stderr, "usage: %s\n", me);
exit(1);
}
static int
uri2secret(char *s, int *digits, const EVP_MD **alg, int *period)
{
- char *q, *t, *f, *secret = NULL;
- const char *errstr;
+ char *q, *t, *f, *ep, *secret = NULL;
+ long l;
if ((q = strchr(s, '?')) == NULL)
return (-1);
warnx("unknown algorithm; using SHA1");
} else if (!strncmp(f, "period=", 7)) {
f += 7;
- *period = strtonum(f, 1, 120, &errstr);
- if (errstr) {
- warnx("period is %s: %s; using 30", errstr, f);
- *period = 30;
- }
+ errno = 0;
+ l = strtol(f, &ep, 10);
+ if (f[0] == '\0' || *ep != '\0')
+ err(1, "period is not a number: %s", f);
+ if (errno == ERANGE && (l == LONG_MAX || l == LONG_MIN))
+ err(1, "period is way out of range: %s", f);
+ if (l < 1 || l > 120)
+ err(1, "period is out of range: %s", f);
+ *period = l;
}
}
const EVP_MD *alg;
unsigned char md[EVP_MAX_MD_SIZE];
unsigned int mdlen;
+ const char *argv0;
char *s, *q, *line = NULL;
size_t linesize = 0;
ssize_t linelen;
if (pledge("stdio", NULL) == -1)
err(1, "pledge");
+ if ((argv0 = argv[0]) == NULL)
+ argv0 = "totp";
+
while ((ch = getopt(argc, argv, "")) != -1) {
switch (ch) {
default:
- usage();
+ usage(argv0);
}
}
argc -= optind;
argv += optind;
if (argc != 0)
- usage();
+ usage(argv0);
alg = EVP_sha1();