@@ -83,8 +83,9 @@ public string Execute(XmlDocument xmlDoc, XmlNamespaceManager nsManager)
8383 var timestampDigest = SHA1 . HashData ( timestampC14N ) ;
8484 var digestValue = Convert . ToBase64String ( timestampDigest ) ;
8585
86- // (3) Create SignedInfo as string (matching Go indentation)
87- var signedInfoXml = $@ "<dsig:SignedInfo xmlns:dsig=""{ DsigNamespace } "">
86+ // (3) Create SignedInfo as string (matching Go exactly - line 207-220)
87+ // IMPORTANT: Indentation matters! 12 spaces before each line (matching Go)
88+ var signedInfo = $@ "<dsig:SignedInfo xmlns:dsig=""{ DsigNamespace } "">
8889 <dsig:CanonicalizationMethod Algorithm=""{ ExcC14NAlgorithm } ""/>
8990 <dsig:SignatureMethod Algorithm=""{ HmacSha1Algorithm } ""/>
9091 <dsig:Reference URI=""#_0"">
@@ -96,29 +97,18 @@ public string Execute(XmlDocument xmlDoc, XmlNamespaceManager nsManager)
9697 </dsig:Reference>
9798 </dsig:SignedInfo>" ;
9899
99- // (4) HMAC-SHA1(SignedInfo)
100- var signedInfoC14N = C14NExclusive ( signedInfoXml ) ;
100+ // (4) HMAC-SHA1(SignatureValue) - matching Go line 223-233
101+ var signedInfoC14N = C14NExclusive ( signedInfo ) ;
101102 var key = Convert . FromBase64String ( _options . SigningKey . Trim ( ) ) ;
102103 using var hmac = new HMACSHA1 ( key ) ;
103104 var signatureValue = hmac . ComputeHash ( signedInfoC14N ) ;
104105 var signatureValueB64 = Convert . ToBase64String ( signatureValue ) ;
105106
106- // (5) Create Signature block (matching Go format exactly)
107- // Note: SignedInfo is embedded WITHOUT xmlns:dsig since it's declared on Signature
108- var signedInfoInner = $@ "
109- <dsig:CanonicalizationMethod Algorithm=""{ ExcC14NAlgorithm } ""/>
110- <dsig:SignatureMethod Algorithm=""{ HmacSha1Algorithm } ""/>
111- <dsig:Reference URI=""#_0"">
112- <dsig:Transforms>
113- <dsig:Transform Algorithm=""{ ExcC14NAlgorithm } ""/>
114- </dsig:Transforms>
115- <dsig:DigestMethod Algorithm=""{ Sha1Algorithm } ""/>
116- <dsig:DigestValue>{ digestValue } </dsig:DigestValue>
117- </dsig:Reference>
118- " ;
119-
107+ // (5) Create Signature block - matching Go line 236-247
108+ // CRITICAL: Embed the EXACT SAME signedInfo string that was used for HMAC calculation
109+ // Go does this at line 238 with %s placeholder
120110 var signatureXml = $@ "<dsig:Signature xmlns:dsig=""{ DsigNamespace } "">
121- <dsig:SignedInfo> { signedInfoInner } </dsig:SignedInfo>
111+ { signedInfo }
122112 <dsig:SignatureValue>{ signatureValueB64 } </dsig:SignatureValue>
123113 <dsig:KeyInfo>
124114 <wsse:SecurityTokenReference xmlns:wsse=""{ WsseNamespace } "">
@@ -131,7 +121,7 @@ public string Execute(XmlDocument xmlDoc, XmlNamespaceManager nsManager)
131121 // Use XmlDocument fragment to properly add elements (avoiding string concatenation issues)
132122 var fragment = xmlDoc . CreateDocumentFragment ( ) ;
133123 fragment . InnerXml = timestampXml + tokenXml + signatureXml ;
134-
124+
135125 securityNode . AppendChild ( fragment ) ;
136126
137127 return xmlDoc . OuterXml ;
0 commit comments