upstream commit
delete support for legacy v00 certificates; "sure" markus@ dtucker@ Upstream-ID: b5b9bb5f9202d09e88f912989d74928601b6636f
This commit is contained in:
parent
564d63e1b4
commit
c28fc62d78
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: auth-options.c,v 1.67 2015/05/01 03:20:54 djm Exp $ */
|
/* $OpenBSD: auth-options.c,v 1.68 2015/07/03 03:43:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -588,19 +588,6 @@ auth_cert_options(struct sshkey *k, struct passwd *pw)
|
||||||
char *cert_forced_command = NULL;
|
char *cert_forced_command = NULL;
|
||||||
int cert_source_address_done = 0;
|
int cert_source_address_done = 0;
|
||||||
|
|
||||||
if (sshkey_cert_is_legacy(k)) {
|
|
||||||
/* All options are in the one field for v00 certs */
|
|
||||||
if (parse_option_list(k->cert->critical, pw,
|
|
||||||
OPTIONS_CRITICAL|OPTIONS_EXTENSIONS, 1,
|
|
||||||
&cert_no_port_forwarding_flag,
|
|
||||||
&cert_no_agent_forwarding_flag,
|
|
||||||
&cert_no_x11_forwarding_flag,
|
|
||||||
&cert_no_pty_flag,
|
|
||||||
&cert_no_user_rc,
|
|
||||||
&cert_forced_command,
|
|
||||||
&cert_source_address_done) == -1)
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
/* Separate options and extensions for v01 certs */
|
/* Separate options and extensions for v01 certs */
|
||||||
if (parse_option_list(k->cert->critical, pw,
|
if (parse_option_list(k->cert->critical, pw,
|
||||||
OPTIONS_CRITICAL, 1, NULL, NULL, NULL, NULL, NULL,
|
OPTIONS_CRITICAL, 1, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
@ -616,7 +603,6 @@ auth_cert_options(struct sshkey *k, struct passwd *pw)
|
||||||
&cert_no_user_rc,
|
&cert_no_user_rc,
|
||||||
NULL, NULL) == -1)
|
NULL, NULL) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
no_port_forwarding_flag |= cert_no_port_forwarding_flag;
|
no_port_forwarding_flag |= cert_no_port_forwarding_flag;
|
||||||
no_agent_forwarding_flag |= cert_no_agent_forwarding_flag;
|
no_agent_forwarding_flag |= cert_no_agent_forwarding_flag;
|
||||||
|
|
4
authfd.c
4
authfd.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: authfd.c,v 1.97 2015/03/26 19:32:19 markus Exp $ */
|
/* $OpenBSD: authfd.c,v 1.98 2015/07/03 03:43:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -560,10 +560,8 @@ ssh_add_identity_constrained(int sock, struct sshkey *key, const char *comment,
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_ECDSA:
|
case KEY_ECDSA:
|
||||||
case KEY_ECDSA_CERT:
|
case KEY_ECDSA_CERT:
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: authfile.c,v 1.114 2015/04/17 13:32:09 djm Exp $ */
|
/* $OpenBSD: authfile.c,v 1.115 2015/07/03 03:43:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2013 Markus Friedl. All rights reserved.
|
* Copyright (c) 2000, 2013 Markus Friedl. All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -467,7 +467,7 @@ sshkey_load_private_cert(int type, const char *filename, const char *passphrase,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((r = sshkey_to_certified(key, sshkey_cert_is_legacy(cert))) != 0 ||
|
if ((r = sshkey_to_certified(key)) != 0 ||
|
||||||
(r = sshkey_cert_copy(cert, key)) != 0)
|
(r = sshkey_cert_copy(cert, key)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
r = 0;
|
r = 0;
|
||||||
|
|
6
key.c
6
key.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: key.c,v 1.127 2015/01/28 22:36:00 djm Exp $ */
|
/* $OpenBSD: key.c,v 1.128 2015/07/03 03:43:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* placed in the public domain
|
* placed in the public domain
|
||||||
*/
|
*/
|
||||||
|
@ -184,11 +184,11 @@ key_demote(const Key *k)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
key_to_certified(Key *k, int legacy)
|
key_to_certified(Key *k)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if ((r = sshkey_to_certified(k, legacy)) != 0) {
|
if ((r = sshkey_to_certified(k)) != 0) {
|
||||||
fatal_on_fatal_errors(r, __func__, 0);
|
fatal_on_fatal_errors(r, __func__, 0);
|
||||||
error("%s: %s", __func__, ssh_err(r));
|
error("%s: %s", __func__, ssh_err(r));
|
||||||
return -1;
|
return -1;
|
||||||
|
|
5
key.h
5
key.h
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: key.h,v 1.47 2015/01/28 22:36:00 djm Exp $ */
|
/* $OpenBSD: key.h,v 1.48 2015/07/03 03:43:18 djm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||||
|
@ -51,7 +51,6 @@ typedef struct sshkey Key;
|
||||||
#define key_ecdsa_key_to_nid sshkey_ecdsa_key_to_nid
|
#define key_ecdsa_key_to_nid sshkey_ecdsa_key_to_nid
|
||||||
#define key_is_cert sshkey_is_cert
|
#define key_is_cert sshkey_is_cert
|
||||||
#define key_type_plain sshkey_type_plain
|
#define key_type_plain sshkey_type_plain
|
||||||
#define key_cert_is_legacy sshkey_cert_is_legacy
|
|
||||||
#define key_curve_name_to_nid sshkey_curve_name_to_nid
|
#define key_curve_name_to_nid sshkey_curve_name_to_nid
|
||||||
#define key_curve_nid_to_bits sshkey_curve_nid_to_bits
|
#define key_curve_nid_to_bits sshkey_curve_nid_to_bits
|
||||||
#define key_curve_nid_to_name sshkey_curve_nid_to_name
|
#define key_curve_nid_to_name sshkey_curve_nid_to_name
|
||||||
|
@ -69,7 +68,7 @@ int key_read(Key *, char **);
|
||||||
|
|
||||||
Key *key_generate(int, u_int);
|
Key *key_generate(int, u_int);
|
||||||
Key *key_from_private(const Key *);
|
Key *key_from_private(const Key *);
|
||||||
int key_to_certified(Key *, int);
|
int key_to_certified(Key *);
|
||||||
int key_drop_cert(Key *);
|
int key_drop_cert(Key *);
|
||||||
int key_certify(Key *, Key *);
|
int key_certify(Key *, Key *);
|
||||||
void key_cert_copy(const Key *, Key *);
|
void key_cert_copy(const Key *, Key *);
|
||||||
|
|
10
krl.c
10
krl.c
|
@ -14,7 +14,7 @@
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $OpenBSD: krl.c,v 1.32 2015/06/24 23:47:23 djm Exp $ */
|
/* $OpenBSD: krl.c,v 1.33 2015/07/03 03:43:18 djm Exp $ */
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
|
|
||||||
|
@ -429,7 +429,7 @@ ssh_krl_revoke_key(struct ssh_krl *krl, const struct sshkey *key)
|
||||||
if (!sshkey_is_cert(key))
|
if (!sshkey_is_cert(key))
|
||||||
return ssh_krl_revoke_key_sha1(krl, key);
|
return ssh_krl_revoke_key_sha1(krl, key);
|
||||||
|
|
||||||
if (sshkey_cert_is_legacy(key) || key->cert->serial == 0) {
|
if (key->cert->serial == 0) {
|
||||||
return ssh_krl_revoke_cert_by_key_id(krl,
|
return ssh_krl_revoke_cert_by_key_id(krl,
|
||||||
key->cert->signature_key,
|
key->cert->signature_key,
|
||||||
key->cert->key_id);
|
key->cert->key_id);
|
||||||
|
@ -1180,10 +1180,10 @@ is_cert_revoked(const struct sshkey *key, struct revoked_certs *rc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Legacy cert formats lack serial numbers. Zero serials numbers
|
* Zero serials numbers are ignored (it's the default when the
|
||||||
* are ignored (it's the default when the CA doesn't specify one).
|
* CA doesn't specify one).
|
||||||
*/
|
*/
|
||||||
if (sshkey_cert_is_legacy(key) || key->cert->serial == 0)
|
if (key->cert->serial == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
memset(&rs, 0, sizeof(rs));
|
memset(&rs, 0, sizeof(rs));
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: myproposal.h,v 1.44 2015/05/27 23:51:10 dtucker Exp $ */
|
/* $OpenBSD: myproposal.h,v 1.45 2015/07/03 03:43:18 djm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
||||||
|
@ -101,8 +101,6 @@
|
||||||
"ssh-ed25519-cert-v01@openssh.com," \
|
"ssh-ed25519-cert-v01@openssh.com," \
|
||||||
"ssh-rsa-cert-v01@openssh.com," \
|
"ssh-rsa-cert-v01@openssh.com," \
|
||||||
"ssh-dss-cert-v01@openssh.com," \
|
"ssh-dss-cert-v01@openssh.com," \
|
||||||
"ssh-rsa-cert-v00@openssh.com," \
|
|
||||||
"ssh-dss-cert-v00@openssh.com," \
|
|
||||||
HOSTKEY_ECDSA_METHODS \
|
HOSTKEY_ECDSA_METHODS \
|
||||||
"ssh-ed25519," \
|
"ssh-ed25519," \
|
||||||
"ssh-rsa," \
|
"ssh-rsa," \
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: ssh-add.c,v 1.122 2015/03/26 12:32:38 naddy Exp $ */
|
/* $OpenBSD: ssh-add.c,v 1.123 2015/07/03 03:43:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -302,8 +302,7 @@ add_file(int agent_fd, const char *filename, int key_only)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Graft with private bits */
|
/* Graft with private bits */
|
||||||
if ((r = sshkey_to_certified(private,
|
if ((r = sshkey_to_certified(private)) != 0) {
|
||||||
sshkey_cert_is_legacy(cert))) != 0) {
|
|
||||||
error("%s: sshkey_to_certified: %s", __func__, ssh_err(r));
|
error("%s: sshkey_to_certified: %s", __func__, ssh_err(r));
|
||||||
sshkey_free(cert);
|
sshkey_free(cert);
|
||||||
goto out;
|
goto out;
|
||||||
|
|
53
ssh-keygen.c
53
ssh-keygen.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: ssh-keygen.c,v 1.274 2015/05/28 07:37:31 djm Exp $ */
|
/* $OpenBSD: ssh-keygen.c,v 1.275 2015/07/03 03:43:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -239,7 +239,6 @@ ask_filename(struct passwd *pw, const char *prompt)
|
||||||
name = _PATH_SSH_CLIENT_IDENTITY;
|
name = _PATH_SSH_CLIENT_IDENTITY;
|
||||||
break;
|
break;
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
name = _PATH_SSH_CLIENT_ID_DSA;
|
name = _PATH_SSH_CLIENT_ID_DSA;
|
||||||
break;
|
break;
|
||||||
|
@ -250,7 +249,6 @@ ask_filename(struct passwd *pw, const char *prompt)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
name = _PATH_SSH_CLIENT_ID_RSA;
|
name = _PATH_SSH_CLIENT_ID_RSA;
|
||||||
break;
|
break;
|
||||||
|
@ -1575,25 +1573,6 @@ do_ca_sign(struct passwd *pw, int argc, char **argv)
|
||||||
struct sshkey *ca, *public;
|
struct sshkey *ca, *public;
|
||||||
char *otmp, *tmp, *cp, *out, *comment, **plist = NULL;
|
char *otmp, *tmp, *cp, *out, *comment, **plist = NULL;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
int v00 = 0; /* legacy keys */
|
|
||||||
|
|
||||||
if (key_type_name != NULL) {
|
|
||||||
switch (sshkey_type_from_name(key_type_name)) {
|
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
v00 = 1;
|
|
||||||
break;
|
|
||||||
case KEY_UNSPEC:
|
|
||||||
if (strcasecmp(key_type_name, "v00") == 0) {
|
|
||||||
v00 = 1;
|
|
||||||
break;
|
|
||||||
} else if (strcasecmp(key_type_name, "v01") == 0)
|
|
||||||
break;
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
|
||||||
fatal("unknown key type %s", key_type_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ENABLE_PKCS11
|
#ifdef ENABLE_PKCS11
|
||||||
pkcs11_init(1);
|
pkcs11_init(1);
|
||||||
|
@ -1630,7 +1609,7 @@ do_ca_sign(struct passwd *pw, int argc, char **argv)
|
||||||
__func__, tmp, sshkey_type(public));
|
__func__, tmp, sshkey_type(public));
|
||||||
|
|
||||||
/* Prepare certificate to sign */
|
/* Prepare certificate to sign */
|
||||||
if ((r = sshkey_to_certified(public, v00)) != 0)
|
if ((r = sshkey_to_certified(public)) != 0)
|
||||||
fatal("Could not upgrade key %s to certificate: %s",
|
fatal("Could not upgrade key %s to certificate: %s",
|
||||||
tmp, ssh_err(r));
|
tmp, ssh_err(r));
|
||||||
public->cert->type = cert_key_type;
|
public->cert->type = cert_key_type;
|
||||||
|
@ -1640,15 +1619,9 @@ do_ca_sign(struct passwd *pw, int argc, char **argv)
|
||||||
public->cert->principals = plist;
|
public->cert->principals = plist;
|
||||||
public->cert->valid_after = cert_valid_from;
|
public->cert->valid_after = cert_valid_from;
|
||||||
public->cert->valid_before = cert_valid_to;
|
public->cert->valid_before = cert_valid_to;
|
||||||
if (v00) {
|
prepare_options_buf(public->cert->critical, OPTIONS_CRITICAL);
|
||||||
prepare_options_buf(public->cert->critical,
|
|
||||||
OPTIONS_CRITICAL|OPTIONS_EXTENSIONS);
|
|
||||||
} else {
|
|
||||||
prepare_options_buf(public->cert->critical,
|
|
||||||
OPTIONS_CRITICAL);
|
|
||||||
prepare_options_buf(public->cert->extensions,
|
prepare_options_buf(public->cert->extensions,
|
||||||
OPTIONS_EXTENSIONS);
|
OPTIONS_EXTENSIONS);
|
||||||
}
|
|
||||||
if ((r = sshkey_from_private(ca,
|
if ((r = sshkey_from_private(ca,
|
||||||
&public->cert->signature_key)) != 0)
|
&public->cert->signature_key)) != 0)
|
||||||
fatal("key_from_private (ca key): %s", ssh_err(r));
|
fatal("key_from_private (ca key): %s", ssh_err(r));
|
||||||
|
@ -1833,7 +1806,7 @@ add_cert_option(char *opt)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_options(struct sshbuf *optbuf, int v00, int in_critical)
|
show_options(struct sshbuf *optbuf, int in_critical)
|
||||||
{
|
{
|
||||||
char *name, *arg;
|
char *name, *arg;
|
||||||
struct sshbuf *options, *option = NULL;
|
struct sshbuf *options, *option = NULL;
|
||||||
|
@ -1848,14 +1821,14 @@ show_options(struct sshbuf *optbuf, int v00, int in_critical)
|
||||||
(r = sshbuf_froms(options, &option)) != 0)
|
(r = sshbuf_froms(options, &option)) != 0)
|
||||||
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
fatal("%s: buffer error: %s", __func__, ssh_err(r));
|
||||||
printf(" %s", name);
|
printf(" %s", name);
|
||||||
if ((v00 || !in_critical) &&
|
if (!in_critical &&
|
||||||
(strcmp(name, "permit-X11-forwarding") == 0 ||
|
(strcmp(name, "permit-X11-forwarding") == 0 ||
|
||||||
strcmp(name, "permit-agent-forwarding") == 0 ||
|
strcmp(name, "permit-agent-forwarding") == 0 ||
|
||||||
strcmp(name, "permit-port-forwarding") == 0 ||
|
strcmp(name, "permit-port-forwarding") == 0 ||
|
||||||
strcmp(name, "permit-pty") == 0 ||
|
strcmp(name, "permit-pty") == 0 ||
|
||||||
strcmp(name, "permit-user-rc") == 0))
|
strcmp(name, "permit-user-rc") == 0))
|
||||||
printf("\n");
|
printf("\n");
|
||||||
else if ((v00 || in_critical) &&
|
else if (in_critical &&
|
||||||
(strcmp(name, "force-command") == 0 ||
|
(strcmp(name, "force-command") == 0 ||
|
||||||
strcmp(name, "source-address") == 0)) {
|
strcmp(name, "source-address") == 0)) {
|
||||||
if ((r = sshbuf_get_cstring(option, &arg, NULL)) != 0)
|
if ((r = sshbuf_get_cstring(option, &arg, NULL)) != 0)
|
||||||
|
@ -1882,7 +1855,7 @@ do_show_cert(struct passwd *pw)
|
||||||
struct sshkey *key;
|
struct sshkey *key;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char *key_fp, *ca_fp;
|
char *key_fp, *ca_fp;
|
||||||
u_int i, v00;
|
u_int i;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (!have_identity)
|
if (!have_identity)
|
||||||
|
@ -1894,7 +1867,6 @@ do_show_cert(struct passwd *pw)
|
||||||
identity_file, ssh_err(r));
|
identity_file, ssh_err(r));
|
||||||
if (!sshkey_is_cert(key))
|
if (!sshkey_is_cert(key))
|
||||||
fatal("%s is not a certificate", identity_file);
|
fatal("%s is not a certificate", identity_file);
|
||||||
v00 = key->type == KEY_RSA_CERT_V00 || key->type == KEY_DSA_CERT_V00;
|
|
||||||
|
|
||||||
key_fp = sshkey_fingerprint(key, fingerprint_hash, SSH_FP_DEFAULT);
|
key_fp = sshkey_fingerprint(key, fingerprint_hash, SSH_FP_DEFAULT);
|
||||||
ca_fp = sshkey_fingerprint(key->cert->signature_key,
|
ca_fp = sshkey_fingerprint(key->cert->signature_key,
|
||||||
|
@ -1909,10 +1881,7 @@ do_show_cert(struct passwd *pw)
|
||||||
printf(" Signing CA: %s %s\n",
|
printf(" Signing CA: %s %s\n",
|
||||||
sshkey_type(key->cert->signature_key), ca_fp);
|
sshkey_type(key->cert->signature_key), ca_fp);
|
||||||
printf(" Key ID: \"%s\"\n", key->cert->key_id);
|
printf(" Key ID: \"%s\"\n", key->cert->key_id);
|
||||||
if (!v00) {
|
printf(" Serial: %llu\n", (unsigned long long)key->cert->serial);
|
||||||
printf(" Serial: %llu\n",
|
|
||||||
(unsigned long long)key->cert->serial);
|
|
||||||
}
|
|
||||||
printf(" Valid: %s\n",
|
printf(" Valid: %s\n",
|
||||||
fmt_validity(key->cert->valid_after, key->cert->valid_before));
|
fmt_validity(key->cert->valid_after, key->cert->valid_before));
|
||||||
printf(" Principals: ");
|
printf(" Principals: ");
|
||||||
|
@ -1929,16 +1898,14 @@ do_show_cert(struct passwd *pw)
|
||||||
printf("(none)\n");
|
printf("(none)\n");
|
||||||
else {
|
else {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
show_options(key->cert->critical, v00, 1);
|
show_options(key->cert->critical, 1);
|
||||||
}
|
}
|
||||||
if (!v00) {
|
|
||||||
printf(" Extensions: ");
|
printf(" Extensions: ");
|
||||||
if (sshbuf_len(key->cert->extensions) == 0)
|
if (sshbuf_len(key->cert->extensions) == 0)
|
||||||
printf("(none)\n");
|
printf("(none)\n");
|
||||||
else {
|
else {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
show_options(key->cert->extensions, v00, 0);
|
show_options(key->cert->extensions, 0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
6
sshd.c
6
sshd.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: sshd.c,v 1.450 2015/05/24 23:39:16 djm Exp $ */
|
/* $OpenBSD: sshd.c,v 1.451 2015/07/03 03:43:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -815,8 +815,6 @@ list_hostkey_types(void)
|
||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
continue;
|
continue;
|
||||||
switch (key->type) {
|
switch (key->type) {
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_ECDSA_CERT:
|
case KEY_ECDSA_CERT:
|
||||||
|
@ -843,8 +841,6 @@ get_hostkey_by_type(int type, int nid, int need_private, struct ssh *ssh)
|
||||||
|
|
||||||
for (i = 0; i < options.num_host_key_files; i++) {
|
for (i = 0; i < options.num_host_key_files; i++) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_ECDSA_CERT:
|
case KEY_ECDSA_CERT:
|
||||||
|
|
104
sshkey.c
104
sshkey.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: sshkey.c,v 1.19 2015/05/21 04:55:51 djm Exp $ */
|
/* $OpenBSD: sshkey.c,v 1.20 2015/07/03 03:43:18 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||||
* Copyright (c) 2008 Alexander von Gernler. All rights reserved.
|
* Copyright (c) 2008 Alexander von Gernler. All rights reserved.
|
||||||
|
@ -111,10 +111,6 @@ static const struct keytype keytypes[] = {
|
||||||
KEY_ECDSA_CERT, NID_secp521r1, 1 },
|
KEY_ECDSA_CERT, NID_secp521r1, 1 },
|
||||||
# endif /* OPENSSL_HAS_NISTP521 */
|
# endif /* OPENSSL_HAS_NISTP521 */
|
||||||
# endif /* OPENSSL_HAS_ECC */
|
# endif /* OPENSSL_HAS_ECC */
|
||||||
{ "ssh-rsa-cert-v00@openssh.com", "RSA-CERT-V00",
|
|
||||||
KEY_RSA_CERT_V00, 0, 1 },
|
|
||||||
{ "ssh-dss-cert-v00@openssh.com", "DSA-CERT-V00",
|
|
||||||
KEY_DSA_CERT_V00, 0, 1 },
|
|
||||||
#endif /* WITH_OPENSSL */
|
#endif /* WITH_OPENSSL */
|
||||||
{ NULL, NULL, -1, -1, 0 }
|
{ NULL, NULL, -1, -1, 0 }
|
||||||
};
|
};
|
||||||
|
@ -272,11 +268,9 @@ sshkey_size(const struct sshkey *k)
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_RSA1:
|
case KEY_RSA1:
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
return BN_num_bits(k->rsa->n);
|
return BN_num_bits(k->rsa->n);
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
return BN_num_bits(k->dsa->p);
|
return BN_num_bits(k->dsa->p);
|
||||||
case KEY_ECDSA:
|
case KEY_ECDSA:
|
||||||
|
@ -290,18 +284,6 @@ sshkey_size(const struct sshkey *k)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
sshkey_cert_is_legacy(const struct sshkey *k)
|
|
||||||
{
|
|
||||||
switch (k->type) {
|
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
return 1;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sshkey_type_is_valid_ca(int type)
|
sshkey_type_is_valid_ca(int type)
|
||||||
{
|
{
|
||||||
|
@ -329,10 +311,8 @@ int
|
||||||
sshkey_type_plain(int type)
|
sshkey_type_plain(int type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
return KEY_RSA;
|
return KEY_RSA;
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
return KEY_DSA;
|
return KEY_DSA;
|
||||||
case KEY_ECDSA_CERT:
|
case KEY_ECDSA_CERT:
|
||||||
|
@ -497,7 +477,6 @@ sshkey_new(int type)
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_RSA1:
|
case KEY_RSA1:
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
if ((rsa = RSA_new()) == NULL ||
|
if ((rsa = RSA_new()) == NULL ||
|
||||||
(rsa->n = BN_new()) == NULL ||
|
(rsa->n = BN_new()) == NULL ||
|
||||||
|
@ -510,7 +489,6 @@ sshkey_new(int type)
|
||||||
k->rsa = rsa;
|
k->rsa = rsa;
|
||||||
break;
|
break;
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
if ((dsa = DSA_new()) == NULL ||
|
if ((dsa = DSA_new()) == NULL ||
|
||||||
(dsa->p = BN_new()) == NULL ||
|
(dsa->p = BN_new()) == NULL ||
|
||||||
|
@ -558,7 +536,6 @@ sshkey_add_private(struct sshkey *k)
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_RSA1:
|
case KEY_RSA1:
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
#define bn_maybe_alloc_failed(p) (p == NULL && (p = BN_new()) == NULL)
|
#define bn_maybe_alloc_failed(p) (p == NULL && (p = BN_new()) == NULL)
|
||||||
if (bn_maybe_alloc_failed(k->rsa->d) ||
|
if (bn_maybe_alloc_failed(k->rsa->d) ||
|
||||||
|
@ -570,7 +547,6 @@ sshkey_add_private(struct sshkey *k)
|
||||||
return SSH_ERR_ALLOC_FAIL;
|
return SSH_ERR_ALLOC_FAIL;
|
||||||
break;
|
break;
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
if (bn_maybe_alloc_failed(k->dsa->priv_key))
|
if (bn_maybe_alloc_failed(k->dsa->priv_key))
|
||||||
return SSH_ERR_ALLOC_FAIL;
|
return SSH_ERR_ALLOC_FAIL;
|
||||||
|
@ -616,14 +592,12 @@ sshkey_free(struct sshkey *k)
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_RSA1:
|
case KEY_RSA1:
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
if (k->rsa != NULL)
|
if (k->rsa != NULL)
|
||||||
RSA_free(k->rsa);
|
RSA_free(k->rsa);
|
||||||
k->rsa = NULL;
|
k->rsa = NULL;
|
||||||
break;
|
break;
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
if (k->dsa != NULL)
|
if (k->dsa != NULL)
|
||||||
DSA_free(k->dsa);
|
DSA_free(k->dsa);
|
||||||
|
@ -695,13 +669,11 @@ sshkey_equal_public(const struct sshkey *a, const struct sshkey *b)
|
||||||
switch (a->type) {
|
switch (a->type) {
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_RSA1:
|
case KEY_RSA1:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
return a->rsa != NULL && b->rsa != NULL &&
|
return a->rsa != NULL && b->rsa != NULL &&
|
||||||
BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
|
BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
|
||||||
BN_cmp(a->rsa->n, b->rsa->n) == 0;
|
BN_cmp(a->rsa->n, b->rsa->n) == 0;
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
return a->dsa != NULL && b->dsa != NULL &&
|
return a->dsa != NULL && b->dsa != NULL &&
|
||||||
|
@ -772,8 +744,6 @@ to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain)
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_ECDSA_CERT:
|
case KEY_ECDSA_CERT:
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
|
@ -1297,8 +1267,6 @@ sshkey_read(struct sshkey *ret, char **cpp)
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
case KEY_ECDSA:
|
case KEY_ECDSA:
|
||||||
case KEY_ED25519:
|
case KEY_ED25519:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_ECDSA_CERT:
|
case KEY_ECDSA_CERT:
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
|
@ -1797,7 +1765,6 @@ sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
|
||||||
switch (k->type) {
|
switch (k->type) {
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
if ((n = sshkey_new(k->type)) == NULL)
|
if ((n = sshkey_new(k->type)) == NULL)
|
||||||
return SSH_ERR_ALLOC_FAIL;
|
return SSH_ERR_ALLOC_FAIL;
|
||||||
|
@ -1829,7 +1796,6 @@ sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
|
||||||
# endif /* OPENSSL_HAS_ECC */
|
# endif /* OPENSSL_HAS_ECC */
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
case KEY_RSA1:
|
case KEY_RSA1:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
if ((n = sshkey_new(k->type)) == NULL)
|
if ((n = sshkey_new(k->type)) == NULL)
|
||||||
return SSH_ERR_ALLOC_FAIL;
|
return SSH_ERR_ALLOC_FAIL;
|
||||||
|
@ -1873,21 +1839,20 @@ cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
|
||||||
u_char *sig = NULL;
|
u_char *sig = NULL;
|
||||||
size_t signed_len = 0, slen = 0, kidlen = 0;
|
size_t signed_len = 0, slen = 0, kidlen = 0;
|
||||||
int ret = SSH_ERR_INTERNAL_ERROR;
|
int ret = SSH_ERR_INTERNAL_ERROR;
|
||||||
int v00 = sshkey_cert_is_legacy(key);
|
|
||||||
|
|
||||||
/* Copy the entire key blob for verification and later serialisation */
|
/* Copy the entire key blob for verification and later serialisation */
|
||||||
if ((ret = sshbuf_putb(key->cert->certblob, certbuf)) != 0)
|
if ((ret = sshbuf_putb(key->cert->certblob, certbuf)) != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if ((!v00 && (ret = sshbuf_get_u64(b, &key->cert->serial)) != 0) ||
|
/* Parse body of certificate up to signature */
|
||||||
|
if ((ret = sshbuf_get_u64(b, &key->cert->serial)) != 0 ||
|
||||||
(ret = sshbuf_get_u32(b, &key->cert->type)) != 0 ||
|
(ret = sshbuf_get_u32(b, &key->cert->type)) != 0 ||
|
||||||
(ret = sshbuf_get_cstring(b, &key->cert->key_id, &kidlen)) != 0 ||
|
(ret = sshbuf_get_cstring(b, &key->cert->key_id, &kidlen)) != 0 ||
|
||||||
(ret = sshbuf_froms(b, &principals)) != 0 ||
|
(ret = sshbuf_froms(b, &principals)) != 0 ||
|
||||||
(ret = sshbuf_get_u64(b, &key->cert->valid_after)) != 0 ||
|
(ret = sshbuf_get_u64(b, &key->cert->valid_after)) != 0 ||
|
||||||
(ret = sshbuf_get_u64(b, &key->cert->valid_before)) != 0 ||
|
(ret = sshbuf_get_u64(b, &key->cert->valid_before)) != 0 ||
|
||||||
(ret = sshbuf_froms(b, &crit)) != 0 ||
|
(ret = sshbuf_froms(b, &crit)) != 0 ||
|
||||||
(!v00 && (ret = sshbuf_froms(b, &exts)) != 0) ||
|
(ret = sshbuf_froms(b, &exts)) != 0 ||
|
||||||
(v00 && (ret = sshbuf_get_string_direct(b, NULL, NULL)) != 0) ||
|
|
||||||
(ret = sshbuf_get_string_direct(b, NULL, NULL)) != 0 ||
|
(ret = sshbuf_get_string_direct(b, NULL, NULL)) != 0 ||
|
||||||
(ret = sshbuf_froms(b, &ca)) != 0) {
|
(ret = sshbuf_froms(b, &ca)) != 0) {
|
||||||
/* XXX debug print error for ret */
|
/* XXX debug print error for ret */
|
||||||
|
@ -1924,9 +1889,8 @@ cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
oprincipals = key->cert->principals;
|
oprincipals = key->cert->principals;
|
||||||
key->cert->principals = realloc(key->cert->principals,
|
key->cert->principals = reallocarray(key->cert->principals,
|
||||||
(key->cert->nprincipals + 1) *
|
key->cert->nprincipals + 1, sizeof(*key->cert->principals));
|
||||||
sizeof(*key->cert->principals));
|
|
||||||
if (key->cert->principals == NULL) {
|
if (key->cert->principals == NULL) {
|
||||||
free(principal);
|
free(principal);
|
||||||
key->cert->principals = oprincipals;
|
key->cert->principals = oprincipals;
|
||||||
|
@ -1947,7 +1911,6 @@ cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validate critical options and extensions sections format.
|
* Validate critical options and extensions sections format.
|
||||||
* NB. extensions are not present in v00 certs.
|
|
||||||
*/
|
*/
|
||||||
while (sshbuf_len(crit) != 0) {
|
while (sshbuf_len(crit) != 0) {
|
||||||
if ((ret = sshbuf_get_string_direct(crit, NULL, NULL)) != 0 ||
|
if ((ret = sshbuf_get_string_direct(crit, NULL, NULL)) != 0 ||
|
||||||
|
@ -2032,7 +1995,6 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
|
||||||
}
|
}
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
if ((key = sshkey_new(type)) == NULL) {
|
if ((key = sshkey_new(type)) == NULL) {
|
||||||
ret = SSH_ERR_ALLOC_FAIL;
|
ret = SSH_ERR_ALLOC_FAIL;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2054,7 +2016,6 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
|
||||||
}
|
}
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
if ((key = sshkey_new(type)) == NULL) {
|
if ((key = sshkey_new(type)) == NULL) {
|
||||||
ret = SSH_ERR_ALLOC_FAIL;
|
ret = SSH_ERR_ALLOC_FAIL;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2224,7 +2185,6 @@ sshkey_sign(const struct sshkey *key,
|
||||||
return SSH_ERR_INVALID_ARGUMENT;
|
return SSH_ERR_INVALID_ARGUMENT;
|
||||||
switch (key->type) {
|
switch (key->type) {
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
return ssh_dss_sign(key, sigp, lenp, data, datalen, compat);
|
return ssh_dss_sign(key, sigp, lenp, data, datalen, compat);
|
||||||
|
@ -2233,7 +2193,6 @@ sshkey_sign(const struct sshkey *key,
|
||||||
case KEY_ECDSA:
|
case KEY_ECDSA:
|
||||||
return ssh_ecdsa_sign(key, sigp, lenp, data, datalen, compat);
|
return ssh_ecdsa_sign(key, sigp, lenp, data, datalen, compat);
|
||||||
# endif /* OPENSSL_HAS_ECC */
|
# endif /* OPENSSL_HAS_ECC */
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
return ssh_rsa_sign(key, sigp, lenp, data, datalen, compat);
|
return ssh_rsa_sign(key, sigp, lenp, data, datalen, compat);
|
||||||
|
@ -2258,7 +2217,6 @@ sshkey_verify(const struct sshkey *key,
|
||||||
return SSH_ERR_INVALID_ARGUMENT;
|
return SSH_ERR_INVALID_ARGUMENT;
|
||||||
switch (key->type) {
|
switch (key->type) {
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
return ssh_dss_verify(key, sig, siglen, data, dlen, compat);
|
return ssh_dss_verify(key, sig, siglen, data, dlen, compat);
|
||||||
|
@ -2267,7 +2225,6 @@ sshkey_verify(const struct sshkey *key,
|
||||||
case KEY_ECDSA:
|
case KEY_ECDSA:
|
||||||
return ssh_ecdsa_verify(key, sig, siglen, data, dlen, compat);
|
return ssh_ecdsa_verify(key, sig, siglen, data, dlen, compat);
|
||||||
# endif /* OPENSSL_HAS_ECC */
|
# endif /* OPENSSL_HAS_ECC */
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
return ssh_rsa_verify(key, sig, siglen, data, dlen, compat);
|
return ssh_rsa_verify(key, sig, siglen, data, dlen, compat);
|
||||||
|
@ -2303,7 +2260,6 @@ sshkey_demote(const struct sshkey *k, struct sshkey **dkp)
|
||||||
|
|
||||||
switch (k->type) {
|
switch (k->type) {
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
if ((ret = sshkey_cert_copy(k, pk)) != 0)
|
if ((ret = sshkey_cert_copy(k, pk)) != 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -2317,7 +2273,6 @@ sshkey_demote(const struct sshkey *k, struct sshkey **dkp)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
if ((ret = sshkey_cert_copy(k, pk)) != 0)
|
if ((ret = sshkey_cert_copy(k, pk)) != 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -2376,27 +2331,23 @@ sshkey_demote(const struct sshkey *k, struct sshkey **dkp)
|
||||||
|
|
||||||
/* Convert a plain key to their _CERT equivalent */
|
/* Convert a plain key to their _CERT equivalent */
|
||||||
int
|
int
|
||||||
sshkey_to_certified(struct sshkey *k, int legacy)
|
sshkey_to_certified(struct sshkey *k)
|
||||||
{
|
{
|
||||||
int newtype;
|
int newtype;
|
||||||
|
|
||||||
switch (k->type) {
|
switch (k->type) {
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
newtype = legacy ? KEY_RSA_CERT_V00 : KEY_RSA_CERT;
|
newtype = KEY_RSA_CERT;
|
||||||
break;
|
break;
|
||||||
case KEY_DSA:
|
case KEY_DSA:
|
||||||
newtype = legacy ? KEY_DSA_CERT_V00 : KEY_DSA_CERT;
|
newtype = KEY_DSA_CERT;
|
||||||
break;
|
break;
|
||||||
case KEY_ECDSA:
|
case KEY_ECDSA:
|
||||||
if (legacy)
|
|
||||||
return SSH_ERR_INVALID_ARGUMENT;
|
|
||||||
newtype = KEY_ECDSA_CERT;
|
newtype = KEY_ECDSA_CERT;
|
||||||
break;
|
break;
|
||||||
#endif /* WITH_OPENSSL */
|
#endif /* WITH_OPENSSL */
|
||||||
case KEY_ED25519:
|
case KEY_ED25519:
|
||||||
if (legacy)
|
|
||||||
return SSH_ERR_INVALID_ARGUMENT;
|
|
||||||
newtype = KEY_ED25519_CERT;
|
newtype = KEY_ED25519_CERT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2448,15 +2399,12 @@ sshkey_certify(struct sshkey *k, struct sshkey *ca)
|
||||||
|
|
||||||
/* -v01 certs put nonce first */
|
/* -v01 certs put nonce first */
|
||||||
arc4random_buf(&nonce, sizeof(nonce));
|
arc4random_buf(&nonce, sizeof(nonce));
|
||||||
if (!sshkey_cert_is_legacy(k)) {
|
|
||||||
if ((ret = sshbuf_put_string(cert, nonce, sizeof(nonce))) != 0)
|
if ((ret = sshbuf_put_string(cert, nonce, sizeof(nonce))) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX this substantially duplicates to_blob(); refactor */
|
/* XXX this substantially duplicates to_blob(); refactor */
|
||||||
switch (k->type) {
|
switch (k->type) {
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
if ((ret = sshbuf_put_bignum2(cert, k->dsa->p)) != 0 ||
|
if ((ret = sshbuf_put_bignum2(cert, k->dsa->p)) != 0 ||
|
||||||
(ret = sshbuf_put_bignum2(cert, k->dsa->q)) != 0 ||
|
(ret = sshbuf_put_bignum2(cert, k->dsa->q)) != 0 ||
|
||||||
|
@ -2474,7 +2422,6 @@ sshkey_certify(struct sshkey *k, struct sshkey *ca)
|
||||||
goto out;
|
goto out;
|
||||||
break;
|
break;
|
||||||
# endif /* OPENSSL_HAS_ECC */
|
# endif /* OPENSSL_HAS_ECC */
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
if ((ret = sshbuf_put_bignum2(cert, k->rsa->e)) != 0 ||
|
if ((ret = sshbuf_put_bignum2(cert, k->rsa->e)) != 0 ||
|
||||||
(ret = sshbuf_put_bignum2(cert, k->rsa->n)) != 0)
|
(ret = sshbuf_put_bignum2(cert, k->rsa->n)) != 0)
|
||||||
|
@ -2491,13 +2438,8 @@ sshkey_certify(struct sshkey *k, struct sshkey *ca)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -v01 certs have a serial number next */
|
if ((ret = sshbuf_put_u64(cert, k->cert->serial)) != 0 ||
|
||||||
if (!sshkey_cert_is_legacy(k)) {
|
(ret = sshbuf_put_u32(cert, k->cert->type)) != 0 ||
|
||||||
if ((ret = sshbuf_put_u64(cert, k->cert->serial)) != 0)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = sshbuf_put_u32(cert, k->cert->type)) != 0 ||
|
|
||||||
(ret = sshbuf_put_cstring(cert, k->cert->key_id)) != 0)
|
(ret = sshbuf_put_cstring(cert, k->cert->key_id)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -2513,22 +2455,9 @@ sshkey_certify(struct sshkey *k, struct sshkey *ca)
|
||||||
if ((ret = sshbuf_put_stringb(cert, principals)) != 0 ||
|
if ((ret = sshbuf_put_stringb(cert, principals)) != 0 ||
|
||||||
(ret = sshbuf_put_u64(cert, k->cert->valid_after)) != 0 ||
|
(ret = sshbuf_put_u64(cert, k->cert->valid_after)) != 0 ||
|
||||||
(ret = sshbuf_put_u64(cert, k->cert->valid_before)) != 0 ||
|
(ret = sshbuf_put_u64(cert, k->cert->valid_before)) != 0 ||
|
||||||
(ret = sshbuf_put_stringb(cert, k->cert->critical)) != 0)
|
(ret = sshbuf_put_stringb(cert, k->cert->critical)) != 0 ||
|
||||||
goto out;
|
(ret = sshbuf_put_stringb(cert, k->cert->extensions)) != 0 ||
|
||||||
|
(ret = sshbuf_put_string(cert, NULL, 0)) != 0 || /* Reserved */
|
||||||
/* -v01 certs have non-critical options here */
|
|
||||||
if (!sshkey_cert_is_legacy(k)) {
|
|
||||||
if ((ret = sshbuf_put_stringb(cert, k->cert->extensions)) != 0)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -v00 certs put the nonce at the end */
|
|
||||||
if (sshkey_cert_is_legacy(k)) {
|
|
||||||
if ((ret = sshbuf_put_string(cert, nonce, sizeof(nonce))) != 0)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = sshbuf_put_string(cert, NULL, 0)) != 0 || /* Reserved */
|
|
||||||
(ret = sshbuf_put_string(cert, ca_blob, ca_len)) != 0)
|
(ret = sshbuf_put_string(cert, ca_blob, ca_len)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -2628,7 +2557,6 @@ sshkey_private_serialize(const struct sshkey *key, struct sshbuf *b)
|
||||||
(r = sshbuf_put_bignum2(b, key->rsa->q)) != 0)
|
(r = sshbuf_put_bignum2(b, key->rsa->q)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
break;
|
break;
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
|
if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
|
||||||
r = SSH_ERR_INVALID_ARGUMENT;
|
r = SSH_ERR_INVALID_ARGUMENT;
|
||||||
|
@ -2649,7 +2577,6 @@ sshkey_private_serialize(const struct sshkey *key, struct sshbuf *b)
|
||||||
(r = sshbuf_put_bignum2(b, key->dsa->priv_key)) != 0)
|
(r = sshbuf_put_bignum2(b, key->dsa->priv_key)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
break;
|
break;
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
|
if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
|
||||||
r = SSH_ERR_INVALID_ARGUMENT;
|
r = SSH_ERR_INVALID_ARGUMENT;
|
||||||
|
@ -2740,7 +2667,6 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
|
||||||
(r = sshbuf_get_bignum2(buf, k->dsa->priv_key)) != 0)
|
(r = sshbuf_get_bignum2(buf, k->dsa->priv_key)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
break;
|
break;
|
||||||
case KEY_DSA_CERT_V00:
|
|
||||||
case KEY_DSA_CERT:
|
case KEY_DSA_CERT:
|
||||||
if ((r = sshkey_froms(buf, &k)) != 0 ||
|
if ((r = sshkey_froms(buf, &k)) != 0 ||
|
||||||
(r = sshkey_add_private(k)) != 0 ||
|
(r = sshkey_add_private(k)) != 0 ||
|
||||||
|
@ -2813,7 +2739,6 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
|
||||||
(r = rsa_generate_additional_parameters(k->rsa)) != 0)
|
(r = rsa_generate_additional_parameters(k->rsa)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
break;
|
break;
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
if ((r = sshkey_froms(buf, &k)) != 0 ||
|
if ((r = sshkey_froms(buf, &k)) != 0 ||
|
||||||
(r = sshkey_add_private(k)) != 0 ||
|
(r = sshkey_add_private(k)) != 0 ||
|
||||||
|
@ -2863,7 +2788,6 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
|
||||||
/* enable blinding */
|
/* enable blinding */
|
||||||
switch (k->type) {
|
switch (k->type) {
|
||||||
case KEY_RSA:
|
case KEY_RSA:
|
||||||
case KEY_RSA_CERT_V00:
|
|
||||||
case KEY_RSA_CERT:
|
case KEY_RSA_CERT:
|
||||||
case KEY_RSA1:
|
case KEY_RSA1:
|
||||||
if (RSA_blinding_on(k->rsa, NULL) != 1) {
|
if (RSA_blinding_on(k->rsa, NULL) != 1) {
|
||||||
|
|
7
sshkey.h
7
sshkey.h
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: sshkey.h,v 1.6 2015/05/21 04:55:51 djm Exp $ */
|
/* $OpenBSD: sshkey.h,v 1.7 2015/07/03 03:43:18 djm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||||
|
@ -62,8 +62,6 @@ enum sshkey_types {
|
||||||
KEY_DSA_CERT,
|
KEY_DSA_CERT,
|
||||||
KEY_ECDSA_CERT,
|
KEY_ECDSA_CERT,
|
||||||
KEY_ED25519_CERT,
|
KEY_ED25519_CERT,
|
||||||
KEY_RSA_CERT_V00,
|
|
||||||
KEY_DSA_CERT_V00,
|
|
||||||
KEY_UNSPEC
|
KEY_UNSPEC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -137,13 +135,12 @@ int sshkey_type_from_name(const char *);
|
||||||
int sshkey_is_cert(const struct sshkey *);
|
int sshkey_is_cert(const struct sshkey *);
|
||||||
int sshkey_type_is_cert(int);
|
int sshkey_type_is_cert(int);
|
||||||
int sshkey_type_plain(int);
|
int sshkey_type_plain(int);
|
||||||
int sshkey_to_certified(struct sshkey *, int);
|
int sshkey_to_certified(struct sshkey *);
|
||||||
int sshkey_drop_cert(struct sshkey *);
|
int sshkey_drop_cert(struct sshkey *);
|
||||||
int sshkey_certify(struct sshkey *, struct sshkey *);
|
int sshkey_certify(struct sshkey *, struct sshkey *);
|
||||||
int sshkey_cert_copy(const struct sshkey *, struct sshkey *);
|
int sshkey_cert_copy(const struct sshkey *, struct sshkey *);
|
||||||
int sshkey_cert_check_authority(const struct sshkey *, int, int,
|
int sshkey_cert_check_authority(const struct sshkey *, int, int,
|
||||||
const char *, const char **);
|
const char *, const char **);
|
||||||
int sshkey_cert_is_legacy(const struct sshkey *);
|
|
||||||
|
|
||||||
int sshkey_ecdsa_nid_from_name(const char *);
|
int sshkey_ecdsa_nid_from_name(const char *);
|
||||||
int sshkey_curve_name_to_nid(const char *);
|
int sshkey_curve_name_to_nid(const char *);
|
||||||
|
|
Loading…
Reference in New Issue