func calculateHash(reference *etree.Element, doc *etree.Document) (string, error) { digestMethodElement := reference.SelectElement("DigestMethod") if digestMethodElement == nil { return "", errors.New("signedxml: unable to find DigestMethod") } digestMethodURI := digestMethodElement.SelectAttrValue("Algorithm", "") if digestMethodURI == "" { return "", errors.New("signedxml: unable to find Algorithm in DigestMethod") } digestAlgo, ok := hashAlgorithms[digestMethodURI] if !ok { return "", fmt.Errorf("signedxml: unable to find matching hash"+ "algorithm for %s in hashAlgorithms", digestMethodURI) } doc.WriteSettings.CanonicalEndTags = true doc.WriteSettings.CanonicalText = true doc.WriteSettings.CanonicalAttrVal = true h := digestAlgo.New() docBytes, err := doc.WriteToBytes() if err != nil { return "", err } //ioutil.WriteFile("C:/Temp/SignedXML/Suspect.xml", docBytes, 0644) //s, _ := doc.WriteToString() //logger.Println(s) h.Write(docBytes) d := h.Sum(nil) calculatedValue := base64.StdEncoding.EncodeToString(d) return calculatedValue, nil }