summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sshkey.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sshkey.c b/sshkey.c
index e1e882b72..4a656f846 100644
--- a/sshkey.c
+++ b/sshkey.c
@@ -3914,6 +3914,20 @@ convert_libcrypto_error(void)
3914} 3914}
3915 3915
3916static int 3916static int
3917pem_passphrase_cb(char *buf, int size, int rwflag, void *u)
3918{
3919 char *p = (char *)u;
3920 size_t len;
3921
3922 if (p == NULL || (len = strlen(p)) == 0)
3923 return -1;
3924 if (size < 0 || len > (size_t)size)
3925 return -1;
3926 memcpy(buf, p, len);
3927 return (int)len;
3928}
3929
3930static int
3917sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, 3931sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
3918 const char *passphrase, struct sshkey **keyp) 3932 const char *passphrase, struct sshkey **keyp)
3919{ 3933{
@@ -3934,7 +3948,7 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
3934 } 3948 }
3935 3949
3936 clear_libcrypto_errors(); 3950 clear_libcrypto_errors();
3937 if ((pk = PEM_read_bio_PrivateKey(bio, NULL, NULL, 3951 if ((pk = PEM_read_bio_PrivateKey(bio, NULL, pem_passphrase_cb,
3938 (char *)passphrase)) == NULL) { 3952 (char *)passphrase)) == NULL) {
3939 /* 3953 /*
3940 * libcrypto may return various ASN.1 errors when attempting 3954 * libcrypto may return various ASN.1 errors when attempting