Add compatiblity with older SSL versions

This commit is contained in:
Vladimir Dubrovin 2026-05-08 17:16:47 +03:00
parent 41d1fa8b00
commit 978f351560
3 changed files with 31 additions and 10 deletions

View File

@ -28,7 +28,7 @@ static unsigned char itoa64[] =
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
#if defined(WITH_SSL) #if defined(WITH_SSL) && OPENSSL_VERSION_NUMBER >= 0x30000000L
EVP_MD *md4_hash = NULL; EVP_MD *md4_hash = NULL;
EVP_MD *md5_hash = NULL; EVP_MD *md5_hash = NULL;
#endif #endif
@ -52,7 +52,12 @@ unsigned char * ntpwdhash (unsigned char *szHash, const unsigned char *szPasswor
unsigned int len=sizeof(szUnicodePass); unsigned int len=sizeof(szUnicodePass);
unsigned int i; unsigned int i;
if(md4_hash == NULL) return NULL; #if OPENSSL_VERSION_NUMBER >= 0x30000000L
const EVP_MD *md4 = md4_hash;
#else
const EVP_MD *md4 = EVP_md4();
#endif
if(md4 == NULL) return NULL;
/* /*
* NT passwords are unicode. Convert plain text password * NT passwords are unicode. Convert plain text password
@ -68,7 +73,7 @@ unsigned char * ntpwdhash (unsigned char *szHash, const unsigned char *szPasswor
/* Encrypt Unicode password to a 16-byte MD4 hash */ /* Encrypt Unicode password to a 16-byte MD4 hash */
ctx = EVP_MD_CTX_new(); ctx = EVP_MD_CTX_new();
if(!ctx) return NULL; if(!ctx) return NULL;
if(!EVP_DigestInit_ex(ctx, md4_hash, NULL)){ if(!EVP_DigestInit_ex(ctx, md4, NULL)){
EVP_MD_CTX_free(ctx); EVP_MD_CTX_free(ctx);
return NULL; return NULL;
} }
@ -102,7 +107,12 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi
unsigned int len; unsigned int len;
int pl, i; int pl, i;
if(md5_hash == NULL) { #if OPENSSL_VERSION_NUMBER >= 0x30000000L
const EVP_MD *md5 = md5_hash;
#else
const EVP_MD *md5 = EVP_md5();
#endif
if(md5 == NULL) {
*passwd = 0; *passwd = 0;
return NULL; return NULL;
} }
@ -116,7 +126,7 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi
*passwd = 0; *passwd = 0;
return NULL; return NULL;
} }
EVP_DigestInit_ex(ctx, md5_hash, NULL); EVP_DigestInit_ex(ctx, md5, NULL);
/* The password first, since that is what is most unknown */ /* The password first, since that is what is most unknown */
EVP_DigestUpdate(ctx,pw,strlen((char *)pw)); EVP_DigestUpdate(ctx,pw,strlen((char *)pw));
@ -134,7 +144,7 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi
*passwd = 0; *passwd = 0;
return NULL; return NULL;
} }
EVP_DigestInit_ex(ctx1, EVP_md5(), NULL); EVP_DigestInit_ex(ctx1, md5, NULL);
EVP_DigestUpdate(ctx1,pw,strlen((char *)pw)); EVP_DigestUpdate(ctx1,pw,strlen((char *)pw));
EVP_DigestUpdate(ctx1,sp,sl); EVP_DigestUpdate(ctx1,sp,sl);
EVP_DigestUpdate(ctx1,pw,strlen((char *)pw)); EVP_DigestUpdate(ctx1,pw,strlen((char *)pw));
@ -163,7 +173,7 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi
*/ */
for(i=0;i<1000;i++) { for(i=0;i<1000;i++) {
EVP_MD_CTX_reset(ctx1); EVP_MD_CTX_reset(ctx1);
EVP_DigestInit_ex(ctx1, md5_hash, NULL); EVP_DigestInit_ex(ctx1, md5, NULL);
if(i & 1) if(i & 1)
EVP_DigestUpdate(ctx1,pw,strlen((char *)pw)); EVP_DigestUpdate(ctx1,pw,strlen((char *)pw));
else else
@ -230,7 +240,7 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi
} }
#ifdef WITHMAIN #ifdef WITHMAIN
#ifdef WITH_SSL #if defined(WITH_SSL) && OPENSSL_VERSION_NUMBER >= 0x30000000L
#include <openssl/provider.h> #include <openssl/provider.h>
#endif #endif
#include <stdio.h> #include <stdio.h>
@ -256,7 +266,7 @@ int main(int argc, char* argv[]){
argv[0]); argv[0]);
return 1; return 1;
} }
#ifdef WITH_SSL #if defined(WITH_SSL) && OPENSSL_VERSION_NUMBER >= 0x30000000L
OSSL_PROVIDER_load(NULL, "legacy"); OSSL_PROVIDER_load(NULL, "legacy");
OSSL_PROVIDER_load(NULL, "default"); OSSL_PROVIDER_load(NULL, "default");
md4_hash = EVP_MD_fetch(NULL, "MD4", NULL); md4_hash = EVP_MD_fetch(NULL, "MD4", NULL);

View File

@ -183,8 +183,10 @@ char *strNcpy(char *dest, const char *src, int n)
return dest; return dest;
} }
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
extern EVP_MD *md4_hash; extern EVP_MD *md4_hash;
extern EVP_MD *md5_hash; extern EVP_MD *md5_hash;
#endif
void md5_calc(unsigned char *output, unsigned char *input, void md5_calc(unsigned char *output, unsigned char *input,
@ -192,7 +194,11 @@ void md5_calc(unsigned char *output, unsigned char *input,
{ {
EVP_MD_CTX *ctx = EVP_MD_CTX_new(); EVP_MD_CTX *ctx = EVP_MD_CTX_new();
unsigned int len = 0; unsigned int len = 0;
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
EVP_DigestInit_ex(ctx, md5_hash, NULL); EVP_DigestInit_ex(ctx, md5_hash, NULL);
#else
EVP_DigestInit_ex(ctx, EVP_md5(), NULL);
#endif
EVP_DigestUpdate(ctx, input, inlen); EVP_DigestUpdate(ctx, input, inlen);
EVP_DigestFinal_ex(ctx, output, &len); EVP_DigestFinal_ex(ctx, output, &len);
EVP_MD_CTX_free(ctx); EVP_MD_CTX_free(ctx);

View File

@ -20,7 +20,9 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/ssl.h> #include <openssl/ssl.h>
#include <openssl/err.h> #include <openssl/err.h>
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
#include <openssl/provider.h> #include <openssl/provider.h>
#endif
#include "proxy.h" #include "proxy.h"
#include "ssl.h" #include "ssl.h"
@ -278,8 +280,10 @@ int ssl_file_init = 0;
int ssl_init_done = 0; int ssl_init_done = 0;
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
extern EVP_MD *md4_hash; extern EVP_MD *md4_hash;
extern EVP_MD *md5_hash; extern EVP_MD *md5_hash;
#endif
void ssl_init() void ssl_init()
@ -292,6 +296,7 @@ void ssl_init()
SSL_load_error_strings(); SSL_load_error_strings();
_3proxy_mutex_init(&ssl_file_mutex); _3proxy_mutex_init(&ssl_file_mutex);
bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
OSSL_PROVIDER_load(NULL, "legacy"); OSSL_PROVIDER_load(NULL, "legacy");
OSSL_PROVIDER_load(NULL, "default"); OSSL_PROVIDER_load(NULL, "default");
md4_hash = EVP_MD_fetch(NULL, "MD4", NULL); md4_hash = EVP_MD_fetch(NULL, "MD4", NULL);
@ -302,6 +307,6 @@ void ssl_init()
if (md5_hash == NULL) { if (md5_hash == NULL) {
fprintf(stderr, "Error fetching MD5\n"); fprintf(stderr, "Error fetching MD5\n");
} }
#endif
} }
} }