mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-03 17:35:06 -05:00
client: add keygen command
Add a new command that will generate a random key from /dev/urandom with given ID, hash function and length.
This commit is contained in:
40
client.c
40
client.c
@@ -1255,6 +1255,7 @@ give_help(void)
|
||||
"dns -4|-6|-46\0Resolve hostnames only to IPv4/IPv6/both addresses\0"
|
||||
"timeout <milliseconds>\0Set initial response timeout\0"
|
||||
"retries <retries>\0Set maximum number of retries\0"
|
||||
"keygen <id> [<type> [<bits>]]\0Generate key for key file\0"
|
||||
"exit|quit\0Leave the program\0"
|
||||
"help\0Generate this help\0"
|
||||
"\0";
|
||||
@@ -2413,6 +2414,42 @@ process_cmd_retries(const char *line)
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
static int
|
||||
process_cmd_keygen(char *line)
|
||||
{
|
||||
char hash_name[17];
|
||||
unsigned char key[512];
|
||||
unsigned int i, length, id, bits = 160;
|
||||
|
||||
#ifdef FEAT_SECHASH
|
||||
snprintf(hash_name, sizeof (hash_name), "SHA1");
|
||||
#else
|
||||
snprintf(hash_name, sizeof (hash_name), "MD5");
|
||||
#endif
|
||||
|
||||
if (sscanf(line, "%u %16s %d", &id, hash_name, &bits) < 1) {
|
||||
LOG(LOGS_ERR, LOGF_Client, "Invalid syntax for keygen command");
|
||||
return 0;
|
||||
}
|
||||
|
||||
length = CLAMP(10, (bits + 7) / 8, sizeof (key));
|
||||
if (HSH_GetHashId(hash_name) < 0) {
|
||||
LOG(LOGS_ERR, LOGF_Client, "Unknown hash function %s", hash_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
UTI_GetRandomBytesUrandom(key, length);
|
||||
|
||||
printf("%u %s HEX:", id, hash_name);
|
||||
for (i = 0; i < length; i++)
|
||||
printf("%02hhX", key[i]);
|
||||
printf("\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
static int
|
||||
process_line(char *line)
|
||||
{
|
||||
@@ -2499,6 +2536,9 @@ process_line(char *line)
|
||||
do_normal_submit = 0;
|
||||
give_help();
|
||||
ret = 1;
|
||||
} else if (!strcmp(command, "keygen")) {
|
||||
ret = process_cmd_keygen(line);
|
||||
do_normal_submit = 0;
|
||||
} else if (!strcmp(command, "local")) {
|
||||
do_normal_submit = process_cmd_local(&tx_message, line);
|
||||
} else if (!strcmp(command, "makestep")) {
|
||||
|
||||
Reference in New Issue
Block a user