Index: nss/lib/certdb/genname.c |
diff --git a/nss/lib/certdb/genname.c b/nss/lib/certdb/genname.c |
index 6529a6a097a07af30e006735fcc87d084d63c351..fe48df839c67262d3574e2c5eb94f5e78ae74daf 100644 |
--- a/nss/lib/certdb/genname.c |
+++ b/nss/lib/certdb/genname.c |
@@ -26,13 +26,11 @@ SEC_ASN1_MKSUB(SEC_OctetStringTemplate) |
static const SEC_ASN1Template CERTNameConstraintTemplate[] = { |
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CERTNameConstraint) }, |
{ SEC_ASN1_ANY, offsetof(CERTNameConstraint, DERName) }, |
- { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0, |
- offsetof(CERTNameConstraint, min), |
- SEC_ASN1_SUB(SEC_IntegerTemplate) }, |
- { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 1, |
- offsetof(CERTNameConstraint, max), |
- SEC_ASN1_SUB(SEC_IntegerTemplate) }, |
- { 0, } |
+ { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0, |
+ offsetof(CERTNameConstraint, min), SEC_ASN1_SUB(SEC_IntegerTemplate) }, |
+ { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 1, |
+ offsetof(CERTNameConstraint, max), SEC_ASN1_SUB(SEC_IntegerTemplate) }, |
+ { 0 } |
}; |
const SEC_ASN1Template CERT_NameConstraintSubtreeSubTemplate[] = { |
@@ -41,119 +39,108 @@ const SEC_ASN1Template CERT_NameConstraintSubtreeSubTemplate[] = { |
static const SEC_ASN1Template CERTNameConstraintsTemplate[] = { |
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CERTNameConstraints) }, |
- { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0, |
- offsetof(CERTNameConstraints, DERPermited), |
- CERT_NameConstraintSubtreeSubTemplate}, |
- { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1, |
- offsetof(CERTNameConstraints, DERExcluded), |
- CERT_NameConstraintSubtreeSubTemplate}, |
- { 0, } |
+ { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0, |
+ offsetof(CERTNameConstraints, DERPermited), |
+ CERT_NameConstraintSubtreeSubTemplate }, |
+ { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1, |
+ offsetof(CERTNameConstraints, DERExcluded), |
+ CERT_NameConstraintSubtreeSubTemplate }, |
+ { 0 } |
}; |
- |
static const SEC_ASN1Template CERTOthNameTemplate[] = { |
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(OtherName) }, |
- { SEC_ASN1_OBJECT_ID, |
- offsetof(OtherName, oid) }, |
+ { SEC_ASN1_OBJECT_ID, offsetof(OtherName, oid) }, |
{ SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | |
- SEC_ASN1_XTRN | 0, offsetof(OtherName, name), |
- SEC_ASN1_SUB(SEC_AnyTemplate) }, |
- { 0, } |
+ SEC_ASN1_XTRN | 0, |
+ offsetof(OtherName, name), SEC_ASN1_SUB(SEC_AnyTemplate) }, |
+ { 0 } |
}; |
static const SEC_ASN1Template CERTOtherNameTemplate[] = { |
- { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 0 , |
- offsetof(CERTGeneralName, name.OthName), CERTOthNameTemplate, |
+ { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 0, |
+ offsetof(CERTGeneralName, name.OthName), CERTOthNameTemplate, |
sizeof(CERTGeneralName) } |
}; |
static const SEC_ASN1Template CERT_RFC822NameTemplate[] = { |
- { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 1 , |
- offsetof(CERTGeneralName, name.other), |
- SEC_ASN1_SUB(SEC_IA5StringTemplate), |
- sizeof (CERTGeneralName)} |
+ { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 1, |
+ offsetof(CERTGeneralName, name.other), |
+ SEC_ASN1_SUB(SEC_IA5StringTemplate), sizeof(CERTGeneralName) } |
}; |
static const SEC_ASN1Template CERT_DNSNameTemplate[] = { |
- { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 2 , |
- offsetof(CERTGeneralName, name.other), |
- SEC_ASN1_SUB(SEC_IA5StringTemplate), |
- sizeof (CERTGeneralName)} |
+ { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 2, |
+ offsetof(CERTGeneralName, name.other), |
+ SEC_ASN1_SUB(SEC_IA5StringTemplate), sizeof(CERTGeneralName) } |
}; |
static const SEC_ASN1Template CERT_X400AddressTemplate[] = { |
{ SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | SEC_ASN1_XTRN | 3, |
- offsetof(CERTGeneralName, name.other), SEC_ASN1_SUB(SEC_AnyTemplate), |
- sizeof (CERTGeneralName)} |
+ offsetof(CERTGeneralName, name.other), SEC_ASN1_SUB(SEC_AnyTemplate), |
+ sizeof(CERTGeneralName) } |
}; |
static const SEC_ASN1Template CERT_DirectoryNameTemplate[] = { |
{ SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | |
- SEC_ASN1_XTRN | 4, offsetof(CERTGeneralName, derDirectoryName), |
- SEC_ASN1_SUB(SEC_AnyTemplate), sizeof (CERTGeneralName)} |
+ SEC_ASN1_XTRN | 4, |
+ offsetof(CERTGeneralName, derDirectoryName), |
+ SEC_ASN1_SUB(SEC_AnyTemplate), sizeof(CERTGeneralName) } |
}; |
- |
static const SEC_ASN1Template CERT_EDIPartyNameTemplate[] = { |
{ SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | SEC_ASN1_XTRN | 5, |
- offsetof(CERTGeneralName, name.other), SEC_ASN1_SUB(SEC_AnyTemplate), |
- sizeof (CERTGeneralName)} |
+ offsetof(CERTGeneralName, name.other), SEC_ASN1_SUB(SEC_AnyTemplate), |
+ sizeof(CERTGeneralName) } |
}; |
static const SEC_ASN1Template CERT_URITemplate[] = { |
- { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 6 , |
- offsetof(CERTGeneralName, name.other), |
- SEC_ASN1_SUB(SEC_IA5StringTemplate), |
- sizeof (CERTGeneralName)} |
+ { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 6, |
+ offsetof(CERTGeneralName, name.other), |
+ SEC_ASN1_SUB(SEC_IA5StringTemplate), sizeof(CERTGeneralName) } |
}; |
static const SEC_ASN1Template CERT_IPAddressTemplate[] = { |
- { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 7 , |
- offsetof(CERTGeneralName, name.other), |
- SEC_ASN1_SUB(SEC_OctetStringTemplate), |
- sizeof (CERTGeneralName)} |
+ { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 7, |
+ offsetof(CERTGeneralName, name.other), |
+ SEC_ASN1_SUB(SEC_OctetStringTemplate), sizeof(CERTGeneralName) } |
}; |
static const SEC_ASN1Template CERT_RegisteredIDTemplate[] = { |
- { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 8 , |
- offsetof(CERTGeneralName, name.other), |
- SEC_ASN1_SUB(SEC_ObjectIDTemplate), |
- sizeof (CERTGeneralName)} |
+ { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 8, |
+ offsetof(CERTGeneralName, name.other), SEC_ASN1_SUB(SEC_ObjectIDTemplate), |
+ sizeof(CERTGeneralName) } |
}; |
- |
const SEC_ASN1Template CERT_GeneralNamesTemplate[] = { |
- { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_XTRN , 0, SEC_ASN1_SUB(SEC_AnyTemplate) } |
+ { SEC_ASN1_SEQUENCE_OF | SEC_ASN1_XTRN, 0, SEC_ASN1_SUB(SEC_AnyTemplate) } |
}; |
- |
static struct { |
CERTGeneralNameType type; |
char *name; |
-} typesArray[] = { |
- { certOtherName, "other" }, |
- { certRFC822Name, "email" }, |
- { certRFC822Name, "rfc822" }, |
- { certDNSName, "dns" }, |
- { certX400Address, "x400" }, |
- { certX400Address, "x400addr" }, |
- { certDirectoryName, "directory" }, |
- { certDirectoryName, "dn" }, |
- { certEDIPartyName, "edi" }, |
- { certEDIPartyName, "ediparty" }, |
- { certURI, "uri" }, |
- { certIPAddress, "ip" }, |
- { certIPAddress, "ipaddr" }, |
- { certRegisterID, "registerid" } |
-}; |
+} typesArray[] = { { certOtherName, "other" }, |
+ { certRFC822Name, "email" }, |
+ { certRFC822Name, "rfc822" }, |
+ { certDNSName, "dns" }, |
+ { certX400Address, "x400" }, |
+ { certX400Address, "x400addr" }, |
+ { certDirectoryName, "directory" }, |
+ { certDirectoryName, "dn" }, |
+ { certEDIPartyName, "edi" }, |
+ { certEDIPartyName, "ediparty" }, |
+ { certURI, "uri" }, |
+ { certIPAddress, "ip" }, |
+ { certIPAddress, "ipaddr" }, |
+ { certRegisterID, "registerid" } }; |
CERTGeneralNameType |
CERT_GetGeneralNameTypeFromString(const char *string) |
{ |
- int types_count = sizeof(typesArray)/sizeof(typesArray[0]); |
+ int types_count = sizeof(typesArray) / sizeof(typesArray[0]); |
int i; |
- for (i=0; i < types_count; i++) { |
+ for (i = 0; i < types_count; i++) { |
if (PORT_Strcasecmp(string, typesArray[i].name) == 0) { |
return typesArray[i].type; |
} |
@@ -164,12 +151,11 @@ CERT_GetGeneralNameTypeFromString(const char *string) |
CERTGeneralName * |
CERT_NewGeneralName(PLArenaPool *arena, CERTGeneralNameType type) |
{ |
- CERTGeneralName *name = arena |
- ? PORT_ArenaZNew(arena, CERTGeneralName) |
- : PORT_ZNew(CERTGeneralName); |
+ CERTGeneralName *name = arena ? PORT_ArenaZNew(arena, CERTGeneralName) |
+ : PORT_ZNew(CERTGeneralName); |
if (name) { |
- name->type = type; |
- name->l.prev = name->l.next = &name->l; |
+ name->type = type; |
+ name->l.prev = name->l.next = &name->l; |
} |
return name; |
} |
@@ -179,9 +165,8 @@ CERT_NewGeneralName(PLArenaPool *arena, CERTGeneralNameType type) |
** This function does not change the destinate's GeneralName's list linkage. |
*/ |
SECStatus |
-cert_CopyOneGeneralName(PLArenaPool *arena, |
- CERTGeneralName *dest, |
- CERTGeneralName *src) |
+cert_CopyOneGeneralName(PLArenaPool *arena, CERTGeneralName *dest, |
+ CERTGeneralName *src) |
{ |
SECStatus rv; |
void *mark = NULL; |
@@ -192,27 +177,25 @@ cert_CopyOneGeneralName(PLArenaPool *arena, |
mark = PORT_ArenaMark(arena); |
switch (src->type) { |
- case certDirectoryName: |
- rv = SECITEM_CopyItem(arena, &dest->derDirectoryName, |
- &src->derDirectoryName); |
- if (rv == SECSuccess) |
- rv = CERT_CopyName(arena, &dest->name.directoryName, |
- &src->name.directoryName); |
- break; |
- |
- case certOtherName: |
- rv = SECITEM_CopyItem(arena, &dest->name.OthName.name, |
- &src->name.OthName.name); |
- if (rv == SECSuccess) |
- rv = SECITEM_CopyItem(arena, &dest->name.OthName.oid, |
- &src->name.OthName.oid); |
- break; |
- |
- default: |
- rv = SECITEM_CopyItem(arena, &dest->name.other, |
- &src->name.other); |
- break; |
- |
+ case certDirectoryName: |
+ rv = SECITEM_CopyItem(arena, &dest->derDirectoryName, |
+ &src->derDirectoryName); |
+ if (rv == SECSuccess) |
+ rv = CERT_CopyName(arena, &dest->name.directoryName, |
+ &src->name.directoryName); |
+ break; |
+ |
+ case certOtherName: |
+ rv = SECITEM_CopyItem(arena, &dest->name.OthName.name, |
+ &src->name.OthName.name); |
+ if (rv == SECSuccess) |
+ rv = SECITEM_CopyItem(arena, &dest->name.OthName.oid, |
+ &src->name.OthName.oid); |
+ break; |
+ |
+ default: |
+ rv = SECITEM_CopyItem(arena, &dest->name.other, &src->name.other); |
+ break; |
} |
if (rv != SECSuccess) { |
PORT_ArenaRelease(arena, mark); |
@@ -222,50 +205,50 @@ cert_CopyOneGeneralName(PLArenaPool *arena, |
return rv; |
} |
- |
void |
CERT_DestroyGeneralNameList(CERTGeneralNameList *list) |
{ |
PZLock *lock; |
if (list != NULL) { |
- lock = list->lock; |
- PZ_Lock(lock); |
- if (--list->refCount <= 0 && list->arena != NULL) { |
- PORT_FreeArena(list->arena, PR_FALSE); |
- PZ_Unlock(lock); |
- PZ_DestroyLock(lock); |
- } else { |
- PZ_Unlock(lock); |
- } |
+ lock = list->lock; |
+ PZ_Lock(lock); |
+ if (--list->refCount <= 0 && list->arena != NULL) { |
+ PORT_FreeArena(list->arena, PR_FALSE); |
+ PZ_Unlock(lock); |
+ PZ_DestroyLock(lock); |
+ } else { |
+ PZ_Unlock(lock); |
+ } |
} |
return; |
} |
CERTGeneralNameList * |
-CERT_CreateGeneralNameList(CERTGeneralName *name) { |
+CERT_CreateGeneralNameList(CERTGeneralName *name) |
+{ |
PLArenaPool *arena; |
CERTGeneralNameList *list = NULL; |
arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); |
if (arena == NULL) { |
- goto done; |
+ goto done; |
} |
list = PORT_ArenaZNew(arena, CERTGeneralNameList); |
if (!list) |
- goto loser; |
+ goto loser; |
if (name != NULL) { |
- SECStatus rv; |
- list->name = CERT_NewGeneralName(arena, (CERTGeneralNameType)0); |
- if (!list->name) |
- goto loser; |
- rv = CERT_CopyGeneralName(arena, list->name, name); |
- if (rv != SECSuccess) |
- goto loser; |
+ SECStatus rv; |
+ list->name = CERT_NewGeneralName(arena, (CERTGeneralNameType)0); |
+ if (!list->name) |
+ goto loser; |
+ rv = CERT_CopyGeneralName(arena, list->name, name); |
+ if (rv != SECSuccess) |
+ goto loser; |
} |
list->lock = PZ_NewLock(nssILockList); |
if (!list->lock) |
- goto loser; |
+ goto loser; |
list->arena = arena; |
list->refCount = 1; |
done: |
@@ -280,9 +263,9 @@ CERTGeneralName * |
CERT_GetNextGeneralName(CERTGeneralName *current) |
{ |
PRCList *next; |
- |
+ |
next = current->l.next; |
- return (CERTGeneralName *) (((char *) next) - offsetof(CERTGeneralName, l)); |
+ return (CERTGeneralName *)(((char *)next) - offsetof(CERTGeneralName, l)); |
} |
CERTGeneralName * |
@@ -290,16 +273,17 @@ CERT_GetPrevGeneralName(CERTGeneralName *current) |
{ |
PRCList *prev; |
prev = current->l.prev; |
- return (CERTGeneralName *) (((char *) prev) - offsetof(CERTGeneralName, l)); |
+ return (CERTGeneralName *)(((char *)prev) - offsetof(CERTGeneralName, l)); |
} |
CERTNameConstraint * |
CERT_GetNextNameConstraint(CERTNameConstraint *current) |
{ |
PRCList *next; |
- |
+ |
next = current->l.next; |
- return (CERTNameConstraint *) (((char *) next) - offsetof(CERTNameConstraint, l)); |
+ return (CERTNameConstraint *)(((char *)next) - |
+ offsetof(CERTNameConstraint, l)); |
} |
CERTNameConstraint * |
@@ -307,58 +291,78 @@ CERT_GetPrevNameConstraint(CERTNameConstraint *current) |
{ |
PRCList *prev; |
prev = current->l.prev; |
- return (CERTNameConstraint *) (((char *) prev) - offsetof(CERTNameConstraint, l)); |
+ return (CERTNameConstraint *)(((char *)prev) - |
+ offsetof(CERTNameConstraint, l)); |
} |
SECItem * |
-CERT_EncodeGeneralName(CERTGeneralName *genName, SECItem *dest, PLArenaPool *arena) |
+CERT_EncodeGeneralName(CERTGeneralName *genName, SECItem *dest, |
+ PLArenaPool *arena) |
{ |
- const SEC_ASN1Template * template; |
+ const SEC_ASN1Template *template; |
PORT_Assert(arena); |
if (arena == NULL) { |
- PORT_SetError(SEC_ERROR_INVALID_ARGS); |
- return NULL; |
+ PORT_SetError(SEC_ERROR_INVALID_ARGS); |
+ return NULL; |
} |
/* TODO: mark arena */ |
if (dest == NULL) { |
- dest = PORT_ArenaZNew(arena, SECItem); |
- if (!dest) |
- goto loser; |
+ dest = PORT_ArenaZNew(arena, SECItem); |
+ if (!dest) |
+ goto loser; |
} |
if (genName->type == certDirectoryName) { |
- if (genName->derDirectoryName.data == NULL) { |
- /* The field hasn't been encoded yet. */ |
- SECItem * pre_dest = |
- SEC_ASN1EncodeItem (arena, &(genName->derDirectoryName), |
- &(genName->name.directoryName), |
- CERT_NameTemplate); |
+ if (genName->derDirectoryName.data == NULL) { |
+ /* The field hasn't been encoded yet. */ |
+ SECItem *pre_dest = SEC_ASN1EncodeItem( |
+ arena, &(genName->derDirectoryName), |
+ &(genName->name.directoryName), CERT_NameTemplate); |
if (!pre_dest) |
goto loser; |
- } |
- if (genName->derDirectoryName.data == NULL) { |
- goto loser; |
- } |
+ } |
+ if (genName->derDirectoryName.data == NULL) { |
+ goto loser; |
+ } |
} |
switch (genName->type) { |
- case certURI: template = CERT_URITemplate; break; |
- case certRFC822Name: template = CERT_RFC822NameTemplate; break; |
- case certDNSName: template = CERT_DNSNameTemplate; break; |
- case certIPAddress: template = CERT_IPAddressTemplate; break; |
- case certOtherName: template = CERTOtherNameTemplate; break; |
- case certRegisterID: template = CERT_RegisteredIDTemplate; break; |
- /* for this type, we expect the value is already encoded */ |
- case certEDIPartyName: template = CERT_EDIPartyNameTemplate; break; |
- /* for this type, we expect the value is already encoded */ |
- case certX400Address: template = CERT_X400AddressTemplate; break; |
- case certDirectoryName: template = CERT_DirectoryNameTemplate; break; |
- default: |
- PORT_Assert(0); goto loser; |
+ case certURI: |
+ template = CERT_URITemplate; |
+ break; |
+ case certRFC822Name: |
+ template = CERT_RFC822NameTemplate; |
+ break; |
+ case certDNSName: |
+ template = CERT_DNSNameTemplate; |
+ break; |
+ case certIPAddress: |
+ template = CERT_IPAddressTemplate; |
+ break; |
+ case certOtherName: |
+ template = CERTOtherNameTemplate; |
+ break; |
+ case certRegisterID: |
+ template = CERT_RegisteredIDTemplate; |
+ break; |
+ /* for this type, we expect the value is already encoded */ |
+ case certEDIPartyName: |
+ template = CERT_EDIPartyNameTemplate; |
+ break; |
+ /* for this type, we expect the value is already encoded */ |
+ case certX400Address: |
+ template = CERT_X400AddressTemplate; |
+ break; |
+ case certDirectoryName: |
+ template = CERT_DirectoryNameTemplate; |
+ break; |
+ default: |
+ PORT_Assert(0); |
+ goto loser; |
} |
dest = SEC_ASN1EncodeItem(arena, dest, genName, template); |
if (!dest) { |
- goto loser; |
+ goto loser; |
} |
/* TODO: unmark arena */ |
return dest; |
@@ -370,34 +374,34 @@ loser: |
SECItem ** |
cert_EncodeGeneralNames(PLArenaPool *arena, CERTGeneralName *names) |
{ |
- CERTGeneralName *current_name; |
- SECItem **items = NULL; |
- int count = 0; |
- int i; |
- PRCList *head; |
+ CERTGeneralName *current_name; |
+ SECItem **items = NULL; |
+ int count = 0; |
+ int i; |
+ PRCList *head; |
PORT_Assert(arena); |
/* TODO: mark arena */ |
current_name = names; |
if (names != NULL) { |
- count = 1; |
+ count = 1; |
} |
head = &(names->l); |
while (current_name->l.next != head) { |
- current_name = CERT_GetNextGeneralName(current_name); |
- ++count; |
+ current_name = CERT_GetNextGeneralName(current_name); |
+ ++count; |
} |
current_name = CERT_GetNextGeneralName(current_name); |
items = PORT_ArenaNewArray(arena, SECItem *, count + 1); |
if (items == NULL) { |
- goto loser; |
+ goto loser; |
} |
for (i = 0; i < count; i++) { |
- items[i] = CERT_EncodeGeneralName(current_name, (SECItem *)NULL, arena); |
- if (items[i] == NULL) { |
- goto loser; |
- } |
- current_name = CERT_GetNextGeneralName(current_name); |
+ items[i] = CERT_EncodeGeneralName(current_name, (SECItem *)NULL, arena); |
+ if (items[i] == NULL) { |
+ goto loser; |
+ } |
+ current_name = CERT_GetNextGeneralName(current_name); |
} |
items[i] = NULL; |
/* TODO: unmark arena */ |
@@ -408,14 +412,13 @@ loser: |
} |
CERTGeneralName * |
-CERT_DecodeGeneralName(PLArenaPool *reqArena, |
- SECItem *encodedName, |
- CERTGeneralName *genName) |
+CERT_DecodeGeneralName(PLArenaPool *reqArena, SECItem *encodedName, |
+ CERTGeneralName *genName) |
{ |
- const SEC_ASN1Template * template; |
- CERTGeneralNameType genNameType; |
- SECStatus rv = SECSuccess; |
- SECItem* newEncodedName; |
+ const SEC_ASN1Template *template; |
+ CERTGeneralNameType genNameType; |
+ SECStatus rv = SECSuccess; |
+ SECItem *newEncodedName; |
if (!reqArena) { |
PORT_SetError(SEC_ERROR_INVALID_ARGS); |
@@ -430,36 +433,54 @@ CERT_DecodeGeneralName(PLArenaPool *reqArena, |
/* TODO: mark arena */ |
genNameType = (CERTGeneralNameType)((*(newEncodedName->data) & 0x0f) + 1); |
if (genName == NULL) { |
- genName = CERT_NewGeneralName(reqArena, genNameType); |
- if (!genName) |
- goto loser; |
+ genName = CERT_NewGeneralName(reqArena, genNameType); |
+ if (!genName) |
+ goto loser; |
} else { |
- genName->type = genNameType; |
- genName->l.prev = genName->l.next = &genName->l; |
+ genName->type = genNameType; |
+ genName->l.prev = genName->l.next = &genName->l; |
} |
switch (genNameType) { |
- case certURI: template = CERT_URITemplate; break; |
- case certRFC822Name: template = CERT_RFC822NameTemplate; break; |
- case certDNSName: template = CERT_DNSNameTemplate; break; |
- case certIPAddress: template = CERT_IPAddressTemplate; break; |
- case certOtherName: template = CERTOtherNameTemplate; break; |
- case certRegisterID: template = CERT_RegisteredIDTemplate; break; |
- case certEDIPartyName: template = CERT_EDIPartyNameTemplate; break; |
- case certX400Address: template = CERT_X400AddressTemplate; break; |
- case certDirectoryName: template = CERT_DirectoryNameTemplate; break; |
- default: |
- goto loser; |
+ case certURI: |
+ template = CERT_URITemplate; |
+ break; |
+ case certRFC822Name: |
+ template = CERT_RFC822NameTemplate; |
+ break; |
+ case certDNSName: |
+ template = CERT_DNSNameTemplate; |
+ break; |
+ case certIPAddress: |
+ template = CERT_IPAddressTemplate; |
+ break; |
+ case certOtherName: |
+ template = CERTOtherNameTemplate; |
+ break; |
+ case certRegisterID: |
+ template = CERT_RegisteredIDTemplate; |
+ break; |
+ case certEDIPartyName: |
+ template = CERT_EDIPartyNameTemplate; |
+ break; |
+ case certX400Address: |
+ template = CERT_X400AddressTemplate; |
+ break; |
+ case certDirectoryName: |
+ template = CERT_DirectoryNameTemplate; |
+ break; |
+ default: |
+ goto loser; |
} |
rv = SEC_QuickDERDecodeItem(reqArena, genName, template, newEncodedName); |
- if (rv != SECSuccess) |
- goto loser; |
+ if (rv != SECSuccess) |
+ goto loser; |
if (genNameType == certDirectoryName) { |
- rv = SEC_QuickDERDecodeItem(reqArena, &(genName->name.directoryName), |
- CERT_NameTemplate, |
- &(genName->derDirectoryName)); |
+ rv = SEC_QuickDERDecodeItem(reqArena, &(genName->name.directoryName), |
+ CERT_NameTemplate, |
+ &(genName->derDirectoryName)); |
if (rv != SECSuccess) |
- goto loser; |
+ goto loser; |
} |
/* TODO: unmark arena */ |
@@ -470,35 +491,34 @@ loser: |
} |
CERTGeneralName * |
-cert_DecodeGeneralNames (PLArenaPool *arena, |
- SECItem **encodedGenName) |
+cert_DecodeGeneralNames(PLArenaPool *arena, SECItem **encodedGenName) |
{ |
- PRCList *head = NULL; |
- PRCList *tail = NULL; |
- CERTGeneralName *currentName = NULL; |
+ PRCList *head = NULL; |
+ PRCList *tail = NULL; |
+ CERTGeneralName *currentName = NULL; |
PORT_Assert(arena); |
if (!encodedGenName || !arena) { |
- PORT_SetError(SEC_ERROR_INVALID_ARGS); |
- return NULL; |
+ PORT_SetError(SEC_ERROR_INVALID_ARGS); |
+ return NULL; |
} |
/* TODO: mark arena */ |
while (*encodedGenName != NULL) { |
- currentName = CERT_DecodeGeneralName(arena, *encodedGenName, NULL); |
- if (currentName == NULL) |
- break; |
- if (head == NULL) { |
- head = &(currentName->l); |
- tail = head; |
- } |
- currentName->l.next = head; |
- currentName->l.prev = tail; |
- tail = head->prev = tail->next = &(currentName->l); |
- encodedGenName++; |
+ currentName = CERT_DecodeGeneralName(arena, *encodedGenName, NULL); |
+ if (currentName == NULL) |
+ break; |
+ if (head == NULL) { |
+ head = &(currentName->l); |
+ tail = head; |
+ } |
+ currentName->l.next = head; |
+ currentName->l.prev = tail; |
+ tail = head->prev = tail->next = &(currentName->l); |
+ encodedGenName++; |
} |
if (currentName) { |
- /* TODO: unmark arena */ |
- return CERT_GetNextGeneralName(currentName); |
+ /* TODO: unmark arena */ |
+ return CERT_GetNextGeneralName(currentName); |
} |
/* TODO: release arena to mark */ |
return NULL; |
@@ -513,76 +533,73 @@ CERT_DestroyGeneralName(CERTGeneralName *name) |
SECStatus |
cert_DestroyGeneralNames(CERTGeneralName *name) |
{ |
- CERTGeneralName *first; |
- CERTGeneralName *next = NULL; |
- |
+ CERTGeneralName *first; |
+ CERTGeneralName *next = NULL; |
first = name; |
do { |
- next = CERT_GetNextGeneralName(name); |
- PORT_Free(name); |
- name = next; |
+ next = CERT_GetNextGeneralName(name); |
+ PORT_Free(name); |
+ name = next; |
} while (name != first); |
return SECSuccess; |
} |
static SECItem * |
-cert_EncodeNameConstraint(CERTNameConstraint *constraint, |
- SECItem *dest, |
- PLArenaPool *arena) |
+cert_EncodeNameConstraint(CERTNameConstraint *constraint, SECItem *dest, |
+ PLArenaPool *arena) |
{ |
PORT_Assert(arena); |
if (dest == NULL) { |
- dest = PORT_ArenaZNew(arena, SECItem); |
- if (dest == NULL) { |
- return NULL; |
- } |
+ dest = PORT_ArenaZNew(arena, SECItem); |
+ if (dest == NULL) { |
+ return NULL; |
+ } |
} |
CERT_EncodeGeneralName(&(constraint->name), &(constraint->DERName), arena); |
- |
- dest = SEC_ASN1EncodeItem (arena, dest, constraint, |
- CERTNameConstraintTemplate); |
+ |
+ dest = |
+ SEC_ASN1EncodeItem(arena, dest, constraint, CERTNameConstraintTemplate); |
return dest; |
-} |
+} |
-SECStatus |
-cert_EncodeNameConstraintSubTree(CERTNameConstraint *constraints, |
- PLArenaPool *arena, |
- SECItem ***dest, |
- PRBool permited) |
+SECStatus |
+cert_EncodeNameConstraintSubTree(CERTNameConstraint *constraints, |
+ PLArenaPool *arena, SECItem ***dest, |
+ PRBool permited) |
{ |
- CERTNameConstraint *current_constraint = constraints; |
- SECItem **items = NULL; |
- int count = 0; |
- int i; |
- PRCList *head; |
+ CERTNameConstraint *current_constraint = constraints; |
+ SECItem **items = NULL; |
+ int count = 0; |
+ int i; |
+ PRCList *head; |
PORT_Assert(arena); |
/* TODO: mark arena */ |
if (constraints != NULL) { |
- count = 1; |
+ count = 1; |
} |
head = &constraints->l; |
while (current_constraint->l.next != head) { |
- current_constraint = CERT_GetNextNameConstraint(current_constraint); |
- ++count; |
+ current_constraint = CERT_GetNextNameConstraint(current_constraint); |
+ ++count; |
} |
current_constraint = CERT_GetNextNameConstraint(current_constraint); |
items = PORT_ArenaZNewArray(arena, SECItem *, count + 1); |
if (items == NULL) { |
- goto loser; |
+ goto loser; |
} |
for (i = 0; i < count; i++) { |
- items[i] = cert_EncodeNameConstraint(current_constraint, |
- (SECItem *) NULL, arena); |
- if (items[i] == NULL) { |
- goto loser; |
- } |
- current_constraint = CERT_GetNextNameConstraint(current_constraint); |
+ items[i] = cert_EncodeNameConstraint(current_constraint, |
+ (SECItem *)NULL, arena); |
+ if (items[i] == NULL) { |
+ goto loser; |
+ } |
+ current_constraint = CERT_GetNextNameConstraint(current_constraint); |
} |
*dest = items; |
if (*dest == NULL) { |
- goto loser; |
+ goto loser; |
} |
/* TODO: unmark arena */ |
return SECSuccess; |
@@ -591,35 +608,32 @@ loser: |
return SECFailure; |
} |
-SECStatus |
-cert_EncodeNameConstraints(CERTNameConstraints *constraints, |
- PLArenaPool *arena, |
- SECItem *dest) |
+SECStatus |
+cert_EncodeNameConstraints(CERTNameConstraints *constraints, PLArenaPool *arena, |
+ SECItem *dest) |
{ |
- SECStatus rv = SECSuccess; |
+ SECStatus rv = SECSuccess; |
PORT_Assert(arena); |
/* TODO: mark arena */ |
if (constraints->permited != NULL) { |
- rv = cert_EncodeNameConstraintSubTree(constraints->permited, arena, |
- &constraints->DERPermited, |
- PR_TRUE); |
- if (rv == SECFailure) { |
- goto loser; |
- } |
+ rv = cert_EncodeNameConstraintSubTree( |
+ constraints->permited, arena, &constraints->DERPermited, PR_TRUE); |
+ if (rv == SECFailure) { |
+ goto loser; |
+ } |
} |
if (constraints->excluded != NULL) { |
- rv = cert_EncodeNameConstraintSubTree(constraints->excluded, arena, |
- &constraints->DERExcluded, |
- PR_FALSE); |
- if (rv == SECFailure) { |
- goto loser; |
- } |
+ rv = cert_EncodeNameConstraintSubTree( |
+ constraints->excluded, arena, &constraints->DERExcluded, PR_FALSE); |
+ if (rv == SECFailure) { |
+ goto loser; |
+ } |
} |
- dest = SEC_ASN1EncodeItem(arena, dest, constraints, |
- CERTNameConstraintsTemplate); |
+ dest = SEC_ASN1EncodeItem(arena, dest, constraints, |
+ CERTNameConstraintsTemplate); |
if (dest == NULL) { |
- goto loser; |
+ goto loser; |
} |
/* TODO: unmark arena */ |
return SECSuccess; |
@@ -628,15 +642,13 @@ loser: |
return SECFailure; |
} |
- |
CERTNameConstraint * |
-cert_DecodeNameConstraint(PLArenaPool *reqArena, |
- SECItem *encodedConstraint) |
+cert_DecodeNameConstraint(PLArenaPool *reqArena, SECItem *encodedConstraint) |
{ |
- CERTNameConstraint *constraint; |
- SECStatus rv = SECSuccess; |
- CERTGeneralName *temp; |
- SECItem* newEncodedConstraint; |
+ CERTNameConstraint *constraint; |
+ SECStatus rv = SECSuccess; |
+ CERTGeneralName *temp; |
+ SECItem *newEncodedConstraint; |
if (!reqArena) { |
PORT_SetError(SEC_ERROR_INVALID_ARGS); |
@@ -649,21 +661,20 @@ cert_DecodeNameConstraint(PLArenaPool *reqArena, |
/* TODO: mark arena */ |
constraint = PORT_ArenaZNew(reqArena, CERTNameConstraint); |
if (!constraint) |
- goto loser; |
- rv = SEC_QuickDERDecodeItem(reqArena, constraint, |
- CERTNameConstraintTemplate, |
- newEncodedConstraint); |
+ goto loser; |
+ rv = SEC_QuickDERDecodeItem( |
+ reqArena, constraint, CERTNameConstraintTemplate, newEncodedConstraint); |
if (rv != SECSuccess) { |
- goto loser; |
+ goto loser; |
} |
temp = CERT_DecodeGeneralName(reqArena, &(constraint->DERName), |
&(constraint->name)); |
if (temp != &(constraint->name)) { |
- goto loser; |
+ goto loser; |
} |
- /* ### sjlee: since the name constraint contains only one |
- * CERTGeneralName, the list within CERTGeneralName shouldn't |
+ /* ### sjlee: since the name constraint contains only one |
+ * CERTGeneralName, the list within CERTGeneralName shouldn't |
* point anywhere else. Otherwise, bad things will happen. |
*/ |
constraint->name.l.prev = constraint->name.l.next = &(constraint->name.l); |
@@ -675,30 +686,29 @@ loser: |
} |
static CERTNameConstraint * |
-cert_DecodeNameConstraintSubTree(PLArenaPool *arena, |
- SECItem **subTree, |
- PRBool permited) |
+cert_DecodeNameConstraintSubTree(PLArenaPool *arena, SECItem **subTree, |
+ PRBool permited) |
{ |
- CERTNameConstraint *current = NULL; |
- CERTNameConstraint *first = NULL; |
- CERTNameConstraint *last = NULL; |
- int i = 0; |
+ CERTNameConstraint *current = NULL; |
+ CERTNameConstraint *first = NULL; |
+ CERTNameConstraint *last = NULL; |
+ int i = 0; |
PORT_Assert(arena); |
/* TODO: mark arena */ |
while (subTree[i] != NULL) { |
- current = cert_DecodeNameConstraint(arena, subTree[i]); |
- if (current == NULL) { |
- goto loser; |
- } |
- if (first == NULL) { |
- first = current; |
- } else { |
- current->l.prev = &(last->l); |
- last->l.next = &(current->l); |
- } |
- last = current; |
- i++; |
+ current = cert_DecodeNameConstraint(arena, subTree[i]); |
+ if (current == NULL) { |
+ goto loser; |
+ } |
+ if (first == NULL) { |
+ first = current; |
+ } else { |
+ current->l.prev = &(last->l); |
+ last->l.next = &(current->l); |
+ } |
+ last = current; |
+ i++; |
} |
first->l.prev = &(last->l); |
last->l.next = &(first->l); |
@@ -710,12 +720,12 @@ loser: |
} |
CERTNameConstraints * |
-cert_DecodeNameConstraints(PLArenaPool *reqArena, |
- const SECItem *encodedConstraints) |
+cert_DecodeNameConstraints(PLArenaPool *reqArena, |
+ const SECItem *encodedConstraints) |
{ |
- CERTNameConstraints *constraints; |
- SECStatus rv; |
- SECItem* newEncodedConstraints; |
+ CERTNameConstraints *constraints; |
+ SECStatus rv; |
+ SECItem *newEncodedConstraints; |
if (!reqArena) { |
PORT_SetError(SEC_ERROR_INVALID_ARGS); |
@@ -727,33 +737,29 @@ cert_DecodeNameConstraints(PLArenaPool *reqArena, |
/* TODO: mark arena */ |
constraints = PORT_ArenaZNew(reqArena, CERTNameConstraints); |
if (constraints == NULL) { |
- goto loser; |
+ goto loser; |
} |
rv = SEC_QuickDERDecodeItem(reqArena, constraints, |
CERTNameConstraintsTemplate, |
newEncodedConstraints); |
if (rv != SECSuccess) { |
- goto loser; |
+ goto loser; |
} |
- if (constraints->DERPermited != NULL && |
+ if (constraints->DERPermited != NULL && |
constraints->DERPermited[0] != NULL) { |
- constraints->permited = |
- cert_DecodeNameConstraintSubTree(reqArena, |
- constraints->DERPermited, |
- PR_TRUE); |
- if (constraints->permited == NULL) { |
- goto loser; |
- } |
+ constraints->permited = cert_DecodeNameConstraintSubTree( |
+ reqArena, constraints->DERPermited, PR_TRUE); |
+ if (constraints->permited == NULL) { |
+ goto loser; |
+ } |
} |
- if (constraints->DERExcluded != NULL && |
+ if (constraints->DERExcluded != NULL && |
constraints->DERExcluded[0] != NULL) { |
- constraints->excluded = |
- cert_DecodeNameConstraintSubTree(reqArena, |
- constraints->DERExcluded, |
- PR_FALSE); |
- if (constraints->excluded == NULL) { |
- goto loser; |
- } |
+ constraints->excluded = cert_DecodeNameConstraintSubTree( |
+ reqArena, constraints->DERExcluded, PR_FALSE); |
+ if (constraints->excluded == NULL) { |
+ goto loser; |
+ } |
} |
/* TODO: unmark arena */ |
return constraints; |
@@ -763,22 +769,21 @@ loser: |
} |
/* Copy a chain of one or more general names to a destination chain. |
-** Caller has allocated at least the first destination GeneralName struct. |
+** Caller has allocated at least the first destination GeneralName struct. |
** Both source and destination chains are circular doubly-linked lists. |
** The first source struct is copied to the first destination struct. |
-** If the source chain has more than one member, and the destination chain |
-** has only one member, then this function allocates new structs for all but |
-** the first copy from the arena and links them into the destination list. |
+** If the source chain has more than one member, and the destination chain |
+** has only one member, then this function allocates new structs for all but |
+** the first copy from the arena and links them into the destination list. |
** If the destination struct is part of a list with more than one member, |
** then this function traverses both the source and destination lists, |
** copying each source struct to the corresponding dest struct. |
-** In that case, the destination list MUST contain at least as many |
+** In that case, the destination list MUST contain at least as many |
** structs as the source list or some dest entries will be overwritten. |
*/ |
SECStatus |
-CERT_CopyGeneralName(PLArenaPool *arena, |
- CERTGeneralName *dest, |
- CERTGeneralName *src) |
+CERT_CopyGeneralName(PLArenaPool *arena, CERTGeneralName *dest, |
+ CERTGeneralName *src) |
{ |
SECStatus rv; |
CERTGeneralName *destHead = dest; |
@@ -786,31 +791,31 @@ CERT_CopyGeneralName(PLArenaPool *arena, |
PORT_Assert(dest != NULL); |
if (!dest) { |
- PORT_SetError(SEC_ERROR_INVALID_ARGS); |
+ PORT_SetError(SEC_ERROR_INVALID_ARGS); |
return SECFailure; |
} |
/* TODO: mark arena */ |
do { |
- rv = cert_CopyOneGeneralName(arena, dest, src); |
- if (rv != SECSuccess) |
- goto loser; |
- src = CERT_GetNextGeneralName(src); |
- /* if there is only one general name, we shouldn't do this */ |
- if (src != srcHead) { |
- if (dest->l.next == &destHead->l) { |
- CERTGeneralName *temp; |
- temp = CERT_NewGeneralName(arena, (CERTGeneralNameType)0); |
- if (!temp) |
- goto loser; |
- temp->l.next = &destHead->l; |
- temp->l.prev = &dest->l; |
- destHead->l.prev = &temp->l; |
- dest->l.next = &temp->l; |
- dest = temp; |
- } else { |
- dest = CERT_GetNextGeneralName(dest); |
- } |
- } |
+ rv = cert_CopyOneGeneralName(arena, dest, src); |
+ if (rv != SECSuccess) |
+ goto loser; |
+ src = CERT_GetNextGeneralName(src); |
+ /* if there is only one general name, we shouldn't do this */ |
+ if (src != srcHead) { |
+ if (dest->l.next == &destHead->l) { |
+ CERTGeneralName *temp; |
+ temp = CERT_NewGeneralName(arena, (CERTGeneralNameType)0); |
+ if (!temp) |
+ goto loser; |
+ temp->l.next = &destHead->l; |
+ temp->l.prev = &dest->l; |
+ destHead->l.prev = &temp->l; |
+ dest->l.next = &temp->l; |
+ dest = temp; |
+ } else { |
+ dest = CERT_GetNextGeneralName(dest); |
+ } |
+ } |
} while (src != srcHead && rv == SECSuccess); |
/* TODO: unmark arena */ |
return rv; |
@@ -819,49 +824,47 @@ loser: |
return SECFailure; |
} |
- |
CERTGeneralNameList * |
CERT_DupGeneralNameList(CERTGeneralNameList *list) |
{ |
if (list != NULL) { |
- PZ_Lock(list->lock); |
- list->refCount++; |
- PZ_Unlock(list->lock); |
+ PZ_Lock(list->lock); |
+ list->refCount++; |
+ PZ_Unlock(list->lock); |
} |
return list; |
} |
/* Allocate space and copy CERTNameConstraint from src to dest */ |
CERTNameConstraint * |
-CERT_CopyNameConstraint(PLArenaPool *arena, |
- CERTNameConstraint *dest, |
- CERTNameConstraint *src) |
+CERT_CopyNameConstraint(PLArenaPool *arena, CERTNameConstraint *dest, |
+ CERTNameConstraint *src) |
{ |
- SECStatus rv; |
- |
+ SECStatus rv; |
+ |
/* TODO: mark arena */ |
if (dest == NULL) { |
- dest = PORT_ArenaZNew(arena, CERTNameConstraint); |
- if (!dest) |
- goto loser; |
- /* mark that it is not linked */ |
- dest->name.l.prev = dest->name.l.next = &(dest->name.l); |
+ dest = PORT_ArenaZNew(arena, CERTNameConstraint); |
+ if (!dest) |
+ goto loser; |
+ /* mark that it is not linked */ |
+ dest->name.l.prev = dest->name.l.next = &(dest->name.l); |
} |
rv = CERT_CopyGeneralName(arena, &dest->name, &src->name); |
if (rv != SECSuccess) { |
- goto loser; |
+ goto loser; |
} |
rv = SECITEM_CopyItem(arena, &dest->DERName, &src->DERName); |
if (rv != SECSuccess) { |
- goto loser; |
+ goto loser; |
} |
rv = SECITEM_CopyItem(arena, &dest->min, &src->min); |
if (rv != SECSuccess) { |
- goto loser; |
+ goto loser; |
} |
rv = SECITEM_CopyItem(arena, &dest->max, &src->max); |
if (rv != SECSuccess) { |
- goto loser; |
+ goto loser; |
} |
dest->l.prev = dest->l.next = &dest->l; |
/* TODO: unmark arena */ |
@@ -871,7 +874,6 @@ loser: |
return NULL; |
} |
- |
CERTGeneralName * |
cert_CombineNamesLists(CERTGeneralName *list1, CERTGeneralName *list2) |
{ |
@@ -880,54 +882,52 @@ cert_CombineNamesLists(CERTGeneralName *list1, CERTGeneralName *list2) |
PRCList *end1; |
PRCList *end2; |
- if (list1 == NULL){ |
- return list2; |
+ if (list1 == NULL) { |
+ return list2; |
} else if (list2 == NULL) { |
- return list1; |
+ return list1; |
} else { |
- begin1 = &list1->l; |
- begin2 = &list2->l; |
- end1 = list1->l.prev; |
- end2 = list2->l.prev; |
- end1->next = begin2; |
- end2->next = begin1; |
- begin1->prev = end2; |
- begin2->prev = end1; |
- return list1; |
+ begin1 = &list1->l; |
+ begin2 = &list2->l; |
+ end1 = list1->l.prev; |
+ end2 = list2->l.prev; |
+ end1->next = begin2; |
+ end2->next = begin1; |
+ begin1->prev = end2; |
+ begin2->prev = end1; |
+ return list1; |
} |
} |
- |
CERTNameConstraint * |
-cert_CombineConstraintsLists(CERTNameConstraint *list1, CERTNameConstraint *list2) |
+cert_CombineConstraintsLists(CERTNameConstraint *list1, |
+ CERTNameConstraint *list2) |
{ |
PRCList *begin1; |
PRCList *begin2; |
PRCList *end1; |
PRCList *end2; |
- if (list1 == NULL){ |
- return list2; |
+ if (list1 == NULL) { |
+ return list2; |
} else if (list2 == NULL) { |
- return list1; |
+ return list1; |
} else { |
- begin1 = &list1->l; |
- begin2 = &list2->l; |
- end1 = list1->l.prev; |
- end2 = list2->l.prev; |
- end1->next = begin2; |
- end2->next = begin1; |
- begin1->prev = end2; |
- begin2->prev = end1; |
- return list1; |
+ begin1 = &list1->l; |
+ begin2 = &list2->l; |
+ end1 = list1->l.prev; |
+ end2 = list2->l.prev; |
+ end1->next = begin2; |
+ end2->next = begin1; |
+ begin1->prev = end2; |
+ begin2->prev = end1; |
+ return list1; |
} |
} |
- |
/* Add a CERTNameConstraint to the CERTNameConstraint list */ |
CERTNameConstraint * |
-CERT_AddNameConstraint(CERTNameConstraint *list, |
- CERTNameConstraint *constraint) |
+CERT_AddNameConstraint(CERTNameConstraint *list, CERTNameConstraint *constraint) |
{ |
PORT_Assert(constraint != NULL); |
constraint->l.next = constraint->l.prev = &constraint->l; |
@@ -935,33 +935,32 @@ CERT_AddNameConstraint(CERTNameConstraint *list, |
return list; |
} |
- |
SECStatus |
-CERT_GetNameConstraintByType (CERTNameConstraint *constraints, |
- CERTGeneralNameType type, |
- CERTNameConstraint **returnList, |
- PLArenaPool *arena) |
+CERT_GetNameConstraintByType(CERTNameConstraint *constraints, |
+ CERTGeneralNameType type, |
+ CERTNameConstraint **returnList, |
+ PLArenaPool *arena) |
{ |
CERTNameConstraint *current = NULL; |
- void *mark = NULL; |
+ void *mark = NULL; |
*returnList = NULL; |
if (!constraints) |
- return SECSuccess; |
+ return SECSuccess; |
mark = PORT_ArenaMark(arena); |
current = constraints; |
do { |
- PORT_Assert(current->name.type); |
- if (current->name.type == type) { |
- CERTNameConstraint *temp; |
- temp = CERT_CopyNameConstraint(arena, NULL, current); |
- if (temp == NULL) |
- goto loser; |
- *returnList = CERT_AddNameConstraint(*returnList, temp); |
- } |
- current = CERT_GetNextNameConstraint(current); |
+ PORT_Assert(current->name.type); |
+ if (current->name.type == type) { |
+ CERTNameConstraint *temp; |
+ temp = CERT_CopyNameConstraint(arena, NULL, current); |
+ if (temp == NULL) |
+ goto loser; |
+ *returnList = CERT_AddNameConstraint(*returnList, temp); |
+ } |
+ current = CERT_GetNextNameConstraint(current); |
} while (current != constraints); |
PORT_ArenaUnmark(arena, mark); |
return SECSuccess; |
@@ -972,39 +971,41 @@ loser: |
} |
void * |
-CERT_GetGeneralNameByType (CERTGeneralName *genNames, |
- CERTGeneralNameType type, PRBool derFormat) |
+CERT_GetGeneralNameByType(CERTGeneralName *genNames, CERTGeneralNameType type, |
+ PRBool derFormat) |
{ |
CERTGeneralName *current; |
- |
+ |
if (!genNames) |
- return NULL; |
+ return NULL; |
current = genNames; |
do { |
- if (current->type == type) { |
- switch (type) { |
- case certDNSName: |
- case certEDIPartyName: |
- case certIPAddress: |
- case certRegisterID: |
- case certRFC822Name: |
- case certX400Address: |
- case certURI: |
- return (void *)¤t->name.other; /* SECItem * */ |
- |
- case certOtherName: |
- return (void *)¤t->name.OthName; /* OthName * */ |
- |
- case certDirectoryName: |
- return derFormat |
- ? (void *)¤t->derDirectoryName /* SECItem * */ |
- : (void *)¤t->name.directoryName; /* CERTName * */ |
- } |
- PORT_Assert(0); |
- return NULL; |
- } |
- current = CERT_GetNextGeneralName(current); |
+ if (current->type == type) { |
+ switch (type) { |
+ case certDNSName: |
+ case certEDIPartyName: |
+ case certIPAddress: |
+ case certRegisterID: |
+ case certRFC822Name: |
+ case certX400Address: |
+ case certURI: |
+ return (void *)¤t->name.other; /* SECItem * */ |
+ |
+ case certOtherName: |
+ return (void *)¤t->name.OthName; /* OthName * */ |
+ |
+ case certDirectoryName: |
+ return derFormat |
+ ? (void *)¤t |
+ ->derDirectoryName /* SECItem * */ |
+ : (void *)¤t->name |
+ .directoryName; /* CERTName * */ |
+ } |
+ PORT_Assert(0); |
+ return NULL; |
+ } |
+ current = CERT_GetNextGeneralName(current); |
} while (current != genNames); |
return NULL; |
} |
@@ -1012,60 +1013,61 @@ CERT_GetGeneralNameByType (CERTGeneralName *genNames, |
int |
CERT_GetNamesLength(CERTGeneralName *names) |
{ |
- int length = 0; |
- CERTGeneralName *first; |
+ int length = 0; |
+ CERTGeneralName *first; |
first = names; |
if (names != NULL) { |
- do { |
- length++; |
- names = CERT_GetNextGeneralName(names); |
- } while (names != first); |
+ do { |
+ length++; |
+ names = CERT_GetNextGeneralName(names); |
+ } while (names != first); |
} |
return length; |
} |
-/* Creates new GeneralNames for any email addresses found in the |
+/* Creates new GeneralNames for any email addresses found in the |
** input DN, and links them onto the list for the DN. |
*/ |
SECStatus |
cert_ExtractDNEmailAddrs(CERTGeneralName *name, PLArenaPool *arena) |
{ |
CERTGeneralName *nameList = NULL; |
- const CERTRDN **nRDNs = (const CERTRDN **)(name->name.directoryName.rdns); |
- SECStatus rv = SECSuccess; |
+ const CERTRDN **nRDNs = (const CERTRDN **)(name->name.directoryName.rdns); |
+ SECStatus rv = SECSuccess; |
PORT_Assert(name->type == certDirectoryName); |
if (name->type != certDirectoryName) { |
PORT_SetError(SEC_ERROR_INVALID_ARGS); |
- return SECFailure; |
+ return SECFailure; |
} |
/* TODO: mark arena */ |
while (nRDNs && *nRDNs) { /* loop over RDNs */ |
- const CERTRDN *nRDN = *nRDNs++; |
- CERTAVA **nAVAs = nRDN->avas; |
- while (nAVAs && *nAVAs) { /* loop over AVAs */ |
- int tag; |
- CERTAVA *nAVA = *nAVAs++; |
- tag = CERT_GetAVATag(nAVA); |
- if ( tag == SEC_OID_PKCS9_EMAIL_ADDRESS || |
- tag == SEC_OID_RFC1274_MAIL) { /* email AVA */ |
- CERTGeneralName *newName = NULL; |
- SECItem *avaValue = CERT_DecodeAVAValue(&nAVA->value); |
- if (!avaValue) |
- goto loser; |
- rv = SECFailure; |
+ const CERTRDN *nRDN = *nRDNs++; |
+ CERTAVA **nAVAs = nRDN->avas; |
+ while (nAVAs && *nAVAs) { /* loop over AVAs */ |
+ int tag; |
+ CERTAVA *nAVA = *nAVAs++; |
+ tag = CERT_GetAVATag(nAVA); |
+ if (tag == SEC_OID_PKCS9_EMAIL_ADDRESS || |
+ tag == SEC_OID_RFC1274_MAIL) { /* email AVA */ |
+ CERTGeneralName *newName = NULL; |
+ SECItem *avaValue = CERT_DecodeAVAValue(&nAVA->value); |
+ if (!avaValue) |
+ goto loser; |
+ rv = SECFailure; |
newName = CERT_NewGeneralName(arena, certRFC822Name); |
- if (newName) { |
- rv = SECITEM_CopyItem(arena, &newName->name.other, avaValue); |
- } |
- SECITEM_FreeItem(avaValue, PR_TRUE); |
- if (rv != SECSuccess) |
- goto loser; |
- nameList = cert_CombineNamesLists(nameList, newName); |
- } /* handle one email AVA */ |
- } /* loop over AVAs */ |
- } /* loop over RDNs */ |
+ if (newName) { |
+ rv = |
+ SECITEM_CopyItem(arena, &newName->name.other, avaValue); |
+ } |
+ SECITEM_FreeItem(avaValue, PR_TRUE); |
+ if (rv != SECSuccess) |
+ goto loser; |
+ nameList = cert_CombineNamesLists(nameList, newName); |
+ } /* handle one email AVA */ |
+ } /* loop over AVAs */ |
+ } /* loop over RDNs */ |
/* combine new names with old one. */ |
name = cert_CombineNamesLists(name, nameList); |
/* TODO: unmark arena */ |
@@ -1076,7 +1078,7 @@ loser: |
return SECFailure; |
} |
-/* Extract all names except Subject Common Name from a cert |
+/* Extract all names except Subject Common Name from a cert |
** in preparation for a name constraints test. |
*/ |
CERTGeneralName * |
@@ -1093,30 +1095,30 @@ CERT_GetConstrainedCertificateNames(const CERTCertificate *cert, |
PLArenaPool *arena, |
PRBool includeSubjectCommonName) |
{ |
- CERTGeneralName *DN; |
- CERTGeneralName *SAN; |
- PRUint32 numDNSNames = 0; |
- SECStatus rv; |
+ CERTGeneralName *DN; |
+ CERTGeneralName *SAN; |
+ PRUint32 numDNSNames = 0; |
+ SECStatus rv; |
if (!arena) { |
- PORT_SetError(SEC_ERROR_INVALID_ARGS); |
- return NULL; |
+ PORT_SetError(SEC_ERROR_INVALID_ARGS); |
+ return NULL; |
} |
/* TODO: mark arena */ |
DN = CERT_NewGeneralName(arena, certDirectoryName); |
if (DN == NULL) { |
- goto loser; |
+ goto loser; |
} |
rv = CERT_CopyName(arena, &DN->name.directoryName, &cert->subject); |
if (rv != SECSuccess) { |
- goto loser; |
+ goto loser; |
} |
rv = SECITEM_CopyItem(arena, &DN->derDirectoryName, &cert->derSubject); |
if (rv != SECSuccess) { |
- goto loser; |
+ goto loser; |
} |
- /* Extract email addresses from DN, construct CERTGeneralName structs |
- ** for them, add them to the name list |
+ /* Extract email addresses from DN, construct CERTGeneralName structs |
+ ** for them, add them to the name list |
*/ |
rv = cert_ExtractDNEmailAddrs(DN, arena); |
if (rv != SECSuccess) |
@@ -1125,35 +1127,35 @@ CERT_GetConstrainedCertificateNames(const CERTCertificate *cert, |
/* Now extract any GeneralNames from the subject name names extension. */ |
SAN = cert_GetSubjectAltNameList(cert, arena); |
if (SAN) { |
- numDNSNames = cert_CountDNSPatterns(SAN); |
- DN = cert_CombineNamesLists(DN, SAN); |
+ numDNSNames = cert_CountDNSPatterns(SAN); |
+ DN = cert_CombineNamesLists(DN, SAN); |
} |
if (!numDNSNames && includeSubjectCommonName) { |
- char *cn = CERT_GetCommonName(&cert->subject); |
- if (cn) { |
- CERTGeneralName *CN = CERT_NewGeneralName(arena, certDNSName); |
- if (CN) { |
- SECItem cnItem = {siBuffer, NULL, 0}; |
- cnItem.data = (unsigned char *)cn; |
- cnItem.len = strlen(cn); |
- rv = SECITEM_CopyItem(arena, &CN->name.other, &cnItem); |
- if (rv == SECSuccess) { |
- DN = cert_CombineNamesLists(DN, CN); |
- } |
- } |
- PORT_Free(cn); |
- } |
+ char *cn = CERT_GetCommonName(&cert->subject); |
+ if (cn) { |
+ CERTGeneralName *CN = CERT_NewGeneralName(arena, certDNSName); |
+ if (CN) { |
+ SECItem cnItem = { siBuffer, NULL, 0 }; |
+ cnItem.data = (unsigned char *)cn; |
+ cnItem.len = strlen(cn); |
+ rv = SECITEM_CopyItem(arena, &CN->name.other, &cnItem); |
+ if (rv == SECSuccess) { |
+ DN = cert_CombineNamesLists(DN, CN); |
+ } |
+ } |
+ PORT_Free(cn); |
+ } |
} |
if (rv == SECSuccess) { |
- /* TODO: unmark arena */ |
- return DN; |
+ /* TODO: unmark arena */ |
+ return DN; |
} |
loser: |
/* TODO: release arena to mark */ |
return NULL; |
} |
-/* Returns SECSuccess if name matches constraint per RFC 3280 rules for |
+/* Returns SECSuccess if name matches constraint per RFC 3280 rules for |
** URI name constraints. SECFailure otherwise. |
** If the constraint begins with a dot, it is a domain name, otherwise |
** It is a host name. Examples: |
@@ -1177,24 +1179,24 @@ compareURIN2C(const SECItem *name, const SECItem *constraint) |
*/ |
if (!constraint->len) |
return SECFailure; |
- if (constraint->data[0] != '.') { |
- /* constraint is a host name. */ |
- if (name->len != constraint->len || |
- PL_strncasecmp((char *)name->data, |
- (char *)constraint->data, constraint->len)) |
- return SECFailure; |
- return SECSuccess; |
+ if (constraint->data[0] != '.') { |
+ /* constraint is a host name. */ |
+ if (name->len != constraint->len || |
+ PL_strncasecmp((char *)name->data, (char *)constraint->data, |
+ constraint->len)) |
+ return SECFailure; |
+ return SECSuccess; |
} |
/* constraint is a domain name. */ |
if (name->len < constraint->len) |
return SECFailure; |
offset = name->len - constraint->len; |
- if (PL_strncasecmp((char *)(name->data + offset), |
- (char *)constraint->data, constraint->len)) |
+ if (PL_strncasecmp((char *)(name->data + offset), (char *)constraint->data, |
+ constraint->len)) |
return SECFailure; |
- if (!offset || |
+ if (!offset || |
(name->data[offset - 1] == '.') + (constraint->data[0] == '.') == 1) |
- return SECSuccess; |
+ return SECSuccess; |
return SECFailure; |
} |
@@ -1217,9 +1219,9 @@ compareURIN2C(const SECItem *name, const SECItem *constraint) |
** foo.bar.com nofoo.bar.com MATCHES NO MATCH |
** .foo.bar.com www.foo.bar.com matches matches? disallowed? |
** .foo.bar.com foo.bar.com no match no match |
-** .foo.bar.com www..foo.bar.com matches probably not |
+** .foo.bar.com www..foo.bar.com matches probably not |
** |
-** We will try to conform to NIST's PKITS tests, and the unstated |
+** We will try to conform to NIST's PKITS tests, and the unstated |
** rules they imply. |
*/ |
static SECStatus |
@@ -1234,12 +1236,12 @@ compareDNSN2C(const SECItem *name, const SECItem *constraint) |
if (name->len < constraint->len) |
return SECFailure; |
offset = name->len - constraint->len; |
- if (PL_strncasecmp((char *)(name->data + offset), |
- (char *)constraint->data, constraint->len)) |
+ if (PL_strncasecmp((char *)(name->data + offset), (char *)constraint->data, |
+ constraint->len)) |
return SECFailure; |
- if (!offset || |
+ if (!offset || |
(name->data[offset - 1] == '.') + (constraint->data[0] == '.') == 1) |
- return SECSuccess; |
+ return SECSuccess; |
return SECFailure; |
} |
@@ -1247,7 +1249,7 @@ compareDNSN2C(const SECItem *name, const SECItem *constraint) |
** internet email addresses. SECFailure otherwise. |
** If constraint contains a '@' then the two strings much match exactly. |
** Else if constraint starts with a '.'. then it must match the right-most |
-** substring of the name, |
+** substring of the name, |
** else constraint string must match entire name after the name's '@'. |
** Empty constraint string matches all names. All comparisons case insensitive. |
*/ |
@@ -1262,16 +1264,17 @@ compareRFC822N2C(const SECItem *name, const SECItem *constraint) |
if (constraint->len == 1 && constraint->data[0] == '.') |
return SECSuccess; |
for (offset = constraint->len - 1; offset >= 0; --offset) { |
- if (constraint->data[offset] == '@') { |
- return (name->len == constraint->len && |
- !PL_strncasecmp((char *)name->data, |
- (char *)constraint->data, constraint->len)) |
- ? SECSuccess : SECFailure; |
- } |
+ if (constraint->data[offset] == '@') { |
+ return (name->len == constraint->len && |
+ !PL_strncasecmp((char *)name->data, |
+ (char *)constraint->data, constraint->len)) |
+ ? SECSuccess |
+ : SECFailure; |
+ } |
} |
offset = name->len - constraint->len; |
- if (PL_strncasecmp((char *)(name->data + offset), |
- (char *)constraint->data, constraint->len)) |
+ if (PL_strncasecmp((char *)(name->data + offset), (char *)constraint->data, |
+ constraint->len)) |
return SECFailure; |
if (constraint->data[0] == '.') |
return SECSuccess; |
@@ -1282,9 +1285,9 @@ compareRFC822N2C(const SECItem *name, const SECItem *constraint) |
/* name contains either a 4 byte IPv4 address or a 16 byte IPv6 address. |
** constraint contains an address of the same length, and a subnet mask |
-** of the same length. Compare name's address to the constraint's |
+** of the same length. Compare name's address to the constraint's |
** address, subject to the mask. |
-** Return SECSuccess if they match, SECFailure if they don't. |
+** Return SECSuccess if they match, SECFailure if they don't. |
*/ |
static SECStatus |
compareIPaddrN2C(const SECItem *name, const SECItem *constraint) |
@@ -1292,67 +1295,67 @@ compareIPaddrN2C(const SECItem *name, const SECItem *constraint) |
int i; |
if (name->len == 4 && constraint->len == 8) { /* ipv4 addr */ |
for (i = 0; i < 4; i++) { |
- if ((name->data[i] ^ constraint->data[i]) & constraint->data[i+4]) |
- goto loser; |
- } |
- return SECSuccess; |
+ if ((name->data[i] ^ constraint->data[i]) & constraint->data[i + 4]) |
+ goto loser; |
+ } |
+ return SECSuccess; |
} |
if (name->len == 16 && constraint->len == 32) { /* ipv6 addr */ |
for (i = 0; i < 16; i++) { |
- if ((name->data[i] ^ constraint->data[i]) & constraint->data[i+16]) |
- goto loser; |
- } |
- return SECSuccess; |
+ if ((name->data[i] ^ constraint->data[i]) & |
+ constraint->data[i + 16]) |
+ goto loser; |
+ } |
+ return SECSuccess; |
} |
loser: |
return SECFailure; |
} |
-/* start with a SECItem that points to a URI. Parse it lookingg for |
+/* start with a SECItem that points to a URI. Parse it lookingg for |
** a hostname. Modify item->data and item->len to define the hostname, |
-** but do not modify and data at item->data. |
+** but do not modify and data at item->data. |
** If anything goes wrong, the contents of *item are undefined. |
*/ |
static SECStatus |
-parseUriHostname(SECItem * item) |
+parseUriHostname(SECItem *item) |
{ |
int i; |
PRBool found = PR_FALSE; |
- for (i = 0; (unsigned)(i+2) < item->len; ++i) { |
- if (item->data[i ] == ':' && |
- item->data[i+1] == '/' && |
- item->data[i+2] == '/') { |
- i += 3; |
- item->data += i; |
- item->len -= i; |
- found = PR_TRUE; |
- break; |
- } |
+ for (i = 0; (unsigned)(i + 2) < item->len; ++i) { |
+ if (item->data[i] == ':' && item->data[i + 1] == '/' && |
+ item->data[i + 2] == '/') { |
+ i += 3; |
+ item->data += i; |
+ item->len -= i; |
+ found = PR_TRUE; |
+ break; |
+ } |
} |
- if (!found) |
+ if (!found) |
return SECFailure; |
/* now look for a '/', which is an upper bound in the end of the name */ |
for (i = 0; (unsigned)i < item->len; ++i) { |
- if (item->data[i] == '/') { |
- item->len = i; |
- break; |
- } |
+ if (item->data[i] == '/') { |
+ item->len = i; |
+ break; |
+ } |
} |
/* now look for a ':', which marks the end of the name */ |
- for (i = item->len; --i >= 0; ) { |
+ for (i = item->len; --i >= 0;) { |
if (item->data[i] == ':') { |
- item->len = i; |
- break; |
- } |
+ item->len = i; |
+ break; |
+ } |
} |
/* now look for an '@', which marks the beginning of the hostname */ |
for (i = 0; (unsigned)i < item->len; ++i) { |
- if (item->data[i] == '@') { |
- ++i; |
- item->data += i; |
- item->len -= i; |
- break; |
- } |
+ if (item->data[i] == '@') { |
+ ++i; |
+ item->data += i; |
+ item->len -= i; |
+ break; |
+ } |
} |
return item->len ? SECSuccess : SECFailure; |
} |
@@ -1360,144 +1363,145 @@ parseUriHostname(SECItem * item) |
/* This function takes one name, and a list of constraints. |
** It searches the constraints looking for a match. |
** It returns SECSuccess if the name satisfies the constraints, i.e., |
-** if excluded, then the name does not match any constraint, |
+** if excluded, then the name does not match any constraint, |
** if permitted, then the name matches at least one constraint. |
** It returns SECFailure if the name fails to satisfy the constraints, |
** or if some code fails (e.g. out of memory, or invalid constraint) |
*/ |
SECStatus |
-cert_CompareNameWithConstraints(const CERTGeneralName *name, |
- const CERTNameConstraint *constraints, |
- PRBool excluded) |
+cert_CompareNameWithConstraints(const CERTGeneralName *name, |
+ const CERTNameConstraint *constraints, |
+ PRBool excluded) |
{ |
- SECStatus rv = SECSuccess; |
- SECStatus matched = SECFailure; |
+ SECStatus rv = SECSuccess; |
+ SECStatus matched = SECFailure; |
const CERTNameConstraint *current; |
- PORT_Assert(constraints); /* caller should not call with NULL */ |
+ PORT_Assert(constraints); /* caller should not call with NULL */ |
if (!constraints) { |
- PORT_SetError(SEC_ERROR_INVALID_ARGS); |
+ PORT_SetError(SEC_ERROR_INVALID_ARGS); |
return SECFailure; |
} |
current = constraints; |
do { |
- rv = SECSuccess; |
- matched = SECFailure; |
- PORT_Assert(name->type == current->name.type); |
- switch (name->type) { |
- |
- case certDNSName: |
- matched = compareDNSN2C(&name->name.other, |
- ¤t->name.name.other); |
- break; |
- |
- case certRFC822Name: |
- matched = compareRFC822N2C(&name->name.other, |
- ¤t->name.name.other); |
- break; |
- |
- case certURI: |
- { |
- /* make a modifiable copy of the URI SECItem. */ |
- SECItem uri = name->name.other; |
- /* find the hostname in the URI */ |
- rv = parseUriHostname(&uri); |
- if (rv == SECSuccess) { |
- /* does our hostname meet the constraint? */ |
- matched = compareURIN2C(&uri, ¤t->name.name.other); |
- } |
- } |
- break; |
- |
- case certDirectoryName: |
- /* Determine if the constraint directory name is a "prefix" |
- ** for the directory name being tested. |
- */ |
- { |
- /* status defaults to SECEqual, so that a constraint with |
- ** no AVAs will be a wildcard, matching all directory names. |
- */ |
- SECComparison status = SECEqual; |
- const CERTRDN **cRDNs = |
- (const CERTRDN **)current->name.name.directoryName.rdns; |
- const CERTRDN **nRDNs = |
- (const CERTRDN **)name->name.directoryName.rdns; |
- while (cRDNs && *cRDNs && nRDNs && *nRDNs) { |
- /* loop over name RDNs and constraint RDNs in lock step */ |
- const CERTRDN *cRDN = *cRDNs++; |
- const CERTRDN *nRDN = *nRDNs++; |
- CERTAVA **cAVAs = cRDN->avas; |
- while (cAVAs && *cAVAs) { /* loop over constraint AVAs */ |
- CERTAVA *cAVA = *cAVAs++; |
- CERTAVA **nAVAs = nRDN->avas; |
- while (nAVAs && *nAVAs) { /* loop over name AVAs */ |
- CERTAVA *nAVA = *nAVAs++; |
- status = CERT_CompareAVA(cAVA, nAVA); |
- if (status == SECEqual) |
- break; |
- } /* loop over name AVAs */ |
- if (status != SECEqual) |
- break; |
- } /* loop over constraint AVAs */ |
- if (status != SECEqual) |
- break; |
- } /* loop over name RDNs and constraint RDNs */ |
- matched = (status == SECEqual) ? SECSuccess : SECFailure; |
- break; |
- } |
- |
- case certIPAddress: /* type 8 */ |
- matched = compareIPaddrN2C(&name->name.other, |
- ¤t->name.name.other); |
- break; |
- |
- /* NSS does not know how to compare these "Other" type names with |
- ** their respective constraints. But it does know how to tell |
- ** if the constraint applies to the type of name (by comparing |
- ** the constraint OID to the name OID). NSS makes no use of "Other" |
- ** type names at all, so NSS errs on the side of leniency for these |
- ** types, provided that their OIDs match. So, when an "Other" |
- ** name constraint appears in an excluded subtree, it never causes |
- ** a name to fail. When an "Other" name constraint appears in a |
- ** permitted subtree, AND the constraint's OID matches the name's |
- ** OID, then name is treated as if it matches the constraint. |
- */ |
- case certOtherName: /* type 1 */ |
- matched = (!excluded && |
- name->type == current->name.type && |
- SECITEM_ItemsAreEqual(&name->name.OthName.oid, |
- ¤t->name.name.OthName.oid)) |
- ? SECSuccess : SECFailure; |
- break; |
- |
- /* NSS does not know how to compare these types of names with their |
- ** respective constraints. But NSS makes no use of these types of |
- ** names at all, so it errs on the side of leniency for these types. |
- ** Constraints for these types of names never cause the name to |
- ** fail the constraints test. NSS behaves as if the name matched |
- ** for permitted constraints, and did not match for excluded ones. |
- */ |
- case certX400Address: /* type 4 */ |
- case certEDIPartyName: /* type 6 */ |
- case certRegisterID: /* type 9 */ |
- matched = excluded ? SECFailure : SECSuccess; |
- break; |
- |
- default: /* non-standard types are not supported */ |
- rv = SECFailure; |
- break; |
- } |
- if (matched == SECSuccess || rv != SECSuccess) |
- break; |
- current = CERT_GetNextNameConstraint((CERTNameConstraint*)current); |
+ rv = SECSuccess; |
+ matched = SECFailure; |
+ PORT_Assert(name->type == current->name.type); |
+ switch (name->type) { |
+ |
+ case certDNSName: |
+ matched = |
+ compareDNSN2C(&name->name.other, ¤t->name.name.other); |
+ break; |
+ |
+ case certRFC822Name: |
+ matched = compareRFC822N2C(&name->name.other, |
+ ¤t->name.name.other); |
+ break; |
+ |
+ case certURI: { |
+ /* make a modifiable copy of the URI SECItem. */ |
+ SECItem uri = name->name.other; |
+ /* find the hostname in the URI */ |
+ rv = parseUriHostname(&uri); |
+ if (rv == SECSuccess) { |
+ /* does our hostname meet the constraint? */ |
+ matched = compareURIN2C(&uri, ¤t->name.name.other); |
+ } |
+ } break; |
+ |
+ case certDirectoryName: |
+ /* Determine if the constraint directory name is a "prefix" |
+ ** for the directory name being tested. |
+ */ |
+ { |
+ /* status defaults to SECEqual, so that a constraint with |
+ ** no AVAs will be a wildcard, matching all directory names. |
+ */ |
+ SECComparison status = SECEqual; |
+ const CERTRDN **cRDNs = |
+ (const CERTRDN **)current->name.name.directoryName.rdns; |
+ const CERTRDN **nRDNs = |
+ (const CERTRDN **)name->name.directoryName.rdns; |
+ while (cRDNs && *cRDNs && nRDNs && *nRDNs) { |
+ /* loop over name RDNs and constraint RDNs in lock step |
+ */ |
+ const CERTRDN *cRDN = *cRDNs++; |
+ const CERTRDN *nRDN = *nRDNs++; |
+ CERTAVA **cAVAs = cRDN->avas; |
+ while (cAVAs && |
+ *cAVAs) { /* loop over constraint AVAs */ |
+ CERTAVA *cAVA = *cAVAs++; |
+ CERTAVA **nAVAs = nRDN->avas; |
+ while (nAVAs && *nAVAs) { /* loop over name AVAs */ |
+ CERTAVA *nAVA = *nAVAs++; |
+ status = CERT_CompareAVA(cAVA, nAVA); |
+ if (status == SECEqual) |
+ break; |
+ } /* loop over name AVAs */ |
+ if (status != SECEqual) |
+ break; |
+ } /* loop over constraint AVAs */ |
+ if (status != SECEqual) |
+ break; |
+ } /* loop over name RDNs and constraint RDNs */ |
+ matched = (status == SECEqual) ? SECSuccess : SECFailure; |
+ break; |
+ } |
+ |
+ case certIPAddress: /* type 8 */ |
+ matched = compareIPaddrN2C(&name->name.other, |
+ ¤t->name.name.other); |
+ break; |
+ |
+ /* NSS does not know how to compare these "Other" type names with |
+ ** their respective constraints. But it does know how to tell |
+ ** if the constraint applies to the type of name (by comparing |
+ ** the constraint OID to the name OID). NSS makes no use of "Other" |
+ ** type names at all, so NSS errs on the side of leniency for these |
+ ** types, provided that their OIDs match. So, when an "Other" |
+ ** name constraint appears in an excluded subtree, it never causes |
+ ** a name to fail. When an "Other" name constraint appears in a |
+ ** permitted subtree, AND the constraint's OID matches the name's |
+ ** OID, then name is treated as if it matches the constraint. |
+ */ |
+ case certOtherName: /* type 1 */ |
+ matched = |
+ (!excluded && name->type == current->name.type && |
+ SECITEM_ItemsAreEqual(&name->name.OthName.oid, |
+ ¤t->name.name.OthName.oid)) |
+ ? SECSuccess |
+ : SECFailure; |
+ break; |
+ |
+ /* NSS does not know how to compare these types of names with their |
+ ** respective constraints. But NSS makes no use of these types of |
+ ** names at all, so it errs on the side of leniency for these types. |
+ ** Constraints for these types of names never cause the name to |
+ ** fail the constraints test. NSS behaves as if the name matched |
+ ** for permitted constraints, and did not match for excluded ones. |
+ */ |
+ case certX400Address: /* type 4 */ |
+ case certEDIPartyName: /* type 6 */ |
+ case certRegisterID: /* type 9 */ |
+ matched = excluded ? SECFailure : SECSuccess; |
+ break; |
+ |
+ default: /* non-standard types are not supported */ |
+ rv = SECFailure; |
+ break; |
+ } |
+ if (matched == SECSuccess || rv != SECSuccess) |
+ break; |
+ current = CERT_GetNextNameConstraint((CERTNameConstraint *)current); |
} while (current != constraints); |
if (rv == SECSuccess) { |
- if (matched == SECSuccess) |
- rv = excluded ? SECFailure : SECSuccess; |
- else |
- rv = excluded ? SECSuccess : SECFailure; |
- return rv; |
+ if (matched == SECSuccess) |
+ rv = excluded ? SECFailure : SECSuccess; |
+ else |
+ rv = excluded ? SECSuccess : SECFailure; |
+ return rv; |
} |
return SECFailure; |
@@ -1524,14 +1528,14 @@ CERT_AddNameConstraintByGeneralName(PLArenaPool *arena, |
rv = SECFailure; |
goto done; |
} |
- |
+ |
rv = cert_CopyOneGeneralName(arena, ¤t->name, name); |
if (rv != SECSuccess) { |
goto done; |
} |
- |
+ |
current->name.l.prev = current->name.l.next = &(current->name.l); |
- |
+ |
if (first == NULL) { |
*constraints = current; |
PR_INIT_CLIST(¤t->l); |
@@ -1569,51 +1573,55 @@ done: |
* |
*/ |
-#define STRING_TO_SECITEM(str) \ |
-{ siBuffer, (unsigned char*) str, sizeof(str) - 1 } |
+#define STRING_TO_SECITEM(str) \ |
+ { \ |
+ siBuffer, (unsigned char *)str, sizeof(str) - 1 \ |
+ } |
-#define NAME_CONSTRAINTS_ENTRY(CA) \ |
- { \ |
- STRING_TO_SECITEM(CA ## _SUBJECT_DN), \ |
- STRING_TO_SECITEM(CA ## _NAME_CONSTRAINTS) \ |
+#define NAME_CONSTRAINTS_ENTRY(CA) \ |
+ { \ |
+ STRING_TO_SECITEM(CA##_SUBJECT_DN), \ |
+ STRING_TO_SECITEM(CA##_NAME_CONSTRAINTS) \ |
} |
/* Agence Nationale de la Securite des Systemes d'Information (ANSSI) */ |
-#define ANSSI_SUBJECT_DN \ |
- "\x30\x81\x85" \ |
- "\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02" "FR" /* C */ \ |
- "\x31\x0F\x30\x0D\x06\x03\x55\x04\x08\x13\x06" "France" /* ST */ \ |
- "\x31\x0E\x30\x0C\x06\x03\x55\x04\x07\x13\x05" "Paris" /* L */ \ |
- "\x31\x10\x30\x0E\x06\x03\x55\x04\x0A\x13\x07" "PM/SGDN" /* O */ \ |
- "\x31\x0E\x30\x0C\x06\x03\x55\x04\x0B\x13\x05" "DCSSI" /* OU */ \ |
- "\x31\x0E\x30\x0C\x06\x03\x55\x04\x03\x13\x05" "IGC/A" /* CN */ \ |
- "\x31\x23\x30\x21\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01" \ |
- "\x16\x14" "igca@sgdn.pm.gouv.fr" /* emailAddress */ \ |
- |
-#define ANSSI_NAME_CONSTRAINTS \ |
- "\x30\x5D\xA0\x5B" \ |
- "\x30\x05\x82\x03" ".fr" \ |
- "\x30\x05\x82\x03" ".gp" \ |
- "\x30\x05\x82\x03" ".gf" \ |
- "\x30\x05\x82\x03" ".mq" \ |
- "\x30\x05\x82\x03" ".re" \ |
- "\x30\x05\x82\x03" ".yt" \ |
- "\x30\x05\x82\x03" ".pm" \ |
- "\x30\x05\x82\x03" ".bl" \ |
- "\x30\x05\x82\x03" ".mf" \ |
- "\x30\x05\x82\x03" ".wf" \ |
- "\x30\x05\x82\x03" ".pf" \ |
- "\x30\x05\x82\x03" ".nc" \ |
- "\x30\x05\x82\x03" ".tf" \ |
- |
-static const SECItem builtInNameConstraints[][2] = { |
- NAME_CONSTRAINTS_ENTRY(ANSSI) |
-}; |
+/* clang-format off */ |
+ |
+#define ANSSI_SUBJECT_DN \ |
+ "\x30\x81\x85" \ |
+ "\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02" "FR" /* C */ \ |
+ "\x31\x0F\x30\x0D\x06\x03\x55\x04\x08\x13\x06" "France" /* ST */ \ |
+ "\x31\x0E\x30\x0C\x06\x03\x55\x04\x07\x13\x05" "Paris" /* L */ \ |
+ "\x31\x10\x30\x0E\x06\x03\x55\x04\x0A\x13\x07" "PM/SGDN" /* O */ \ |
+ "\x31\x0E\x30\x0C\x06\x03\x55\x04\x0B\x13\x05" "DCSSI" /* OU */ \ |
+ "\x31\x0E\x30\x0C\x06\x03\x55\x04\x03\x13\x05" "IGC/A" /* CN */ \ |
+ "\x31\x23\x30\x21\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01" \ |
+ "\x16\x14" "igca@sgdn.pm.gouv.fr" /* emailAddress */ \ |
+ |
+#define ANSSI_NAME_CONSTRAINTS \ |
+ "\x30\x5D\xA0\x5B" \ |
+ "\x30\x05\x82\x03" ".fr" \ |
+ "\x30\x05\x82\x03" ".gp" \ |
+ "\x30\x05\x82\x03" ".gf" \ |
+ "\x30\x05\x82\x03" ".mq" \ |
+ "\x30\x05\x82\x03" ".re" \ |
+ "\x30\x05\x82\x03" ".yt" \ |
+ "\x30\x05\x82\x03" ".pm" \ |
+ "\x30\x05\x82\x03" ".bl" \ |
+ "\x30\x05\x82\x03" ".mf" \ |
+ "\x30\x05\x82\x03" ".wf" \ |
+ "\x30\x05\x82\x03" ".pf" \ |
+ "\x30\x05\x82\x03" ".nc" \ |
+ "\x30\x05\x82\x03" ".tf" |
+ |
+/* clang-format on */ |
+ |
+static const SECItem builtInNameConstraints[][2] = { NAME_CONSTRAINTS_ENTRY( |
+ ANSSI) }; |
SECStatus |
-CERT_GetImposedNameConstraints(const SECItem *derSubject, |
- SECItem *extensions) |
+CERT_GetImposedNameConstraints(const SECItem *derSubject, SECItem *extensions) |
{ |
size_t i; |
@@ -1624,8 +1632,7 @@ CERT_GetImposedNameConstraints(const SECItem *derSubject, |
for (i = 0; i < PR_ARRAY_SIZE(builtInNameConstraints); ++i) { |
if (SECITEM_ItemsAreEqual(derSubject, &builtInNameConstraints[i][0])) { |
- return SECITEM_CopyItem(NULL, |
- extensions, |
+ return SECITEM_CopyItem(NULL, extensions, |
&builtInNameConstraints[i][1]); |
} |
} |
@@ -1634,24 +1641,23 @@ CERT_GetImposedNameConstraints(const SECItem *derSubject, |
return SECFailure; |
} |
-/* |
+/* |
* Extract the name constraints extension from the CA cert. |
* If the certificate contains no name constraints extension, but |
* CERT_GetImposedNameConstraints returns a name constraints extension |
* for the subject of the certificate, then that extension will be returned. |
*/ |
SECStatus |
-CERT_FindNameConstraintsExten(PLArenaPool *arena, |
- CERTCertificate *cert, |
+CERT_FindNameConstraintsExten(PLArenaPool *arena, CERTCertificate *cert, |
CERTNameConstraints **constraints) |
{ |
- SECStatus rv = SECSuccess; |
- SECItem constraintsExtension; |
- void *mark = NULL; |
- |
+ SECStatus rv = SECSuccess; |
+ SECItem constraintsExtension; |
+ void *mark = NULL; |
+ |
*constraints = NULL; |
- rv = CERT_FindCertExtension(cert, SEC_OID_X509_NAME_CONSTRAINTS, |
+ rv = CERT_FindCertExtension(cert, SEC_OID_X509_NAME_CONSTRAINTS, |
&constraintsExtension); |
if (rv != SECSuccess) { |
if (PORT_GetError() != SEC_ERROR_EXTENSION_NOT_FOUND) { |
@@ -1660,10 +1666,10 @@ CERT_FindNameConstraintsExten(PLArenaPool *arena, |
rv = CERT_GetImposedNameConstraints(&cert->derSubject, |
&constraintsExtension); |
if (rv != SECSuccess) { |
- if (PORT_GetError() == SEC_ERROR_EXTENSION_NOT_FOUND) { |
- return SECSuccess; |
- } |
- return rv; |
+ if (PORT_GetError() == SEC_ERROR_EXTENSION_NOT_FOUND) { |
+ return SECSuccess; |
+ } |
+ return rv; |
} |
} |
@@ -1673,7 +1679,7 @@ CERT_FindNameConstraintsExten(PLArenaPool *arena, |
if (*constraints == NULL) { /* decode failed */ |
rv = SECFailure; |
} |
- PORT_Free (constraintsExtension.data); |
+ PORT_Free(constraintsExtension.data); |
if (rv == SECFailure) { |
PORT_ArenaRelease(arena, mark); |
@@ -1688,42 +1694,39 @@ CERT_FindNameConstraintsExten(PLArenaPool *arena, |
** the name. |
*/ |
SECStatus |
-CERT_CheckNameSpace(PLArenaPool *arena, |
- const CERTNameConstraints *constraints, |
- const CERTGeneralName *currentName) |
+CERT_CheckNameSpace(PLArenaPool *arena, const CERTNameConstraints *constraints, |
+ const CERTGeneralName *currentName) |
{ |
- CERTNameConstraint *matchingConstraints; |
- SECStatus rv = SECSuccess; |
- |
+ CERTNameConstraint *matchingConstraints; |
+ SECStatus rv = SECSuccess; |
+ |
if (constraints->excluded != NULL) { |
- rv = CERT_GetNameConstraintByType(constraints->excluded, |
- currentName->type, |
+ rv = CERT_GetNameConstraintByType(constraints->excluded, |
+ currentName->type, |
&matchingConstraints, arena); |
if (rv == SECSuccess && matchingConstraints != NULL) { |
- rv = cert_CompareNameWithConstraints(currentName, |
- matchingConstraints, |
- PR_TRUE); |
+ rv = cert_CompareNameWithConstraints(currentName, |
+ matchingConstraints, PR_TRUE); |
} |
if (rv != SECSuccess) { |
- return(rv); |
+ return (rv); |
} |
} |
- |
+ |
if (constraints->permited != NULL) { |
- rv = CERT_GetNameConstraintByType(constraints->permited, |
- currentName->type, |
+ rv = CERT_GetNameConstraintByType(constraints->permited, |
+ currentName->type, |
&matchingConstraints, arena); |
if (rv == SECSuccess && matchingConstraints != NULL) { |
- rv = cert_CompareNameWithConstraints(currentName, |
- matchingConstraints, |
- PR_FALSE); |
+ rv = cert_CompareNameWithConstraints(currentName, |
+ matchingConstraints, PR_FALSE); |
} |
if (rv != SECSuccess) { |
- return(rv); |
+ return (rv); |
} |
} |
- return(SECSuccess); |
+ return (SECSuccess); |
} |
/* Extract the name constraints extension from the CA cert. |
@@ -1734,45 +1737,43 @@ CERT_CheckNameSpace(PLArenaPool *arena, |
** contained that name. |
*/ |
SECStatus |
-CERT_CompareNameSpace(CERTCertificate *cert, |
- CERTGeneralName *namesList, |
- CERTCertificate **certsList, |
- PLArenaPool *reqArena, |
- CERTCertificate **pBadCert) |
+CERT_CompareNameSpace(CERTCertificate *cert, CERTGeneralName *namesList, |
+ CERTCertificate **certsList, PLArenaPool *reqArena, |
+ CERTCertificate **pBadCert) |
{ |
- SECStatus rv = SECSuccess; |
- CERTNameConstraints *constraints; |
- CERTGeneralName *currentName; |
- int count = 0; |
- CERTCertificate *badCert = NULL; |
+ SECStatus rv = SECSuccess; |
+ CERTNameConstraints *constraints; |
+ CERTGeneralName *currentName; |
+ int count = 0; |
+ CERTCertificate *badCert = NULL; |
/* If no names to check, then no names can be bad. */ |
if (!namesList) |
- goto done; |
+ goto done; |
rv = CERT_FindNameConstraintsExten(reqArena, cert, &constraints); |
if (rv != SECSuccess) { |
- count = -1; |
- goto done; |
+ count = -1; |
+ goto done; |
} |
currentName = namesList; |
do { |
- if (constraints){ |
- rv = CERT_CheckNameSpace(reqArena, constraints, currentName); |
- if (rv != SECSuccess) { |
- break; |
- } |
- } |
- currentName = CERT_GetNextGeneralName(currentName); |
- count ++; |
+ if (constraints) { |
+ rv = CERT_CheckNameSpace(reqArena, constraints, currentName); |
+ if (rv != SECSuccess) { |
+ break; |
+ } |
+ } |
+ currentName = CERT_GetNextGeneralName(currentName); |
+ count++; |
} while (currentName != namesList); |
done: |
if (rv != SECSuccess) { |
- badCert = (count >= 0) ? certsList[count] : cert; |
+ badCert = (count >= 0) ? certsList[count] : cert; |
} |
if (pBadCert) |
- *pBadCert = badCert; |
+ *pBadCert = badCert; |
return rv; |
} |
@@ -1789,7 +1790,7 @@ CERT_CompareGeneralName(CERTGeneralName *a, CERTGeneralName *b) |
currentA = a; |
currentB = b; |
if (a != NULL) { |
- do { |
+ do { |
if (currentB == NULL) { |
return SECFailure; |
} |
@@ -1815,14 +1816,14 @@ CERT_CompareGeneralName(CERTGeneralName *a, CERTGeneralName *b) |
case certX400Address: |
case certURI: |
if (SECITEM_CompareItem(¤tA->name.other, |
- ¤tB->name.other) |
+ ¤tB->name.other) |
== SECEqual) { |
found = PR_TRUE; |
} |
break; |
case certOtherName: |
if (SECITEM_CompareItem(¤tA->name.OthName.oid, |
- ¤tB->name.OthName.oid) |
+ ¤tB->name.OthName.oid) |
== SECEqual && |
SECITEM_CompareItem(¤tA->name.OthName.name, |
¤tB->name.OthName.name) |
@@ -1837,7 +1838,7 @@ CERT_CompareGeneralName(CERTGeneralName *a, CERTGeneralName *b) |
found = PR_TRUE; |
} |
} |
- |
+ |
} |
currentB = CERT_GetNextGeneralName(currentB); |
} while (currentB != b && found != PR_TRUE); |
@@ -1880,7 +1881,7 @@ CERT_GetGeneralNameFromListByType(CERTGeneralNameList *list, |
CERTGeneralNameType type, |
PLArenaPool *arena) |
{ |
- CERTName *name = NULL; |
+ CERTName *name = NULL; |
SECItem *item = NULL; |
OtherName *other = NULL; |
OtherName *tmpOther = NULL; |
@@ -1902,7 +1903,7 @@ CERT_GetGeneralNameFromListByType(CERTGeneralNameList *list, |
if (item != NULL) { |
XXX SECITEM_CopyItem(arena, item, (SECItem *) data); |
} |
- } else { |
+ } else { |
item = SECITEM_DupItem((SECItem *) data); |
} |
PZ_Unlock(list->lock); |
@@ -1943,7 +1944,7 @@ XXX CERT_CopyName(arena, name, (CERTName *) data); |
** that can fail. |
*/ |
void |
-CERT_AddGeneralNameToList(CERTGeneralNameList *list, |
+CERT_AddGeneralNameToList(CERTGeneralNameList *list, |
CERTGeneralNameType type, |
void *data, SECItem *oid) |
{ |