From bfe6fbbc43faaeea426a5bcf6b4138ccedd598c3 Mon Sep 17 00:00:00 2001 From: Christian Hohnstaedt Date: Sun, 22 Apr 2018 16:12:04 +0200 Subject: [PATCH] Close #24: Add LibreSSL support. Tested with LibreSSL 2.7.2 --- lib/openssl_compat.h | 4 +++- lib/pkcs11.cpp | 4 ++-- lib/pki_evp.cpp | 16 +++++++--------- lib/pki_temp.cpp | 5 ----- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/lib/openssl_compat.h b/lib/openssl_compat.h index d3c371ff..9e022359 100644 --- a/lib/openssl_compat.h +++ b/lib/openssl_compat.h @@ -14,6 +14,8 @@ #ifndef __OPENSS_COMPAT_XCA_H #define __OPENSS_COMPAT_XCA_H +#include + #if OPENSSL_VERSION_NUMBER < 0x10100000L #include #include @@ -75,7 +77,7 @@ RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q) } static inline void RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, - const BIGNUM **iqmp) + const BIGNUM **iqmp) { if (dmp1) *dmp1=r->dmp1; if (dmq1) *dmq1=r->dmq1; diff --git a/lib/pkcs11.cpp b/lib/pkcs11.cpp index 86d52134..8ca78f1e 100644 --- a/lib/pkcs11.cpp +++ b/lib/pkcs11.cpp @@ -660,8 +660,8 @@ int pkcs11::encrypt(int flen, const unsigned char *from, return size; } -#if OPENSSL_VERSION_NUMBER < 0x10000000L || \ - OPENSSL_VERSION_NUMBER >= 0x10100000L +#if OPENSSL_VERSION_NUMBER < 0x10000000L || \ + OPENSSL_VERSION_NUMBER >= 0x10100000L && ! defined LIBRESSL_VERSION_NUMBER static int rsa_privdata_free(RSA *rsa) { pkcs11 *priv = (pkcs11*)RSA_get_app_data(rsa); diff --git a/lib/pki_evp.cpp b/lib/pki_evp.cpp index 5d95dab7..d341c265 100644 --- a/lib/pki_evp.cpp +++ b/lib/pki_evp.cpp @@ -510,7 +510,8 @@ EVP_PKEY *pki_evp::legacyDecryptKey(QByteArray &myencKey, (const unsigned char*)myencKey.constData() +8, myencKey.count() -8); decsize = outl; - EVP_DecryptFinal(ctx, p + decsize , &outl); + EVP_DecryptFinal_ex(ctx, p + decsize , &outl); + EVP_CIPHER_CTX_cleanup(ctx); decsize += outl; pki_openssl_error(); tmpkey = d2i_PrivateKey(getKeyType(), NULL, &p1, decsize); @@ -721,27 +722,24 @@ void pki_evp::writeDefault(const QString fname) mycb, true); } -#if OPENSSL_VERSION_NUMBER < 0x10100000L +#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined LIBRESSL_VERSION_NUMBER int PEM_write_bio_PrivateKey_traditional(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, unsigned char *kstr, int klen, pem_password_cb *cb, void *u) { const char *t = ""; - char pem_str[80]; int keytype = EVP_PKEY_id(x); switch (keytype) { - case EVP_PKEY_RSA: t = "RSA"; break; - case EVP_PKEY_DSA: t = "DSA"; break; + case EVP_PKEY_RSA: t = "RSA PRIVATE KEY"; break; + case EVP_PKEY_DSA: t = "DSA PRIVATE KEY"; break; #ifndef OPENSSL_NO_EC - case EVP_PKEY_EC: t = "EC"; break; + case EVP_PKEY_EC: t = "EC PRIVATE KEY"; break; #endif } - - BIO_snprintf(pem_str, 80, "%s PRIVATE KEY", t); return PEM_ASN1_write_bio((i2d_of_void *)i2d_PrivateKey, - pem_str, bp, (char*)x, enc, kstr, klen, cb, u); + t, bp, (char*)x, enc, kstr, klen, cb, u); } #endif diff --git a/lib/pki_temp.cpp b/lib/pki_temp.cpp index 2e08d786..afb74f8e 100644 --- a/lib/pki_temp.cpp +++ b/lib/pki_temp.cpp @@ -399,13 +399,8 @@ BIO *pki_temp::pem(BIO *b, int format) QByteArray ba = toExportData(); if (!b) b = BIO_new(BIO_s_mem()); -#if OPENSSL_VERSION_NUMBER < 0x10002000L PEM_write_bio(b, PEM_STRING_XCA_TEMPLATE, (char*)"", (unsigned char*)(ba.data()), ba.size()); -#else - PEM_write_bio(b, PEM_STRING_XCA_TEMPLATE, "", - (const unsigned char*)(ba.constData()), ba.size()); -#endif pki_openssl_error(); return b; }