-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxmldsig.go
65 lines (56 loc) · 1.56 KB
/
xmldsig.go
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
package xmldsig
import (
"errors"
"github.com/beevik/etree"
)
const (
XmlDSigNamespaceUri string = "http://www.w3.org/2000/09/xmldsig#"
)
var (
ErrElementIsNil = errors.New("element is nil")
ErrInvalidElementTag = errors.New("invalid element tag")
ErrInvalidSignatureMethod = errors.New("invalid signature method")
ErrInvalidDigestMethod = errors.New("invalid digest method")
)
var (
referenceElementResolvers map[string]ResolveReferenceMethod = map[string]ResolveReferenceMethod{}
)
func CryptographicEquals(a, b []byte) bool {
if len(a) != len(b) {
return false
}
r := 0
for i := range a {
r |= (int(a[i]) - int(b[i]))
}
return (r == 0)
}
func validateElement(el *etree.Element, tag string, namespaceUri string) error {
if el == nil {
return ErrElementIsNil
}
if el.Tag != tag || el.NamespaceURI() != namespaceUri {
return ErrInvalidElementTag
}
return nil
}
func getSingleChildElement(el *etree.Element, tag string, namespaceUri string) (*etree.Element, error) {
elements := el.SelectElements(tag)
if len(elements) == 0 {
return nil, newChildElementNotFoundError(el, tag, namespaceUri)
}
if len(elements) > 1 {
return nil, NewMultipleChildElementsFoundError(el, tag, namespaceUri)
}
return elements[0], nil
}
func getOptionalSingleChildElement(el *etree.Element, tag string, namespaceUri string) (*etree.Element, error) {
elements := el.SelectElements(tag)
if len(elements) > 1 {
return nil, NewMultipleChildElementsFoundError(el, tag, namespaceUri)
}
if len(elements) > 0 {
return elements[0], nil
}
return nil, nil
}