summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Baryshkov <dbaryshkov@gmail.com>2020-05-14 02:15:23 +0300
committerDmitry Baryshkov <dbaryshkov@gmail.com>2020-05-14 05:20:27 +0300
commit76e024246565d5369f9c9aebc0f22dbd0543a551 (patch)
tree2887fae01ab32bc9de0994f53c02c5aa77569dc1
parent4da53c4a4380e4fe0cf676f432c61f9c164971f0 (diff)
downloadgnutls-76e024246565d5369f9c9aebc0f22dbd0543a551.tar.gz
x509: generify oid to str conversions
Make oid to name conversion functions generic enough by allowing caller to specify a pointer to OID table. Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
-rw-r--r--lib/x509/common.c58
-rw-r--r--lib/x509/common.h12
2 files changed, 27 insertions, 43 deletions
diff --git a/lib/x509/common.c b/lib/x509/common.c
index c8ea6657c7..a1f6d62e13 100644
--- a/lib/x509/common.c
+++ b/lib/x509/common.c
@@ -39,19 +39,9 @@ static int
data2hex(const void *data, size_t data_size,
gnutls_datum_t *out);
-struct oid_to_string {
- const char *oid;
- unsigned oid_size;
- const char *ldap_desc;
- unsigned ldap_desc_size;
- const char *asn_desc; /* description in the pkix file if complex type */
- unsigned int etype; /* the libtasn1 ASN1_ETYPE or INVALID
- * if cannot be simply parsed */
-};
-
#define ENTRY(oid, ldap, asn, etype) {oid, sizeof(oid)-1, ldap, sizeof(ldap)-1, asn, etype}
-/* when there is no ldap description */
+/* when there is no name description */
#define ENTRY_ND(oid, asn, etype) {oid, sizeof(oid)-1, NULL, 0, asn, etype}
/* This list contains all the OIDs that may be
@@ -144,18 +134,18 @@ static const struct oid_to_string _oid2str[] = {
{NULL, 0, NULL, 0, NULL, 0}
};
-static const struct oid_to_string *get_oid_entry(const char *oid)
+const struct oid_to_string *_gnutls_oid_get_entry(const struct oid_to_string *ots, const char *oid)
{
unsigned int i = 0;
unsigned len = strlen(oid);
do {
- if (len == _oid2str[i].oid_size &&
- strcmp(_oid2str[i].oid, oid) == 0)
- return &_oid2str[i];
+ if (len == ots[i].oid_size &&
+ strcmp(ots[i].oid, oid) == 0)
+ return &ots[i];
i++;
}
- while (_oid2str[i].oid != NULL);
+ while (ots[i].oid != NULL);
return NULL;
}
@@ -165,9 +155,9 @@ const char *_gnutls_ldap_string_to_oid(const char *str, unsigned str_len)
unsigned int i = 0;
do {
- if ((_oid2str[i].ldap_desc != NULL) &&
- (str_len == _oid2str[i].ldap_desc_size) &&
- (c_strncasecmp(_oid2str[i].ldap_desc, str, str_len) ==
+ if ((_oid2str[i].name_desc != NULL) &&
+ (str_len == _oid2str[i].name_desc_size) &&
+ (c_strncasecmp(_oid2str[i].name_desc, str, str_len) ==
0))
return _oid2str[i].oid;
i++;
@@ -242,18 +232,7 @@ static int str_escape(const gnutls_datum_t * str, gnutls_datum_t * escaped)
**/
int gnutls_x509_dn_oid_known(const char *oid)
{
- unsigned int i = 0;
- unsigned len = strlen(oid);
-
- do {
- if (len == _oid2str[i].oid_size &&
- strcmp(_oid2str[i].oid, oid) == 0)
- return 1;
- i++;
- }
- while (_oid2str[i].oid != NULL);
-
- return 0;
+ return _gnutls_oid_get_entry(_oid2str, oid) != NULL;
}
/**
@@ -272,17 +251,10 @@ int gnutls_x509_dn_oid_known(const char *oid)
**/
const char *gnutls_x509_dn_oid_name(const char *oid, unsigned int flags)
{
- unsigned int i = 0;
- unsigned len = strlen(oid);
-
- do {
- if ((_oid2str[i].oid_size == len) &&
- strcmp(_oid2str[i].oid, oid) == 0 && _oid2str[i].ldap_desc != NULL)
- return _oid2str[i].ldap_desc;
- i++;
- }
- while (_oid2str[i].oid != NULL);
+ const struct oid_to_string *entry =_gnutls_oid_get_entry(_oid2str, oid);
+ if (entry && entry->name_desc)
+ return entry->name_desc;
if (flags & GNUTLS_X509_DN_OID_RETURN_OID)
return oid;
else
@@ -450,7 +422,7 @@ _gnutls_x509_dn_to_string(const char *oid, void *value,
return GNUTLS_E_INVALID_REQUEST;
}
- oentry = get_oid_entry(oid);
+ oentry = _gnutls_oid_get_entry(_oid2str, oid);
if (oentry == NULL) { /* unknown OID -> hex */
unknown_oid:
ret = data2hex(value, value_size, str);
@@ -1469,7 +1441,7 @@ _gnutls_x509_encode_and_write_attribute(const char *given_oid,
int result;
const struct oid_to_string *oentry;
- oentry = get_oid_entry(given_oid);
+ oentry = _gnutls_oid_get_entry(_oid2str, given_oid);
if (oentry == NULL) {
gnutls_assert();
_gnutls_debug_log("Cannot find OID: %s\n", given_oid);
diff --git a/lib/x509/common.h b/lib/x509/common.h
index 54ded21188..483bd1de6c 100644
--- a/lib/x509/common.h
+++ b/lib/x509/common.h
@@ -114,6 +114,18 @@
#define ASN1_NULL "\x05\x00"
#define ASN1_NULL_SIZE 2
+struct oid_to_string {
+ const char *oid;
+ unsigned oid_size;
+ const char *name_desc;
+ unsigned name_desc_size;
+ const char *asn_desc; /* description in the pkix file if complex type */
+ unsigned int etype; /* the libtasn1 ASN1_ETYPE or INVALID
+ * if cannot be simply parsed */
+};
+
+const struct oid_to_string *_gnutls_oid_get_entry(const struct oid_to_string *ots, const char *oid);
+
int _gnutls_x509_set_time(ASN1_TYPE c2, const char *where, time_t tim,
int force_general);
int