コード例 #1
0
/**
 * xmlSecX509DataGetNodeContent:
 * @node:		the pointer to <dsig:X509Data/> node.
 * @deleteChildren:	the flag that indicates whether to remove node children after reading.
 * @keyInfoCtx:		the pointer to <dsig:KeyInfo/> node processing context.
 *
 * Reads the contents of <dsig:X509Data/> node and returns it as
 * a bits mask.
 *
 * Returns the bit mask representing the <dsig:X509Data/> node content
 * or a negative value if an error occurs.
 */
EXPORT_C
int
xmlSecX509DataGetNodeContent (xmlNodePtr node, int deleteChildren,
			    xmlSecKeyInfoCtxPtr keyInfoCtx) {
    xmlNodePtr cur, next;
    int deleteCurNode;
    int content = 0;

    xmlSecAssert2(node != NULL, 0);
    xmlSecAssert2(keyInfoCtx != NULL, -1);

    /* determine the current node content */
    cur = xmlSecGetNextElementNode(node->children); 
    while(cur != NULL) {
	deleteCurNode = 0;
	if(xmlSecCheckNodeName(cur, xmlSecNodeX509Certificate, xmlSecDSigNs)) {
	    if(xmlSecIsEmptyNode(cur) == 1) {
		content |= XMLSEC_X509DATA_CERTIFICATE_NODE;
		deleteCurNode = 1;
	    }
	} else if(xmlSecCheckNodeName(cur, xmlSecNodeX509SubjectName, xmlSecDSigNs)) {
	    if(xmlSecIsEmptyNode(cur) == 1) {
    	        content |= XMLSEC_X509DATA_SUBJECTNAME_NODE;
		deleteCurNode = 1;
	    }
	} else if(xmlSecCheckNodeName(cur, xmlSecNodeX509IssuerSerial, xmlSecDSigNs)) {
	    if(xmlSecIsEmptyNode(cur) == 1) {
		content |= XMLSEC_X509DATA_ISSUERSERIAL_NODE;
		deleteCurNode = 1;
	    }
	} else if(xmlSecCheckNodeName(cur, xmlSecNodeX509SKI, xmlSecDSigNs)) {
	    if(xmlSecIsEmptyNode(cur) == 1) {
		content |= XMLSEC_X509DATA_SKI_NODE;
		deleteCurNode = 1;
	    }
	} else if(xmlSecCheckNodeName(cur, xmlSecNodeX509CRL, xmlSecDSigNs)) {
	    if(xmlSecIsEmptyNode(cur) == 1) {
		content |= XMLSEC_X509DATA_CRL_NODE;
		deleteCurNode = 1;
	    }
	} else {
	}
	next = xmlSecGetNextElementNode(cur->next);
	if((deleteCurNode != 0) && (deleteChildren != 0)) {
	    /* remove "template" nodes */
	    xmlUnlinkNode(cur);
	    xmlFreeNode(cur);
	}
	cur = next;
    }

    return (content);
}
コード例 #2
0
ファイル: x509.c プロジェクト: esproul/xmlsec
/**
 * xmlSecX509DataGetNodeContent:
 * @node:               the pointer to <dsig:X509Data/> node.
 * @keyInfoCtx:         the pointer to <dsig:KeyInfo/> node processing context.
 *
 * Reads the contents of <dsig:X509Data/> node and returns it as
 * a bits mask.
 *
 * Returns: the bit mask representing the <dsig:X509Data/> node content
 * or a negative value if an error occurs.
 */
int
xmlSecX509DataGetNodeContent (xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx) {
    xmlNodePtr cur;
    int content = 0;

    xmlSecAssert2(node != NULL, 0);
    xmlSecAssert2(keyInfoCtx != NULL, -1);

    /* determine the current node content */
    cur = xmlSecGetNextElementNode(node->children);
    while(cur != NULL) {
        if(xmlSecCheckNodeName(cur, xmlSecNodeX509Certificate, xmlSecDSigNs)) {
            if(xmlSecIsEmptyNode(cur) == 1) {
                content |= XMLSEC_X509DATA_CERTIFICATE_NODE;
            }
        } else if(xmlSecCheckNodeName(cur, xmlSecNodeX509SubjectName, xmlSecDSigNs)) {
            if(xmlSecIsEmptyNode(cur) == 1) {
                content |= XMLSEC_X509DATA_SUBJECTNAME_NODE;
            }
        } else if(xmlSecCheckNodeName(cur, xmlSecNodeX509IssuerSerial, xmlSecDSigNs)) {
            if(xmlSecIsEmptyNode(cur) == 1) {
                content |= XMLSEC_X509DATA_ISSUERSERIAL_NODE;
            }
        } else if(xmlSecCheckNodeName(cur, xmlSecNodeX509SKI, xmlSecDSigNs)) {
            if(xmlSecIsEmptyNode(cur) == 1) {
                content |= XMLSEC_X509DATA_SKI_NODE;
            }
        } else if(xmlSecCheckNodeName(cur, xmlSecNodeX509CRL, xmlSecDSigNs)) {
            if(xmlSecIsEmptyNode(cur) == 1) {
                content |= XMLSEC_X509DATA_CRL_NODE;
            }
        } else {
            /* todo: fail on unknown child node? */
        }
        cur = xmlSecGetNextElementNode(cur->next);
    }

    return (content);
}