201
184
PKIX_PL_String **pString,
204
PKIX_UInt32 *components = NULL;
187
PKIX_PL_OID *oid = NULL;
188
char *oidString = NULL;
208
190
PKIX_ENTER(OID, "pkix_pl_OID_toString");
209
191
PKIX_NULLCHECK_TWO(object, pString);
211
193
PKIX_CHECK(pkix_CheckType(object, PKIX_OID_TYPE, plContext),
212
194
PKIX_OBJECTNOTANOID);
214
components = ((PKIX_PL_OID*)object)->components;
215
length = ((PKIX_PL_OID*)object)->length;
217
PKIX_CHECK(pkix_pl_helperBytes2Ascii
218
(components, length, &ascii, plContext),
219
PKIX_HELPERBYTES2ASCIIFAILED);
195
oid = (PKIX_PL_OID*)object;
196
oidString = CERT_GetOidString(&oid->derOid);
221
198
PKIX_CHECK(PKIX_PL_String_Create
222
(PKIX_ESCASCII, ascii, 0, pString, plContext),
199
(PKIX_ESCASCII, oidString , 0, pString, plContext),
223
200
PKIX_STRINGCREATEFAILED);
202
PR_smprintf_free(oidString);
229
204
PKIX_RETURN(OID);
244
219
pkix_pl_OID_RegisterSelf(
248
222
extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES];
249
pkix_ClassTable_Entry entry;
223
pkix_ClassTable_Entry *entry = &systemClasses[PKIX_OID_TYPE];
251
225
PKIX_ENTER(OID, "pkix_pl_OID_RegisterSelf");
253
entry.description = "OID";
254
entry.objCounter = 0;
255
entry.typeObjectSize = sizeof(PKIX_PL_OID);
256
entry.destructor = pkix_pl_OID_Destroy;
257
entry.equalsFunction = pkix_pl_OID_Equals;
258
entry.hashcodeFunction = pkix_pl_OID_Hashcode;
259
entry.toStringFunction = pkix_pl_OID_ToString;
260
entry.comparator = pkix_pl_OID_Comparator;
261
entry.duplicateFunction = pkix_duplicateImmutable;
263
systemClasses[PKIX_OID_TYPE] = entry;
269
* FUNCTION: pkix_pl_OID_GetNextToken
272
* This function is essentially a thread safe version of strtok, except
273
* that we always use '.' (dot) for the token separator.
275
* Searches for tokens in the string pointed to by "input", using '.' (dot)
276
* as the token separator. If "input" contains multiple tokens, the first
277
* token is stored at "pToken", the character immediately follow the first
278
* token is replaced by a null character, and the rekmainder of "input" is
279
* stored at "pRem". If no additional tokens are available, this function
280
* stores NULL at "pToken".
284
* Address of string to be tokenized. May be NULL.
286
* Destination for OID token. Must be non-NULL.
288
* Destination for pointer to remainder of string. Must be non-NULL.
290
* Platform-specific context pointer.
292
* Thread Safe (see Thread Safety Definitions in Programmer's Guide)
294
* Returns NULL if the function succeeds.
295
* Returns an OID Error if the function fails in a non-fatal way.
296
* Returns a Fatal Error if the function fails in an unrecoverable way.
299
pkix_pl_OID_GetNextToken(
307
PKIX_ENTER(OID, "pkix_pl_OID_GetNextToken");
308
PKIX_NULLCHECK_TWO(pToken, pRem);
315
while (*input != '.' && *input != '\0'){
322
} else { /* NULL case */
227
entry->description = "OID";
228
entry->typeObjectSize = sizeof(PKIX_PL_OID);
229
entry->destructor = pkix_pl_OID_Destroy;
230
entry->equalsFunction = pkix_pl_OID_Equals;
231
entry->hashcodeFunction = pkix_pl_OID_Hashcode;
232
entry->toStringFunction = pkix_pl_OID_ToString;
233
entry->comparator = pkix_pl_OID_Comparator;
234
entry->duplicateFunction = pkix_duplicateImmutable;
330
236
PKIX_RETURN(OID);
369
271
PKIX_CHECK(PKIX_List_Create(&oidsList, plContext),
370
272
PKIX_LISTCREATEFAILED);
375
extension = *extensions++;
377
PKIX_NULLCHECK_ONE(extension);
379
/* extension is critical */
380
critical = extension->critical;
382
if (critical.len != 0){
384
if (critical.data[0] == 0xff) {
387
PKIX_CHECK(pkix_pl_oidBytes2Ascii
388
(&oid, &oidAscii, plContext),
389
PKIX_OIDBYTES2ASCIIFAILED);
391
PKIX_CHECK(PKIX_PL_OID_Create
392
(oidAscii, &pkixOID, plContext),
393
PKIX_OIDCREATEFAILED);
395
PKIX_CHECK(PKIX_List_AppendItem
397
(PKIX_PL_Object *)pkixOID,
399
PKIX_LISTAPPENDITEMFAILED);
404
PKIX_DECREF(pkixOID);
275
while (*extensions) {
276
CERTCertExtension *extension = NULL;
277
SECItem *critical = NULL;
280
extension = *extensions++;
281
/* extension is critical ? */
282
critical = &extension->critical;
283
if (critical->len == 0 || critical->data[0] == 0) {
286
oid = &extension->id;
288
PKIX_PL_OID_CreateBySECItem(oid, &pkixOID, plContext),
289
PKIX_OIDCREATEFAILED);
291
PKIX_List_AppendItem(oidsList, (PKIX_PL_Object *)pkixOID,
293
PKIX_LISTAPPENDITEMFAILED);
294
PKIX_DECREF(pkixOID);
408
298
*pOidsList = oidsList;
418
307
/* --Public-Functions------------------------------------------------------- */
421
* FUNCTION: PKIX_PL_OID_Create (see comments in pkix_pl_system.h)
310
* FUNCTION: PKIX_PL_OID_CreateBySECItem (see comments in pkix_pl_system.h)
313
PKIX_PL_OID_CreateBySECItem(
426
315
PKIX_PL_OID **pOID,
429
318
PKIX_PL_OID *oid = NULL;
430
char *strCpy1 = NULL;
431
char *strCpy2 = NULL;
433
PKIX_UInt32 numTokens, i, length;
435
PKIX_Boolean firstFieldTwo;
436
PKIX_UInt32 *components = NULL;
439
PKIX_ENTER(OID, "PKIX_PL_OID_Create");
440
PKIX_NULLCHECK_TWO(pOID, stringRep);
442
PKIX_OID_DEBUG("\tCalling PL_strlen).\n");
443
length = PL_strlen(stringRep);
446
PKIX_ERROR(PKIX_OIDLENGTHTOOSHORT);
449
for (i = 0; i < length; i++) {
450
if ((!PKIX_ISDIGIT(stringRep[i]))&&(stringRep[i] != '.')) {
451
PKIX_ERROR(PKIX_ILLEGALCHARACTERINOID);
455
/* Check that string doesn't have extra dots */
456
if ((stringRep[0] == '.') ||
457
(stringRep[length-1] == '.')||
458
(PL_strstr(stringRep, "..") != NULL)) {
459
PKIX_ERROR(PKIX_ILLEGALDOTINOID);
462
PKIX_OID_DEBUG("\tCalling PL_strdup).\n");
464
strCpy1 = PL_strdup(stringRep);
465
strCpy2 = PL_strdup(stringRep);
467
/* Validate and tally the number of tokens */
469
PKIX_CHECK(pkix_pl_OID_GetNextToken
470
(strCpy1, &token, &rem, plContext),
471
PKIX_OIDGETNEXTTOKENFAILED);
473
for (numTokens = 0; token != NULL; numTokens++){
474
if (numTokens == 0) {
475
/* We know the string is all digits */
476
PKIX_OID_DEBUG("\tCalling PORT_Atoi).\n");
477
value = PORT_Atoi(token);
479
PKIX_ERROR(PKIX_FIRSTFIELDMUSTBEBETWEEN02);
482
/* Set a flag if the first field is 2 */
483
firstFieldTwo = (value == 2);
484
} else if (numTokens == 1) {
485
PKIX_OID_DEBUG("\tCalling PORT_Atoi).\n");
486
value = PORT_Atoi(token);
487
if ((!firstFieldTwo)&&(value > 39)) {
489
(PKIX_SECONDFIELDMUSTBEBETWEEN039);
493
/* Check for 32-bit overflow */
494
if (pkix_pl_UInt32_Overflows(token)){
495
PKIX_ERROR(PKIX_OIDCOMPONENTTOOBIG);
498
PKIX_CHECK(pkix_pl_OID_GetNextToken
499
(rem, &token, &rem, plContext),
500
PKIX_OIDGETNEXTTOKENFAILED);
504
PKIX_ERROR(PKIX_OIDNEEDS2ORMOREFIELDS);
507
PKIX_CHECK(PKIX_PL_Malloc
508
(numTokens * sizeof (PKIX_UInt32),
509
(void **)&components, plContext),
512
PKIX_CHECK(pkix_pl_OID_GetNextToken
513
(strCpy2, &token, &rem, plContext),
514
PKIX_OIDGETNEXTTOKENFAILED);
516
for (i = 0; token != NULL; i++){
517
PKIX_OID_DEBUG("\tCalling PORT_Atoi).\n");
518
components[i] = PORT_Atoi(token);
520
PKIX_CHECK(pkix_pl_OID_GetNextToken
521
(rem, &token, &rem, plContext),
522
PKIX_OIDGETNEXTTOKENFAILED);
321
PKIX_ENTER(OID, "PKIX_PL_OID_CreateBySECItem");
322
PKIX_NULLCHECK_TWO(pOID, derOid);
525
324
PKIX_CHECK(PKIX_PL_Object_Alloc
527
326
sizeof (PKIX_PL_OID),
528
327
(PKIX_PL_Object **)&oid,
530
329
PKIX_COULDNOTCREATEOBJECT);
532
oid->length = numTokens;
533
oid->components = components;
540
PKIX_OID_DEBUG("\tCalling PL_strfree).\n");
545
PKIX_OID_DEBUG("\tCalling PL_strfree).\n");
549
if (PKIX_ERROR_RECEIVED){
550
PKIX_FREE(components);
330
rv = SECITEM_CopyItem(NULL, &oid->derOid, derOid);
331
if (rv != SECFailure) {
343
* FUNCTION: PKIX_PL_OID_Create (see comments in pkix_pl_system.h)
351
SECOidData *oidData = NULL;
353
PKIX_ENTER(OID, "PKIX_PL_OID_Create");
354
PKIX_NULLCHECK_ONE(pOID);
356
oidData = SECOID_FindOIDByTag((SECOidTag)idtag);
358
PKIX_ERROR(PKIX_SECOIDFINDOIDTAGDESCRIPTIONFAILED);
362
PKIX_PL_OID_CreateBySECItem(&oidData->oid, pOID, plContext);
553
364
PKIX_RETURN(OID);