Не могу найти, как рассчитать правильное DigestValue моего XML — С#
Мне нужно выполнить расчет дайджеста SignedInfo balise из моего XMLDocument. Предоставляемые инструкции: выполнить канонизацию XML в DataPDU (включая начальный и конечный теги DataPDU) и вычислить дайджест SHA256 канонизированного DataPDU. Добавьте его в тег DigestValue.
Это пример при условии, что я вставил lau.xml в 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>
Результат примераzgluNTE/crT+PFXTvljlz0imMZe0fWbkhmGzjD1LkrA=
Это мой тестовый код, с помощью которого я пытаюсь вычислить значение:
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);
}
Значение этого результатаuIPn2sqYFkTSqKcsFZjq1BOAbHYq8F2NaqqTlMJC/MQ=
Значение, когда я предоставляю пространства имен (строка с комментариями) в преобразовании, равноtX+fHyobZkAUrPSmxDRowDL8H7l5Mo4/AJaGuNTa0t0=
Я не могу понять, где я не прав.
Я также пробовал следующие вещи:
- Удалить узел <?xml>
- Сохранять пробелы при загрузке XML
- Разделите канонизацию и хэш
Я видел некоторых людей, у которых были проблемы с JAVA, но их код работал на C#...
1 ответ
Я проверяю ваш XML. Результат ок.
ДАЙДЖЕСТ dv_length [32][ce096e35313f72b4fe3c55d3be58e5cf48a63197b47d66e48661b38c3d4b92b0]
Дайджест base64 [zgluNTE/crT+PFXTvljlz0imMZe0fWbkhmGzjD1LkrA=]
Я думаю, что у вас нет места и табуляции перед тегами xml.
Извините за мой плохой английский.