mirror of
				https://github.com/clearml/dropbear
				synced 2025-06-26 18:17:32 +00:00 
			
		
		
		
	refactor key generation, make it generate as required.
Needs UI in server command line options --HG-- branch : keyondemand
This commit is contained in:
		
							parent
							
								
									cfac8435a7
								
							
						
					
					
						commit
						4363b8b32d
					
				@ -27,7 +27,8 @@ COMMONOBJS=dbutil.o buffer.o \
 | 
				
			|||||||
		signkey.o rsa.o random.o \
 | 
							signkey.o rsa.o random.o \
 | 
				
			||||||
		queue.o \
 | 
							queue.o \
 | 
				
			||||||
		atomicio.o compat.o fake-rfc2553.o \
 | 
							atomicio.o compat.o fake-rfc2553.o \
 | 
				
			||||||
		ltc_prng.o ecc.o ecdsa.o crypto_desc.o
 | 
							ltc_prng.o ecc.o ecdsa.o crypto_desc.o \
 | 
				
			||||||
 | 
							gensignkey.o gendss.o genrsa.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SVROBJS=svr-kex.o svr-auth.o sshpty.o \
 | 
					SVROBJS=svr-kex.o svr-auth.o sshpty.o \
 | 
				
			||||||
		svr-authpasswd.o svr-authpubkey.o svr-authpubkeyoptions.o svr-session.o svr-service.o \
 | 
							svr-authpasswd.o svr-authpubkey.o svr-authpubkeyoptions.o svr-session.o svr-service.o \
 | 
				
			||||||
@ -44,7 +45,7 @@ CLISVROBJS=common-session.o packet.o common-algo.o common-kex.o \
 | 
				
			|||||||
			tcp-accept.o listener.o process-packet.o \
 | 
								tcp-accept.o listener.o process-packet.o \
 | 
				
			||||||
			common-runopts.o circbuffer.o
 | 
								common-runopts.o circbuffer.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
KEYOBJS=dropbearkey.o gendss.o genrsa.o
 | 
					KEYOBJS=dropbearkey.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONVERTOBJS=dropbearconvert.o keyimport.o
 | 
					CONVERTOBJS=dropbearconvert.o keyimport.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								debug.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								debug.h
									
									
									
									
									
								
							@ -40,7 +40,6 @@
 | 
				
			|||||||
 * since the printing may not sanitise strings etc. This will add a reasonable
 | 
					 * since the printing may not sanitise strings etc. This will add a reasonable
 | 
				
			||||||
 * amount to your executable size. */
 | 
					 * amount to your executable size. */
 | 
				
			||||||
/* #define DEBUG_TRACE */
 | 
					/* #define DEBUG_TRACE */
 | 
				
			||||||
#define DEBUG_TRACE
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* All functions writing to the cleartext payload buffer call
 | 
					/* All functions writing to the cleartext payload buffer call
 | 
				
			||||||
 * CHECKCLEARTOWRITE() before writing. This is only really useful if you're
 | 
					 * CHECKCLEARTOWRITE() before writing. This is only really useful if you're
 | 
				
			||||||
@ -72,7 +71,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* To debug with GDB it is easier to run with no forking of child processes.
 | 
					/* To debug with GDB it is easier to run with no forking of child processes.
 | 
				
			||||||
   You will need to pass "-F" as well. */
 | 
					   You will need to pass "-F" as well. */
 | 
				
			||||||
#define DEBUG_NOFORK
 | 
					/* #define DEBUG_NOFORK */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* For testing as non-root on shadowed systems, include the crypt of a password
 | 
					/* For testing as non-root on shadowed systems, include the crypt of a password
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										169
									
								
								dropbearkey.c
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								dropbearkey.c
									
									
									
									
									
								
							@ -57,12 +57,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void printhelp(char * progname);
 | 
					static void printhelp(char * progname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RSA_DEFAULT_SIZE 2048
 | 
					 | 
				
			||||||
#define DSS_DEFAULT_SIZE 1024
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void buf_writefile(buffer * buf, const char * filename);
 | 
					 | 
				
			||||||
static void printpubkey(sign_key * key, int keytype);
 | 
					static void printpubkey(sign_key * key, int keytype);
 | 
				
			||||||
static void justprintpub(const char* filename);
 | 
					static int printpubfile(const char* filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Print a help message */
 | 
					/* Print a help message */
 | 
				
			||||||
static void printhelp(char * progname) {
 | 
					static void printhelp(char * progname) {
 | 
				
			||||||
@ -103,6 +100,30 @@ static void printhelp(char * progname) {
 | 
				
			|||||||
					,progname);
 | 
										,progname);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* fails fatally */
 | 
				
			||||||
 | 
					static void check_signkey_bits(enum signkey_type type, int bits)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					        switch (type) {
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_RSA
 | 
				
			||||||
 | 
					            case DROPBEAR_SIGNKEY_RSA:
 | 
				
			||||||
 | 
					                if (bits < 512 || bits > 4096 || (bits % 8 != 0)) {
 | 
				
			||||||
 | 
					                	dropbear_exit("Bits must satisfy 512 <= bits <= 4096, and be a"
 | 
				
			||||||
 | 
					                            " multiple of 8\n");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef DROPEAR_DSS
 | 
				
			||||||
 | 
					            case DROPBEAR_SIGNKEY_DSS:
 | 
				
			||||||
 | 
					                if (bits != 1024) {
 | 
				
			||||||
 | 
					                    dropbear_exit("DSS keys have a fixed size of 1024 bits\n");
 | 
				
			||||||
 | 
					                    exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									(void)0; /* quiet, compiler. ecdsa handles checks itself */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(DBMULTI_dropbearkey) || !defined(DROPBEAR_MULTI)
 | 
					#if defined(DBMULTI_dropbearkey) || !defined(DROPBEAR_MULTI)
 | 
				
			||||||
#if defined(DBMULTI_dropbearkey) && defined(DROPBEAR_MULTI)
 | 
					#if defined(DBMULTI_dropbearkey) && defined(DROPBEAR_MULTI)
 | 
				
			||||||
int dropbearkey_main(int argc, char ** argv) {
 | 
					int dropbearkey_main(int argc, char ** argv) {
 | 
				
			||||||
@ -118,7 +139,7 @@ int main(int argc, char ** argv) {
 | 
				
			|||||||
	enum signkey_type keytype = DROPBEAR_SIGNKEY_NONE;
 | 
						enum signkey_type keytype = DROPBEAR_SIGNKEY_NONE;
 | 
				
			||||||
	char * typetext = NULL;
 | 
						char * typetext = NULL;
 | 
				
			||||||
	char * sizetext = NULL;
 | 
						char * sizetext = NULL;
 | 
				
			||||||
	unsigned int bits;
 | 
						unsigned int bits = 0;
 | 
				
			||||||
	int printpub = 0;
 | 
						int printpub = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	crypto_init();
 | 
						crypto_init();
 | 
				
			||||||
@ -174,8 +195,8 @@ int main(int argc, char ** argv) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (printpub) {
 | 
						if (printpub) {
 | 
				
			||||||
		justprintpub(filename);
 | 
							int ret = printpubfile(filename);
 | 
				
			||||||
		/* Not reached */
 | 
							exit(ret);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* check/parse args */
 | 
						/* check/parse args */
 | 
				
			||||||
@ -216,106 +237,22 @@ int main(int argc, char ** argv) {
 | 
				
			|||||||
			exit(EXIT_FAILURE);
 | 
								exit(EXIT_FAILURE);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// TODO: put RSA and DSS size checks into genrsa.c etc
 | 
							check_signkey_bits(keytype, bits);;
 | 
				
			||||||
        switch (keytype) {
 | 
					    }
 | 
				
			||||||
#ifdef DROPBEAR_RSA
 | 
					 | 
				
			||||||
            case DROPBEAR_SIGNKEY_RSA:
 | 
					 | 
				
			||||||
                if (bits < 512 || bits > 4096 || (bits % 8 != 0)) {
 | 
					 | 
				
			||||||
                    fprintf(stderr, "Bits must satisfy 512 <= bits <= 4096, and be a"
 | 
					 | 
				
			||||||
                            " multiple of 8\n");
 | 
					 | 
				
			||||||
                    exit(EXIT_FAILURE);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef DROPEAR_DSS
 | 
					 | 
				
			||||||
            case DROPBEAR_SIGNKEY_DSS:
 | 
					 | 
				
			||||||
                if (bits != 1024) {
 | 
					 | 
				
			||||||
                    fprintf(stderr, "DSS keys have a fixed size of 1024 bits\n");
 | 
					 | 
				
			||||||
                    exit(EXIT_FAILURE);			
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
			default:
 | 
					 | 
				
			||||||
				(void)0; /* quiet, compiler. ecdsa handles checks itself */
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
    	/* default key size */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        switch (keytype) {
 | 
					 | 
				
			||||||
#ifdef DROPBEAR_RSA
 | 
					 | 
				
			||||||
            case DROPBEAR_SIGNKEY_RSA:
 | 
					 | 
				
			||||||
				bits = RSA_DEFAULT_SIZE;
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef DROPBEAR_DSS
 | 
					 | 
				
			||||||
            case DROPBEAR_SIGNKEY_DSS:
 | 
					 | 
				
			||||||
                bits = DSS_DEFAULT_SIZE;
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					 | 
				
			||||||
            case DROPBEAR_SIGNKEY_ECDSA_KEYGEN:
 | 
					 | 
				
			||||||
                bits = ECDSA_DEFAULT_SIZE;
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            default:
 | 
					 | 
				
			||||||
                exit(EXIT_FAILURE); /* not reached */
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fprintf(stderr, "Will output %d bit %s secret key to '%s'\n", bits,
 | 
					 | 
				
			||||||
			typetext, filename);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* don't want the file readable by others */
 | 
					 | 
				
			||||||
	umask(077);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* now we can generate the key */
 | 
					 | 
				
			||||||
	key = new_sign_key();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fprintf(stderr, "Generating key, this may take a while...\n");
 | 
						fprintf(stderr, "Generating key, this may take a while...\n");
 | 
				
			||||||
	switch(keytype) {
 | 
					    if (signkey_generate(keytype, bits, filename) == DROPBEAR_FAILURE)
 | 
				
			||||||
#ifdef DROPBEAR_RSA
 | 
					    {
 | 
				
			||||||
		case DROPBEAR_SIGNKEY_RSA:
 | 
					    	dropbear_exit("Failed to generate key.\n");
 | 
				
			||||||
			key->rsakey = gen_rsa_priv_key(bits);
 | 
					    }
 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef DROPBEAR_DSS
 | 
					 | 
				
			||||||
		case DROPBEAR_SIGNKEY_DSS:
 | 
					 | 
				
			||||||
			key->dsskey = gen_dss_priv_key(bits);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					 | 
				
			||||||
		case DROPBEAR_SIGNKEY_ECDSA_KEYGEN:
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				ecc_key *ecckey = gen_ecdsa_priv_key(bits);
 | 
					 | 
				
			||||||
				keytype = ecdsa_signkey_type(ecckey);
 | 
					 | 
				
			||||||
				*signkey_key_ptr(key, keytype) = ecckey;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			fprintf(stderr, "Internal error, bad key type\n");
 | 
					 | 
				
			||||||
			exit(EXIT_FAILURE);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buf = buf_new(MAX_PRIVKEY_SIZE); 
 | 
						printpubfile(filename);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	buf_put_priv_key(buf, key, keytype);
 | 
					 | 
				
			||||||
	buf_setpos(buf, 0);
 | 
					 | 
				
			||||||
	buf_writefile(buf, filename);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	buf_burn(buf);
 | 
					 | 
				
			||||||
	buf_free(buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	printpubkey(key, keytype);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sign_key_free(key);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return EXIT_SUCCESS;
 | 
						return EXIT_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void justprintpub(const char* filename) {
 | 
					static int printpubfile(const char* filename) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buffer *buf = NULL;
 | 
						buffer *buf = NULL;
 | 
				
			||||||
	sign_key *key = NULL;
 | 
						sign_key *key = NULL;
 | 
				
			||||||
@ -353,7 +290,7 @@ out:
 | 
				
			|||||||
		sign_key_free(key);
 | 
							sign_key_free(key);
 | 
				
			||||||
		key = NULL;
 | 
							key = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	exit(err);
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void printpubkey(sign_key * key, int keytype) {
 | 
					static void printpubkey(sign_key * key, int keytype) {
 | 
				
			||||||
@ -402,35 +339,3 @@ static void printpubkey(sign_key * key, int keytype) {
 | 
				
			|||||||
	m_free(fp);
 | 
						m_free(fp);
 | 
				
			||||||
	buf_free(buf);
 | 
						buf_free(buf);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Write a buffer to a file specified, failing if the file exists */
 | 
					 | 
				
			||||||
static void buf_writefile(buffer * buf, const char * filename) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	int fd;
 | 
					 | 
				
			||||||
	int len;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
 | 
					 | 
				
			||||||
	if (fd < 0) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "Couldn't create new file %s\n", filename);
 | 
					 | 
				
			||||||
		perror("Reason");
 | 
					 | 
				
			||||||
		buf_burn(buf);
 | 
					 | 
				
			||||||
		exit(EXIT_FAILURE);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* write the file now */
 | 
					 | 
				
			||||||
	while (buf->pos != buf->len) {
 | 
					 | 
				
			||||||
		len = write(fd, buf_getptr(buf, buf->len - buf->pos),
 | 
					 | 
				
			||||||
				buf->len - buf->pos);
 | 
					 | 
				
			||||||
		if (errno == EINTR) {
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (len <= 0) {
 | 
					 | 
				
			||||||
			fprintf(stderr, "Failed writing file '%s'\n",filename);
 | 
					 | 
				
			||||||
			perror("Reason");
 | 
					 | 
				
			||||||
			exit(EXIT_FAILURE);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		buf_incrpos(buf, len);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	close(fd);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										7
									
								
								ecdsa.c
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								ecdsa.c
									
									
									
									
									
								
							@ -8,6 +8,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int signkey_is_ecdsa(enum signkey_type type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return type == DROPBEAR_SIGNKEY_ECDSA_NISTP256
 | 
				
			||||||
 | 
							|| type == DROPBEAR_SIGNKEY_ECDSA_NISTP384
 | 
				
			||||||
 | 
							|| type == DROPBEAR_SIGNKEY_ECDSA_NISTP521;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum signkey_type ecdsa_signkey_type(ecc_key * key) {
 | 
					enum signkey_type ecdsa_signkey_type(ecc_key * key) {
 | 
				
			||||||
#ifdef DROPBEAR_ECC_256
 | 
					#ifdef DROPBEAR_ECC_256
 | 
				
			||||||
	if (key->dp == ecc_curve_nistp256.dp) {
 | 
						if (key->dp == ecc_curve_nistp256.dp) {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								ecdsa.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								ecdsa.h
									
									
									
									
									
								
							@ -26,6 +26,8 @@ enum signkey_type ecdsa_signkey_type(ecc_key * key);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void buf_put_ecdsa_sign(buffer *buf, ecc_key *key, buffer *data_buf);
 | 
					void buf_put_ecdsa_sign(buffer *buf, ecc_key *key, buffer *data_buf);
 | 
				
			||||||
int buf_ecdsa_verify(buffer *buf, ecc_key *key, buffer *data_buf);
 | 
					int buf_ecdsa_verify(buffer *buf, ecc_key *key, buffer *data_buf);
 | 
				
			||||||
 | 
					/* Returns 1 on success */
 | 
				
			||||||
 | 
					int signkey_is_ecdsa(enum signkey_type type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										128
									
								
								gensignkey.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								gensignkey.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,128 @@
 | 
				
			|||||||
 | 
					#include "includes.h"
 | 
				
			||||||
 | 
					#include "dbutil.h"
 | 
				
			||||||
 | 
					#include "buffer.h"
 | 
				
			||||||
 | 
					#include "ecdsa.h"
 | 
				
			||||||
 | 
					#include "genrsa.h"
 | 
				
			||||||
 | 
					#include "gendss.h"
 | 
				
			||||||
 | 
					#include "signkey.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RSA_DEFAULT_SIZE 2048
 | 
				
			||||||
 | 
					#define DSS_DEFAULT_SIZE 1024
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Returns DROPBEAR_SUCCESS or DROPBEAR_FAILURE
 | 
				
			||||||
 | 
					static int buf_writefile(buffer * buf, const char * filename) {
 | 
				
			||||||
 | 
						int ret = DROPBEAR_FAILURE;
 | 
				
			||||||
 | 
						int fd = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
 | 
				
			||||||
 | 
						if (fd < 0) {
 | 
				
			||||||
 | 
							dropbear_log(LOG_ERR, "Couldn't create new file %s: %s",
 | 
				
			||||||
 | 
								filename, strerror(errno));
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* write the file now */
 | 
				
			||||||
 | 
						while (buf->pos != buf->len) {
 | 
				
			||||||
 | 
							int len = write(fd, buf_getptr(buf, buf->len - buf->pos),
 | 
				
			||||||
 | 
									buf->len - buf->pos);
 | 
				
			||||||
 | 
							if (errno == EINTR) {
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (len <= 0) {
 | 
				
			||||||
 | 
								dropbear_log(LOG_ERR, "Failed writing file %s: %s",
 | 
				
			||||||
 | 
									filename, strerror(errno));
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							buf_incrpos(buf, len);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = DROPBEAR_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
 | 
						if (fd >= 0) {
 | 
				
			||||||
 | 
							m_close(fd);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* returns 0 on failure */
 | 
				
			||||||
 | 
					static int get_default_bits(enum signkey_type keytype)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					        switch (keytype) {
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_RSA
 | 
				
			||||||
 | 
					            case DROPBEAR_SIGNKEY_RSA:
 | 
				
			||||||
 | 
									return RSA_DEFAULT_SIZE;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_DSS
 | 
				
			||||||
 | 
					            case DROPBEAR_SIGNKEY_DSS:
 | 
				
			||||||
 | 
					                return DSS_DEFAULT_SIZE;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
 | 
					            case DROPBEAR_SIGNKEY_ECDSA_KEYGEN:
 | 
				
			||||||
 | 
					                return ECDSA_DEFAULT_SIZE;
 | 
				
			||||||
 | 
					            case DROPBEAR_SIGNKEY_ECDSA_NISTP521:
 | 
				
			||||||
 | 
					            	return 521;
 | 
				
			||||||
 | 
					            case DROPBEAR_SIGNKEY_ECDSA_NISTP384:
 | 
				
			||||||
 | 
					            	return 384;
 | 
				
			||||||
 | 
					            case DROPBEAR_SIGNKEY_ECDSA_NISTP256:
 | 
				
			||||||
 | 
					            	return 256;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int signkey_generate(enum signkey_type keytype, int bits, const char* filename)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						sign_key * key = NULL;
 | 
				
			||||||
 | 
						buffer *buf = NULL;
 | 
				
			||||||
 | 
						int ret = DROPBEAR_FAILURE;
 | 
				
			||||||
 | 
						if (bits == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							bits = get_default_bits(keytype);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* now we can generate the key */
 | 
				
			||||||
 | 
						key = new_sign_key();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch(keytype) {
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_RSA
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_RSA:
 | 
				
			||||||
 | 
								key->rsakey = gen_rsa_priv_key(bits);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_DSS
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_DSS:
 | 
				
			||||||
 | 
								key->dsskey = gen_dss_priv_key(bits);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_ECDSA_KEYGEN:
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_ECDSA_NISTP521:
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_ECDSA_NISTP384:
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_ECDSA_NISTP256:
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ecc_key *ecckey = gen_ecdsa_priv_key(bits);
 | 
				
			||||||
 | 
									keytype = ecdsa_signkey_type(ecckey);
 | 
				
			||||||
 | 
									*signkey_key_ptr(key, keytype) = ecckey;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								dropbear_exit("Internal error");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf = buf_new(MAX_PRIVKEY_SIZE); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf_put_priv_key(buf, key, keytype);
 | 
				
			||||||
 | 
						sign_key_free(key);
 | 
				
			||||||
 | 
						key = NULL;
 | 
				
			||||||
 | 
						buf_setpos(buf, 0);
 | 
				
			||||||
 | 
						ret = buf_writefile(buf, filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf_burn(buf);
 | 
				
			||||||
 | 
						buf_free(buf);
 | 
				
			||||||
 | 
						buf = NULL;
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										8
									
								
								gensignkey.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								gensignkey.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					#ifndef _GENSIGNKEY_H
 | 
				
			||||||
 | 
					#define _GENSIGNKEY_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "signkey.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int signkey_generate(enum signkey_type type, int bits, const char* filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										10
									
								
								keyimport.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								keyimport.c
									
									
									
									
									
								
							@ -112,7 +112,7 @@ static sign_key *dropbear_read(const char* filename) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	buffer * buf = NULL;
 | 
						buffer * buf = NULL;
 | 
				
			||||||
	sign_key *ret = NULL;
 | 
						sign_key *ret = NULL;
 | 
				
			||||||
	int type;
 | 
						enum signkey_type type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buf = buf_new(MAX_PRIVKEY_SIZE);
 | 
						buf = buf_new(MAX_PRIVKEY_SIZE);
 | 
				
			||||||
	if (buf_readfile(buf, filename) == DROPBEAR_FAILURE) {
 | 
						if (buf_readfile(buf, filename) == DROPBEAR_FAILURE) {
 | 
				
			||||||
@ -501,7 +501,7 @@ static int openssh_encrypted(const char *filename)
 | 
				
			|||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static sign_key *openssh_read(const char *filename, char *passphrase)
 | 
					static sign_key *openssh_read(const char *filename, char * UNUSED(passphrase))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct openssh_key *key;
 | 
						struct openssh_key *key;
 | 
				
			||||||
	unsigned char *p;
 | 
						unsigned char *p;
 | 
				
			||||||
@ -511,7 +511,7 @@ static sign_key *openssh_read(const char *filename, char *passphrase)
 | 
				
			|||||||
	char *errmsg;
 | 
						char *errmsg;
 | 
				
			||||||
	char *modptr = NULL;
 | 
						char *modptr = NULL;
 | 
				
			||||||
	int modlen = -9999;
 | 
						int modlen = -9999;
 | 
				
			||||||
	int type;
 | 
						enum signkey_type type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sign_key *retkey;
 | 
						sign_key *retkey;
 | 
				
			||||||
	buffer * blobbuf = NULL;
 | 
						buffer * blobbuf = NULL;
 | 
				
			||||||
@ -1018,8 +1018,8 @@ static int openssh_write(const char *filename, sign_key *key,
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		*/
 | 
							*/
 | 
				
			||||||
		buffer *seq_buf = buf_new(400);
 | 
							buffer *seq_buf = buf_new(400);
 | 
				
			||||||
		ecc_key **eck = signkey_ecc_key_ptr(key, key->type);
 | 
							ecc_key **eck = (ecc_key**)signkey_key_ptr(key, key->type);
 | 
				
			||||||
		const unsigned long curve_size = (*eck)->dp->size;
 | 
							const long curve_size = (*eck)->dp->size;
 | 
				
			||||||
		int curve_oid_len = 0;
 | 
							int curve_oid_len = 0;
 | 
				
			||||||
		const void* curve_oid = NULL;
 | 
							const void* curve_oid = NULL;
 | 
				
			||||||
		unsigned long pubkey_size = 2*curve_size+1;
 | 
							unsigned long pubkey_size = 2*curve_size+1;
 | 
				
			||||||
 | 
				
			|||||||
@ -180,9 +180,9 @@ much traffic. */
 | 
				
			|||||||
 * PAM challenge/response.
 | 
					 * PAM challenge/response.
 | 
				
			||||||
 * You can't enable both PASSWORD and PAM. */
 | 
					 * You can't enable both PASSWORD and PAM. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ENABLE_SVR_PASSWORD_AUTH
 | 
					//#define ENABLE_SVR_PASSWORD_AUTH
 | 
				
			||||||
/* PAM requires ./configure --enable-pam */
 | 
					/* PAM requires ./configure --enable-pam */
 | 
				
			||||||
//#define ENABLE_SVR_PAM_AUTH
 | 
					#define ENABLE_SVR_PAM_AUTH
 | 
				
			||||||
#define ENABLE_SVR_PUBKEY_AUTH
 | 
					#define ENABLE_SVR_PUBKEY_AUTH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Whether to take public key options in 
 | 
					/* Whether to take public key options in 
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										15
									
								
								signkey.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								signkey.c
									
									
									
									
									
								
							@ -181,7 +181,7 @@ int buf_get_pub_key(buffer *buf, sign_key *key, enum signkey_type *type) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
	{
 | 
						if (signkey_is_ecdsa(keytype)) {
 | 
				
			||||||
		ecc_key **eck = (ecc_key**)signkey_key_ptr(key, keytype);
 | 
							ecc_key **eck = (ecc_key**)signkey_key_ptr(key, keytype);
 | 
				
			||||||
		if (eck) {
 | 
							if (eck) {
 | 
				
			||||||
			if (*eck) {
 | 
								if (*eck) {
 | 
				
			||||||
@ -249,7 +249,7 @@ int buf_get_priv_key(buffer *buf, sign_key *key, enum signkey_type *type) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
	{
 | 
						if (signkey_is_ecdsa(keytype)) {
 | 
				
			||||||
		ecc_key **eck = (ecc_key**)signkey_key_ptr(key, keytype);
 | 
							ecc_key **eck = (ecc_key**)signkey_key_ptr(key, keytype);
 | 
				
			||||||
		if (eck) {
 | 
							if (eck) {
 | 
				
			||||||
			if (*eck) {
 | 
								if (*eck) {
 | 
				
			||||||
@ -289,10 +289,7 @@ void buf_put_pub_key(buffer* buf, sign_key *key, enum signkey_type type) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
	if (type == DROPBEAR_SIGNKEY_ECDSA_NISTP256
 | 
						if (signkey_is_ecdsa(type)) {
 | 
				
			||||||
		|| type == DROPBEAR_SIGNKEY_ECDSA_NISTP384
 | 
					 | 
				
			||||||
		|| type == DROPBEAR_SIGNKEY_ECDSA_NISTP521)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
 | 
							ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
 | 
				
			||||||
		if (eck) {
 | 
							if (eck) {
 | 
				
			||||||
			buf_put_ecdsa_pub_key(pubkeys, *eck);
 | 
								buf_put_ecdsa_pub_key(pubkeys, *eck);
 | 
				
			||||||
@ -329,7 +326,7 @@ void buf_put_priv_key(buffer* buf, sign_key *key, enum signkey_type type) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
	{
 | 
						if (signkey_is_ecdsa(type)) {
 | 
				
			||||||
		ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
 | 
							ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
 | 
				
			||||||
		if (eck) {
 | 
							if (eck) {
 | 
				
			||||||
			buf_put_ecdsa_priv_key(buf, *eck);
 | 
								buf_put_ecdsa_priv_key(buf, *eck);
 | 
				
			||||||
@ -484,7 +481,7 @@ void buf_put_sign(buffer* buf, sign_key *key, enum signkey_type type,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
	{
 | 
						if (signkey_is_ecdsa(type)) {
 | 
				
			||||||
		ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
 | 
							ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
 | 
				
			||||||
		if (eck) {
 | 
							if (eck) {
 | 
				
			||||||
			buf_put_ecdsa_sign(sigblob, *eck, data_buf);
 | 
								buf_put_ecdsa_sign(sigblob, *eck, data_buf);
 | 
				
			||||||
@ -535,7 +532,7 @@ int buf_verify(buffer * buf, sign_key *key, buffer *data_buf) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef DROPBEAR_ECDSA
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
	{
 | 
						if (signkey_is_ecdsa(type)) {
 | 
				
			||||||
		ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
 | 
							ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
 | 
				
			||||||
		if (eck) {
 | 
							if (eck) {
 | 
				
			||||||
			return buf_ecdsa_verify(buf, *eck, data_buf);
 | 
								return buf_ecdsa_verify(buf, *eck, data_buf);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										80
									
								
								svr-kex.c
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								svr-kex.c
									
									
									
									
									
								
							@ -35,6 +35,7 @@
 | 
				
			|||||||
#include "random.h"
 | 
					#include "random.h"
 | 
				
			||||||
#include "runopts.h"
 | 
					#include "runopts.h"
 | 
				
			||||||
#include "ecc.h"
 | 
					#include "ecc.h"
 | 
				
			||||||
 | 
					#include "gensignkey.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void send_msg_kexdh_reply(mp_int *dh_e, buffer *ecdh_qs);
 | 
					static void send_msg_kexdh_reply(mp_int *dh_e, buffer *ecdh_qs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -76,6 +77,82 @@ void recv_msg_kexdh_init() {
 | 
				
			|||||||
	TRACE(("leave recv_msg_kexdh_init"))
 | 
						TRACE(("leave recv_msg_kexdh_init"))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void svr_ensure_hostkey() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const char* fn = NULL;
 | 
				
			||||||
 | 
						char *fn_temp = NULL;
 | 
				
			||||||
 | 
						enum signkey_type type = ses.newkeys->algo_hostkey;
 | 
				
			||||||
 | 
						void **hostkey = signkey_key_ptr(svr_opts.hostkey, type);
 | 
				
			||||||
 | 
						int ret = DROPBEAR_FAILURE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (hostkey && *hostkey) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (type)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_RSA
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_RSA:
 | 
				
			||||||
 | 
								fn = RSA_PRIV_FILENAME;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_DSS
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_DSS:
 | 
				
			||||||
 | 
								fn = DSS_PRIV_FILENAME;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef DROPBEAR_ECDSA
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_ECDSA_NISTP256:
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_ECDSA_NISTP384:
 | 
				
			||||||
 | 
							case DROPBEAR_SIGNKEY_ECDSA_NISTP521:
 | 
				
			||||||
 | 
								fn = ECDSA_PRIV_FILENAME;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								(void)0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (readhostkey(fn, svr_opts.hostkey, &type) == DROPBEAR_SUCCESS) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fn_temp = m_malloc(strlen(fn) + 20);
 | 
				
			||||||
 | 
						snprintf(fn_temp, strlen(fn)+20, "%s.tmp%d", fn, getpid());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (signkey_generate(type, 0, fn_temp) == DROPBEAR_FAILURE) {
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (link(fn_temp, fn) < 0) {
 | 
				
			||||||
 | 
							if (errno != EEXIST) {
 | 
				
			||||||
 | 
								dropbear_log(LOG_ERR, "Failed moving key file to %s", fn);
 | 
				
			||||||
 | 
								/* XXX fallback to non-atomic copy for some filesystems? */
 | 
				
			||||||
 | 
								goto out;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = readhostkey(fn, svr_opts.hostkey, &type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
 | 
						if (fn_temp) {
 | 
				
			||||||
 | 
							unlink(fn_temp);
 | 
				
			||||||
 | 
							m_free(fn_temp);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ret == DROPBEAR_FAILURE)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							dropbear_exit("Couldn't read or generate hostkey");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// directory for keys.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create lockfile first, or wait if it exists. PID!
 | 
				
			||||||
 | 
						// Generate key
 | 
				
			||||||
 | 
						// write it, load to memory
 | 
				
			||||||
 | 
						// atomic rename, done.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
/* Generate our side of the diffie-hellman key exchange value (dh_f), and
 | 
					/* Generate our side of the diffie-hellman key exchange value (dh_f), and
 | 
				
			||||||
 * calculate the session key using the diffie-hellman algorithm. Following
 | 
					 * calculate the session key using the diffie-hellman algorithm. Following
 | 
				
			||||||
 * that, the session hash is calculated, and signed with RSA or DSS. The
 | 
					 * that, the session hash is calculated, and signed with RSA or DSS. The
 | 
				
			||||||
@ -88,6 +165,9 @@ static void send_msg_kexdh_reply(mp_int *dh_e, buffer *ecdh_qs) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* we can start creating the kexdh_reply packet */
 | 
						/* we can start creating the kexdh_reply packet */
 | 
				
			||||||
	CHECKCLEARTOWRITE();
 | 
						CHECKCLEARTOWRITE();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						svr_ensure_hostkey();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buf_putbyte(ses.writepayload, SSH_MSG_KEXDH_REPLY);
 | 
						buf_putbyte(ses.writepayload, SSH_MSG_KEXDH_REPLY);
 | 
				
			||||||
	buf_put_pub_key(ses.writepayload, svr_opts.hostkey,
 | 
						buf_put_pub_key(ses.writepayload, svr_opts.hostkey,
 | 
				
			||||||
			ses.newkeys->algo_hostkey);
 | 
								ses.newkeys->algo_hostkey);
 | 
				
			||||||
 | 
				
			|||||||
@ -482,7 +482,7 @@ void load_all_hostkeys() {
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef DROPBEAR_ECC_521
 | 
					#ifdef DROPBEAR_ECC_521
 | 
				
			||||||
	if (!svr_opts.hostkey->ecckey521) {
 | 
						if (!svr_opts.hostkey->ecckey521) {
 | 
				
			||||||
		disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP521);
 | 
							//disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP521);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user