Don't find how to calculate the correct DigestValue of my XML - C#

355 Views Asked by At

I need to perform the calculation of the digestValue of a SignedInfo balise from my XMLDocument. Instructions provided are : Perform XML canonicalisation on the DataPDU (including start and end tags of DataPDU) and compute the SHA256 digest of the canonicalised DataPDU. Add it to the DigestValue tag.

This is the example provided that I put in a lau.xml in UTF-8 :

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Saa:DataPDU xmlns:Saa="urn:swift:saa:xsd:saa.2.0" xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:SwGbl="urn:swift:snl:ns.SwGbl"
xmlns:SwInt="urn:swift:snl:ns.SwInt" xmlns:SwSec="urn:swift:snl:ns.SwSec">
    <Saa:Revision>2.0.14</Saa:Revision>
    <Saa:Header>
        <Saa:Message>
            <Saa:SenderReference>ISWHQBEBBXXX199test LAU$220908450</Saa:SenderReference>
            <Saa:MessageIdentifier>fin.199</Saa:MessageIdentifier>
            <Saa:Format>MT</Saa:Format>
            <Saa:SubFormat>Input</Saa:SubFormat>
            <Saa:Sender>
                <Saa:BIC12>SWHQBEBBAXXX</Saa:BIC12>
                <Saa:FullName>
                    <Saa:X1>SWHQBEBBXXX</Saa:X1>
                </Saa:FullName>
            </Saa:Sender>
            <Saa:Receiver>
                <Saa:BIC12>SWHQBEBBXXXX</Saa:BIC12>
                <Saa:FullName>
                    <Saa:X1>SWHQBEBBXXX</Saa:X1>
                    <Saa:FinancialInstitution>S.W.I.F.T. HEADQUARTERS</Saa:FinancialInstitution>
                    <Saa:CityName>LA HULPE</Saa:CityName>
                    <Saa:CountryCode>BE</Saa:CountryCode>
                </Saa:FullName>
            </Saa:Receiver>
            <Saa:InterfaceInfo>
                <Saa:MessageCreator>Messenger</Saa:MessageCreator>
                <Saa:MessageContext>Original</Saa:MessageContext>
                <Saa:MessageNature>Financial</Saa:MessageNature>
                <Saa:Sumid>1CE66DB2FFFFFE3D</Saa:Sumid>
            </Saa:InterfaceInfo>
            <Saa:NetworkInfo>
                <Saa:Priority>Normal</Saa:Priority>
                <Saa:IsPossibleDuplicate>false</Saa:IsPossibleDuplicate>
                <Saa:IsNotificationRequested>false</Saa:IsNotificationRequested>
                <Saa:Service>swift.fin</Saa:Service>
                <Saa:FINNetworkInfo>
                    <Saa:MessageSyntaxVersion>1805</Saa:MessageSyntaxVersion>
                    <Saa:FINUserHeader>{121:5cab77ec-066b-4d88-b0a5-f8464af45aa5}</Saa:FINUserHeader>
                    <Saa:E2ETransactionReference>5cab77ec-066b-4d88-b0a5-f8464af45aa5</Saa:E2ETransactionReference>
                </Saa:FINNetworkInfo>
            </Saa:NetworkInfo>
            <Saa:ExpiryDateTime>20220928065302</Saa:ExpiryDateTime>
        </Saa:Message>
    </Saa:Header>
    <Saa:Body>DQo6MjA6dGVzdCBMQVUNCjo3OTpMQVU=</Saa:Body>
</Saa:DataPDU>

The result of the example is zgluNTE/crT+PFXTvljlz0imMZe0fWbkhmGzjD1LkrA=

This is my test code with which I am trying to calculate the value :

public static void Signed()
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("lau.xml");

    //XmlDsigExcC14NTransform transform = new XmlDsigExcC14NTransform(false, "Saa Sw SwGbl SwInt SwSec");
    XmlDsigExcC14NTransform transform = new XmlDsigExcC14NTransform(false);

    transform.LoadInput(xmlDoc);

    SHA256Managed sha256 = new SHA256Managed();

    byte[] canonalizedAndDigestedContent = transform.GetDigestedOutput(sha256);
    string canonalizedAndDigestedString = Convert.ToBase64String(canonalizedAndDigestedContent);
    Console.WriteLine(canonalizedAndDigestedString);
}

The value that result is uIPn2sqYFkTSqKcsFZjq1BOAbHYq8F2NaqqTlMJC/MQ=

The value when I provide namespaces (commented line) in the transform is tX+fHyobZkAUrPSmxDRowDL8H7l5Mo4/AJaGuNTa0t0=

I can't figure out where I'm wrong.

I also tried the following things :

  • Delete the <?xml> node
  • Preserve white spaces when loading the XML
  • Separate the canonalisation and the hash

I have seen some people which had problems with JAVA but their code work in C# ...

1

There are 1 best solutions below

0
On

I test your xml. The result is ok.

DIGEST dv_length [32][ce096e35313f72b4fe3c55d3be58e5cf48a63197b47d66e48661b38c3d4b92b0]

Digest base64 [zgluNTE/crT+PFXTvljlz0imMZe0fWbkhmGzjD1LkrA=]

I think that you have space nor tabs before xml tags.

Excuse my poor English.