/* See LICENSE file for copyright and license details. */
#include "common.h"
int
cmdline_bsum(int argc, char **argv, enum command command, struct config *config,
const char **algostr, enum libhashsum_algorithm *algorithm, char **algostrbuf)
{
const char *salt = NULL;
char *arg;
*algostrbuf = NULL;
ARGBEGIN {
case 'b': /* binary input (compat) */
case 't': /* text input (compat) */
config->hexinput = 0;
break;
case 'c':
config->verify = 1;
break;
case 'w':
config->warn_improper_format = 1;
break;
case 'z':
config->format &= (enum format)~WITH_LF;
config->format |= WITH_NUL;
break;
case 'l':
if (command != BSUM)
usage();
arg = ARG();
if (!strcmp(arg, "224")) *algostr = "blake224", *algorithm = LIBHASHSUM_BLAKE224;
else if (!strcmp(arg, "256")) *algostr = "blake256", *algorithm = LIBHASHSUM_BLAKE256;
else if (!strcmp(arg, "384")) *algostr = "blake384", *algorithm = LIBHASHSUM_BLAKE384;
else if (!strcmp(arg, "512")) *algostr = "blake512", *algorithm = LIBHASHSUM_BLAKE512;
else
eprintf("unsupport value on -l option, expected 224, 256, 384, or 512");
break;
case 'S':
if (salt)
usage();
arg = ARG();
if (!strncasecmp(arg, "0x", 2))
arg = &arg[2];
if (!*arg)
usage();
salt = arg;
while (isxdigit(*arg))
arg++;
if (!*arg)
eprintf("expected hexadecimal value for -S option");
break;
case 'x': /* (compat) */
config->hexinput = 1;
break;
case 'L': /* (compat) */
config->format &= (enum format)~FORMAT_MASK;
config->format |= LOWERCASE_HEX;
break;
case 'U': /* (compat) */
config->format &= (enum format)~FORMAT_MASK;
config->format |= UPPERCASE_HEX;
break;
case 'B': /* (compat) */
config->format &= (enum format)~FORMAT_MASK;
config->format |= BINARY;
break;
case 'W':
arg = parseopts(config, ARG(), &parseopt_vendor);
if (*arg)
eprintf("unsupported -W options: %s", arg);
break;
default:
usage();
} ARGEND;
if (salt) {
size_t expected_salt_len = 64; /* BLAKEb */
if (*algorithm == LIBHASHSUM_BLAKE224 || *algorithm == LIBHASHSUM_BLAKE256)
expected_salt_len = 32; /* BLAKEs */
if (strlen(salt) != expected_salt_len)
eprintf("salt for BLAKE%s is expected to be %zu hexadecimal characters long",
&(*algostr)[5], expected_salt_len);
*algostrbuf = malloc(strlen(*algostr) + strlen(salt) + sizeof("[salt=]"));
sprintf(*algostrbuf, "%s[salt=%s]", *algostr, salt);
*algostr = *algostrbuf;
}
return argc;
}