Add support for OpenSSL 3
This commit is contained in:
		@@ -3,6 +3,9 @@ TARGETS=acsmdownloader adept_activate adept_remove adept_loan_mgt
 | 
			
		||||
 | 
			
		||||
CXXFLAGS=-Wall -fPIC -I$(ROOT)/include -I$(ROOT)/lib/pugixml/src/
 | 
			
		||||
 | 
			
		||||
# OpenSSL 1.1.0 compat
 | 
			
		||||
CXXFLAGS += -DOPENSSL_API_COMPAT=0x10100000L
 | 
			
		||||
 | 
			
		||||
STATIC_DEP=
 | 
			
		||||
LDFLAGS=-L$(ROOT) -lcrypto -lzip -lz -lcurl
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,8 @@
 | 
			
		||||
#include <openssl/pkcs12.h>
 | 
			
		||||
#include <openssl/evp.h>
 | 
			
		||||
#include <openssl/err.h>
 | 
			
		||||
#include <openssl/rsa.h>
 | 
			
		||||
#include <openssl/bn.h>
 | 
			
		||||
 | 
			
		||||
#include <curl/curl.h>
 | 
			
		||||
 | 
			
		||||
@@ -45,6 +47,31 @@
 | 
			
		||||
#include <libgourou_log.h>
 | 
			
		||||
#include "drmprocessorclientimpl.h"
 | 
			
		||||
 | 
			
		||||
DRMProcessorClientImpl::DRMProcessorClientImpl():
 | 
			
		||||
    legacy(0), deflt(0)
 | 
			
		||||
{
 | 
			
		||||
#if OPENSSL_VERSION_MAJOR >= 3
 | 
			
		||||
    legacy = OSSL_PROVIDER_load(NULL, "legacy");
 | 
			
		||||
    if (!legacy)
 | 
			
		||||
	EXCEPTION(gourou::CLIENT_OSSL_ERROR, "Error, OpenSSL legacy provider not available");
 | 
			
		||||
 | 
			
		||||
    deflt = OSSL_PROVIDER_load(NULL, "default");
 | 
			
		||||
    if (!deflt)
 | 
			
		||||
	EXCEPTION(gourou::CLIENT_OSSL_ERROR, "Error, OpenSSL default provider not available");
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DRMProcessorClientImpl::~DRMProcessorClientImpl()
 | 
			
		||||
{
 | 
			
		||||
#if OPENSSL_VERSION_MAJOR >= 3
 | 
			
		||||
    if (legacy)
 | 
			
		||||
	OSSL_PROVIDER_unload(legacy);
 | 
			
		||||
 | 
			
		||||
    if (deflt)
 | 
			
		||||
	OSSL_PROVIDER_unload(deflt);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Digest interface */
 | 
			
		||||
void* DRMProcessorClientImpl::createDigest(const std::string& digestName)
 | 
			
		||||
{
 | 
			
		||||
@@ -289,7 +316,12 @@ void DRMProcessorClientImpl::RSAPrivateEncrypt(const unsigned char* RSAKey, unsi
 | 
			
		||||
    pkcs12 = d2i_PKCS12(NULL, &RSAKey, RSAKeyLength);
 | 
			
		||||
    if (!pkcs12)
 | 
			
		||||
	EXCEPTION(gourou::CLIENT_INVALID_PKCS12, ERR_error_string(ERR_get_error(), NULL));
 | 
			
		||||
 | 
			
		||||
    PKCS12_parse(pkcs12, password.c_str(), &pkey, &cert, &ca);
 | 
			
		||||
 | 
			
		||||
    if (!pkey)
 | 
			
		||||
	EXCEPTION(gourou::CLIENT_INVALID_PKCS12, ERR_error_string(ERR_get_error(), NULL));
 | 
			
		||||
 | 
			
		||||
    rsa = EVP_PKEY_get1_RSA(pkey);
 | 
			
		||||
 | 
			
		||||
    int ret = RSA_private_encrypt(dataLength, data, res, rsa, RSA_PKCS1_PADDING);
 | 
			
		||||
@@ -413,6 +445,9 @@ void DRMProcessorClientImpl::extractCertificate(const unsigned char* RSAKey, uns
 | 
			
		||||
	EXCEPTION(gourou::CLIENT_INVALID_PKCS12, ERR_error_string(ERR_get_error(), NULL));
 | 
			
		||||
    PKCS12_parse(pkcs12, password.c_str(), &pkey, &cert, &ca);
 | 
			
		||||
 | 
			
		||||
    if (!cert)
 | 
			
		||||
	EXCEPTION(gourou::CLIENT_INVALID_PKCS12, ERR_error_string(ERR_get_error(), NULL));
 | 
			
		||||
 | 
			
		||||
    *certOutLength = i2d_X509(cert, certOut);
 | 
			
		||||
 | 
			
		||||
    EVP_PKEY_free(pkey);
 | 
			
		||||
 
 | 
			
		||||
@@ -31,11 +31,18 @@
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#if OPENSSL_VERSION_MAJOR >= 3
 | 
			
		||||
#include <openssl/provider.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <drmprocessorclient.h>
 | 
			
		||||
 | 
			
		||||
class DRMProcessorClientImpl : public gourou::DRMProcessorClient
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    DRMProcessorClientImpl();
 | 
			
		||||
    ~DRMProcessorClientImpl();
 | 
			
		||||
    
 | 
			
		||||
    /* Digest interface */
 | 
			
		||||
    virtual void* createDigest(const std::string& digestName);
 | 
			
		||||
    virtual int digestUpdate(void* handler, unsigned char* data, unsigned int length);
 | 
			
		||||
@@ -118,6 +125,13 @@ public:
 | 
			
		||||
	
 | 
			
		||||
    virtual void deflate(gourou::ByteArray& data, gourou::ByteArray& result,
 | 
			
		||||
			 int wbits=-15, int compressionLevel=8);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
#if OPENSSL_VERSION_MAJOR >= 3
 | 
			
		||||
    OSSL_PROVIDER *legacy, *deflt;
 | 
			
		||||
#else
 | 
			
		||||
    void *legacy, *deflt;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user