Add options for configuring digits and time step
Default digits to 6 and time step to 30 seconds. This implies passing `-d 8' to all TOTP test cases.
This commit is contained in:
		
							parent
							
								
									95341d4ca2
								
							
						
					
					
						commit
						ecc23ff01f
					
				
					 2 changed files with 40 additions and 25 deletions
				
			
		
							
								
								
									
										29
									
								
								cli.c
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								cli.c
									
										
									
									
									
								
							|  | @ -31,7 +31,9 @@ static void | ||||||
| usage(void) | usage(void) | ||||||
| { | { | ||||||
| 	fprintf(stderr, "Usage:\n" | 	fprintf(stderr, "Usage:\n" | ||||||
| 	    "    %s [-h HMAC] [-H counter | -T counter] SECRET\n", __progname); | 	    "    %s [-d digits] [-h HMAC] -H counter SECRET\n" | ||||||
|  | 	    "    %s [-d digits] [-h HMAC] [-s step] [-T counter] SECRET\n", | ||||||
|  | 	    __progname, __progname); | ||||||
| 	exit(1); | 	exit(1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -40,15 +42,23 @@ main(int argc, char *argv[]) | ||||||
| { | { | ||||||
| 	const char *errstr; | 	const char *errstr; | ||||||
| 	uint64_t counter; | 	uint64_t counter; | ||||||
|  | 	unsigned int step; | ||||||
| 	int32_t r; | 	int32_t r; | ||||||
| 	int ch, do_hotp; | 	int ch, digits, do_hotp; | ||||||
| 	enum otp_hmac hmac; | 	enum otp_hmac hmac; | ||||||
| 
 | 
 | ||||||
| 	counter = 0; | 	counter = 0; | ||||||
|  | 	digits = 6; | ||||||
| 	do_hotp = 0; | 	do_hotp = 0; | ||||||
| 	hmac = OTP_HMAC_SHA1; | 	hmac = OTP_HMAC_SHA1; | ||||||
| 	while ((ch = getopt(argc, argv, "H:h:T:")) != -1) { | 	step = 30; | ||||||
|  | 	while ((ch = getopt(argc, argv, "d:H:h:s:T:")) != -1) { | ||||||
| 		switch (ch) { | 		switch (ch) { | ||||||
|  | 		case 'd': | ||||||
|  | 			digits = mystrtonum(optarg, 6, 10, &errstr); | ||||||
|  | 			if (errstr != NULL) | ||||||
|  | 				errx(1, "digits is %s: %s", errstr, optarg); | ||||||
|  | 			break; | ||||||
| 		case 'H': | 		case 'H': | ||||||
| 			counter = mystrtonum(optarg, 0, LLONG_MAX, &errstr); | 			counter = mystrtonum(optarg, 0, LLONG_MAX, &errstr); | ||||||
| 			if (errstr != NULL) | 			if (errstr != NULL) | ||||||
|  | @ -65,6 +75,11 @@ main(int argc, char *argv[]) | ||||||
| 			else | 			else | ||||||
| 				usage(); | 				usage(); | ||||||
| 			break; | 			break; | ||||||
|  | 		case 's': | ||||||
|  | 			step = mystrtonum(optarg, 1, UINT_MAX, &errstr); | ||||||
|  | 			if (errstr != NULL) | ||||||
|  | 				errx(1, "step is %s: %s", errstr, optarg); | ||||||
|  | 			break; | ||||||
| 		case 'T': | 		case 'T': | ||||||
| 			counter = mystrtonum(optarg, 0, LLONG_MAX, &errstr); | 			counter = mystrtonum(optarg, 0, LLONG_MAX, &errstr); | ||||||
| 			if (errstr != NULL) | 			if (errstr != NULL) | ||||||
|  | @ -82,15 +97,15 @@ main(int argc, char *argv[]) | ||||||
| 		usage(); | 		usage(); | ||||||
| 
 | 
 | ||||||
| 	if (do_hotp) { | 	if (do_hotp) { | ||||||
| 		r = hotp(hmac, argv[0], strlen(argv[0]), counter, 6); | 		r = hotp(hmac, argv[0], strlen(argv[0]), counter, digits); | ||||||
| 		if (r == -1) | 		if (r == -1) | ||||||
| 			errx(1, "couldn't calculate HOTP"); | 			errx(1, "couldn't calculate HOTP"); | ||||||
| 		printf("%0*" PRId32 "\n", 6, r); | 		printf("%0*" PRId32 "\n", digits, r); | ||||||
| 	} else { | 	} else { | ||||||
| 		r = totp(hmac, argv[0], strlen(argv[0]), counter, 30, 8); | 		r = totp(hmac, argv[0], strlen(argv[0]), counter, step, digits); | ||||||
| 		if (r == -1) | 		if (r == -1) | ||||||
| 			errx(1, "couldn't calculate TOTP"); | 			errx(1, "couldn't calculate TOTP"); | ||||||
| 		printf("%0*" PRId32 "\n", 8, r); | 		printf("%0*" PRId32 "\n", digits, r); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
							
								
								
									
										36
									
								
								run-tests.sh
									
										
									
									
									
								
							
							
						
						
									
										36
									
								
								run-tests.sh
									
										
									
									
									
								
							|  | @ -48,24 +48,24 @@ case_eq 162583 ./otpcli -H 7 "$HOTP_SECRET" | ||||||
| case_eq 399871 ./otpcli -H 8 "$HOTP_SECRET" | case_eq 399871 ./otpcli -H 8 "$HOTP_SECRET" | ||||||
| case_eq 520489 ./otpcli -H 9 "$HOTP_SECRET" | case_eq 520489 ./otpcli -H 9 "$HOTP_SECRET" | ||||||
| 
 | 
 | ||||||
| case_eq 94287082 ./otpcli -T 59 "$TOTP_SECRET" | case_eq 94287082 ./otpcli -d 8 -T 59 "$TOTP_SECRET" | ||||||
| case_eq 46119246 ./otpcli -h sha256 -T 59 "$TOTP_SHA256_SECRET" | case_eq 46119246 ./otpcli -d 8 -h sha256 -T 59 "$TOTP_SHA256_SECRET" | ||||||
| case_eq 90693936 ./otpcli -h sha512 -T 59 "$TOTP_SHA512_SECRET" | case_eq 90693936 ./otpcli -d 8 -h sha512 -T 59 "$TOTP_SHA512_SECRET" | ||||||
| case_eq 07081804 ./otpcli -T 1111111109 "$TOTP_SECRET" | case_eq 07081804 ./otpcli -d 8 -T 1111111109 "$TOTP_SECRET" | ||||||
| case_eq 68084774 ./otpcli -h sha256 -T 1111111109 "$TOTP_SHA256_SECRET" | case_eq 68084774 ./otpcli -d 8 -h sha256 -T 1111111109 "$TOTP_SHA256_SECRET" | ||||||
| case_eq 25091201 ./otpcli -h sha512 -T 1111111109 "$TOTP_SHA512_SECRET" | case_eq 25091201 ./otpcli -d 8 -h sha512 -T 1111111109 "$TOTP_SHA512_SECRET" | ||||||
| case_eq 14050471 ./otpcli -T 1111111111 "$TOTP_SECRET" | case_eq 14050471 ./otpcli -d 8 -T 1111111111 "$TOTP_SECRET" | ||||||
| case_eq 67062674 ./otpcli -h sha256 -T 1111111111 "$TOTP_SHA256_SECRET" | case_eq 67062674 ./otpcli -d 8 -h sha256 -T 1111111111 "$TOTP_SHA256_SECRET" | ||||||
| case_eq 99943326 ./otpcli -h sha512 -T 1111111111 "$TOTP_SHA512_SECRET" | case_eq 99943326 ./otpcli -d 8 -h sha512 -T 1111111111 "$TOTP_SHA512_SECRET" | ||||||
| case_eq 89005924 ./otpcli -T 1234567890 "$TOTP_SECRET" | case_eq 89005924 ./otpcli -d 8 -T 1234567890 "$TOTP_SECRET" | ||||||
| case_eq 91819424 ./otpcli -h sha256 -T 1234567890 "$TOTP_SHA256_SECRET" | case_eq 91819424 ./otpcli -d 8 -h sha256 -T 1234567890 "$TOTP_SHA256_SECRET" | ||||||
| case_eq 93441116 ./otpcli -h sha512 -T 1234567890 "$TOTP_SHA512_SECRET" | case_eq 93441116 ./otpcli -d 8 -h sha512 -T 1234567890 "$TOTP_SHA512_SECRET" | ||||||
| case_eq 69279037 ./otpcli -T 2000000000 "$TOTP_SECRET" | case_eq 69279037 ./otpcli -d 8 -T 2000000000 "$TOTP_SECRET" | ||||||
| case_eq 90698825 ./otpcli -h sha256 -T 2000000000 "$TOTP_SHA256_SECRET" | case_eq 90698825 ./otpcli -d 8 -h sha256 -T 2000000000 "$TOTP_SHA256_SECRET" | ||||||
| case_eq 38618901 ./otpcli -h sha512 -T 2000000000 "$TOTP_SHA512_SECRET" | case_eq 38618901 ./otpcli -d 8 -h sha512 -T 2000000000 "$TOTP_SHA512_SECRET" | ||||||
| case_eq 65353130 ./otpcli -T 20000000000 "$TOTP_SECRET" | case_eq 65353130 ./otpcli -d 8 -T 20000000000 "$TOTP_SECRET" | ||||||
| case_eq 77737706 ./otpcli -h sha256 -T 20000000000 "$TOTP_SHA256_SECRET" | case_eq 77737706 ./otpcli -d 8 -h sha256 -T 20000000000 "$TOTP_SHA256_SECRET" | ||||||
| case_eq 47863826 ./otpcli -h sha512 -T 20000000000 "$TOTP_SHA512_SECRET" | case_eq 47863826 ./otpcli -d 8 -h sha512 -T 20000000000 "$TOTP_SHA512_SECRET" | ||||||
| 
 | 
 | ||||||
| if [ $_test_rc -eq 0 ]; then | if [ $_test_rc -eq 0 ]; then | ||||||
| 	printf "All %u tests completed successfully!\n" "$_test_nr" >&2 | 	printf "All %u tests completed successfully!\n" "$_test_nr" >&2 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue