Skip to content

Commit e18ccf8

Browse files
chore: bump KPS.Core version to 1.0.23; enhance SignSoapEnvelopeOperation for improved XML formatting and alignment with Go implementation
1 parent 0839214 commit e18ccf8

File tree

2 files changed

+11
-21
lines changed

2 files changed

+11
-21
lines changed

src/KPS.Core/KPS.Core.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<LangVersion>latest</LangVersion>
88
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
99
<PackageId>KPS.Core</PackageId>
10-
<Version>1.0.22</Version>
10+
<Version>1.0.23</Version>
1111
<Authors>onurkanbkrc@gmail.com</Authors>
1212
<Description>.NET client for Turkey's Population and Citizenship Affairs (KPS) v2 services</Description>
1313
<PackageTags>kps;turkish;population;citizenship;soap;ws-trust</PackageTags>

src/KPS.Core/Services/Factory/Xml/Operations/SignSoapEnvelopeOperation.cs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)