diff options
-rw-r--r-- | sshkey.c | 16 |
1 files changed, 15 insertions, 1 deletions
@@ -3914,6 +3914,20 @@ convert_libcrypto_error(void) | |||
3914 | } | 3914 | } |
3915 | 3915 | ||
3916 | static int | 3916 | static int |
3917 | pem_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 | |||
3930 | static int | ||
3917 | sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, | 3931 | sshkey_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 |