⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ac.c

📁 This a good VPN source
💻 C
📖 第 1 页 / 共 2 页
字号:
	    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(&current_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(&current_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 + -