mirror of
https://github.com/clearml/dropbear
synced 2025-03-09 21:41:07 +00:00
Dropbearkey can now print out pubkey portions
--HG-- extra : convert_revision : 2d897b12ba8710efe0b042b36b1fd31b2469eb15
This commit is contained in:
parent
85748aec15
commit
403c18a300
@ -10,7 +10,7 @@
|
|||||||
# This makefile is quite evil.
|
# This makefile is quite evil.
|
||||||
|
|
||||||
ifndef PROGRAMS
|
ifndef PROGRAMS
|
||||||
PROGRAMS=dropbear dbclient dropbearkey dropbearkey
|
PROGRAMS=dropbear dbclient dropbearkey dropbearconvert
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LTC=libtomcrypt/libtomcrypt.a
|
LTC=libtomcrypt/libtomcrypt.a
|
||||||
|
33
dbutil.c
33
dbutil.c
@ -56,8 +56,15 @@
|
|||||||
|
|
||||||
#define MAX_FMT 100
|
#define MAX_FMT 100
|
||||||
|
|
||||||
void (*_dropbear_exit)(int exitcode, const char* format, va_list param) = NULL;
|
static void generic_dropbear_exit(int exitcode, const char* format,
|
||||||
void (*_dropbear_log)(int priority, const char* format, va_list param) = NULL;
|
va_list param);
|
||||||
|
static void generic_dropbear_log(int priority, const char* format,
|
||||||
|
va_list param);
|
||||||
|
|
||||||
|
void (*_dropbear_exit)(int exitcode, const char* format, va_list param)
|
||||||
|
= generic_dropbear_exit;
|
||||||
|
void (*_dropbear_log)(int priority, const char* format, va_list param)
|
||||||
|
= generic_dropbear_log;
|
||||||
|
|
||||||
int usingsyslog = 0; /* set by runopts, but required externally to sessions */
|
int usingsyslog = 0; /* set by runopts, but required externally to sessions */
|
||||||
#ifndef DISABLE_SYSLOG
|
#ifndef DISABLE_SYSLOG
|
||||||
@ -88,6 +95,28 @@ void dropbear_exit(const char* format, ...) {
|
|||||||
va_end(param);
|
va_end(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void generic_dropbear_exit(int exitcode, const char* format,
|
||||||
|
va_list param) {
|
||||||
|
|
||||||
|
char fmtbuf[300];
|
||||||
|
|
||||||
|
snprintf(fmtbuf, sizeof(fmtbuf), "Exited: %s", format);
|
||||||
|
|
||||||
|
_dropbear_log(LOG_INFO, fmtbuf, param);
|
||||||
|
|
||||||
|
exit(exitcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void generic_dropbear_log(int priority, const char* format,
|
||||||
|
va_list param) {
|
||||||
|
|
||||||
|
char printbuf[1024];
|
||||||
|
|
||||||
|
vsnprintf(printbuf, sizeof(printbuf), format, param);
|
||||||
|
|
||||||
|
fprintf(stderr, "%s\n", printbuf);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* this is what can be called to write arbitrary log messages */
|
/* this is what can be called to write arbitrary log messages */
|
||||||
void dropbear_log(int priority, const char* format, ...) {
|
void dropbear_log(int priority, const char* format, ...) {
|
||||||
|
@ -49,7 +49,7 @@ static void printhelp(char * progname) {
|
|||||||
"Example:\n"
|
"Example:\n"
|
||||||
"dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear_rsa_host_key\n"
|
"dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear_rsa_host_key\n"
|
||||||
"\n"
|
"\n"
|
||||||
"The inputfile and output file can be '-' to specify\n"
|
"The inputfile and outputfile can be '-' to specify\n"
|
||||||
"standard input or standard output.\n", progname);
|
"standard input or standard output.\n", progname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
138
dropbearkey.c
138
dropbearkey.c
@ -54,28 +54,28 @@
|
|||||||
|
|
||||||
static void printhelp(char * progname);
|
static void printhelp(char * progname);
|
||||||
|
|
||||||
#define BUF_SIZE 2000
|
|
||||||
|
|
||||||
#define RSA_SIZE (1024/8) /* 1024 bit */
|
#define RSA_SIZE (1024/8) /* 1024 bit */
|
||||||
#define DSS_SIZE (1024/8) /* 1024 bit */
|
#define DSS_SIZE (1024/8) /* 1024 bit */
|
||||||
|
|
||||||
static void buf_writefile(buffer * buf, const char * filename);
|
static void buf_writefile(buffer * buf, const char * filename);
|
||||||
|
static void printpubkey(sign_key * key, int keytype);
|
||||||
|
static void justprintpub(const char* filename);
|
||||||
|
|
||||||
/* Print a help message */
|
/* Print a help message */
|
||||||
static void printhelp(char * progname) {
|
static void printhelp(char * progname) {
|
||||||
|
|
||||||
fprintf(stderr, "Usage: %s -t <type> -f <filename> [-s bits]\n"
|
fprintf(stderr, "Usage: %s -t <type> -f <filename> [-s bits]\n"
|
||||||
"Options are:\n"
|
"Options are:\n"
|
||||||
"-t type Type of key to generate. One of:\n"
|
"-t type Type of key to generate. One of:\n"
|
||||||
#ifdef DROPBEAR_RSA
|
#ifdef DROPBEAR_RSA
|
||||||
" rsa\n"
|
" rsa\n"
|
||||||
#endif
|
#endif
|
||||||
#ifdef DROPBEAR_DSS
|
#ifdef DROPBEAR_DSS
|
||||||
" dss\n"
|
" dss\n"
|
||||||
#endif
|
#endif
|
||||||
"-f filename Use filename for the secret key\n"
|
"-f filename Use filename for the secret key\n"
|
||||||
"-s bits Key size in bits, should be "
|
"-s bits Key size in bits, should be a multiple of 8 (optional)\n"
|
||||||
"multiple of 8 (optional)\n",
|
"-y Just print the publickey and fingerprint for the\n private key in <filename>.\n",
|
||||||
progname);
|
progname);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,23 +88,24 @@ int main(int argc, char ** argv) {
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
char ** next = 0;
|
char ** next = 0;
|
||||||
sign_key *key;
|
sign_key *key = NULL;
|
||||||
buffer *buf;
|
buffer *buf = NULL;
|
||||||
char * filename = NULL;
|
char * filename = NULL;
|
||||||
int keytype = -1;
|
int keytype = -1;
|
||||||
char * typetext = NULL;
|
char * typetext = NULL;
|
||||||
char * sizetext = NULL;
|
char * sizetext = NULL;
|
||||||
unsigned int bits;
|
unsigned int bits;
|
||||||
unsigned int keysize;
|
unsigned int keysize;
|
||||||
|
int printpub = 0;
|
||||||
|
|
||||||
/* get the commandline options */
|
/* get the commandline options */
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
|
if (argv[i] == NULL) {
|
||||||
|
continue; /* Whack */
|
||||||
|
}
|
||||||
if (next) {
|
if (next) {
|
||||||
*next = argv[i];
|
*next = argv[i];
|
||||||
if (*next == NULL) {
|
next = NULL;
|
||||||
fprintf(stderr, "Invalid null argument");
|
|
||||||
}
|
|
||||||
next = 0x00;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +120,9 @@ int main(int argc, char ** argv) {
|
|||||||
case 's':
|
case 's':
|
||||||
next = &sizetext;
|
next = &sizetext;
|
||||||
break;
|
break;
|
||||||
|
case 'y':
|
||||||
|
printpub = 1;
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
printhelp(argv[0]);
|
printhelp(argv[0]);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
@ -132,17 +136,20 @@ int main(int argc, char ** argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!filename) {
|
||||||
|
fprintf(stderr, "Must specify a key filename\n");
|
||||||
|
printhelp(argv[0]);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (printpub) {
|
||||||
|
justprintpub(filename);
|
||||||
|
/* Not reached */
|
||||||
|
}
|
||||||
|
|
||||||
/* check/parse args */
|
/* check/parse args */
|
||||||
if (!typetext) {
|
if (!typetext) {
|
||||||
fprintf(stderr, "Must specify file type, one of:\n"
|
fprintf(stderr, "Must specify key type\n");
|
||||||
#ifdef DROPBEAR_RSA
|
|
||||||
"rsa\n"
|
|
||||||
#endif
|
|
||||||
#ifdef DROPBEAR_DSS
|
|
||||||
"dss\n"
|
|
||||||
#endif
|
|
||||||
"\n"
|
|
||||||
);
|
|
||||||
printhelp(argv[0]);
|
printhelp(argv[0]);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -190,11 +197,6 @@ int main(int argc, char ** argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!filename) {
|
|
||||||
fprintf(stderr, "Must specify a key filename\n");
|
|
||||||
printhelp(argv[0]);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Will output %d bit %s secret key to '%s'\n", keysize*8,
|
fprintf(stderr, "Will output %d bit %s secret key to '%s'\n", keysize*8,
|
||||||
typetext, filename);
|
typetext, filename);
|
||||||
@ -222,7 +224,7 @@ int main(int argc, char ** argv) {
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = buf_new(BUF_SIZE);
|
buf = buf_new(MAX_PRIVKEY_SIZE);
|
||||||
|
|
||||||
buf_put_priv_key(buf, key, keytype);
|
buf_put_priv_key(buf, key, keytype);
|
||||||
buf_setpos(buf, 0);
|
buf_setpos(buf, 0);
|
||||||
@ -230,14 +232,88 @@ int main(int argc, char ** argv) {
|
|||||||
|
|
||||||
buf_burn(buf);
|
buf_burn(buf);
|
||||||
buf_free(buf);
|
buf_free(buf);
|
||||||
sign_key_free(key);
|
|
||||||
|
|
||||||
fprintf(stderr, "Done.\n");
|
printpubkey(key, keytype);
|
||||||
|
|
||||||
|
sign_key_free(key);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void justprintpub(const char* filename) {
|
||||||
|
|
||||||
|
buffer *buf = NULL;
|
||||||
|
sign_key *key = NULL;
|
||||||
|
int keytype;
|
||||||
|
int ret;
|
||||||
|
int err = DROPBEAR_FAILURE;
|
||||||
|
|
||||||
|
buf = buf_new(MAX_PRIVKEY_SIZE);
|
||||||
|
ret = buf_readfile(buf, filename);
|
||||||
|
|
||||||
|
if (ret != DROPBEAR_SUCCESS) {
|
||||||
|
fprintf(stderr, "Failed reading '%s'\n", filename);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
key = new_sign_key();
|
||||||
|
keytype = DROPBEAR_SIGNKEY_ANY;
|
||||||
|
|
||||||
|
buf_setpos(buf, 0);
|
||||||
|
ret = buf_get_priv_key(buf, key, &keytype);
|
||||||
|
if (ret == DROPBEAR_FAILURE) {
|
||||||
|
fprintf(stderr, "Bad key in '%s'\n", filename);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
printpubkey(key, keytype);
|
||||||
|
|
||||||
|
err = DROPBEAR_SUCCESS;
|
||||||
|
|
||||||
|
out:
|
||||||
|
buf_burn(buf);
|
||||||
|
buf_free(buf);
|
||||||
|
buf = NULL;
|
||||||
|
sign_key_free(key);
|
||||||
|
key = NULL;
|
||||||
|
exit(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void printpubkey(sign_key * key, int keytype) {
|
||||||
|
|
||||||
|
buffer * buf = NULL;
|
||||||
|
unsigned char base64key[MAX_PUBKEY_SIZE*2];
|
||||||
|
unsigned long base64len;
|
||||||
|
int err;
|
||||||
|
const char * typestring = NULL;
|
||||||
|
char *fp = NULL;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
buf = buf_new(MAX_PUBKEY_SIZE);
|
||||||
|
buf_put_pub_key(buf, key, keytype);
|
||||||
|
buf_setpos(buf, 4);
|
||||||
|
|
||||||
|
len = buf->len - buf->pos;
|
||||||
|
|
||||||
|
base64len = sizeof(base64key);
|
||||||
|
err = base64_encode(buf_getptr(buf, len), len, base64key, &base64len);
|
||||||
|
|
||||||
|
if (err != CRYPT_OK) {
|
||||||
|
fprintf(stderr, "base64 failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
typestring = signkey_name_from_type(keytype, &err);
|
||||||
|
|
||||||
|
fp = sign_key_fingerprint(buf_getptr(buf, len), len);
|
||||||
|
|
||||||
|
printf("Public key portion is:\n%s %s\nFingerprint: %s\n",
|
||||||
|
typestring, base64key, fp);
|
||||||
|
|
||||||
|
m_free(fp);
|
||||||
|
buf_free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
/* Write a buffer to a file specified, failing if the file exists */
|
/* Write a buffer to a file specified, failing if the file exists */
|
||||||
static void buf_writefile(buffer * buf, const char * filename) {
|
static void buf_writefile(buffer * buf, const char * filename) {
|
||||||
|
|
||||||
|
23
keyimport.c
23
keyimport.c
@ -109,29 +109,16 @@ static sign_key *dropbear_read(const char* filename) {
|
|||||||
|
|
||||||
buffer * buf = NULL;
|
buffer * buf = NULL;
|
||||||
int len, maxlen;
|
int len, maxlen;
|
||||||
FILE *fp;
|
FILE *fp = NULL;
|
||||||
sign_key *ret = NULL;
|
sign_key *ret = NULL;
|
||||||
int type;
|
int type;
|
||||||
|
|
||||||
buf = buf_new(2000);
|
buf = buf_new(MAX_PRIVKEY_SIZE);
|
||||||
/* can't use buf_readfile since we might have "-" as filename */
|
/* buf_readfile knows about "-" */
|
||||||
if (strlen(filename) == 1 && filename[0] == '-') {
|
if (buf_readfile(buf, filename) == DROPBEAR_FAILURE) {
|
||||||
fp = stdin;
|
|
||||||
} else {
|
|
||||||
fp = fopen(filename, "r");
|
|
||||||
}
|
|
||||||
if (!fp) {
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
|
||||||
maxlen = buf->size - buf->pos;
|
|
||||||
len = fread(buf_getwriteptr(buf, maxlen), 1, maxlen, fp);
|
|
||||||
buf_incrwritepos(buf, len);
|
|
||||||
} while (len != maxlen && len > 0);
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
buf_setpos(buf, 0);
|
buf_setpos(buf, 0);
|
||||||
ret = new_sign_key();
|
ret = new_sign_key();
|
||||||
|
|
||||||
@ -173,7 +160,7 @@ static int dropbear_write(const char*filename, sign_key * key) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
buf = buf_new(2000);
|
buf = buf_new(MAX_PRIVKEY_SIZE);
|
||||||
buf_put_priv_key(buf, key, keytype);
|
buf_put_priv_key(buf, key, keytype);
|
||||||
|
|
||||||
if (strlen(filename) == 1 && filename[0] == '-') {
|
if (strlen(filename) == 1 && filename[0] == '-') {
|
||||||
|
Loading…
Reference in New Issue
Block a user