46 lines
1.3 KiB
Diff
46 lines
1.3 KiB
Diff
OpenSSL 1.1.0i has changed the behaviour of their PEM APIs,
|
|
so that empty passphrases are interpreted differently. This
|
|
probabalistically breaks loading some keys, because the PEM format
|
|
is terrible and doesn't include a proper MAC.
|
|
|
|
Avoid this by providing a basic callback to avoid passing empty
|
|
passphrases to OpenSSL in cases where one is required.
|
|
---
|
|
diff --git a/sshkey.c b/sshkey.c
|
|
index 5807627..c973910 100644
|
|
--- a/sshkey.c
|
|
+++ b/sshkey.c
|
|
@@ -4063,6 +4063,20 @@ convert_libcrypto_error(void)
|
|
return translate_libcrypto_error(ERR_peek_last_error());
|
|
}
|
|
|
|
+static int
|
|
+pem_passphrase_cb(char *buf, int size, int rwflag, void *u)
|
|
+{
|
|
+ char *p = (char *)u;
|
|
+ size_t len;
|
|
+
|
|
+ if (p == NULL || (len = strlen(p)) == 0)
|
|
+ return -1;
|
|
+ if (size < 0 || len > (size_t)size)
|
|
+ return -1;
|
|
+ memcpy(buf, p, len);
|
|
+ return (int)len;
|
|
+}
|
|
+
|
|
static int
|
|
sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
|
|
const char *passphrase, struct sshkey **keyp)
|
|
@@ -4084,7 +4098,7 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
|
|
}
|
|
|
|
clear_libcrypto_errors();
|
|
- if ((pk = PEM_read_bio_PrivateKey(bio, NULL, NULL,
|
|
+ if ((pk = PEM_read_bio_PrivateKey(bio, NULL, pem_passphrase_cb,
|
|
(char *)passphrase)) == NULL) {
|
|
r = convert_libcrypto_error();
|
|
goto out;
|
|
|
|
|
|
|