mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-03 20:54:41 +02:00
Add PKCS7 data OID support and enhance X.509 OID comparison
- Add oidPkcs7Type to Oid_Types enum in asn.h for PKCS7 content type recognition - Add pkcs7DataOid byte array definition for OID 1.2.840.113549.1.7.1 in asn.c - Add OID recognition logic in GetOID function to handle PKCS7 data content type - Add GetEntryByOID function in x509.c for direct OID byte comparison - Enhance wolfSSL_X509_NAME_get_index_by_OBJ to use OID comparison instead of string comparison - All changes are properly guarded with #ifdef HAVE_PKCS7 where appropriate - Maintains backward compatibility with existing APIs Co-Authored-By: lealem@wolfssl.com <lealem@wolfssl.com>
This commit is contained in:
44
src/x509.c
44
src/x509.c
@@ -5493,6 +5493,29 @@ static WOLFSSL_X509_NAME_ENTRY* GetEntryByNID(WOLFSSL_X509_NAME* name, int nid,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static WOLFSSL_X509_NAME_ENTRY* GetEntryByOID(WOLFSSL_X509_NAME* name,
|
||||||
|
const WOLFSSL_ASN1_OBJECT* obj, int* idx)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
WOLFSSL_X509_NAME_ENTRY* ret = NULL;
|
||||||
|
|
||||||
|
if (!obj || !obj->obj) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = *idx; i < MAX_NAME_ENTRIES; i++) {
|
||||||
|
if (name->entry[i].set && name->entry[i].object) {
|
||||||
|
if (obj->objSz == name->entry[i].object->objSz &&
|
||||||
|
XMEMCMP(obj->obj, name->entry[i].object->obj, obj->objSz) == 0) {
|
||||||
|
ret = &name->entry[i];
|
||||||
|
*idx = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Used to get a string from the WOLFSSL_X509_NAME structure that
|
/* Used to get a string from the WOLFSSL_X509_NAME structure that
|
||||||
* corresponds with the NID value passed in. This finds the first entry with
|
* corresponds with the NID value passed in. This finds the first entry with
|
||||||
@@ -13212,26 +13235,23 @@ WOLFSSL_ASN1_OBJECT* wolfSSL_X509_NAME_ENTRY_get_object(
|
|||||||
int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
|
int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
|
||||||
const WOLFSSL_ASN1_OBJECT *obj,
|
const WOLFSSL_ASN1_OBJECT *obj,
|
||||||
int idx) {
|
int idx) {
|
||||||
if (!name || idx >= MAX_NAME_ENTRIES ||
|
WOLFSSL_X509_NAME_ENTRY* entry;
|
||||||
!obj || !obj->obj) {
|
|
||||||
|
if (!name || idx >= MAX_NAME_ENTRIES || !obj) {
|
||||||
return WOLFSSL_FATAL_ERROR;
|
return WOLFSSL_FATAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
idx = -1;
|
idx = 0;
|
||||||
|
} else {
|
||||||
|
idx++; /* Start searching from next index */
|
||||||
}
|
}
|
||||||
|
|
||||||
for (idx++; idx < MAX_NAME_ENTRIES; idx++) {
|
entry = GetEntryByOID(name, obj, &idx);
|
||||||
/* Find index of desired name */
|
if (entry != NULL) {
|
||||||
if (name->entry[idx].set) {
|
|
||||||
if (XSTRLEN(obj->sName) ==
|
|
||||||
XSTRLEN(name->entry[idx].object->sName) &&
|
|
||||||
XSTRNCMP((const char*) obj->sName,
|
|
||||||
name->entry[idx].object->sName, obj->objSz - 1) == 0) {
|
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
return WOLFSSL_FATAL_ERROR;
|
return WOLFSSL_FATAL_ERROR;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -4468,6 +4468,8 @@ static word32 SetBitString16Bit(word16 val, byte* output)
|
|||||||
#ifdef HAVE_PKCS7
|
#ifdef HAVE_PKCS7
|
||||||
/* From RFC 3211 */
|
/* From RFC 3211 */
|
||||||
static const byte wrapPwriKekOid[] = {42, 134, 72, 134, 247, 13, 1, 9, 16, 3,9};
|
static const byte wrapPwriKekOid[] = {42, 134, 72, 134, 247, 13, 1, 9, 16, 3,9};
|
||||||
|
/* PKCS#7 content types */
|
||||||
|
static const byte pkcs7DataOid[] = {42, 134, 72, 134, 247, 13, 1, 7, 1};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* cmsKeyAgreeType */
|
/* cmsKeyAgreeType */
|
||||||
@@ -6429,6 +6431,18 @@ const byte* OidFromId(word32 id, word32 type, word32* oidSz)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif /* WOLFSSL_SUBJ_DIR_ATTR */
|
#endif /* WOLFSSL_SUBJ_DIR_ATTR */
|
||||||
|
#ifdef HAVE_PKCS7
|
||||||
|
case oidPkcs7Type:
|
||||||
|
switch (id) {
|
||||||
|
case DATA:
|
||||||
|
oid = pkcs7DataOid;
|
||||||
|
*oidSz = sizeof(pkcs7DataOid);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case oidIgnoreType:
|
case oidIgnoreType:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@@ -1229,6 +1229,9 @@ enum Oid_Types {
|
|||||||
oidCsrAttrType = 20,
|
oidCsrAttrType = 20,
|
||||||
#ifdef WOLFSSL_SUBJ_DIR_ATTR
|
#ifdef WOLFSSL_SUBJ_DIR_ATTR
|
||||||
oidSubjDirAttrType = 21,
|
oidSubjDirAttrType = 21,
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_PKCS7
|
||||||
|
oidPkcs7Type = 22,
|
||||||
#endif
|
#endif
|
||||||
oidIgnoreType
|
oidIgnoreType
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user