1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2026-09-23 11:51:23 +03:00

Merge pull request #2307 from chipitsine/master

Mayaqua: Fix OpenSSL 4.0 build failures due to opaque ASN.1 structures
This commit is contained in:
Ilya Shipitsin
2026-09-22 20:29:34 +02:00
committed by GitHub
+83 -2
View File
@@ -1796,6 +1796,21 @@ X509 *NewX509(K *pub, K *priv, X *ca, NAME *name, UINT days, X_SERIAL *serial)
// Set the Serial Number // Set the Serial Number
s = X509_get_serialNumber(x509); s = X509_get_serialNumber(x509);
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
if (serial == NULL)
{
ASN1_INTEGER_set(s, 0);
}
else
{
BIGNUM *bn = BN_bin2bn(serial->data, serial->size, NULL);
if (bn != NULL)
{
BN_to_ASN1_INTEGER(bn, s);
BN_free(bn);
}
}
#else
OPENSSL_free(s->data); OPENSSL_free(s->data);
if (serial == NULL) if (serial == NULL)
{ {
@@ -1810,6 +1825,7 @@ X509 *NewX509(K *pub, K *priv, X *ca, NAME *name, UINT days, X_SERIAL *serial)
Copy(s->data, serial->data, serial->size); Copy(s->data, serial->data, serial->size);
s->length = serial->size; s->length = serial->size;
} }
#endif
/* /*
// Extensions // Extensions
@@ -1939,6 +1955,21 @@ X509 *NewRootX509(K *pub, K *priv, NAME *name, UINT days, X_SERIAL *serial)
// Set a Serial Number // Set a Serial Number
s = X509_get_serialNumber(x509); s = X509_get_serialNumber(x509);
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
if (serial == NULL)
{
ASN1_INTEGER_set(s, 0);
}
else
{
BIGNUM *bn = BN_bin2bn(serial->data, serial->size, NULL);
if (bn != NULL)
{
BN_to_ASN1_INTEGER(bn, s);
BN_free(bn);
}
}
#else
OPENSSL_free(s->data); OPENSSL_free(s->data);
if (serial == NULL) if (serial == NULL)
{ {
@@ -1953,6 +1984,7 @@ X509 *NewRootX509(K *pub, K *priv, NAME *name, UINT days, X_SERIAL *serial)
Copy(s->data, serial->data, serial->size); Copy(s->data, serial->data, serial->size);
s->length = serial->size; s->length = serial->size;
} }
#endif
// Extensions // Extensions
ex = X509V3_EXT_conf_nid(NULL, NULL, NID_basic_constraints, "critical,CA:TRUE"); ex = X509V3_EXT_conf_nid(NULL, NULL, NID_basic_constraints, "critical,CA:TRUE");
@@ -2180,6 +2212,9 @@ bool SystemToAsn1Time(void *asn1_time, SYSTEMTIME *s)
return false; return false;
} }
t = (ASN1_TIME *)asn1_time; t = (ASN1_TIME *)asn1_time;
#if OPENSSL_VERSION_NUMBER >= 0x10000000L
return ASN1_TIME_set_string(t, tmp) != 0;
#else
if (t->data == NULL || t->length < sizeof(tmp)) if (t->data == NULL || t->length < sizeof(tmp))
{ {
t->data = OPENSSL_malloc(sizeof(tmp)); t->data = OPENSSL_malloc(sizeof(tmp));
@@ -2189,6 +2224,7 @@ bool SystemToAsn1Time(void *asn1_time, SYSTEMTIME *s)
t->type = V_ASN1_UTCTIME; t->type = V_ASN1_UTCTIME;
return true; return true;
#endif
} }
// Convert the system time to a string // Convert the system time to a string
@@ -2228,6 +2264,12 @@ UINT64 Asn1TimeToUINT64(void *asn1_time)
bool Asn1TimeToSystem(SYSTEMTIME *s, void *asn1_time) bool Asn1TimeToSystem(SYSTEMTIME *s, void *asn1_time)
{ {
ASN1_TIME *t; ASN1_TIME *t;
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
char tmp[32];
int len;
const char *src;
int type;
#endif
// Validate arguments // Validate arguments
if (s == NULL || asn1_time == NULL) if (s == NULL || asn1_time == NULL)
{ {
@@ -2235,6 +2277,29 @@ bool Asn1TimeToSystem(SYSTEMTIME *s, void *asn1_time)
} }
t = (ASN1_TIME *)asn1_time; t = (ASN1_TIME *)asn1_time;
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
len = ASN1_STRING_length((const ASN1_STRING *)t);
src = (const char *)ASN1_STRING_get0_data((const ASN1_STRING *)t);
type = ASN1_STRING_type((const ASN1_STRING *)t);
if (src == NULL || len <= 0 || len >= (int)sizeof(tmp))
{
return false;
}
Copy(tmp, src, len);
tmp[len] = '\0';
if (StrToSystem(s, tmp) == false)
{
return false;
}
if (type == V_ASN1_GENERALIZEDTIME)
{
LocalToSystem(s, s);
}
#else
if (StrToSystem(s, (char *)t->data) == false) if (StrToSystem(s, (char *)t->data) == false)
{ {
return false; return false;
@@ -2244,6 +2309,7 @@ bool Asn1TimeToSystem(SYSTEMTIME *s, void *asn1_time)
{ {
LocalToSystem(s, s); LocalToSystem(s, s);
} }
#endif
return true; return true;
} }
@@ -2803,7 +2869,7 @@ wchar_t *GetUniStrFromX509Name(void *xn, int nid)
bool unicode = false; bool unicode = false;
bool is_utf_8 = false; bool is_utf_8 = false;
ASN1_OBJECT *obj; ASN1_OBJECT *obj;
ASN1_STRING *data; const ASN1_STRING *data;
// Validate arguments // Validate arguments
if (xn == NULL || nid == 0) if (xn == NULL || nid == 0)
{ {
@@ -2831,6 +2897,16 @@ wchar_t *GetUniStrFromX509Name(void *xn, int nid)
{ {
return NULL; return NULL;
} }
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
if (ASN1_STRING_type(data) == V_ASN1_BMPSTRING)
{
unicode = true;
}
if (ASN1_STRING_type(data) == V_ASN1_UTF8STRING || ASN1_STRING_type(data) == V_ASN1_T61STRING)
{
is_utf_8 = true;
}
#else
if (data->type == V_ASN1_BMPSTRING) if (data->type == V_ASN1_BMPSTRING)
{ {
unicode = true; unicode = true;
@@ -2839,6 +2915,7 @@ wchar_t *GetUniStrFromX509Name(void *xn, int nid)
{ {
is_utf_8 = true; is_utf_8 = true;
} }
#endif
size = UniStrLen((wchar_t *)txt) * 4 + 8; size = UniStrLen((wchar_t *)txt) * 4 + 8;
for (i = 0;i < size;i++) for (i = 0;i < size;i++)
@@ -3742,7 +3819,11 @@ X *X509ToX(X509 *x509)
// Get the Serial Number // Get the Serial Number
s = X509_get_serialNumber(x509); s = X509_get_serialNumber(x509);
x->serial = NewXSerial(s->data, s->length); #if OPENSSL_VERSION_NUMBER >= 0x10100000L
x->serial = (s != NULL) ? NewXSerial((void *)ASN1_STRING_get0_data((const ASN1_STRING *)s), ASN1_STRING_length((const ASN1_STRING *)s)) : NULL;
#else
x->serial = (s != NULL) ? NewXSerial(s->data, s->length) : NULL;
#endif
if (x->serial == NULL) if (x->serial == NULL)
{ {
char zero = 0; char zero = 0;