version 1.138, 2023/08/21 04:36:46 |
version 1.139, 2023/10/11 22:41:05 |
|
|
struct sshkey *prv = NULL; |
struct sshkey *prv = NULL; |
BIO *bio = NULL; |
BIO *bio = NULL; |
int r; |
int r; |
|
size_t len; |
|
|
if (keyp != NULL) |
if (keyp != NULL) |
*keyp = NULL; |
*keyp = NULL; |
|
|
if (prv != NULL && prv->ecdsa != NULL) |
if (prv != NULL && prv->ecdsa != NULL) |
sshkey_dump_ec_key(prv->ecdsa); |
sshkey_dump_ec_key(prv->ecdsa); |
#endif |
#endif |
|
} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_ED25519 && |
|
(type == KEY_UNSPEC || type == KEY_ED25519)) { |
|
if ((prv = sshkey_new(KEY_UNSPEC)) == NULL || |
|
(prv->ed25519_sk = calloc(1, ED25519_SK_SZ)) == NULL || |
|
(prv->ed25519_pk = calloc(1, ED25519_PK_SZ)) == NULL) { |
|
r = SSH_ERR_ALLOC_FAIL; |
|
goto out; |
|
} |
|
prv->type = KEY_ED25519; |
|
len = ED25519_PK_SZ; |
|
if (!EVP_PKEY_get_raw_public_key(pk, prv->ed25519_pk, &len)) { |
|
r = SSH_ERR_LIBCRYPTO_ERROR; |
|
goto out; |
|
} |
|
if (len != ED25519_PK_SZ) { |
|
r = SSH_ERR_INVALID_FORMAT; |
|
goto out; |
|
} |
|
len = ED25519_SK_SZ - ED25519_PK_SZ; |
|
if (!EVP_PKEY_get_raw_private_key(pk, prv->ed25519_sk, &len)) { |
|
r = SSH_ERR_LIBCRYPTO_ERROR; |
|
goto out; |
|
} |
|
if (len != ED25519_SK_SZ - ED25519_PK_SZ) { |
|
r = SSH_ERR_INVALID_FORMAT; |
|
goto out; |
|
} |
|
/* Append the public key to our private key */ |
|
memcpy(prv->ed25519_sk + (ED25519_SK_SZ - ED25519_PK_SZ), |
|
prv->ed25519_pk, ED25519_PK_SZ); |
|
#ifdef DEBUG_PK |
|
sshbuf_dump_data(prv->ed25519_sk, ED25519_SK_SZ, stderr); |
|
#endif |
} else { |
} else { |
r = SSH_ERR_INVALID_FORMAT; |
r = SSH_ERR_INVALID_FORMAT; |
goto out; |
goto out; |
|
|
*commentp = NULL; |
*commentp = NULL; |
|
|
switch (type) { |
switch (type) { |
case KEY_ED25519: |
|
case KEY_XMSS: |
case KEY_XMSS: |
/* No fallback for new-format-only keys */ |
/* No fallback for new-format-only keys */ |
return sshkey_parse_private2(blob, type, passphrase, |
return sshkey_parse_private2(blob, type, passphrase, |