diff --git a/decrypt.go b/decrypt.go index ac1ebf0..76d5afd 100644 --- a/decrypt.go +++ b/decrypt.go @@ -48,7 +48,7 @@ func Decrypt(privateKey []byte, doc []byte) ([]byte, error) { return nil, popError() } - parsedDoc, err := newDoc(doc) + parsedDoc, err := newDoc(doc, nil) if err != nil { return nil, err } diff --git a/encrypt.go b/encrypt.go index 438d49f..bf73c81 100644 --- a/encrypt.go +++ b/encrypt.go @@ -139,7 +139,7 @@ func Encrypt(publicKey, doc []byte, opts EncryptOptions) ([]byte, error) { return nil, mustPopError() } - parsedDoc, err := newDoc(doc) + parsedDoc, err := newDoc(doc, nil) if err != nil { return nil, err } diff --git a/encrypt_test.go b/encrypt_test.go index f5502f8..a816438 100644 --- a/encrypt_test.go +++ b/encrypt_test.go @@ -88,7 +88,7 @@ func (testSuite *EncryptTest) TestEncrypt(c *C) { actualPlaintext, err := Decrypt(testSuite.Key, encryptedString) c.Assert(err, IsNil) - plaintextDoc, _ := newDoc(testSuite.Plaintext) + plaintextDoc, _ := newDoc(testSuite.Plaintext, nil) expectedPlaintext := dumpDoc(plaintextDoc) // Big blobs of XML are hard to debug. They are easier to handle when diff --git a/xmldsig.go b/xmldsig.go index 3fbb012..d593e27 100644 --- a/xmldsig.go +++ b/xmldsig.go @@ -58,7 +58,7 @@ func Sign(key []byte, doc []byte, opts SignatureOptions) ([]byte, error) { return nil, errors.New("failed to load pem key") } - parsedDoc, err := newDoc2(doc, opts) + parsedDoc, err := newDoc(doc, opts.XMLID) if err != nil { return nil, err } @@ -134,7 +134,7 @@ func Verify(publicKey []byte, doc []byte, opts SignatureOptions) error { } defer C.xmlSecDSigCtxDestroy(dsigCtx) - parsedDoc, err := newDoc2(doc, opts) + parsedDoc, err := newDoc(doc, opts.XMLID) if err != nil { return err } diff --git a/xmlsec.go b/xmlsec.go index 2257dc5..3d73f57 100644 --- a/xmlsec.go +++ b/xmlsec.go @@ -49,7 +49,7 @@ func init() { C.xmlSecErrorsSetCallback((C.xmlSecErrorsCallback)(unsafe.Pointer(C.onError_cgo))) } -func newDoc(buf []byte) (*C.xmlDoc, error) { +func newDoc(buf []byte, idattrs []XMLIDOption) (*C.xmlDoc, error) { ctx := C.xmlCreateMemoryParserCtxt((*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf))) if ctx == nil { @@ -68,29 +68,7 @@ func newDoc(buf []byte) (*C.xmlDoc, error) { return nil, errors.New("parse failed") } - return doc, nil -} - -func newDoc2(buf []byte, opts SignatureOptions) (*C.xmlDoc, error) { - ctx := C.xmlCreateMemoryParserCtxt((*C.char)(unsafe.Pointer(&buf[0])), - C.int(len(buf))) - if ctx == nil { - return nil, errors.New("error creating parser") - } - defer C.xmlFreeParserCtxt(ctx) - - C.xmlParseDocument(ctx) - - if ctx.wellFormed == C.int(0) { - return nil, errors.New("malformed XML") - } - - doc := ctx.myDoc - if doc == nil { - return nil, errors.New("parse failed") - } - - for _, idattr := range opts.XMLID { + for _, idattr := range idattrs { addIDAttr(C.xmlDocGetRootElement(doc), idattr.AttributeName, idattr.ElementName, idattr.ElementNamespace) }