1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/**
* XML Security Library (http://www.aleksey.com/xmlsec).
*
* This is free software; see Copyright file in the source
* distribution for preciese wording.
*
* Copyright (C) 2002-2003 Aleksey Sanin <aleksey@aleksey.com>
*/
#include "globals.h"
#ifndef XMLSEC_NO_X509
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <libxml/tree.h>
#include <libxml/parser.h>
#include <xmlsec/xmlsec.h>
#include <xmlsec/buffer.h>
#include <xmlsec/xmltree.h>
#include <xmlsec/keys.h>
#include <xmlsec/keysmngr.h>
#include <xmlsec/transforms.h>
#include <xmlsec/keyinfo.h>
#include <xmlsec/x509.h>
#include <xmlsec/errors.h>
/**
* 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.
*/
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 {
/* todo: fail on unknown child node? */
}
next = xmlSecGetNextElementNode(cur->next);
if((deleteCurNode != 0) && (deleteChildren != 0)) {
/* remove "template" nodes */
xmlUnlinkNode(cur);
xmlFreeNode(cur);
}
cur = next;
}
return (content);
}
#endif /* XMLSEC_NO_X509 */
|