📄 ac.c
字号:
ac->holderIssuer = get_directoryName(object, level, FALSE); break; case AC_OBJ_HOLDER_SERIAL: ac->holderSerial = object; break; case AC_OBJ_ENTITY_NAME: ac->entityName = get_directoryName(object, level, TRUE); break; case AC_OBJ_ISSUER_NAME: ac->issuerName = get_directoryName(object, level, FALSE); break; case AC_OBJ_SIG_ALG: ac->sigAlg = parse_algorithmIdentifier(object, level); break; case AC_OBJ_SERIAL_NUMBER: ac->serialNumber = object; break; case AC_OBJ_NOT_BEFORE: ac->notBefore = asn1totime(&object, ASN1_GENERALIZEDTIME); break; case AC_OBJ_NOT_AFTER: ac->notAfter = asn1totime(&object, ASN1_GENERALIZEDTIME); break; case AC_OBJ_ATTRIBUTE_TYPE: type = object; break; case AC_OBJ_ATTRIBUTE_VALUE: { u_int type_oid = known_oid(type); switch (type_oid) { case OID_AUTHENTICATION_INFO: DBG(DBG_PARSING, DBG_log(" need to parse authenticationInfo") ) break; case OID_ACCESS_IDENTITY: DBG(DBG_PARSING, DBG_log(" need to parse accessIdentity") ) break; case OID_CHARGING_IDENTITY: ac->charging = parse_ietfAttrSyntax(object, level); break; case OID_GROUP: ac->groups = parse_ietfAttrSyntax(object, level); break; case OID_ROLE: parse_roleSyntax(object, level); break; default: break; } } break; case AC_OBJ_EXTN_ID: extnID = object; break; case AC_OBJ_CRITICAL: critical = object.len && *object.ptr; DBG(DBG_PARSING, DBG_log(" %s",(critical)?"TRUE":"FALSE"); ) break; case AC_OBJ_EXTN_VALUE: { u_int extn_oid = known_oid(extnID); switch (extn_oid) { case OID_CRL_DISTRIBUTION_POINTS: DBG(DBG_PARSING, DBG_log(" need to parse crlDistributionPoints") ) break; case OID_AUTHORITY_KEY_ID: parse_authorityKeyIdentifier(object, level , &ac->authKeyID, &ac->authKeySerialNumber); break; case OID_TARGET_INFORMATION: DBG(DBG_PARSING, DBG_log(" need to parse targetInformation") ) break; case OID_NO_REV_AVAIL: ac->noRevAvail = TRUE; break; default: break; } } break; case AC_OBJ_ALGORITHM: ac->algorithm = parse_algorithmIdentifier(object, level); break; case AC_OBJ_SIGNATURE: ac->signature = object; break; default: break; } objectID++; } time(&ac->installed); return TRUE;}/* * compare two X.509 attribute certificates by comparing their signatures */static boolsame_x509acert(x509acert_t *a, x509acert_t *b){ return a->signature.len == b->signature.len && memcmp(a->signature.ptr, b->signature.ptr, b->signature.len) == 0;}/* * release an ietfAttribute, free it if count reaches zero */static voidrelease_ietfAttr(ietfAttr_t* attr){ if (--attr->count == 0) { ietfAttrList_t **plist = &ietfAttributes; ietfAttrList_t *list = *plist; while (list->attr != attr) { plist = &list->next; list = *plist; } *plist = list->next; pfree(attr->value.ptr); pfree(attr); pfree(list); }}/* * free an ietfAttrList */voidfree_ietfAttrList(ietfAttrList_t* list){ while (list != NULL) { ietfAttrList_t *el = list; release_ietfAttr(el->attr); list = list->next; pfree(el); }}/* * free a X.509 attribute certificate */static voidfree_acert(x509acert_t *ac){ if (ac != NULL) { free_ietfAttrList(ac->charging); free_ietfAttrList(ac->groups); pfreeany(ac->certificate.ptr); pfree(ac); }}/* * add a X.509 attribute certificate to the chained list */static voidadd_acert(x509acert_t *acert){ x509acert_t *ac = x509acerts; while (ac != NULL) { if (same_x509acert(acert, ac)) /* already in chain, free cert */ { free_acert(acert); } ac = ac->next; } /* insert new ac at the root of the chain */ acert->next = x509acerts; x509acerts = acert;}/* verify the validity of an attribute certificate by * checking the notBefore and notAfter dates */static err_tcheck_ac_validity(const x509acert_t *ac){ time_t current_time; time(¤t_time); DBG(DBG_CONTROL | DBG_PARSING, char tbuf[TIMETOA_BUF]; DBG_log(" not before : %s", timetoa(&ac->notBefore, TRUE, tbuf, sizeof(tbuf))); DBG_log(" current time: %s", timetoa(¤t_time, TRUE, tbuf, sizeof(tbuf))); DBG_log(" not after : %s", timetoa(&ac->notAfter, TRUE, tbuf, sizeof(tbuf))); ) if (current_time < ac->notBefore) return "attribute certificate is not valid yet"; if (current_time > ac->notAfter) return "attribute certificate has expired"; else return NULL;}/* * verifies a X.509 attribute certificate */static boolverify_x509acert(x509acert_t *ac, bool strict){ u_char buf[BUF_LEN]; x509cert_t *aacert; err_t ugh = NULL; time_t valid_until = ac->notAfter; DBG(DBG_CONTROL, dntoa(buf, BUF_LEN, ac->entityName); DBG_log("holder: '%s'",buf); dntoa(buf, BUF_LEN, ac->issuerName); DBG_log("issuer: '%s'",buf); ) ugh = check_ac_validity(ac); if (ugh != NULL) { plog("%s", ugh); return FALSE; } DBG(DBG_CONTROL, DBG_log("attribute certificate is valid") ) lock_authcert_list("verify_x509acert"); aacert = get_authcert(ac->issuerName, ac->authKeySerialNumber , ac->authKeyID, AUTH_AA); unlock_authcert_list("verify_x509acert"); if (aacert == NULL) { plog("issuer aacert not found"); return FALSE; } DBG(DBG_CONTROL, DBG_log("issuer aacert found") ) if (!check_signature(ac->certificateInfo, ac->signature , ac->algorithm, aacert)) { plog("attribute certificate signature is invalid"); return FALSE; } DBG(DBG_CONTROL, DBG_log("attribute certificate signature is valid"); ) return verify_x509cert(aacert, strict, &valid_until);}/* * Loads X.509 attribute certificates */voidload_acerts(void){ u_char buf[BUF_LEN]; /* change directory to specified path */ u_char *save_dir = getcwd(buf, BUF_LEN); if (!chdir(A_CERT_PATH)) { struct dirent **filelist; int n; openswan_log("Changing to directory '%s'",A_CERT_PATH); n = scandir(A_CERT_PATH, &filelist, file_select, alphasort); if (n > 0) { while (n--) { chunk_t blob = empty_chunk; bool pgp = FALSE; if (load_coded_file(filelist[n]->d_name, NULL, "acert", &blob, &pgp)) { x509acert_t *ac = alloc_thing(x509acert_t, "x509acert"); *ac = empty_ac; if (parse_ac(blob, ac) && verify_x509acert(ac, strict_crl_policy)) add_acert(ac); else free_acert(ac); } free(filelist[n]); } free(filelist); } } /* restore directory path */ chdir(save_dir);}/* * Free all attribute certificates in the chained list */voidfree_acerts(void){ while (x509acerts != NULL) { x509acert_t *ac = x509acerts; x509acerts = ac->next; free_acert(ac); }}/* * list all X.509 attribute certificates in the chained list */voidlist_acerts(bool utc){ x509acert_t *ac = x509acerts; time_t now; /* determine the current time */ time(&now); if (ac != NULL) { whack_log(RC_COMMENT, " "); whack_log(RC_COMMENT, "List of X.509 Attribute Certificates:"); whack_log(RC_COMMENT, " "); } while (ac != NULL) { u_char buf[BUF_LEN]; char tbuf[TIMETOA_BUF]; whack_log(RC_COMMENT, "%s",timetoa(&ac->installed, utc, tbuf, sizeof(tbuf))); if (ac->entityName.ptr != NULL) { dntoa(buf, BUF_LEN, ac->entityName); whack_log(RC_COMMENT, " holder: '%s'", buf); } if (ac->holderIssuer.ptr != NULL) { dntoa(buf, BUF_LEN, ac->holderIssuer); whack_log(RC_COMMENT, " hissuer: '%s'", buf); } if (ac->holderSerial.ptr != NULL) { datatot(ac->holderSerial.ptr, ac->holderSerial.len, ':' , buf, BUF_LEN); whack_log(RC_COMMENT, " hserial: %s", buf); } dntoa(buf, BUF_LEN, ac->issuerName); whack_log(RC_COMMENT, " issuer: '%s'", buf); datatot(ac->serialNumber.ptr, ac->serialNumber.len, ':' , buf, BUF_LEN); whack_log(RC_COMMENT, " serial: %s", buf); if (ac->groups != NULL) { bool first = TRUE; char *pos = buf; ietfAttrList_t *list = ac->groups; while (list != NULL) { ietfAttr_t *attr = list->attr; if (attr->kind != IETF_ATTRIBUTE_OID) { int n = snprintf(pos, BUF_LEN, "%s%.*s", (first? "":", ") , (int)attr->value.len, attr->value.ptr); if (n == -1) /* print buffer is full */ break; pos += n; first = FALSE; } list = list->next; } whack_log(RC_COMMENT, " groups: %s", buf); } whack_log(RC_COMMENT, " validity: not before %s %s", timetoa(&ac->notBefore, utc, tbuf, sizeof(tbuf)), (ac->notBefore < now)?"ok":"fatal (not valid yet)"); whack_log(RC_COMMENT, " not after %s %s", timetoa(&ac->notAfter, utc, tbuf, sizeof(tbuf)), check_expiry(ac->notAfter, ACERT_WARNING_INTERVAL, TRUE)); ac = ac->next; }}/* * list all group attributes in alphabetical order */voidlist_groups(bool utc){ ietfAttrList_t *list = ietfAttributes; if (list != NULL) { whack_log(RC_COMMENT, " "); whack_log(RC_COMMENT, "List of Group Attributes:"); whack_log(RC_COMMENT, " "); } while (list != NULL) { ietfAttr_t *attr = list->attr; char tbuf[TIMETOA_BUF]; whack_log(RC_COMMENT, "%s, count: %d", timetoa(&attr->installed, utc, tbuf, sizeof(tbuf)), attr->count); switch (attr->kind) { case IETF_ATTRIBUTE_OCTETS: case IETF_ATTRIBUTE_STRING: whack_log(RC_COMMENT, " %.*s", (int)attr->value.len, attr->value.ptr); break; case IETF_ATTRIBUTE_OID: whack_log(RC_COMMENT, " OID"); break; default: break; } list = list->next; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -