@@ -18,7 +18,6 @@ addons:
|
|||||||
- libxmlsec1-dev
|
- libxmlsec1-dev
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.6
|
|
||||||
- 1.7
|
- 1.7
|
||||||
- tip
|
- tip
|
||||||
|
|
||||||
|
|||||||
51
Makefile
51
Makefile
@@ -43,6 +43,8 @@ endif
|
|||||||
# Add the GO binary dir in the PATH
|
# Add the GO binary dir in the PATH
|
||||||
export PATH := $(GOPATH)/bin:$(PATH)
|
export PATH := $(GOPATH)/bin:$(PATH)
|
||||||
|
|
||||||
|
GOENV=GOPATH=$(GOPATH) CGO_CFLAGS_ALLOW='-w'
|
||||||
|
|
||||||
# --- MAKE TARGETS ---
|
# --- MAKE TARGETS ---
|
||||||
|
|
||||||
# Display general help about this command
|
# Display general help about this command
|
||||||
@@ -81,9 +83,8 @@ all: help
|
|||||||
# Run the unit tests
|
# Run the unit tests
|
||||||
test:
|
test:
|
||||||
@mkdir -p target/test
|
@mkdir -p target/test
|
||||||
GOPATH=$(GOPATH) \
|
$(GOENV) go test -covermode=atomic -bench=. -race -v . | \
|
||||||
go test -covermode=atomic -bench=. -race -v . | \
|
tee >($(GOENV) go-junit-report > target/test/report.xml); \
|
||||||
tee >(PATH=$(GOPATH)/bin:$(PATH) go-junit-report > target/test/report.xml); \
|
|
||||||
test $${PIPESTATUS[0]} -eq 0
|
test $${PIPESTATUS[0]} -eq 0
|
||||||
|
|
||||||
# Format the source code
|
# Format the source code
|
||||||
@@ -98,44 +99,42 @@ fmtcheck:
|
|||||||
|
|
||||||
# Check for syntax errors
|
# Check for syntax errors
|
||||||
vet:
|
vet:
|
||||||
GOPATH=$(GOPATH) go vet .
|
$(GOENV) go vet .
|
||||||
|
|
||||||
# Check for style errors
|
# Check for style errors
|
||||||
lint:
|
lint:
|
||||||
GOPATH=$(GOPATH) PATH=$(GOPATH)/bin:$(PATH) golint .
|
$(GOENV) golint .
|
||||||
|
|
||||||
# Generate the coverage report
|
# Generate the coverage report
|
||||||
coverage:
|
coverage:
|
||||||
@mkdir -p target/report
|
@mkdir -p target/report
|
||||||
GOPATH=$(GOPATH) \
|
$(GOENV) go test -covermode=count -coverprofile=target/report/coverage.out -v . && \
|
||||||
go test -covermode=count -coverprofile=target/report/coverage.out -v . && \
|
$(GOENV) go tool cover -html=target/report/coverage.out -o target/report/coverage.html
|
||||||
GOPATH=$(GOPATH) \
|
|
||||||
go tool cover -html=target/report/coverage.out -o target/report/coverage.html
|
|
||||||
|
|
||||||
# Report cyclomatic complexity
|
# Report cyclomatic complexity
|
||||||
cyclo:
|
cyclo:
|
||||||
@mkdir -p target/report
|
@mkdir -p target/report
|
||||||
GOPATH=$(GOPATH) gocyclo -avg . | tee target/report/cyclo.txt ; test $${PIPESTATUS[0]} -eq 0
|
$(GOENV) gocyclo -avg . | tee target/report/cyclo.txt ; test $${PIPESTATUS[0]} -eq 0
|
||||||
|
|
||||||
# Detect ineffectual assignments
|
# Detect ineffectual assignments
|
||||||
ineffassign:
|
ineffassign:
|
||||||
@mkdir -p target/report
|
@mkdir -p target/report
|
||||||
GOPATH=$(GOPATH) ineffassign . | tee target/report/ineffassign.txt ; test $${PIPESTATUS[0]} -eq 0
|
$(GOENV) ineffassign . | tee target/report/ineffassign.txt ; test $${PIPESTATUS[0]} -eq 0
|
||||||
|
|
||||||
# Detect commonly misspelled words in source files
|
# Detect commonly misspelled words in source files
|
||||||
misspell:
|
misspell:
|
||||||
@mkdir -p target/report
|
@mkdir -p target/report
|
||||||
GOPATH=$(GOPATH) misspell -error . | tee target/report/misspell.txt ; test $${PIPESTATUS[0]} -eq 0
|
$(GOENV) misspell -error . | tee target/report/misspell.txt ; test $${PIPESTATUS[0]} -eq 0
|
||||||
|
|
||||||
# AST scanner
|
# AST scanner
|
||||||
astscan:
|
astscan:
|
||||||
@mkdir -p target/report
|
@mkdir -p target/report
|
||||||
GOPATH=$(GOPATH) gas ./*.go | tee target/report/astscan.txt ; test $${PIPESTATUS[0]} -eq 0
|
$(GOENV) gas ./... | tee target/report/astscan.txt ; test $${PIPESTATUS[0]} -eq 0
|
||||||
|
|
||||||
# Generate source docs
|
# Generate source docs
|
||||||
docs:
|
docs:
|
||||||
@mkdir -p target/docs
|
@mkdir -p target/docs
|
||||||
nohup sh -c 'GOPATH=$(GOPATH) godoc -http=127.0.0.1:6060' > target/godoc_server.log 2>&1 &
|
nohup sh -c '$(GOENV) godoc -http=127.0.0.1:6060' > target/godoc_server.log 2>&1 &
|
||||||
wget --directory-prefix=target/docs/ --execute robots=off --retry-connrefused --recursive --no-parent --adjust-extension --page-requisites --convert-links http://127.0.0.1:6060/pkg/github.com/${VENDOR}/${PROJECT}/ ; kill -9 `lsof -ti :6060`
|
wget --directory-prefix=target/docs/ --execute robots=off --retry-connrefused --recursive --no-parent --adjust-extension --page-requisites --convert-links http://127.0.0.1:6060/pkg/github.com/${VENDOR}/${PROJECT}/ ; kill -9 `lsof -ti :6060`
|
||||||
@echo '<html><head><meta http-equiv="refresh" content="0;./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html"/></head><a href="./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html">'${PKGNAME}' Documentation ...</a></html>' > target/docs/index.html
|
@echo '<html><head><meta http-equiv="refresh" content="0;./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html"/></head><a href="./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html">'${PKGNAME}' Documentation ...</a></html>' > target/docs/index.html
|
||||||
|
|
||||||
@@ -146,25 +145,25 @@ qa: fmtcheck test vet lint coverage cyclo ineffassign misspell astscan
|
|||||||
|
|
||||||
# Get the dependencies
|
# Get the dependencies
|
||||||
deps:
|
deps:
|
||||||
GOPATH=$(GOPATH) go get $(go list ./... | grep -v /vendor/)
|
$(GOENV) go get $(go list ./... | grep -v /vendor/)
|
||||||
GOPATH=$(GOPATH) go get github.com/inconshreveable/mousetrap
|
$(GOENV) go get github.com/inconshreveable/mousetrap
|
||||||
GOPATH=$(GOPATH) go get github.com/golang/lint/golint
|
$(GOENV) go get github.com/golang/lint/golint
|
||||||
GOPATH=$(GOPATH) go get github.com/jstemmer/go-junit-report
|
$(GOENV) go get github.com/jstemmer/go-junit-report
|
||||||
GOPATH=$(GOPATH) go get github.com/axw/gocov/gocov
|
$(GOENV) go get github.com/axw/gocov/gocov
|
||||||
GOPATH=$(GOPATH) go get github.com/fzipp/gocyclo
|
$(GOENV) go get github.com/fzipp/gocyclo
|
||||||
GOPATH=$(GOPATH) go get github.com/gordonklaus/ineffassign
|
$(GOENV) go get github.com/gordonklaus/ineffassign
|
||||||
GOPATH=$(GOPATH) go get github.com/client9/misspell/cmd/misspell
|
$(GOENV) go get github.com/client9/misspell/cmd/misspell
|
||||||
GOPATH=$(GOPATH) go get github.com/HewlettPackard/gas
|
$(GOENV) go get github.com/HewlettPackard/gas/cmd/gas
|
||||||
GOPATH=$(GOPATH) go get gopkg.in/check.v1
|
$(GOENV) go get gopkg.in/check.v1
|
||||||
|
|
||||||
# Remove any build artifact
|
# Remove any build artifact
|
||||||
clean:
|
clean:
|
||||||
GOPATH=$(GOPATH) go clean ./...
|
$(GOENV) go clean ./...
|
||||||
|
|
||||||
# Deletes any intermediate file
|
# Deletes any intermediate file
|
||||||
nuke:
|
nuke:
|
||||||
rm -rf ./target
|
rm -rf ./target
|
||||||
GOPATH=$(GOPATH) go clean -i ./...
|
$(GOENV) go clean -i ./...
|
||||||
|
|
||||||
# Full build and test sequence
|
# Full build and test sequence
|
||||||
buildall: deps qa
|
buildall: deps qa
|
||||||
|
|||||||
@@ -1,18 +1,13 @@
|
|||||||
// +build !static
|
|
||||||
|
|
||||||
package xmlsec
|
package xmlsec
|
||||||
|
|
||||||
|
// #cgo pkg-config: xmlsec1 libxml-2.0
|
||||||
// #cgo linux CFLAGS: -w
|
// #cgo linux CFLAGS: -w
|
||||||
// #cgo darwin CFLAGS: -Wno-invalid-pp-token -Wno-header-guard
|
// #cgo linux LDFLAGS: -lxml2 -lm
|
||||||
// #cgo pkg-config: xmlsec1
|
|
||||||
// #include <xmlsec/xmlsec.h>
|
// #include <xmlsec/xmlsec.h>
|
||||||
// #include <xmlsec/xmltree.h>
|
// #include <xmlsec/xmltree.h>
|
||||||
// #include <xmlsec/xmlenc.h>
|
// #include <xmlsec/xmlenc.h>
|
||||||
// #include <xmlsec/templates.h>
|
// #include <xmlsec/templates.h>
|
||||||
// #include <xmlsec/crypto.h>
|
// #include <xmlsec/crypto.h>
|
||||||
import "C"
|
|
||||||
|
|
||||||
// #cgo pkg-config: libxml-2.0
|
|
||||||
// #include <libxml/parser.h>
|
// #include <libxml/parser.h>
|
||||||
// #include <libxml/parserInternals.h>
|
// #include <libxml/parserInternals.h>
|
||||||
// #include <libxml/xmlmemory.h>
|
// #include <libxml/xmlmemory.h>
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
// +build static
|
|
||||||
|
|
||||||
package xmlsec
|
|
||||||
|
|
||||||
// #cgo linux CFLAGS: -w
|
|
||||||
// #cgo darwin CFLAGS: -Wno-invalid-pp-token -Wno-header-guard
|
|
||||||
// #cgo pkg-config: --static xmlsec1
|
|
||||||
// #include <xmlsec/xmlsec.h>
|
|
||||||
// #include <xmlsec/xmltree.h>
|
|
||||||
// #include <xmlsec/xmlenc.h>
|
|
||||||
// #include <xmlsec/templates.h>
|
|
||||||
// #include <xmlsec/crypto.h>
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
// #cgo pkg-config: --static libxml-2.0
|
|
||||||
// #include <libxml/parser.h>
|
|
||||||
// #include <libxml/parserInternals.h>
|
|
||||||
// #include <libxml/xmlmemory.h>
|
|
||||||
import "C"
|
|
||||||
@@ -42,7 +42,7 @@ func main() {
|
|||||||
fmt.Printf("%s\n", err)
|
fmt.Printf("%s\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
os.Stdout.Write(signedBuf)
|
os.Stdout.Write(signedBuf) //#nosec
|
||||||
}
|
}
|
||||||
|
|
||||||
if *doVerify {
|
if *doVerify {
|
||||||
|
|||||||
24
resources/certs/cert1
Normal file
24
resources/certs/cert1
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDzzCCAzigAwIBAgIJAK+ii7kzrdqtMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
|
||||||
|
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1MIFNlY3Vy
|
||||||
|
aXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2VjKTEQMA4G
|
||||||
|
A1UECxMHUm9vdCBDQTEWMBQGA1UEAxMNQWxla3NleSBTYW5pbjEhMB8GCSqGSIb3
|
||||||
|
DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tMCAXDTE0MDUyMzE3NTIzOFoYDzIxMTQw
|
||||||
|
NDI5MTc1MjM4WjCBnDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWEx
|
||||||
|
PTA7BgNVBAoTNFhNTCBTZWN1cml0eSBMaWJyYXJ5IChodHRwOi8vd3d3LmFsZWtz
|
||||||
|
ZXkuY29tL3htbHNlYykxFjAUBgNVBAMTDUFsZWtzZXkgU2FuaW4xITAfBgkqhkiG
|
||||||
|
9w0BCQEWEnhtbHNlY0BhbGVrc2V5LmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC
|
||||||
|
QQCyuvKJ2CuUPD33ghPt4Q8MilesHxVbbpyKfmabrYVpDGVDmOKKp337qJUZZ95K
|
||||||
|
fwlXbR2j0zyKWJmvRxUx+PsTAgMBAAGjggFFMIIBQTAMBgNVHRMEBTADAQH/MCwG
|
||||||
|
CWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNV
|
||||||
|
HQ4EFgQU/uTsUyTwlZXHELXhRLVdOWVa434wgeMGA1UdIwSB2zCB2IAUBrWkrKeq
|
||||||
|
dUTqFZxP3wWDT2oe/guhgbSkgbEwga4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpD
|
||||||
|
YWxpZm9ybmlhMT0wOwYDVQQKEzRYTUwgU2VjdXJpdHkgTGlicmFyeSAoaHR0cDov
|
||||||
|
L3d3dy5hbGVrc2V5LmNvbS94bWxzZWMpMRAwDgYDVQQLEwdSb290IENBMRYwFAYD
|
||||||
|
VQQDEw1BbGVrc2V5IFNhbmluMSEwHwYJKoZIhvcNAQkBFhJ4bWxzZWNAYWxla3Nl
|
||||||
|
eS5jb22CCQCvoou5M63arDANBgkqhkiG9w0BAQUFAAOBgQBuTAW63AgWqqUDPGi8
|
||||||
|
BiXbdKHhFP4J8qgkdv5WMa6SpSWVgNgOYXkK/BSg1aSmQtGv8/8UvBRPoJnO4y0N
|
||||||
|
jWUFf1ubOgUNmedYNLq7YbTp8yTGWeogCyM2xdWELMP8BMgQL0sP+MDAFMKO3itY
|
||||||
|
mEWnCEsP15HKSTms54RNj7oJ+A==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
25
resources/certs/cert2
Normal file
25
resources/certs/cert2
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIID9zCCA2CgAwIBAgIJAK+ii7kzrdqsMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
|
||||||
|
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1MIFNlY3Vy
|
||||||
|
aXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2VjKTEQMA4G
|
||||||
|
A1UECxMHUm9vdCBDQTEWMBQGA1UEAxMNQWxla3NleSBTYW5pbjEhMB8GCSqGSIb3
|
||||||
|
DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tMCAXDTE0MDUyMzE3NTA1OVoYDzIxMTQw
|
||||||
|
NDI5MTc1MDU5WjCBrjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWEx
|
||||||
|
PTA7BgNVBAoTNFhNTCBTZWN1cml0eSBMaWJyYXJ5IChodHRwOi8vd3d3LmFsZWtz
|
||||||
|
ZXkuY29tL3htbHNlYykxEDAOBgNVBAsTB1Jvb3QgQ0ExFjAUBgNVBAMTDUFsZWtz
|
||||||
|
ZXkgU2FuaW4xITAfBgkqhkiG9w0BCQEWEnhtbHNlY0BhbGVrc2V5LmNvbTCBnzAN
|
||||||
|
BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAtY4MCNj/qrOzVuex1BD/PuCYTDDOLLVj
|
||||||
|
tpKXQteQPqy0kgMwuQgRwdNnICIHQbnFKL40XoyACJVWKM7b0LkvWJNeyVzXPqEE
|
||||||
|
9ZPmNxWGUjVcr7powT7v8V7S2QflUnr8ZvR4XWwkZJ9EYKNhenijgJ5yYDrXCWdv
|
||||||
|
C+fnjBjv2LcCAwEAAaOCARcwggETMB0GA1UdDgQWBBQGtaSsp6p1ROoVnE/fBYNP
|
||||||
|
ah7+CzCB4wYDVR0jBIHbMIHYgBQGtaSsp6p1ROoVnE/fBYNPah7+C6GBtKSBsTCB
|
||||||
|
rjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExPTA7BgNVBAoTNFhN
|
||||||
|
TCBTZWN1cml0eSBMaWJyYXJ5IChodHRwOi8vd3d3LmFsZWtzZXkuY29tL3htbHNl
|
||||||
|
YykxEDAOBgNVBAsTB1Jvb3QgQ0ExFjAUBgNVBAMTDUFsZWtzZXkgU2FuaW4xITAf
|
||||||
|
BgkqhkiG9w0BCQEWEnhtbHNlY0BhbGVrc2V5LmNvbYIJAK+ii7kzrdqsMAwGA1Ud
|
||||||
|
EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEARpb86RP/ck55X+NunXeIX81i763b
|
||||||
|
j7Z1VJwFbA/QfupzxnqJ2IP/lxC8YxJ3Bp2IJMI7rC9r0poa41ZxI5rGHip97Dpg
|
||||||
|
sxPF9lkRUmKBBQjkICOq1w/4d2DRInBoqXttD+0WsqDfNDVK+7kSE07ytn3RzHCj
|
||||||
|
j0gv0PdxmuCsR/E=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
23
resources/certs/cert3
Normal file
23
resources/certs/cert3
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDpzCCA1GgAwIBAgIJAK+ii7kzrdqvMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD
|
||||||
|
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1MIFNlY3Vy
|
||||||
|
aXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2VjKTEWMBQG
|
||||||
|
A1UEAxMNQWxla3NleSBTYW5pbjEhMB8GCSqGSIb3DQEJARYSeG1sc2VjQGFsZWtz
|
||||||
|
ZXkuY29tMCAXDTE0MDUyMzE3NTUzNFoYDzIxMTQwNDI5MTc1NTM0WjCBxzELMAkG
|
||||||
|
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExPTA7BgNVBAoTNFhNTCBTZWN1
|
||||||
|
cml0eSBMaWJyYXJ5IChodHRwOi8vd3d3LmFsZWtzZXkuY29tL3htbHNlYykxKTAn
|
||||||
|
BgNVBAsTIFRlc3QgVGhpcmQgTGV2ZWwgUlNBIENlcnRpZmljYXRlMRYwFAYDVQQD
|
||||||
|
Ew1BbGVrc2V5IFNhbmluMSEwHwYJKoZIhvcNAQkBFhJ4bWxzZWNAYWxla3NleS5j
|
||||||
|
b20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEA09BtD3aeVt6DVDkk0dI7Vh7Ljqdn
|
||||||
|
sYmW0tbDVxxK+nume+Z9Sb4znbUKkWl+vgQATdRUEyhT2P+Gqrd0UBzYfQIDAQAB
|
||||||
|
o4IBRTCCAUEwDAYDVR0TBAUwAwEB/zAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH
|
||||||
|
ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFNf0xkZ3zjcEI60pVPuwDqTM
|
||||||
|
QygZMIHjBgNVHSMEgdswgdiAFP7k7FMk8JWVxxC14US1XTllWuN+oYG0pIGxMIGu
|
||||||
|
MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1M
|
||||||
|
IFNlY3VyaXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2Vj
|
||||||
|
KTEQMA4GA1UECxMHUm9vdCBDQTEWMBQGA1UEAxMNQWxla3NleSBTYW5pbjEhMB8G
|
||||||
|
CSqGSIb3DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tggkAr6KLuTOt2q0wDQYJKoZI
|
||||||
|
hvcNAQEFBQADQQAOXBj0yICp1RmHXqnUlsppryLCW3pKBD1dkb4HWarO7RjA1yJJ
|
||||||
|
fBjXssrERn05kpBcrRfzou4r3DCgQFPhjxga
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
138
xmldsig.go
138
xmldsig.go
@@ -5,12 +5,36 @@ import (
|
|||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// #include <xmlsec/xmlsec.h>
|
/*
|
||||||
// #include <xmlsec/xmltree.h>
|
#include <xmlsec/xmlsec.h>
|
||||||
// #include <xmlsec/xmlenc.h>
|
#include <xmlsec/xmltree.h>
|
||||||
// #include <xmlsec/xmldsig.h>
|
#include <xmlsec/xmlenc.h>
|
||||||
// #include <xmlsec/errors.h>
|
#include <xmlsec/xmldsig.h>
|
||||||
// #include <xmlsec/crypto.h>
|
#include <xmlsec/errors.h>
|
||||||
|
#include <xmlsec/crypto.h>
|
||||||
|
#include <xmlsec/nodeset.h>
|
||||||
|
#include <libxml/list.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
xmlSecFindNodes(const xmlListPtr found, const xmlNodePtr parent, const xmlChar *name, const xmlChar *ns) {
|
||||||
|
|
||||||
|
xmlNodePtr cur;
|
||||||
|
xmlNodePtr ret;
|
||||||
|
|
||||||
|
xmlSecAssert2(name != NULL, NULL);
|
||||||
|
|
||||||
|
cur = parent;
|
||||||
|
while(cur != NULL) {
|
||||||
|
if(cur->children != NULL) {
|
||||||
|
xmlSecFindNodes(found, cur->children, name, ns);
|
||||||
|
}
|
||||||
|
if((cur->type == XML_ELEMENT_NODE) && xmlSecCheckNodeName(cur, name, ns)) {
|
||||||
|
xmlListPushFront(found, cur);
|
||||||
|
}
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
// SignatureOptions represents additional, less commonly used, options for Sign and
|
// SignatureOptions represents additional, less commonly used, options for Sign and
|
||||||
@@ -42,22 +66,6 @@ func Sign(key []byte, doc []byte, opts SignatureOptions) ([]byte, error) {
|
|||||||
startProcessingXML()
|
startProcessingXML()
|
||||||
defer stopProcessingXML()
|
defer stopProcessingXML()
|
||||||
|
|
||||||
ctx := C.xmlSecDSigCtxCreate(nil)
|
|
||||||
if ctx == nil {
|
|
||||||
return nil, errors.New("failed to create signature context")
|
|
||||||
}
|
|
||||||
defer C.xmlSecDSigCtxDestroy(ctx)
|
|
||||||
|
|
||||||
// #nosec
|
|
||||||
ctx.signKey = C.xmlSecCryptoAppKeyLoadMemory(
|
|
||||||
(*C.xmlSecByte)(unsafe.Pointer(&key[0])),
|
|
||||||
C.xmlSecSize(len(key)),
|
|
||||||
C.xmlSecKeyDataFormatPem,
|
|
||||||
nil, nil, nil)
|
|
||||||
if ctx.signKey == nil {
|
|
||||||
return nil, errors.New("failed to load pem key")
|
|
||||||
}
|
|
||||||
|
|
||||||
parsedDoc, err := newDoc(doc, opts.XMLID)
|
parsedDoc, err := newDoc(doc, opts.XMLID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -65,15 +73,51 @@ func Sign(key []byte, doc []byte, opts SignatureOptions) ([]byte, error) {
|
|||||||
defer closeDoc(parsedDoc)
|
defer closeDoc(parsedDoc)
|
||||||
|
|
||||||
// #nosec
|
// #nosec
|
||||||
node := C.xmlSecFindNode(C.xmlDocGetRootElement(parsedDoc),
|
found := C.xmlListCreate(nil, nil)
|
||||||
|
defer func() { C.xmlListDelete(found) }()
|
||||||
|
|
||||||
|
C.xmlSecFindNodes(
|
||||||
|
found,
|
||||||
|
C.xmlDocGetRootElement(parsedDoc),
|
||||||
(*C.xmlChar)(unsafe.Pointer(&C.xmlSecNodeSignature)),
|
(*C.xmlChar)(unsafe.Pointer(&C.xmlSecNodeSignature)),
|
||||||
(*C.xmlChar)(unsafe.Pointer(&C.xmlSecDSigNs)))
|
(*C.xmlChar)(unsafe.Pointer(&C.xmlSecDSigNs)))
|
||||||
if node == nil {
|
|
||||||
|
c := C.xmlListSize(found)
|
||||||
|
if c == 0 {
|
||||||
return nil, errors.New("cannot find start node")
|
return nil, errors.New("cannot find start node")
|
||||||
}
|
}
|
||||||
|
|
||||||
if rv := C.xmlSecDSigCtxSign(ctx, node); rv < 0 {
|
for C.xmlListEmpty(found) == 0 {
|
||||||
return nil, errors.New("failed to sign")
|
link := C.xmlListFront(found)
|
||||||
|
if link == nil {
|
||||||
|
return nil, errors.New("Link is null")
|
||||||
|
}
|
||||||
|
|
||||||
|
node := (C.xmlNodePtr)(C.xmlLinkGetData(link))
|
||||||
|
if node != nil {
|
||||||
|
|
||||||
|
ctx := C.xmlSecDSigCtxCreate(nil)
|
||||||
|
if ctx == nil {
|
||||||
|
return nil, errors.New("failed to create signature context")
|
||||||
|
}
|
||||||
|
defer C.xmlSecDSigCtxDestroy(ctx)
|
||||||
|
|
||||||
|
// #nosec
|
||||||
|
ctx.signKey = C.xmlSecCryptoAppKeyLoadMemory(
|
||||||
|
(*C.xmlSecByte)(unsafe.Pointer(&key[0])),
|
||||||
|
C.xmlSecSize(len(key)),
|
||||||
|
C.xmlSecKeyDataFormatPem,
|
||||||
|
nil, nil, nil)
|
||||||
|
|
||||||
|
if ctx.signKey == nil {
|
||||||
|
return nil, errors.New("failed to load pem key")
|
||||||
|
}
|
||||||
|
|
||||||
|
if rv := C.xmlSecDSigCtxSign(ctx, node); rv < 0 {
|
||||||
|
return nil, errors.New("failed to sign")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
C.xmlListPopFront(found)
|
||||||
}
|
}
|
||||||
|
|
||||||
return dumpDoc(parsedDoc), nil
|
return dumpDoc(parsedDoc), nil
|
||||||
@@ -131,12 +175,6 @@ func Verify(publicKey []byte, doc []byte, opts SignatureOptions) error {
|
|||||||
return mustPopError()
|
return mustPopError()
|
||||||
}
|
}
|
||||||
|
|
||||||
dsigCtx := C.xmlSecDSigCtxCreate(keysMngr)
|
|
||||||
if dsigCtx == nil {
|
|
||||||
return mustPopError()
|
|
||||||
}
|
|
||||||
defer C.xmlSecDSigCtxDestroy(dsigCtx)
|
|
||||||
|
|
||||||
parsedDoc, err := newDoc(doc, opts.XMLID)
|
parsedDoc, err := newDoc(doc, opts.XMLID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -144,19 +182,41 @@ func Verify(publicKey []byte, doc []byte, opts SignatureOptions) error {
|
|||||||
defer closeDoc(parsedDoc)
|
defer closeDoc(parsedDoc)
|
||||||
|
|
||||||
// #nosec
|
// #nosec
|
||||||
node := C.xmlSecFindNode(C.xmlDocGetRootElement(parsedDoc),
|
found := C.xmlListCreate(nil, nil)
|
||||||
|
defer func() { C.xmlListDelete(found) }()
|
||||||
|
|
||||||
|
C.xmlSecFindNodes(
|
||||||
|
found,
|
||||||
|
C.xmlDocGetRootElement(parsedDoc),
|
||||||
(*C.xmlChar)(unsafe.Pointer(&C.xmlSecNodeSignature)),
|
(*C.xmlChar)(unsafe.Pointer(&C.xmlSecNodeSignature)),
|
||||||
(*C.xmlChar)(unsafe.Pointer(&C.xmlSecDSigNs)))
|
(*C.xmlChar)(unsafe.Pointer(&C.xmlSecDSigNs)))
|
||||||
if node == nil {
|
|
||||||
|
c := C.xmlListSize(found)
|
||||||
|
if c == 0 {
|
||||||
return errors.New("cannot find start node")
|
return errors.New("cannot find start node")
|
||||||
}
|
}
|
||||||
|
|
||||||
if rv := C.xmlSecDSigCtxVerify(dsigCtx, node); rv < 0 {
|
for C.xmlListEmpty(found) == 0 {
|
||||||
return ErrVerificationFailed
|
link := C.xmlListFront(found)
|
||||||
}
|
if link == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
node := (C.xmlNodePtr)(C.xmlLinkGetData(link))
|
||||||
|
if node != nil {
|
||||||
|
ctx := C.xmlSecDSigCtxCreate(keysMngr)
|
||||||
|
if ctx == nil {
|
||||||
|
return mustPopError()
|
||||||
|
}
|
||||||
|
defer C.xmlSecDSigCtxDestroy(ctx)
|
||||||
|
|
||||||
if dsigCtx.status != xmlSecDSigStatusSucceeded {
|
if rv := C.xmlSecDSigCtxVerify(ctx, node); rv < 0 {
|
||||||
return ErrVerificationFailed
|
return ErrVerificationFailed
|
||||||
|
}
|
||||||
|
if ctx.status != xmlSecDSigStatusSucceeded {
|
||||||
|
return ErrVerificationFailed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
C.xmlListPopFront(found)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
204
xmldsig_test.go
204
xmldsig_test.go
@@ -2,9 +2,8 @@ package xmlsec
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"strings"
|
|
||||||
|
|
||||||
. "gopkg.in/check.v1"
|
. "gopkg.in/check.v1"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Envelope struct {
|
type Envelope struct {
|
||||||
@@ -163,6 +162,207 @@ fBjXssrERn05kpBcrRfzou4r3DCgQFPhjxga</X509Certificate>
|
|||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (testSuite *XMLDSigTest) TestSignAndVerifyMultiple(c *C) {
|
||||||
|
expectedSignedString := `<?xml version="1.0"?>
|
||||||
|
<Envelope xmlns="urn:envelope">
|
||||||
|
<Data1 ID="id1">
|
||||||
|
Hello, World!
|
||||||
|
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
||||||
|
<SignedInfo>
|
||||||
|
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
||||||
|
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
||||||
|
<Reference URI="#id1">
|
||||||
|
<Transforms>
|
||||||
|
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
||||||
|
</Transforms>
|
||||||
|
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
||||||
|
<DigestValue>ixa7UpgiS2UJ37IG9HzhfK7z+Fo=</DigestValue>
|
||||||
|
</Reference>
|
||||||
|
</SignedInfo>
|
||||||
|
<SignatureValue>xaMgajZ9tBswZmIP5JoBwXMpD9W74fVbfWJ/HkfTHYkXNejOXT+UocvaGaVCqPNE
|
||||||
|
+6rzavcVq18agibmYCkm6w==</SignatureValue>
|
||||||
|
<KeyInfo>
|
||||||
|
<X509Data>
|
||||||
|
<X509Certificate>MIIDpzCCA1GgAwIBAgIJAK+ii7kzrdqvMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD
|
||||||
|
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1MIFNlY3Vy
|
||||||
|
aXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2VjKTEWMBQG
|
||||||
|
A1UEAxMNQWxla3NleSBTYW5pbjEhMB8GCSqGSIb3DQEJARYSeG1sc2VjQGFsZWtz
|
||||||
|
ZXkuY29tMCAXDTE0MDUyMzE3NTUzNFoYDzIxMTQwNDI5MTc1NTM0WjCBxzELMAkG
|
||||||
|
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExPTA7BgNVBAoTNFhNTCBTZWN1
|
||||||
|
cml0eSBMaWJyYXJ5IChodHRwOi8vd3d3LmFsZWtzZXkuY29tL3htbHNlYykxKTAn
|
||||||
|
BgNVBAsTIFRlc3QgVGhpcmQgTGV2ZWwgUlNBIENlcnRpZmljYXRlMRYwFAYDVQQD
|
||||||
|
Ew1BbGVrc2V5IFNhbmluMSEwHwYJKoZIhvcNAQkBFhJ4bWxzZWNAYWxla3NleS5j
|
||||||
|
b20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEA09BtD3aeVt6DVDkk0dI7Vh7Ljqdn
|
||||||
|
sYmW0tbDVxxK+nume+Z9Sb4znbUKkWl+vgQATdRUEyhT2P+Gqrd0UBzYfQIDAQAB
|
||||||
|
o4IBRTCCAUEwDAYDVR0TBAUwAwEB/zAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH
|
||||||
|
ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFNf0xkZ3zjcEI60pVPuwDqTM
|
||||||
|
QygZMIHjBgNVHSMEgdswgdiAFP7k7FMk8JWVxxC14US1XTllWuN+oYG0pIGxMIGu
|
||||||
|
MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1M
|
||||||
|
IFNlY3VyaXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2Vj
|
||||||
|
KTEQMA4GA1UECxMHUm9vdCBDQTEWMBQGA1UEAxMNQWxla3NleSBTYW5pbjEhMB8G
|
||||||
|
CSqGSIb3DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tggkAr6KLuTOt2q0wDQYJKoZI
|
||||||
|
hvcNAQEFBQADQQAOXBj0yICp1RmHXqnUlsppryLCW3pKBD1dkb4HWarO7RjA1yJJ
|
||||||
|
fBjXssrERn05kpBcrRfzou4r3DCgQFPhjxga</X509Certificate>
|
||||||
|
</X509Data>
|
||||||
|
</KeyInfo>
|
||||||
|
</Signature>
|
||||||
|
<Data2 ID="id2">
|
||||||
|
Hello, World!
|
||||||
|
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
||||||
|
<SignedInfo>
|
||||||
|
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
||||||
|
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
||||||
|
<Reference URI="#id2">
|
||||||
|
<Transforms>
|
||||||
|
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
||||||
|
</Transforms>
|
||||||
|
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
||||||
|
<DigestValue>6hs7C+iZA45BBGAcaI0aNnMz+Ts=</DigestValue>
|
||||||
|
</Reference>
|
||||||
|
</SignedInfo>
|
||||||
|
<SignatureValue>F23IldNw0Gozri5ySU5Esopz7llkBrDJNHNgm+Ww93mrU5w1IrP0J7Cv0Xn19ro2
|
||||||
|
QsO3oBVrpdMotMsFkbEVkA==</SignatureValue>
|
||||||
|
<KeyInfo>
|
||||||
|
<X509Data>
|
||||||
|
<X509Certificate>MIIDpzCCA1GgAwIBAgIJAK+ii7kzrdqvMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD
|
||||||
|
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1MIFNlY3Vy
|
||||||
|
aXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2VjKTEWMBQG
|
||||||
|
A1UEAxMNQWxla3NleSBTYW5pbjEhMB8GCSqGSIb3DQEJARYSeG1sc2VjQGFsZWtz
|
||||||
|
ZXkuY29tMCAXDTE0MDUyMzE3NTUzNFoYDzIxMTQwNDI5MTc1NTM0WjCBxzELMAkG
|
||||||
|
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExPTA7BgNVBAoTNFhNTCBTZWN1
|
||||||
|
cml0eSBMaWJyYXJ5IChodHRwOi8vd3d3LmFsZWtzZXkuY29tL3htbHNlYykxKTAn
|
||||||
|
BgNVBAsTIFRlc3QgVGhpcmQgTGV2ZWwgUlNBIENlcnRpZmljYXRlMRYwFAYDVQQD
|
||||||
|
Ew1BbGVrc2V5IFNhbmluMSEwHwYJKoZIhvcNAQkBFhJ4bWxzZWNAYWxla3NleS5j
|
||||||
|
b20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEA09BtD3aeVt6DVDkk0dI7Vh7Ljqdn
|
||||||
|
sYmW0tbDVxxK+nume+Z9Sb4znbUKkWl+vgQATdRUEyhT2P+Gqrd0UBzYfQIDAQAB
|
||||||
|
o4IBRTCCAUEwDAYDVR0TBAUwAwEB/zAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH
|
||||||
|
ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFNf0xkZ3zjcEI60pVPuwDqTM
|
||||||
|
QygZMIHjBgNVHSMEgdswgdiAFP7k7FMk8JWVxxC14US1XTllWuN+oYG0pIGxMIGu
|
||||||
|
MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1M
|
||||||
|
IFNlY3VyaXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2Vj
|
||||||
|
KTEQMA4GA1UECxMHUm9vdCBDQTEWMBQGA1UEAxMNQWxla3NleSBTYW5pbjEhMB8G
|
||||||
|
CSqGSIb3DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tggkAr6KLuTOt2q0wDQYJKoZI
|
||||||
|
hvcNAQEFBQADQQAOXBj0yICp1RmHXqnUlsppryLCW3pKBD1dkb4HWarO7RjA1yJJ
|
||||||
|
fBjXssrERn05kpBcrRfzou4r3DCgQFPhjxga</X509Certificate>
|
||||||
|
</X509Data>
|
||||||
|
</KeyInfo>
|
||||||
|
</Signature>
|
||||||
|
</Data2>
|
||||||
|
</Data1>
|
||||||
|
</Envelope>
|
||||||
|
`
|
||||||
|
actualUnsignedString := `
|
||||||
|
<Envelope xmlns="urn:envelope">
|
||||||
|
<Data1 ID="id1">
|
||||||
|
Hello, World!
|
||||||
|
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
||||||
|
<SignedInfo>
|
||||||
|
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
||||||
|
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
||||||
|
<Reference URI="#id1">
|
||||||
|
<Transforms>
|
||||||
|
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
||||||
|
</Transforms>
|
||||||
|
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
||||||
|
<DigestValue/>
|
||||||
|
</Reference>
|
||||||
|
</SignedInfo>
|
||||||
|
<SignatureValue/>
|
||||||
|
<KeyInfo>
|
||||||
|
<X509Data>
|
||||||
|
<X509Certificate>MIIDpzCCA1GgAwIBAgIJAK+ii7kzrdqvMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD
|
||||||
|
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1MIFNlY3Vy
|
||||||
|
aXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2VjKTEWMBQG
|
||||||
|
A1UEAxMNQWxla3NleSBTYW5pbjEhMB8GCSqGSIb3DQEJARYSeG1sc2VjQGFsZWtz
|
||||||
|
ZXkuY29tMCAXDTE0MDUyMzE3NTUzNFoYDzIxMTQwNDI5MTc1NTM0WjCBxzELMAkG
|
||||||
|
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExPTA7BgNVBAoTNFhNTCBTZWN1
|
||||||
|
cml0eSBMaWJyYXJ5IChodHRwOi8vd3d3LmFsZWtzZXkuY29tL3htbHNlYykxKTAn
|
||||||
|
BgNVBAsTIFRlc3QgVGhpcmQgTGV2ZWwgUlNBIENlcnRpZmljYXRlMRYwFAYDVQQD
|
||||||
|
Ew1BbGVrc2V5IFNhbmluMSEwHwYJKoZIhvcNAQkBFhJ4bWxzZWNAYWxla3NleS5j
|
||||||
|
b20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEA09BtD3aeVt6DVDkk0dI7Vh7Ljqdn
|
||||||
|
sYmW0tbDVxxK+nume+Z9Sb4znbUKkWl+vgQATdRUEyhT2P+Gqrd0UBzYfQIDAQAB
|
||||||
|
o4IBRTCCAUEwDAYDVR0TBAUwAwEB/zAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH
|
||||||
|
ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFNf0xkZ3zjcEI60pVPuwDqTM
|
||||||
|
QygZMIHjBgNVHSMEgdswgdiAFP7k7FMk8JWVxxC14US1XTllWuN+oYG0pIGxMIGu
|
||||||
|
MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1M
|
||||||
|
IFNlY3VyaXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2Vj
|
||||||
|
KTEQMA4GA1UECxMHUm9vdCBDQTEWMBQGA1UEAxMNQWxla3NleSBTYW5pbjEhMB8G
|
||||||
|
CSqGSIb3DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tggkAr6KLuTOt2q0wDQYJKoZI
|
||||||
|
hvcNAQEFBQADQQAOXBj0yICp1RmHXqnUlsppryLCW3pKBD1dkb4HWarO7RjA1yJJ
|
||||||
|
fBjXssrERn05kpBcrRfzou4r3DCgQFPhjxga</X509Certificate>
|
||||||
|
</X509Data>
|
||||||
|
</KeyInfo>
|
||||||
|
</Signature>
|
||||||
|
<Data2 ID="id2">
|
||||||
|
Hello, World!
|
||||||
|
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
||||||
|
<SignedInfo>
|
||||||
|
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
||||||
|
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
||||||
|
<Reference URI="#id2">
|
||||||
|
<Transforms>
|
||||||
|
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
||||||
|
</Transforms>
|
||||||
|
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
||||||
|
<DigestValue/>
|
||||||
|
</Reference>
|
||||||
|
</SignedInfo>
|
||||||
|
<SignatureValue/>
|
||||||
|
<KeyInfo>
|
||||||
|
<X509Data>
|
||||||
|
<X509Certificate>MIIDpzCCA1GgAwIBAgIJAK+ii7kzrdqvMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD
|
||||||
|
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1MIFNlY3Vy
|
||||||
|
aXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2VjKTEWMBQG
|
||||||
|
A1UEAxMNQWxla3NleSBTYW5pbjEhMB8GCSqGSIb3DQEJARYSeG1sc2VjQGFsZWtz
|
||||||
|
ZXkuY29tMCAXDTE0MDUyMzE3NTUzNFoYDzIxMTQwNDI5MTc1NTM0WjCBxzELMAkG
|
||||||
|
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExPTA7BgNVBAoTNFhNTCBTZWN1
|
||||||
|
cml0eSBMaWJyYXJ5IChodHRwOi8vd3d3LmFsZWtzZXkuY29tL3htbHNlYykxKTAn
|
||||||
|
BgNVBAsTIFRlc3QgVGhpcmQgTGV2ZWwgUlNBIENlcnRpZmljYXRlMRYwFAYDVQQD
|
||||||
|
Ew1BbGVrc2V5IFNhbmluMSEwHwYJKoZIhvcNAQkBFhJ4bWxzZWNAYWxla3NleS5j
|
||||||
|
b20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEA09BtD3aeVt6DVDkk0dI7Vh7Ljqdn
|
||||||
|
sYmW0tbDVxxK+nume+Z9Sb4znbUKkWl+vgQATdRUEyhT2P+Gqrd0UBzYfQIDAQAB
|
||||||
|
o4IBRTCCAUEwDAYDVR0TBAUwAwEB/zAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH
|
||||||
|
ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFNf0xkZ3zjcEI60pVPuwDqTM
|
||||||
|
QygZMIHjBgNVHSMEgdswgdiAFP7k7FMk8JWVxxC14US1XTllWuN+oYG0pIGxMIGu
|
||||||
|
MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTE9MDsGA1UEChM0WE1M
|
||||||
|
IFNlY3VyaXR5IExpYnJhcnkgKGh0dHA6Ly93d3cuYWxla3NleS5jb20veG1sc2Vj
|
||||||
|
KTEQMA4GA1UECxMHUm9vdCBDQTEWMBQGA1UEAxMNQWxla3NleSBTYW5pbjEhMB8G
|
||||||
|
CSqGSIb3DQEJARYSeG1sc2VjQGFsZWtzZXkuY29tggkAr6KLuTOt2q0wDQYJKoZI
|
||||||
|
hvcNAQEFBQADQQAOXBj0yICp1RmHXqnUlsppryLCW3pKBD1dkb4HWarO7RjA1yJJ
|
||||||
|
fBjXssrERn05kpBcrRfzou4r3DCgQFPhjxga</X509Certificate>
|
||||||
|
</X509Data>
|
||||||
|
</KeyInfo>
|
||||||
|
</Signature>
|
||||||
|
</Data2>
|
||||||
|
</Data1>
|
||||||
|
</Envelope>
|
||||||
|
`
|
||||||
|
opts := SignatureOptions{XMLID: []XMLIDOption{
|
||||||
|
{ElementName: "Data1", AttributeName: "ID"},
|
||||||
|
{ElementName: "Data2", AttributeName: "ID"},
|
||||||
|
}}
|
||||||
|
|
||||||
|
actualSignedString, err := Sign(testSuite.Key, []byte(actualUnsignedString), opts)
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(string(actualSignedString), Equals, expectedSignedString)
|
||||||
|
|
||||||
|
err = Verify(testSuite.Cert, actualSignedString, opts)
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
|
data1Sig := `<SignatureValue>xaMgajZ9tBswZmIP5JoBwXMpD9W74fVbfWJ/HkfTHYkXNejOXT+UocvaGaVCqPNE
|
||||||
|
+6rzavcVq18agibmYCkm6w==</SignatureValue>`
|
||||||
|
data2Sig := `<SignatureValue>F23IldNw0Gozri5ySU5Esopz7llkBrDJNHNgm+Ww93mrU5w1IrP0J7Cv0Xn19ro2
|
||||||
|
QsO3oBVrpdMotMsFkbEVkA==</SignatureValue>`
|
||||||
|
|
||||||
|
breakData1 := strings.Replace(expectedSignedString, data1Sig, data2Sig, 1)
|
||||||
|
err = Verify(testSuite.Cert, []byte(breakData1), opts)
|
||||||
|
c.Assert(err, ErrorMatches, "signature verification failed")
|
||||||
|
|
||||||
|
breakData2 := strings.Replace(expectedSignedString, data2Sig, data1Sig, 1)
|
||||||
|
err = Verify(testSuite.Cert, []byte(breakData2), opts)
|
||||||
|
c.Assert(err, ErrorMatches, "signature verification failed")
|
||||||
|
}
|
||||||
|
|
||||||
func (testSuite *XMLDSigTest) TestConstructFromSignature(c *C) {
|
func (testSuite *XMLDSigTest) TestConstructFromSignature(c *C) {
|
||||||
// Try again but this time construct the message from a struct having a Signature member
|
// Try again but this time construct the message from a struct having a Signature member
|
||||||
doc := Envelope{Data: "Hello, World!"}
|
doc := Envelope{Data: "Hello, World!"}
|
||||||
|
|||||||
Reference in New Issue
Block a user