diff --git a/src/x509.c b/src/x509.c index 948ab6352..e4c9db6af 100644 --- a/src/x509.c +++ b/src/x509.c @@ -9987,6 +9987,7 @@ static int ConvertNIDToWolfSSL(int nid) case NID_businessCategory: return ASN_BUS_CAT; case NID_domainComponent: return ASN_DOMAIN_COMPONENT; case NID_postalCode: return ASN_POSTAL_CODE; + case NID_favouriteDrink: return ASN_FAVOURITE_DRINK; default: WOLFSSL_MSG("Attribute NID not found"); return -1; diff --git a/tests/api.c b/tests/api.c index dbd9b2085..2349b2b58 100644 --- a/tests/api.c +++ b/tests/api.c @@ -41057,15 +41057,25 @@ static int test_wolfSSL_X509_NAME_ENTRY(void) #ifdef WOLFSSL_CERT_REQ { unsigned char srv_pkcs9p[] = "Server"; + unsigned char fvrtDrnk[] = "tequila"; + unsigned char* der = NULL; char* subject; AssertIntEQ(X509_NAME_add_entry_by_NID(nm, NID_pkcs9_contentType, MBSTRING_ASC, srv_pkcs9p, -1, -1, 0), SSL_SUCCESS); + AssertIntEQ(X509_NAME_add_entry_by_NID(nm, NID_favouriteDrink, + MBSTRING_ASC, fvrtDrnk, -1, -1, 0), SSL_SUCCESS); + + AssertIntGT(wolfSSL_i2d_X509_NAME(nm, &der), 0); + AssertNotNull(der); + subject = X509_NAME_oneline(nm, 0, 0); + AssertNotNull(XSTRSTR(subject, "favouriteDrink=tequila")); #ifdef DEBUG_WOLFSSL fprintf(stderr, "\n\t%s\n", subject); #endif XFREE(subject, 0, DYNAMIC_TYPE_OPENSSL); + XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL); } #endif diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 2c9d46ad9..2ee9a02c1 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -4353,7 +4353,9 @@ static const byte dnsSRVOid[] = {43, 6, 1, 5, 5, 7, 8, 7}; defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ defined(WOLFSSL_ASN_TEMPLATE) /* Pilot attribute types (0.9.2342.19200300.100.1.*) */ -static const byte uidOid[] = {9, 146, 38, 137, 147, 242, 44, 100, 1, 1}; /* user id */ +#define PLT_ATTR_TYPE_OID_BASE(num) {9, 146, 38, 137, 147, 242, 44, 100, 1, num} +static const byte uidOid[] = PLT_ATTR_TYPE_OID_BASE(1); /* user id */ +static const byte fvrtDrk[] = PLT_ATTR_TYPE_OID_BASE(5);/* favourite drink*/ #endif #if defined(WOLFSSL_CERT_GEN) || \ @@ -12408,6 +12410,15 @@ static int GetRDN(DecodedCert* cert, char* full, word32* idx, int* nid, *nid = NID_domainComponent; #endif } + else if (oidSz == sizeof(fvrtDrk) && XMEMCMP(oid, fvrtDrk, oidSz) == 0) { + /* Set the favourite drink, type string, length and NID. */ + id = ASN_FAVOURITE_DRINK; + typeStr = WOLFSSL_FAVOURITE_DRINK; + typeStrLen = sizeof(WOLFSSL_FAVOURITE_DRINK) - 1; + #ifdef WOLFSSL_X509_NAME_AVAILABLE + *nid = NID_favouriteDrink; + #endif + } /* Other OIDs that start with the same values. */ else if (oidSz == sizeof(dcOid) && XMEMCMP(oid, dcOid, oidSz-1) == 0) { WOLFSSL_MSG("Unknown pilot attribute type"); @@ -25806,6 +25817,10 @@ static int EncodeName(EncodedName* name, const char* nameStr, thisLen += (int)sizeof(uidOid); firstSz = (int)sizeof(uidOid); break; + case ASN_FAVOURITE_DRINK: + thisLen += (int)sizeof(fvrtDrk); + firstSz = (int)sizeof(fvrtDrk); + break; #ifdef WOLFSSL_CUSTOM_OID case ASN_CUSTOM_NAME: thisLen += cname->custom.oidSz; @@ -25861,6 +25876,12 @@ static int EncodeName(EncodedName* name, const char* nameStr, /* str type */ name->encoded[idx++] = nameTag; break; + case ASN_FAVOURITE_DRINK: + XMEMCPY(name->encoded + idx, fvrtDrk, sizeof(fvrtDrk)); + idx += (int)sizeof(fvrtDrk); + /* str type */ + name->encoded[idx++] = nameTag; + break; #ifdef WOLFSSL_CUSTOM_OID case ASN_CUSTOM_NAME: XMEMCPY(name->encoded + idx, cname->custom.oid, @@ -25931,6 +25952,10 @@ static int EncodeName(EncodedName* name, const char* nameStr, oid = uidOid; oidSz = sizeof(uidOid); break; + case ASN_FAVOURITE_DRINK: + oid = fvrtDrk; + oidSz = sizeof(fvrtDrk); + break; #ifdef WOLFSSL_CUSTOM_OID case ASN_CUSTOM_NAME: nameSz = cname->custom.valSz; @@ -26118,6 +26143,12 @@ static int SetNameRdnItems(ASNSetData* dataASN, ASNItem* namesASN, sizeof(uidOid), GetNameType(name, i), (const byte*)GetOneCertName(name, i), nameLen[i]); } + else if (type == ASN_FAVOURITE_DRINK) { + /* Copy favourite drink data into dynamic vars. */ + SetRdnItems(namesASN + idx, dataASN + idx, fvrtDrk, + sizeof(fvrtDrk), GetNameType(name, i), + (const byte*)GetOneCertName(name, i), nameLen[i]); + } else if (type == ASN_CUSTOM_NAME) { #ifdef WOLFSSL_CUSTOM_OID SetRdnItems(namesASN + idx, dataASN + idx, name->custom.oid,