rcolebaugh / rpms / openssh

Forked from rpms/openssh 2 years ago
Clone
9fd698
diff --git a/auth2-hostbased.c b/auth2-hostbased.c
aa843e
index 36b9d2f5..6b517db4 100644
9fd698
--- a/auth2-hostbased.c
9fd698
+++ b/auth2-hostbased.c
aa843e
@@ -119,6 +119,11 @@ userauth_hostbased(struct ssh *ssh, const char *method)
9fd698
 		    "(null)" : key->cert->signature_type);
9fd698
 		goto done;
9fd698
 	}
aa843e
+	if ((r = sshkey_check_rsa_length(key,
aa843e
+	    options.required_rsa_size)) != 0) {
aa843e
+		logit_r(r, "refusing %s key", sshkey_type(key));
9fd698
+		goto done;
9fd698
+	}
9fd698
 
9fd698
 	if (!authctxt->valid || authctxt->user == NULL) {
9fd698
 		debug2_f("disabled because of invalid user");
9fd698
diff --git a/auth2-pubkey.c b/auth2-pubkey.c
aa843e
index 962fd342..5d59febc 100644
9fd698
--- a/auth2-pubkey.c
9fd698
+++ b/auth2-pubkey.c
aa843e
@@ -175,6 +175,11 @@ userauth_pubkey(struct ssh *ssh, const char *method)
9fd698
 		    "(null)" : key->cert->signature_type);
9fd698
 		goto done;
9fd698
 	}
aa843e
+	if ((r = sshkey_check_rsa_length(key,
aa843e
+	    options.required_rsa_size)) != 0) {
aa843e
+		logit_r(r, "refusing %s key", sshkey_type(key));
9fd698
+		goto done;
9fd698
+	}
9fd698
 	key_s = format_key(key);
9fd698
 	if (sshkey_is_cert(key))
9fd698
 		ca_s = format_key(key->cert->signature_key);
9fd698
diff --git a/readconf.c b/readconf.c
aa843e
index 7f26c680..42be690b 100644
9fd698
--- a/readconf.c
9fd698
+++ b/readconf.c
aa843e
@@ -174,7 +174,7 @@ typedef enum {
9fd698
 	oStreamLocalBindMask, oStreamLocalBindUnlink, oRevokedHostKeys,
9fd698
 	oFingerprintHash, oUpdateHostkeys, oHostbasedAcceptedAlgorithms,
9fd698
 	oPubkeyAcceptedAlgorithms, oCASignatureAlgorithms, oProxyJump,
9fd698
-	oSecurityKeyProvider, oKnownHostsCommand,
aa843e
+	oSecurityKeyProvider, oKnownHostsCommand, oRequiredRSASize,
9fd698
 	oIgnore, oIgnoredUnknownOption, oDeprecated, oUnsupported
9fd698
 } OpCodes;
9fd698
 
aa843e
@@ -320,6 +320,8 @@ static struct {
9fd698
 	{ "proxyjump", oProxyJump },
9fd698
 	{ "securitykeyprovider", oSecurityKeyProvider },
9fd698
 	{ "knownhostscommand", oKnownHostsCommand },
aa843e
+	{ "requiredrsasize", oRequiredRSASize },
aa843e
+	{ "rsaminsize", oRequiredRSASize }, /* alias */
9fd698
 
9fd698
 	{ NULL, oBadOption }
9fd698
 };
aa843e
@@ -2176,6 +2177,10 @@ parse_pubkey_algos:
9fd698
 			*charptr = xstrdup(arg);
9fd698
 		break;
9fd698
 
aa843e
+	case oRequiredRSASize:
aa843e
+		intptr = &options->required_rsa_size;
9fd698
+		goto parse_int;
9fd698
+
9fd698
 	case oDeprecated:
9fd698
 		debug("%s line %d: Deprecated option \"%s\"",
9fd698
 		    filename, linenum, keyword);
aa843e
@@ -2423,6 +2428,7 @@ initialize_options(Options * options)
9fd698
 	options->hostbased_accepted_algos = NULL;
9fd698
 	options->pubkey_accepted_algos = NULL;
9fd698
 	options->known_hosts_command = NULL;
aa843e
+	options->required_rsa_size = -1;
9fd698
 }
9fd698
 
9fd698
 /*
aa843e
@@ -2619,6 +2625,8 @@ fill_default_options(Options * options)
9fd698
 	if (options->sk_provider == NULL)
9fd698
 		options->sk_provider = xstrdup("$SSH_SK_PROVIDER");
9fd698
 #endif
aa843e
+	if (options->required_rsa_size == -1)
aa843e
+		options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE;
9fd698
 
9fd698
 	/* Expand KEX name lists */
9fd698
 	all_cipher = cipher_alg_list(',', 0);
aa843e
@@ -3308,6 +3316,7 @@ dump_client_config(Options *o, const char *host)
9fd698
 	dump_cfg_int(oNumberOfPasswordPrompts, o->number_of_password_prompts);
9fd698
 	dump_cfg_int(oServerAliveCountMax, o->server_alive_count_max);
9fd698
 	dump_cfg_int(oServerAliveInterval, o->server_alive_interval);
aa843e
+	dump_cfg_int(oRequiredRSASize, o->required_rsa_size);
9fd698
 
9fd698
 	/* String options */
9fd698
 	dump_cfg_string(oBindAddress, o->bind_address);
9fd698
diff --git a/readconf.h b/readconf.h
aa843e
index f647bd42..ffb5ec4f 100644
9fd698
--- a/readconf.h
9fd698
+++ b/readconf.h
9fd698
@@ -176,6 +176,8 @@ typedef struct {
9fd698
 
9fd698
 	char   *known_hosts_command;
9fd698
 
aa843e
+	int	required_rsa_size;	/* minimum size of RSA keys */
9fd698
+
9fd698
 	char	*ignored_unknown; /* Pattern list of unknown tokens to ignore */
9fd698
 }       Options;
9fd698
 
9fd698
diff --git a/servconf.c b/servconf.c
aa843e
index 29df0463..423772b1 100644
9fd698
--- a/servconf.c
9fd698
+++ b/servconf.c
aa843e
@@ -195,6 +195,7 @@ initialize_server_options(ServerOptions *options)
9fd698
 	options->fingerprint_hash = -1;
9fd698
 	options->disable_forwarding = -1;
9fd698
 	options->expose_userauth_info = -1;
aa843e
+	options->required_rsa_size = -1;
9fd698
 }
9fd698
 
9fd698
 /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */
aa843e
@@ -441,6 +442,8 @@ fill_default_server_options(ServerOptions *options)
9fd698
 		options->expose_userauth_info = 0;
9fd698
 	if (options->sk_provider == NULL)
9fd698
 		options->sk_provider = xstrdup("internal");
aa843e
+	if (options->required_rsa_size == -1)
aa843e
+		options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE;
9fd698
 
9fd698
 	assemble_algorithms(options);
9fd698
 
aa843e
@@ -517,6 +520,7 @@ typedef enum {
9fd698
 	sStreamLocalBindMask, sStreamLocalBindUnlink,
9fd698
 	sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding,
9fd698
 	sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider,
aa843e
+	sRequiredRSASize,
9fd698
 	sDeprecated, sIgnore, sUnsupported
9fd698
 } ServerOpCodes;
9fd698
 
aa843e
@@ -676,6 +680,8 @@ static struct {
9fd698
 	{ "rdomain", sRDomain, SSHCFG_ALL },
9fd698
 	{ "casignaturealgorithms", sCASignatureAlgorithms, SSHCFG_ALL },
9fd698
 	{ "securitykeyprovider", sSecurityKeyProvider, SSHCFG_GLOBAL },
aa843e
+	{ "requiredrsasize", sRequiredRSASize, SSHCFG_ALL },
aa843e
+	{ "rsaminsize", sRequiredRSASize, SSHCFG_ALL }, /* alias */
9fd698
 	{ NULL, sBadOption, 0 }
9fd698
 };
9fd698
 
aa843e
@@ -2438,6 +2443,10 @@ process_server_config_line_depth(ServerOptions *options, char *line,
9fd698
 			*charptr = xstrdup(arg);
9fd698
 		break;
9fd698
 
aa843e
+	case sRequiredRSASize:
aa843e
+		intptr = &options->required_rsa_size;
9fd698
+		goto parse_int;
9fd698
+
9fd698
 	case sDeprecated:
9fd698
 	case sIgnore:
9fd698
 	case sUnsupported:
aa843e
@@ -2610,6 +2619,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
9fd698
 	M_CP_INTOPT(rekey_limit);
9fd698
 	M_CP_INTOPT(rekey_interval);
9fd698
 	M_CP_INTOPT(log_level);
aa843e
+	M_CP_INTOPT(required_rsa_size);
9fd698
 
9fd698
 	/*
9fd698
 	 * The bind_mask is a mode_t that may be unsigned, so we can't use
aa843e
@@ -2874,6 +2884,7 @@ dump_config(ServerOptions *o)
9fd698
 	dump_cfg_int(sMaxSessions, o->max_sessions);
9fd698
 	dump_cfg_int(sClientAliveInterval, o->client_alive_interval);
9fd698
 	dump_cfg_int(sClientAliveCountMax, o->client_alive_count_max);
aa843e
+	dump_cfg_int(sRequiredRSASize, o->required_rsa_size);
9fd698
 	dump_cfg_oct(sStreamLocalBindMask, o->fwd_opts.streamlocal_bind_mask);
9fd698
 
9fd698
 	/* formatted integer arguments */
9fd698
diff --git a/servconf.h b/servconf.h
aa843e
index 8a04463e..9346155c 100644
9fd698
--- a/servconf.h
9fd698
+++ b/servconf.h
aa843e
@@ -229,6 +229,7 @@ typedef struct {
9fd698
 	int	expose_userauth_info;
9fd698
 	u_int64_t timing_secret;
9fd698
 	char   *sk_provider;
aa843e
+	int	required_rsa_size;	/* minimum size of RSA keys */
9fd698
 }       ServerOptions;
9fd698
 
9fd698
 /* Information about the incoming connection as used by Match */
9fd698
diff --git a/ssh.c b/ssh.c
aa843e
index 559bf2af..25be53d5 100644
9fd698
--- a/ssh.c
9fd698
+++ b/ssh.c
aa843e
@@ -516,14 +516,22 @@ resolve_canonicalize(char **hostp, int port)
9fd698
 }
9fd698
 
9fd698
 /*
9fd698
- * Check the result of hostkey loading, ignoring some errors and
9fd698
- * fatal()ing for others.
9fd698
+ * Check the result of hostkey loading, ignoring some errors and either
9fd698
+ * discarding the key or fatal()ing for others.
9fd698
  */
9fd698
 static void
9fd698
-check_load(int r, const char *path, const char *message)
9fd698
+check_load(int r, struct sshkey **k, const char *path, const char *message)
9fd698
 {
9fd698
 	switch (r) {
9fd698
 	case 0:
9fd698
+		/* Check RSA keys size and discard if undersized */
9fd698
+		if (k != NULL && *k != NULL &&
9fd698
+		    (r = sshkey_check_rsa_length(*k,
aa843e
+		    options.required_rsa_size)) != 0) {
9fd698
+			error_r(r, "load %s \"%s\"", message, path);
9fd698
+			free(*k);
9fd698
+			*k = NULL;
9fd698
+		}
9fd698
 		break;
9fd698
 	case SSH_ERR_INTERNAL_ERROR:
9fd698
 	case SSH_ERR_ALLOC_FAIL:
aa843e
@@ -1578,7 +1586,7 @@ main(int ac, char **av)
9fd698
 	if ((o) >= sensitive_data.nkeys) \
9fd698
 		fatal_f("pubkey out of array bounds"); \
9fd698
 	check_load(sshkey_load_public(p, &(sensitive_data.keys[o]), NULL), \
9fd698
-	    p, "pubkey"); \
9fd698
+	    &(sensitive_data.keys[o]), p, "pubkey"); \
aa843e
 	if (sensitive_data.keys[o] != NULL) \
aa843e
 		debug2("hostbased key %d: %s key from \"%s\"", o, \
aa843e
 		    sshkey_ssh_name(sensitive_data.keys[o]), p); \
aa843e
@@ -1586,7 +1594,8 @@ main(int ac, char **av)
9fd698
 #define L_CERT(p,o) do { \
9fd698
 	if ((o) >= sensitive_data.nkeys) \
9fd698
 		fatal_f("cert out of array bounds"); \
9fd698
-	check_load(sshkey_load_cert(p, &(sensitive_data.keys[o])), p, "cert"); \
9fd698
+	check_load(sshkey_load_cert(p, &(sensitive_data.keys[o])), \
9fd698
+	    &(sensitive_data.keys[o]), p, "cert"); \
aa843e
 	if (sensitive_data.keys[o] != NULL) \
aa843e
 		debug2("hostbased key %d: %s cert from \"%s\"", o, \
aa843e
 		    sshkey_ssh_name(sensitive_data.keys[o]), p); \
aa843e
@@ -2265,7 +2274,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo)
9fd698
 		filename = default_client_percent_dollar_expand(cp, cinfo);
9fd698
 		free(cp);
9fd698
 		check_load(sshkey_load_public(filename, &public, NULL),
9fd698
-		    filename, "pubkey");
9fd698
+		    &public, filename, "pubkey");
9fd698
 		debug("identity file %s type %d", filename,
9fd698
 		    public ? public->type : -1);
9fd698
 		free(options.identity_files[i]);
aa843e
@@ -2284,7 +2293,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo)
9fd698
 			continue;
9fd698
 		xasprintf(&cp, "%s-cert", filename);
9fd698
 		check_load(sshkey_load_public(cp, &public, NULL),
9fd698
-		    filename, "pubkey");
9fd698
+		    &public, filename, "pubkey");
9fd698
 		debug("identity file %s type %d", cp,
9fd698
 		    public ? public->type : -1);
9fd698
 		if (public == NULL) {
aa843e
@@ -2315,7 +2324,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo)
9fd698
 		free(cp);
9fd698
 
9fd698
 		check_load(sshkey_load_public(filename, &public, NULL),
9fd698
-		    filename, "certificate");
9fd698
+		    &public, filename, "certificate");
9fd698
 		debug("certificate file %s type %d", filename,
9fd698
 		    public ? public->type : -1);
9fd698
 		free(options.certificate_files[i]);
9fd698
diff --git a/sshconnect2.c b/sshconnect2.c
aa843e
index f9bd19ea..58fe98db 100644
9fd698
--- a/sshconnect2.c
9fd698
+++ b/sshconnect2.c
aa843e
@@ -96,6 +96,11 @@ static const struct ssh_conn_info *xxx_conn_info;
9fd698
 static int
9fd698
 verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh)
9fd698
 {
9fd698
+	int r;
9fd698
+
aa843e
+	if ((r = sshkey_check_rsa_length(hostkey,
aa843e
+	    options.required_rsa_size)) != 0)
9fd698
+		fatal_r(r, "Bad server host key");
9fd698
 	if (verify_host_key(xxx_host, xxx_hostaddr, hostkey,
9fd698
 	    xxx_conn_info) == -1)
9fd698
 		fatal("Host key verification failed.");
aa843e
@@ -1606,6 +1611,13 @@ load_identity_file(Identity *id)
483723
 			private = NULL;
483723
 			quit = 1;
483723
 		}
aa843e
+		if (!quit && (r = sshkey_check_rsa_length(private,
aa843e
+		    options.required_rsa_size)) != 0) {
483723
+			debug_fr(r, "Skipping key %s", id->filename);
483723
+			sshkey_free(private);
483723
+			private = NULL;
483723
+			quit = 1;
483723
+		}
483723
 		if (!quit && private != NULL && id->agent_fd == -1 &&
483723
 		    !(id->key && id->isprivate))
483723
 			maybe_add_key_to_agent(id->filename, private, comment,
aa843e
@@ -1752,6 +1764,12 @@ pubkey_prepare(struct ssh *ssh, Authctxt *authctxt)
aa843e
 	/* list of keys supported by the agent */
aa843e
 	if ((r = get_agent_identities(ssh, &agent_fd, &idlist)) == 0) {
aa843e
 		for (j = 0; j < idlist->nkeys; j++) {
9fd698
+			if ((r = sshkey_check_rsa_length(idlist->keys[j],
aa843e
+			    options.required_rsa_size)) != 0) {
9fd698
+				debug_fr(r, "ignoring %s agent key",
9fd698
+				    sshkey_ssh_name(idlist->keys[j]));
9fd698
+				continue;
9fd698
+			}
9fd698
 			found = 0;
9fd698
 			TAILQ_FOREACH(id, &files, next) {
9fd698
 				/*
9fd698
diff --git a/sshd.c b/sshd.c
aa843e
index 17eee9d8..395ef493 100644
9fd698
--- a/sshd.c
9fd698
+++ b/sshd.c
aa843e
@@ -1870,6 +1870,13 @@ main(int ac, char **av)
9fd698
 				fatal_r(r, "Could not demote key: \"%s\"",
9fd698
 				    options.host_key_files[i]);
9fd698
 		}
9fd698
+		if (pubkey != NULL && (r = sshkey_check_rsa_length(pubkey,
aa843e
+		    options.required_rsa_size)) != 0) {
9fd698
+			error_fr(r, "Host key %s", options.host_key_files[i]);
9fd698
+			sshkey_free(pubkey);
9fd698
+			sshkey_free(key);
9fd698
+			continue;
9fd698
+		}
9fd698
 		sensitive_data.host_keys[i] = key;
9fd698
 		sensitive_data.host_pubkeys[i] = pubkey;
9fd698
 
9fd698
diff --git a/sshkey.c b/sshkey.c
aa843e
index ed2b5dff..77093235 100644
9fd698
--- a/sshkey.c
9fd698
+++ b/sshkey.c
aa843e
@@ -2365,18 +2365,24 @@ cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
9fd698
 	return ret;
9fd698
 }
9fd698
 
9fd698
-#ifdef WITH_OPENSSL
9fd698
-static int
9fd698
-check_rsa_length(const RSA *rsa)
9fd698
+int
9fd698
+sshkey_check_rsa_length(const struct sshkey *k, int min_size)
9fd698
 {
9fd698
+#ifdef WITH_OPENSSL
9fd698
 	const BIGNUM *rsa_n;
9fd698
+	int nbits;
9fd698
 
9fd698
-	RSA_get0_key(rsa, &rsa_n, NULL, NULL);
9fd698
-	if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
9fd698
+	if (k == NULL || k->rsa == NULL ||
9fd698
+	    (k->type != KEY_RSA && k->type != KEY_RSA_CERT))
9fd698
+		return 0;
9fd698
+	RSA_get0_key(k->rsa, &rsa_n, NULL, NULL);
9fd698
+	nbits = BN_num_bits(rsa_n);
9fd698
+	if (nbits < SSH_RSA_MINIMUM_MODULUS_SIZE ||
9fd698
+	    (min_size > 0 && nbits < min_size))
9fd698
 		return SSH_ERR_KEY_LENGTH;
9fd698
+#endif /* WITH_OPENSSL */
9fd698
 	return 0;
9fd698
 }
9fd698
-#endif
9fd698
 
9fd698
 static int
9fd698
 sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
aa843e
@@ -2439,7 +2445,7 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
9fd698
 			goto out;
9fd698
 		}
9fd698
 		rsa_n = rsa_e = NULL; /* transferred */
9fd698
-		if ((ret = check_rsa_length(key->rsa)) != 0)
9fd698
+		if ((ret = sshkey_check_rsa_length(key, 0)) != 0)
9fd698
 			goto out;
9fd698
 #ifdef DEBUG_PK
9fd698
 		RSA_print_fp(stderr, key->rsa, 8);
aa843e
@@ -3642,7 +3648,7 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
9fd698
 			goto out;
9fd698
 		}
9fd698
 		rsa_p = rsa_q = NULL; /* transferred */
9fd698
-		if ((r = check_rsa_length(k->rsa)) != 0)
9fd698
+		if ((r = sshkey_check_rsa_length(k, 0)) != 0)
9fd698
 			goto out;
9fd698
 		if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
9fd698
 			goto out;
aa843e
@@ -4644,7 +4650,7 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
9fd698
 			r = SSH_ERR_LIBCRYPTO_ERROR;
9fd698
 			goto out;
9fd698
 		}
9fd698
-		if ((r = check_rsa_length(prv->rsa)) != 0)
9fd698
+		if ((r = sshkey_check_rsa_length(prv, 0)) != 0)
9fd698
 			goto out;
9fd698
 	} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA &&
9fd698
 	    (type == KEY_UNSPEC || type == KEY_DSA)) {
9fd698
diff --git a/sshkey.h b/sshkey.h
aa843e
index 094815e0..be254e6b 100644
9fd698
--- a/sshkey.h
9fd698
+++ b/sshkey.h
aa843e
@@ -273,6 +273,7 @@ int	sshkey_parse_private_fileblob_type(struct sshbuf *blob, int type,
9fd698
 int	sshkey_parse_pubkey_from_private_fileblob_type(struct sshbuf *blob,
9fd698
     int type, struct sshkey **pubkeyp);
9fd698
 
9fd698
+int sshkey_check_rsa_length(const struct sshkey *, int);
9fd698
 /* XXX should be internal, but used by ssh-keygen */
9fd698
 int ssh_rsa_complete_crt_parameters(struct sshkey *, const BIGNUM *);
9fd698
 
9fd698
diff --git a/ssh.1 b/ssh.1
aa843e
index b4956aec..e255b9b9 100644
9fd698
--- a/ssh.1
9fd698
+++ b/ssh.1
aa843e
@@ -571,6 +571,7 @@ For full details of the options listed below, and their possible values, see
aa843e
 .It RemoteCommand
aa843e
 .It RemoteForward
aa843e
 .It RequestTTY
aa843e
+.It RequiredRSASize
aa843e
 .It SendEnv
aa843e
 .It ServerAliveInterval
aa843e
 .It ServerAliveCountMax
9fd698
diff --git a/ssh_config.5 b/ssh_config.5
aa843e
index 24a46460..d1ede18e 100644
9fd698
--- a/ssh_config.5
9fd698
+++ b/ssh_config.5
aa843e
@@ -1634,6 +1634,17 @@ and
aa843e
 .Fl T
aa843e
 flags for
aa843e
 .Xr ssh 1 .
aa843e
+.It Cm RequiredRSASize
aa843e
+Specifies the minimum RSA key size (in bits) that
aa843e
+.Xr ssh 1
aa843e
+will accept.
aa843e
+User authentication keys smaller than this limit will be ignored.
aa843e
+Servers that present host keys smaller than this limit will cause the
aa843e
+connection to be terminated.
aa843e
+The default is
aa843e
+.Cm 1024
aa843e
+bits.
aa843e
+Note that this limit may only be raised from the default.
aa843e
 .It Cm RevokedHostKeys
aa843e
 Specifies revoked host public keys.
aa843e
 Keys listed in this file will be refused for host authentication.
9fd698
diff --git a/sshd_config.5 b/sshd_config.5
aa843e
index 867a747d..f5a06637 100644
9fd698
--- a/sshd_config.5
9fd698
+++ b/sshd_config.5
aa843e
@@ -1596,6 +1596,16 @@ is
aa843e
 .Cm default none ,
aa843e
 which means that rekeying is performed after the cipher's default amount
aa843e
 of data has been sent or received and no time based rekeying is done.
aa843e
+.It Cm RequiredRSASize
aa843e
+Specifies the minimum RSA key size (in bits) that
aa843e
+.Xr sshd 8
aa843e
+will accept.
aa843e
+User and host-based authentication keys smaller than this limit will be
aa843e
+refused.
aa843e
+The default is
aa843e
+.Cm 1024
aa843e
+bits.
aa843e
+Note that this limit may only be raised from the default.
aa843e
 .It Cm RevokedKeys
aa843e
 Specifies revoked public keys file, or
aa843e
 .Cm none