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;