moov-io/signedxml

How to sign an XML choose some settings?

faelp22 opened this issue · 5 comments

Hello everyone, could anyone create an example of how to sign an XML using the following settings?

Hash
http://www.w3.org/2000/09/xmldsig#sha1

Signature
http://www.w3.org/2000/09/xmldsig#rsa-sha1

Canonicalization Methods/Transforms
http://www.w3.org/TR/2001/REC-xml-c14n-20010315

I've tried to do it, but I can't understand it.

Your Signature element would have those settings included. The XML specifications have all of the values, but they're in code as well

Then you'll marshal and sign the xml. See tests in this repository for examples.

I couldn't find any example on the tests folder :/

Can you help me to do this using the Signature struct that I created? @adamdecaf Here's my code:

func SignXML(xpath, canonicalizationAlgorithm, certificate, digestAlgorithm, publicKey, privateKey, xmlString string, transforms []string) error {
	if digestAlgorithm == "" {
		digestAlgorithm = "http://www.w3.org/2000/09/xmldsig#sha1"
	}

	if len(transforms) == 0 {
		transforms = []string{
			"http://www.w3.org/2000/09/xmldsig#enveloped-signature",
			"http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments",
		}
	}

	if certificate == "" {
		certificate = models.GetX509Cert(publicKey)
	}

	if canonicalizationAlgorithm == "" {
		canonicalizationAlgorithm = dsig.CanonicalXML10WithCommentsAlgorithmId.String()
	}

	if publicKey == "" {
		p, err := GetPublicKeyFromFile()
		if err != nil {
			return err
		}

		publicKey = p
	}

	if privateKey == "" {
		p, err := GetPrivateKeyFromFile()
		if err != nil {
			return err
		}

		privateKey = p
	}

	if xpath == "" {
		return errors.New("xpath is required")
	}

	transformsTypes := xmldsig.TransformsType{Transform: make([]xmldsig.TransformType, len(transforms))}

	for i, t := range transforms {
		transformsTypes.Transform[i] = xmldsig.TransformType{
			Algorithm: t,
			XPath:     []*string{&xpath},
		}
	}

	sig := xmldsig.Signature{
		KeyInfo: &xmldsig.KeyInfoType{
			X509Data: []*xmldsig.X509DataType{
				{
					X509Certificate: &certificate,
				},
			},
		},
		SignedInfo: xmldsig.SignedInfoType{
			CanonicalizationMethod: xmldsig.CanonicalizationMethodType{
				Algorithm: canonicalizationAlgorithm,
			},
			Reference: []xmldsig.ReferenceType{
				{
					Transforms: &transformsTypes,
					DigestMethod: xmldsig.DigestMethodType{
						Algorithm: digestAlgorithm,
					},
				},
			},
		},
	}

	spew.Dump(sig)
	return nil
}

What error are you getting?