genname.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,611 行 · 第 1/3 页
C
1,611 行
PORT_Assert(arena); if (constraints->permited != NULL) { 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; } } dest = SEC_ASN1EncodeItem(arena, dest, constraints, CERTNameConstraintsTemplate); if (dest == NULL) { goto loser; } return SECSuccess;loser: return SECFailure;}CERTNameConstraint *cert_DecodeNameConstraint(PRArenaPool *arena, SECItem *encodedConstraint){ CERTNameConstraint *constraint; SECStatus rv = SECSuccess; CERTGeneralName *temp; PORT_Assert(arena); constraint = (CERTNameConstraint *) PORT_ArenaZAlloc(arena, sizeof(CERTNameConstraint)); rv = SEC_ASN1DecodeItem(arena, constraint, CERTNameConstraintTemplate, encodedConstraint); if (rv != SECSuccess) { goto loser; } temp = cert_DecodeGeneralName(arena, &(constraint->DERName), &(constraint->name)); if (temp != &(constraint->name)) { goto loser; } /* ### 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); return constraint;loser: return NULL;}CERTNameConstraint *cert_DecodeNameConstraintSubTree(PRArenaPool *arena, SECItem **subTree, PRBool permited){ CERTNameConstraint *current = NULL; CERTNameConstraint *first = NULL; CERTNameConstraint *last = NULL; CERTNameConstraint *next = NULL; int i = 0; while (subTree[i] != NULL) { current = cert_DecodeNameConstraint(arena, subTree[i]); if (current == NULL) { goto loser; } if (last == NULL) { first = last = current; } current->l.prev = &(last->l); current->l.next = last->l.next; last->l.next = &(current->l); i++; } first->l.prev = &(current->l); return first;loser: if (first) { current = first; do { next = cert_get_next_name_constraint(current); PORT_Free(current); current = next; }while (current != first); } return NULL;}CERTNameConstraints *cert_DecodeNameConstraints(PRArenaPool *arena, SECItem *encodedConstraints){ CERTNameConstraints *constraints; SECStatus rv; PORT_Assert(arena); PORT_Assert(encodedConstraints); constraints = (CERTNameConstraints *) PORT_ArenaZAlloc(arena, sizeof(CERTNameConstraints)); if (constraints == NULL) { goto loser; } rv = SEC_ASN1DecodeItem(arena, constraints, CERTNameConstraintsTemplate, encodedConstraints); if (rv != SECSuccess) { goto loser; } if (constraints->DERPermited != NULL && constraints->DERPermited[0] != NULL) { constraints->permited = cert_DecodeNameConstraintSubTree(arena, constraints->DERPermited, PR_TRUE); if (constraints->permited == NULL) { goto loser; } } if (constraints->DERExcluded != NULL && constraints->DERExcluded[0] != NULL) { constraints->excluded = cert_DecodeNameConstraintSubTree(arena, constraints->DERExcluded, PR_FALSE); if (constraints->excluded == NULL) { goto loser; } } return constraints;loser: return NULL;}SECStatusCERT_CopyGeneralName(PRArenaPool *arena, CERTGeneralName *dest, CERTGeneralName *src){ SECStatus rv; CERTGeneralName *destHead = dest; CERTGeneralName *srcHead = src; CERTGeneralName *temp; PORT_Assert(dest != NULL); dest->type = src->type; do { switch (src->type) { case certDirectoryName: { rv = SECITEM_CopyItem(arena, &dest->derDirectoryName, &src->derDirectoryName); if (rv != SECSuccess) { return rv; } 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) { return rv; } rv = SECITEM_CopyItem(arena, &dest->name.OthName.oid, &src->name.OthName.oid); break; } default: { rv = SECITEM_CopyItem(arena, &dest->name.other, &src->name.other); } } src = cert_get_next_general_name(src); /* if there is only one general name, we shouldn't do this */ if (src != srcHead) { if (dest->l.next == &destHead->l) { if (arena) { temp = (CERTGeneralName *) PORT_ArenaZAlloc(arena, sizeof(CERTGeneralName)); } else { temp = (CERTGeneralName *) PORT_ZAlloc(sizeof(CERTGeneralName)); } 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_get_next_general_name(dest); } } } while (src != srcHead && rv == SECSuccess); return rv;}CERTGeneralNameList *CERT_DupGeneralNameList(CERTGeneralNameList *list){ if (list != NULL) { PR_Lock(list->lock); list->refCount++; PR_Unlock(list->lock); } return list;}CERTNameConstraint *CERT_CopyNameConstraint(PRArenaPool *arena, CERTNameConstraint *dest, CERTNameConstraint *src){ SECStatus rv; if (dest == NULL) { dest = (CERTNameConstraint *) PORT_ArenaZAlloc(arena, sizeof(CERTNameConstraint)); /* 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; } rv = SECITEM_CopyItem(arena, &dest->DERName, &src->DERName); if (rv != SECSuccess) { goto loser; } rv = SECITEM_CopyItem(arena, &dest->min, &src->min); if (rv != SECSuccess) { goto loser; } rv = SECITEM_CopyItem(arena, &dest->max, &src->max); if (rv != SECSuccess) { goto loser; } dest->l.prev = dest->l.next = &dest->l; return dest;loser: return NULL;}CERTGeneralName *cert_CombineNamesLists(CERTGeneralName *list1, CERTGeneralName *list2){ PRCList *begin1; PRCList *begin2; PRCList *end1; PRCList *end2; if (list1 == NULL){ return list2; } else if (list2 == NULL) { 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; }}CERTNameConstraint *cert_CombineConstraintsLists(CERTNameConstraint *list1, CERTNameConstraint *list2){ PRCList *begin1; PRCList *begin2; PRCList *end1; PRCList *end2; if (list1 == NULL){ return list2; } else if (list2 == NULL) { 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; }}CERTNameConstraint *CERT_AddNameConstraint(CERTNameConstraint *list, CERTNameConstraint *constraint){ PORT_Assert(constraint != NULL); constraint->l.next = constraint->l.prev = &constraint->l; list = cert_CombineConstraintsLists(list, constraint); return list;}SECStatusCERT_GetNameConstriantByType (CERTNameConstraint *constraints, CERTGeneralNameType type, CERTNameConstraint **returnList, PRArenaPool *arena){ CERTNameConstraint *current; CERTNameConstraint *temp; *returnList = NULL; if (!constraints) return SECSuccess; current = constraints; do { if (current->name.type == type || (type == certDirectoryName && current->name.type == certRFC822Name)) { temp = NULL; temp = CERT_CopyNameConstraint(arena, temp, current); if (temp == NULL) { goto loser; } *returnList = CERT_AddNameConstraint(*returnList, temp); } current = cert_get_next_name_constraint(current); } while (current != constraints); return SECSuccess;loser: return SECFailure;}void *CERT_GetGeneralNameByType (CERTGeneralName *genNames, CERTGeneralNameType type, PRBool derFormat){ CERTGeneralName *current; if (!genNames) 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 &(current->name.other); } case certOtherName: { return &(current->name.OthName); break; } case certDirectoryName: { if (derFormat) { return &(current->derDirectoryName); } else{ return &(current->name.directoryName); } break; } } } current = cert_get_next_general_name(current); } while (current != genNames); return (NULL);}intCERT_GetNamesLength(CERTGeneralName *names){ int length = 0; CERTGeneralName *first; first = names; if (names != NULL) { do { length++; names = cert_get_next_general_name(names); } while (names != first); } return length;}CERTGeneralName *CERT_GetCertificateNames(CERTCertificate *cert, PRArenaPool *arena){ CERTGeneralName *DN; CERTGeneralName *altName; SECItem altNameExtension; SECStatus rv; DN = (CERTGeneralName *) PORT_ArenaZAlloc(arena, sizeof(CERTGeneralName)); if (DN == NULL) { goto loser; } rv = CERT_CopyName(arena, &DN->name.directoryName, &cert->subject); DN->type = certDirectoryName; DN->l.next = DN->l.prev = &DN->l; if (rv != SECSuccess) { goto loser; } rv = SECITEM_CopyItem(arena, &DN->derDirectoryName, &cert->derSubject); if (rv != SECSuccess) { goto loser; } rv = CERT_FindCertExtension(cert, SEC_OID_X509_SUBJECT_ALT_NAME, &altNameExtension); if (rv != SECSuccess) { return DN; } altName = CERT_DecodeAltNameExtension(arena, &altNameExtension); if (altName == NULL) { goto loser; } DN = cert_CombineNamesLists(DN, altName); return DN;loser: return NULL;}static SECStatuscompareNameToConstraint(char *name, char *constraint, PRBool substring){ SECStatus rv; if (*constraint == '\0' && *name == '\0') { return SECSuccess; } if (*constraint == '*') { return compareNameToConstraint(name, constraint + 1, PR_TRUE); } if (substring) { if (*constraint == '\0') { return SECSuccess; } while (*name != *constraint) { if (*name == '\0') { return SECFailure; } name++; } rv = compareNameToConstraint(name + 1, constraint + 1, PR_FALSE); if (rv == SECSuccess) { return rv; } name++; } else { if (*name == *constraint) { name++; constraint++; } else { return SECFailure; } } return compareNameToConstraint(name, constraint, substring);}SECStatuscert_CompareNameWithConstraints(CERTGeneralName *name, CERTNameConstraint *constraints, PRBool excluded){ SECStatus rv = SECSuccess; char *nameString = NULL; char *constraintString = NULL; int start; int end; int tag; CERTRDN **nameRDNS, *nameRDN; CERTRDN **constraintRDNS, *constraintRDN; CERTAVA **nameAVAS, *nameAVA; CERTAVA **constraintAVAS, *constraintAVA; CERTNameConstraint *current; SECItem *avaValue; CERTName constraintName; CERTName certName; SECComparison status = SECEqual; PRArenaPool *certNameArena; PRArenaPool *constraintNameArena; certName.arena = NULL; certName.rdns = NULL; constraintName.arena = NULL; constraintName.rdns = NULL; if (constraints != NULL) { current = constraints; if (name->type == certDirectoryName) { certNameArena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); CERT_CopyName(certNameArena, &certName, &name->name.directoryName); nameRDNS = certName.rdns; for (;;) { nameRDN = *nameRDNS++; nameAVAS = nameRDN->avas; for(;;) { nameAVA = *nameAVAS++; tag = CERT_GetAVATag(nameAVA); if ( tag == SEC_OID_PKCS9_EMAIL_ADDRESS || tag == SEC_OID_RFC1274_MAIL) { avaValue = CERT_DecodeAVAValue(&nameAVA->value); nameString = (char*)PORT_ZAlloc(avaValue->len + 1); nameString = PORT_Strncpy(nameString, (char *) avaValue->data, avaValue->len); start = 0; while(nameString[start] != '@' && nameString[start + 1] != '\0') { start++; } start++; do{ if (current->name.type == certRFC822Name) { constraintString = (char*)PORT_ZAlloc(current->name.name.other.len + 1); constraintString = PORT_Strncpy(constraintString, (char *) current->name.name.other.data, current->name.name.other.len); rv = compareNameToConstraint(nameString + start, constraintString, PR_FALSE); if (constraintString != NULL) { PORT_Free(constraintString); constraintString = NULL; } if (nameString != NULL) { PORT_Free(nameString); nameString = NULL; } if (rv == SECSuccess && excluded == PR_TRUE) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?