Skip to content

Commit 48de458

Browse files
author
Lealem Amedie
committed
Add Obj_txt2oidBuf function
1 parent 2a539fe commit 48de458

4 files changed

Lines changed: 119 additions & 33 deletions

File tree

src/ssl.c

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29369,6 +29369,51 @@ void* wolfSSL_GetHKDFExtractCtx(WOLFSSL* ssl)
2936929369
}
2937029370
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
2937129371

29372+
#if defined(OPENSSL_ALL)
29373+
const byte* wolfSSL_OBJ_txt2oidBuf(char* buf, word32* inOutSz, word32 oidType)
29374+
{
29375+
char *token;
29376+
byte* oidBuf = NULL;
29377+
word32 oid;
29378+
word16 dotted[ASN1_OID_DOTTED_MAX_SZ];
29379+
word32 dottedCount = 0;
29380+
int nid;
29381+
29382+
if (buf == NULL)
29383+
return NULL;
29384+
29385+
nid = wolfSSL_OBJ_txt2nid(buf);
29386+
29387+
if (nid != NID_undef) {
29388+
/* Handle named OID case */
29389+
oid = nid2oid(nid, oidType);
29390+
oidBuf = (byte*)OidFromId(oid, oidType,inOutSz);
29391+
}
29392+
#if defined(HAVE_OID_ENCODING)
29393+
else {
29394+
/* Handle dotted form OID case*/
29395+
token = XSTRTOK(buf, ".", NULL);
29396+
29397+
while (token != NULL) {
29398+
dotted[dottedCount] = XATOI(token);
29399+
dottedCount++;
29400+
token = XSTRTOK(NULL, ".", NULL);
29401+
}
29402+
29403+
if (EncodeObjectId(dotted, dottedCount, oidBuf, inOutSz) != 0) {
29404+
oidBuf = NULL;
29405+
}
29406+
}
29407+
#else
29408+
(void)token;
29409+
(void)dotted;
29410+
(void)dottedCount;
29411+
#endif
29412+
29413+
return (const byte*)oidBuf;
29414+
}
29415+
#endif /* OPENSSL_ALL */
29416+
2937229417
#if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
2937329418
defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
2937429419
defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
@@ -33912,6 +33957,7 @@ int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
3391233957

3391333958
word32 nid2oid(int nid, int grp)
3391433959
{
33960+
size_t i;
3391533961
/* get OID type */
3391633962
switch (grp) {
3391733963
/* oidHashType */
@@ -34269,10 +34315,33 @@ word32 nid2oid(int nid, int grp)
3426934315
}
3427034316
break;
3427134317

34318+
/* oidCmsKeyAgreeType */
34319+
#ifdef WOLFSSL_CERT_REQ
34320+
case oidCsrAttrType:
34321+
switch (nid) {
34322+
case NID_pkcs9_contentType:
34323+
return PKCS9_CONTENT_TYPE_OID;
34324+
case NID_pkcs9_challengePassword:
34325+
return CHALLENGE_PASSWORD_OID;
34326+
case NID_serialNumber:
34327+
return SERIAL_NUMBER_OID;
34328+
case NID_userId:
34329+
return USER_ID_OID;
34330+
case NID_surname:
34331+
return SURNAME_OID;
34332+
}
34333+
break;
34334+
#endif
34335+
3427234336
default:
3427334337
WOLFSSL_MSG("NID not in table");
34274-
/* MSVC warns without the cast */
34275-
return (word32)-1;
34338+
}
34339+
34340+
/* If not found in above switch then try the table */
34341+
for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
34342+
if (wolfssl_object_info[i].nid == nid) {
34343+
return wolfssl_object_info[i].id;
34344+
}
3427634345
}
3427734346

3427834347
/* MSVC warns without the cast */
@@ -34647,7 +34716,7 @@ int oid2nid(word32 oid, int grp)
3464734716
#endif
3464834717

3464934718
default:
34650-
WOLFSSL_MSG("NID not in table");
34719+
WOLFSSL_MSG("OID not in table");
3465134720
}
3465234721
/* If not found in above switch then try the table */
3465334722
for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {

wolfcrypt/src/asn.c

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12350,9 +12350,13 @@ static int GenerateDNSEntryRIDString(DNS_entry* entry, void* heap)
1235012350
int i, j, ret = 0;
1235112351
int nameSz;
1235212352
int tmpSize = MAX_OID_SZ;
12353+
int endChar = 0;
12354+
int nid = 0;
12355+
word32 oid = 0;
12356+
word32 idx = 0;
1235312357
word16 tmpName[MAX_OID_SZ];
12358+
char finalName[MAX_OID_SZ];
1235412359
char* rid;
12355-
char dottedName[MAX_OID_SZ] = {0};
1235612360

1235712361
if (entry == NULL || entry->type != ASN_RID_TYPE) {
1235812362
return BAD_FUNC_ARG;
@@ -12361,44 +12365,56 @@ static int GenerateDNSEntryRIDString(DNS_entry* entry, void* heap)
1236112365
if (entry->len <= 0) {
1236212366
return BAD_FUNC_ARG;
1236312367
}
12368+
12369+
XMEMSET(&finalName, 0, MAX_OID_SZ);
1236412370
rid = entry->name;
1236512371

12366-
#if defined(HAVE_OID_DECODING) || defined(WOLFSSL_ASN_PRINT)
12367-
/* Decode OBJECT_ID into dotted form array. */
12368-
ret = DecodeObjectId((const byte*)(rid),(word32)entry->len, tmpName,
12369-
(word32*)&tmpSize);
12370-
#else
12371-
ret = NOT_COMPILED_IN;
12372-
#endif
12372+
ret = GetOID((const byte*)rid, &idx, &oid, oidIgnoreType, entry->len);
1237312373

12374-
if (ret == 0) {
12375-
j = 0;
12376-
/* Append each number of dotted form. */
12377-
for (i = 0; i < tmpSize; i++) {
12378-
ret = XSNPRINTF(dottedName + j, MAX_OID_SZ, "%d", tmpName[i]);
12379-
if (ret >= 0) {
12380-
j += ret;
12381-
if (i < tmpSize - 1) {
12382-
dottedName[j] = '.';
12383-
j++;
12374+
if (ret == 0 && (nid = oid2nid(oid, oidCsrAttrType)) > 0) {
12375+
rid = (char*)wolfSSL_OBJ_nid2ln(nid);
12376+
XSTRNCPY(finalName, rid, XSTRLEN((const char*)rid));
12377+
}
12378+
else {
12379+
#if defined(HAVE_OID_DECODING) || defined(WOLFSSL_ASN_PRINT)
12380+
/* Decode OBJECT_ID into dotted form array. */
12381+
ret = DecodeObjectId((const byte*)(rid),(word32)entry->len, tmpName,
12382+
(word32*)&tmpSize);
12383+
#else
12384+
ret = NOT_COMPILED_IN;
12385+
#endif
12386+
12387+
if (ret == 0) {
12388+
endChar = 1;
12389+
j = 0;
12390+
/* Append each number of dotted form. */
12391+
for (i = 0; i < tmpSize; i++) {
12392+
ret = XSNPRINTF(finalName + j, MAX_OID_SZ, "%d", tmpName[i]);
12393+
if (ret >= 0) {
12394+
j += ret;
12395+
if (i < tmpSize - 1) {
12396+
finalName[j] = '.';
12397+
j++;
12398+
}
12399+
}
12400+
else {
12401+
return BUFFER_E;
1238412402
}
1238512403
}
12386-
else {
12387-
return BUFFER_E;
12388-
}
12404+
ret = 0;
1238912405
}
12390-
ret = 0;
1239112406
}
1239212407

1239312408
if (ret == 0) {
12394-
nameSz = (int)XSTRLEN((const char*)dottedName);
12395-
entry->ridString = (char*)XMALLOC(nameSz + 1, heap, DYNAMIC_TYPE_ALTNAME);
12409+
nameSz = (int)XSTRLEN((const char*)finalName);
12410+
entry->ridString = (char*)XMALLOC(nameSz + endChar, heap, DYNAMIC_TYPE_ALTNAME);
1239612411
if (entry->ridString == NULL) {
1239712412
ret = MEMORY_E;
1239812413
}
1239912414

12400-
XMEMCPY(entry->ridString, dottedName, nameSz);
12401-
entry->ridString[nameSz] = '\0';
12415+
XMEMCPY(entry->ridString, finalName, nameSz);
12416+
if (endChar)
12417+
entry->ridString[nameSz] = '\0';
1240212418
}
1240312419

1240412420
return ret;
@@ -37280,9 +37296,6 @@ int wc_Asn1_SetFile(Asn1* asn1, XFILE file)
3728037296
return ret;
3728137297
}
3728237298

37283-
/* Maximum OID dotted form size. */
37284-
#define ASN1_OID_DOTTED_MAX_SZ 16
37285-
3728637299
/* Print OID in dotted form or as hex bytes.
3728737300
*
3728837301
* @param [in] file File pointer to write to.

wolfssl/ssl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4168,6 +4168,7 @@ WOLFSSL_API size_t wolfSSL_OBJ_length(const WOLFSSL_ASN1_OBJECT* o);
41684168
WOLFSSL_API const unsigned char* wolfSSL_OBJ_get0_data(
41694169
const WOLFSSL_ASN1_OBJECT* o);
41704170

4171+
WOLFSSL_API const byte* wolfSSL_OBJ_txt2oidBuf(char* b, word32* sz, word32 t);
41714172
WOLFSSL_API const char* wolfSSL_OBJ_nid2ln(int n);
41724173
WOLFSSL_API int wolfSSL_OBJ_ln2nid(const char *ln);
41734174
WOLFSSL_API int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,

wolfssl/wolfcrypt/asn.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,9 @@ enum ECC_TYPES
898898
#endif
899899
#endif
900900

901+
/* Maximum OID dotted form size. */
902+
#define ASN1_OID_DOTTED_MAX_SZ 16
903+
901904
enum Misc_ASN {
902905
MAX_SALT_SIZE = 64, /* MAX PKCS Salt length */
903906
MAX_IV_SIZE = 64, /* MAX PKCS Iv length */
@@ -2166,7 +2169,7 @@ WOLFSSL_LOCAL int GetInt(mp_int* mpi, const byte* input, word32* inOutIdx,
21662169
word32 maxIdx);
21672170

21682171
#ifdef HAVE_OID_ENCODING
2169-
WOLFSSL_API int EncodeObjectId(const word16* in, word32 inSz,
2172+
WOLFSSL_LOCAL int EncodeObjectId(const word16* in, word32 inSz,
21702173
byte* out, word32* outSz);
21712174
#endif
21722175
#if defined(HAVE_OID_DECODING) || defined(WOLFSSL_ASN_PRINT)

0 commit comments

Comments
 (0)