pki: support ECDSA/ED25519 certificates
As with RSA/DSS, support is still quite limited. This is mostly about adding new ssh_keytypes_e values and updating sites that check keys' types. Signed-off-by: Ben Toews <mastahyeti@gmail.com> Reviewed-by: Jakub Jelen <jjelen@redhat.com>
Этот коммит содержится в:
родитель
b1f3cfec34
Коммит
19cd909c8d
@ -300,6 +300,10 @@ enum ssh_keytypes_e{
|
||||
SSH_KEYTYPE_ECDSA_P256,
|
||||
SSH_KEYTYPE_ECDSA_P384,
|
||||
SSH_KEYTYPE_ECDSA_P521,
|
||||
SSH_KEYTYPE_ECDSA_P256_CERT01,
|
||||
SSH_KEYTYPE_ECDSA_P384_CERT01,
|
||||
SSH_KEYTYPE_ECDSA_P521_CERT01,
|
||||
SSH_KEYTYPE_ED25519_CERT01,
|
||||
};
|
||||
|
||||
enum ssh_keycmp_e {
|
||||
|
@ -104,6 +104,12 @@ enum ssh_keytypes_e ssh_key_type_from_signature_name(const char *name);
|
||||
#define is_ecdsa_key_type(t) \
|
||||
((t) >= SSH_KEYTYPE_ECDSA_P256 && (t) <= SSH_KEYTYPE_ECDSA_P521)
|
||||
|
||||
#define is_cert_type(kt)\
|
||||
((kt) == SSH_KEYTYPE_DSS_CERT01 ||\
|
||||
(kt) == SSH_KEYTYPE_RSA_CERT01 ||\
|
||||
((kt) >= SSH_KEYTYPE_ECDSA_P256_CERT01 &&\
|
||||
(kt) <= SSH_KEYTYPE_ED25519_CERT01))
|
||||
|
||||
/* SSH Signature Functions */
|
||||
ssh_signature ssh_signature_new(void);
|
||||
void ssh_signature_free(ssh_signature sign);
|
||||
|
42
src/pki.c
42
src/pki.c
@ -190,7 +190,9 @@ void ssh_key_free (ssh_key key){
|
||||
* @returns one of SSH_KEYTYPE_RSA, SSH_KEYTYPE_DSS,
|
||||
* SSH_KEYTYPE_ECDSA_P256, SSH_KEYTYPE_ECDSA_P384,
|
||||
* SSH_KEYTYPE_ECDSA_P521, SSH_KEYTYPE_ED25519, SSH_KEYTYPE_DSS_CERT01,
|
||||
* or SSH_KEYTYPE_RSA_CERT01.
|
||||
* SSH_KEYTYPE_RSA_CERT01, SSH_KEYTYPE_ECDSA_P256_CERT01,
|
||||
* SSH_KEYTYPE_ECDSA_P384_CERT01, SSH_KEYTYPE_ECDSA_P521_CERT01, or
|
||||
* SSH_KEYTYPE_ED25519_CERT01.
|
||||
* @returns SSH_KEYTYPE_UNKNOWN if the type is unknown
|
||||
*/
|
||||
enum ssh_keytypes_e ssh_key_type(const ssh_key key){
|
||||
@ -258,6 +260,14 @@ const char *ssh_key_type_to_char(enum ssh_keytypes_e type) {
|
||||
return "ssh-dss-cert-v01@openssh.com";
|
||||
case SSH_KEYTYPE_RSA_CERT01:
|
||||
return "ssh-rsa-cert-v01@openssh.com";
|
||||
case SSH_KEYTYPE_ECDSA_P256_CERT01:
|
||||
return "ecdsa-sha2-nistp256-cert-v01@openssh.com";
|
||||
case SSH_KEYTYPE_ECDSA_P384_CERT01:
|
||||
return "ecdsa-sha2-nistp384-cert-v01@openssh.com";
|
||||
case SSH_KEYTYPE_ECDSA_P521_CERT01:
|
||||
return "ecdsa-sha2-nistp521-cert-v01@openssh.com";
|
||||
case SSH_KEYTYPE_ED25519_CERT01:
|
||||
return "ssh-ed25519-cert-v01@openssh.com";
|
||||
case SSH_KEYTYPE_RSA1:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
return NULL;
|
||||
@ -420,6 +430,14 @@ enum ssh_keytypes_e ssh_key_type_from_name(const char *name) {
|
||||
return SSH_KEYTYPE_DSS_CERT01;
|
||||
} else if (strcmp(name, "ssh-rsa-cert-v01@openssh.com") == 0) {
|
||||
return SSH_KEYTYPE_RSA_CERT01;
|
||||
} else if (strcmp(name, "ecdsa-sha2-nistp256-cert-v01@openssh.com") == 0) {
|
||||
return SSH_KEYTYPE_ECDSA_P256_CERT01;
|
||||
} else if (strcmp(name, "ecdsa-sha2-nistp384-cert-v01@openssh.com") == 0) {
|
||||
return SSH_KEYTYPE_ECDSA_P384_CERT01;
|
||||
} else if (strcmp(name, "ecdsa-sha2-nistp521-cert-v01@openssh.com") == 0) {
|
||||
return SSH_KEYTYPE_ECDSA_P521_CERT01;
|
||||
} else if (strcmp(name, "ssh-ed25519-cert-v01@openssh.com") == 0) {
|
||||
return SSH_KEYTYPE_ED25519_CERT01;
|
||||
}
|
||||
|
||||
return SSH_KEYTYPE_UNKNOWN;
|
||||
@ -546,6 +564,10 @@ void ssh_signature_free(ssh_signature sig)
|
||||
break;
|
||||
case SSH_KEYTYPE_DSS_CERT01:
|
||||
case SSH_KEYTYPE_RSA_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P256_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P384_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P521_CERT01:
|
||||
case SSH_KEYTYPE_ED25519_CERT01:
|
||||
case SSH_KEYTYPE_RSA1:
|
||||
case SSH_KEYTYPE_ECDSA:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
@ -1043,6 +1065,10 @@ int pki_import_privkey_buffer(enum ssh_keytypes_e type,
|
||||
break;
|
||||
case SSH_KEYTYPE_DSS_CERT01:
|
||||
case SSH_KEYTYPE_RSA_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P256_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P384_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P521_CERT01:
|
||||
case SSH_KEYTYPE_ED25519_CERT01:
|
||||
case SSH_KEYTYPE_RSA1:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
default:
|
||||
@ -1194,6 +1220,10 @@ static int pki_import_pubkey_buffer(ssh_buffer buffer,
|
||||
break;
|
||||
case SSH_KEYTYPE_DSS_CERT01:
|
||||
case SSH_KEYTYPE_RSA_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P256_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P384_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P521_CERT01:
|
||||
case SSH_KEYTYPE_ED25519_CERT01:
|
||||
case SSH_KEYTYPE_RSA1:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
default:
|
||||
@ -1298,8 +1328,7 @@ int ssh_pki_import_pubkey_base64(const char *b64_key,
|
||||
}
|
||||
ssh_string_free(type_s);
|
||||
|
||||
if (type == SSH_KEYTYPE_RSA_CERT01 ||
|
||||
type == SSH_KEYTYPE_DSS_CERT01) {
|
||||
if (is_cert_type(type)) {
|
||||
rc = pki_import_cert_buffer(buffer, type, pkey);
|
||||
} else {
|
||||
rc = pki_import_pubkey_buffer(buffer, type, pkey);
|
||||
@ -1361,8 +1390,7 @@ int ssh_pki_import_pubkey_blob(const ssh_string key_blob,
|
||||
}
|
||||
ssh_string_free(type_s);
|
||||
|
||||
if (type == SSH_KEYTYPE_RSA_CERT01 ||
|
||||
type == SSH_KEYTYPE_DSS_CERT01) {
|
||||
if (is_cert_type(type)) {
|
||||
rc = pki_import_cert_buffer(buffer, type, pkey);
|
||||
} else {
|
||||
rc = pki_import_pubkey_buffer(buffer, type, pkey);
|
||||
@ -1626,6 +1654,10 @@ int ssh_pki_generate(enum ssh_keytypes_e type, int parameter,
|
||||
break;
|
||||
case SSH_KEYTYPE_DSS_CERT01:
|
||||
case SSH_KEYTYPE_RSA_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P256_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P384_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P521_CERT01:
|
||||
case SSH_KEYTYPE_ED25519_CERT01:
|
||||
case SSH_KEYTYPE_RSA1:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
default:
|
||||
|
@ -809,6 +809,10 @@ ssh_string pki_private_key_to_pem(const ssh_key key,
|
||||
return NULL;
|
||||
case SSH_KEYTYPE_DSS_CERT01:
|
||||
case SSH_KEYTYPE_RSA_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P256_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P384_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P521_CERT01:
|
||||
case SSH_KEYTYPE_ED25519_CERT01:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
default:
|
||||
BIO_free(mem);
|
||||
@ -947,6 +951,10 @@ ssh_key pki_private_key_from_base64(const char *b64_key,
|
||||
case SSH_KEYTYPE_DSS_CERT01:
|
||||
case SSH_KEYTYPE_RSA_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA:
|
||||
case SSH_KEYTYPE_ECDSA_P256_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P384_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P521_CERT01:
|
||||
case SSH_KEYTYPE_ED25519_CERT01:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
BIO_free(mem);
|
||||
SSH_LOG(SSH_LOG_WARN, "Unknown or invalid private key type %d", type);
|
||||
|
@ -1526,6 +1526,10 @@ int pki_key_compare(const ssh_key k1,
|
||||
case SSH_KEYTYPE_DSS_CERT01:
|
||||
case SSH_KEYTYPE_RSA_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA:
|
||||
case SSH_KEYTYPE_ECDSA_P256_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P384_CERT01:
|
||||
case SSH_KEYTYPE_ECDSA_P521_CERT01:
|
||||
case SSH_KEYTYPE_ED25519_CERT01:
|
||||
case SSH_KEYTYPE_RSA1:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
return 1;
|
||||
|
@ -781,7 +781,7 @@ static int ssh_bind_setup_files(void **state)
|
||||
/* For ed25519 the test keys are not available in legacy PEM format. Using
|
||||
* the new OpenSSH format for all algorithms */
|
||||
torture_write_file(LIBSSH_RSA_TESTKEY,
|
||||
torture_get_openssh_testkey(SSH_KEYTYPE_RSA 0));
|
||||
torture_get_openssh_testkey(SSH_KEYTYPE_RSA, 0));
|
||||
|
||||
torture_write_file(LIBSSH_ED25519_TESTKEY,
|
||||
torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0));
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user