Unexport GENERAL_NAME_cmp
This function was involved in both CVE-2020-1971 and CVE-2023-0286. Both
times, we've had to confirm there were no external callers. Unexport it
so we can be sure of this.
Change-Id: I37b756f5bd66e389f03540872371001c85a0b5af
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56987
Reviewed-by: Bob Beck <bbe@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/crypto/x509v3/internal.h b/crypto/x509v3/internal.h
index 0c068a0..e9d601b 100644
--- a/crypto/x509v3/internal.h
+++ b/crypto/x509v3/internal.h
@@ -181,6 +181,14 @@
ERR_add_error_data(6, "section:", (val)->section, ",name:", (val)->name, \
",value:", (val)->value);
+// GENERAL_NAME_cmp returns zero if |a| and |b| are equal and a non-zero
+// value otherwise. Note this function does not provide a comparison suitable
+// for sorting.
+//
+// This function is exported for testing.
+OPENSSL_EXPORT int GENERAL_NAME_cmp(const GENERAL_NAME *a,
+ const GENERAL_NAME *b);
+
#if defined(__cplusplus)
} // extern C
diff --git a/crypto/x509v3/v3_genn.c b/crypto/x509v3/v3_genn.c
index aafad93..d593727 100644
--- a/crypto/x509v3/v3_genn.c
+++ b/crypto/x509v3/v3_genn.c
@@ -61,6 +61,8 @@
#include <openssl/obj.h>
#include <openssl/x509v3.h>
+#include "internal.h"
+
ASN1_SEQUENCE(OTHERNAME) = {
ASN1_SIMPLE(OTHERNAME, type_id, ASN1_OBJECT),
@@ -122,6 +124,22 @@
}
// Returns 0 if they are equal, != 0 otherwise.
+static int othername_cmp(OTHERNAME *a, OTHERNAME *b) {
+ int result = -1;
+
+ if (!a || !b) {
+ return -1;
+ }
+ // Check their type first.
+ if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0) {
+ return result;
+ }
+ // Check the value.
+ result = ASN1_TYPE_cmp(a->value, b->value);
+ return result;
+}
+
+// Returns 0 if they are equal, != 0 otherwise.
int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b) {
if (!a || !b || a->type != b->type) {
return -1;
@@ -135,7 +153,7 @@
return edipartyname_cmp(a->d.ediPartyName, b->d.ediPartyName);
case GEN_OTHERNAME:
- return OTHERNAME_cmp(a->d.otherName, b->d.otherName);
+ return othername_cmp(a->d.otherName, b->d.otherName);
case GEN_EMAIL:
case GEN_DNS:
@@ -155,22 +173,6 @@
return -1;
}
-// Returns 0 if they are equal, != 0 otherwise.
-int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b) {
- int result = -1;
-
- if (!a || !b) {
- return -1;
- }
- // Check their type first.
- if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0) {
- return result;
- }
- // Check the value.
- result = ASN1_TYPE_cmp(a->value, b->value);
- return result;
-}
-
void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value) {
switch (type) {
case GEN_X400:
diff --git a/include/openssl/x509v3.h b/include/openssl/x509v3.h
index 9002286..04b3cb9 100644
--- a/include/openssl/x509v3.h
+++ b/include/openssl/x509v3.h
@@ -426,12 +426,6 @@
DECLARE_ASN1_FUNCTIONS(GENERAL_NAME)
OPENSSL_EXPORT GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a);
-// GENERAL_NAME_cmp returns zero if |a| and |b| are equal and a non-zero
-// value otherwise. Note this function does not provide a comparison suitable
-// for sorting.
-OPENSSL_EXPORT int GENERAL_NAME_cmp(const GENERAL_NAME *a,
- const GENERAL_NAME *b);
-
// i2v_GENERAL_NAME serializes |gen| as a |CONF_VALUE|. If |ret| is non-NULL, it
// appends the value to |ret| and returns |ret| on success or NULL on error. If
// it returns NULL, the caller is still responsible for freeing |ret|. If |ret|
@@ -468,7 +462,6 @@
DECLARE_ASN1_FUNCTIONS_const(OTHERNAME)
DECLARE_ASN1_FUNCTIONS_const(EDIPARTYNAME)
-OPENSSL_EXPORT int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b);
OPENSSL_EXPORT void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type,
void *value);
OPENSSL_EXPORT void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype);