version 1.7, 2014/12/21 22:27:55 |
version 1.8, 2015/01/08 10:14:08 |
|
|
#endif /* WITH_SSH1 */ |
#endif /* WITH_SSH1 */ |
|
|
#ifdef WITH_OPENSSL |
#ifdef WITH_OPENSSL |
/* XXX make private once ssh-keysign.c fixed */ |
static int |
int |
|
sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, |
sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, |
const char *passphrase, struct sshkey **keyp, char **commentp) |
const char *passphrase, struct sshkey **keyp) |
{ |
{ |
EVP_PKEY *pk = NULL; |
EVP_PKEY *pk = NULL; |
struct sshkey *prv = NULL; |
struct sshkey *prv = NULL; |
char *name = "<no key>"; |
|
BIO *bio = NULL; |
BIO *bio = NULL; |
int r; |
int r; |
|
|
*keyp = NULL; |
*keyp = NULL; |
if (commentp != NULL) |
|
*commentp = NULL; |
|
|
|
if ((bio = BIO_new(BIO_s_mem())) == NULL || sshbuf_len(blob) > INT_MAX) |
if ((bio = BIO_new(BIO_s_mem())) == NULL || sshbuf_len(blob) > INT_MAX) |
return SSH_ERR_ALLOC_FAIL; |
return SSH_ERR_ALLOC_FAIL; |
|
|
} |
} |
prv->rsa = EVP_PKEY_get1_RSA(pk); |
prv->rsa = EVP_PKEY_get1_RSA(pk); |
prv->type = KEY_RSA; |
prv->type = KEY_RSA; |
name = "rsa w/o comment"; |
|
#ifdef DEBUG_PK |
#ifdef DEBUG_PK |
RSA_print_fp(stderr, prv->rsa, 8); |
RSA_print_fp(stderr, prv->rsa, 8); |
#endif |
#endif |
|
|
} |
} |
prv->dsa = EVP_PKEY_get1_DSA(pk); |
prv->dsa = EVP_PKEY_get1_DSA(pk); |
prv->type = KEY_DSA; |
prv->type = KEY_DSA; |
name = "dsa w/o comment"; |
|
#ifdef DEBUG_PK |
#ifdef DEBUG_PK |
DSA_print_fp(stderr, prv->dsa, 8); |
DSA_print_fp(stderr, prv->dsa, 8); |
#endif |
#endif |
|
|
r = SSH_ERR_INVALID_FORMAT; |
r = SSH_ERR_INVALID_FORMAT; |
goto out; |
goto out; |
} |
} |
name = "ecdsa w/o comment"; |
|
#ifdef DEBUG_PK |
#ifdef DEBUG_PK |
if (prv != NULL && prv->ecdsa != NULL) |
if (prv != NULL && prv->ecdsa != NULL) |
sshkey_dump_ec_key(prv->ecdsa); |
sshkey_dump_ec_key(prv->ecdsa); |
|
|
r = SSH_ERR_INVALID_FORMAT; |
r = SSH_ERR_INVALID_FORMAT; |
goto out; |
goto out; |
} |
} |
if (commentp != NULL && |
|
(*commentp = strdup(name)) == NULL) { |
|
r = SSH_ERR_ALLOC_FAIL; |
|
goto out; |
|
} |
|
r = 0; |
r = 0; |
*keyp = prv; |
*keyp = prv; |
prv = NULL; |
prv = NULL; |
|
|
case KEY_DSA: |
case KEY_DSA: |
case KEY_ECDSA: |
case KEY_ECDSA: |
case KEY_RSA: |
case KEY_RSA: |
return sshkey_parse_private_pem_fileblob(blob, type, passphrase, |
return sshkey_parse_private_pem_fileblob(blob, type, |
keyp, commentp); |
passphrase, keyp); |
#endif /* WITH_OPENSSL */ |
#endif /* WITH_OPENSSL */ |
case KEY_ED25519: |
case KEY_ED25519: |
return sshkey_parse_private2(blob, type, passphrase, |
return sshkey_parse_private2(blob, type, passphrase, |
|
|
commentp)) == 0) |
commentp)) == 0) |
return 0; |
return 0; |
#ifdef WITH_OPENSSL |
#ifdef WITH_OPENSSL |
return sshkey_parse_private_pem_fileblob(blob, type, passphrase, |
return sshkey_parse_private_pem_fileblob(blob, type, |
keyp, commentp); |
passphrase, keyp); |
#else |
#else |
return SSH_ERR_INVALID_FORMAT; |
return SSH_ERR_INVALID_FORMAT; |
#endif /* WITH_OPENSSL */ |
#endif /* WITH_OPENSSL */ |