Неправильная канонизация (c14n), выполненная SignedXml - она удаляет разрывы строк (& # 13;) - это ошибка.NET?
Мы получаем подписанные xmls от третьих лиц, которые используют Java. Наша реализация.NET правильно проверяет подписи, за исключением случаев, когда xml содержит & # 13; характеристика личности.
Похоже, что.NET удаляет этот символ разрыва строки где-то в процессе c14n.
Я провел несколько тестов в C# со следующим XML:
var xml = "<a>something \nsomething\r\n</a>";
Используя следующий код для c14n:
public static void c14n(string xml)
{
using (MemoryStream msIn = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
var t = new XmlDsigExcC14NTransform(false);
t.LoadInput(msIn);
var o = t.GetOutput() as MemoryStream;
var c14n = Encoding.UTF8.GetString((o as MemoryStream).ToArray());
Console.WriteLine(c14n);
}
}
приведет к следующему xml, что соответствует спецификациям w3org (каждая строка заканчивается LF char):
<a>something
something
</a>
Тем не менее, при использовании следующего кода, чтобы увидеть, какая каноническая форма имеет xml, подписанный с классом SignedXml .NET:
public static void SignXml(string xml)
{
var doc = new XmlDocument { PreserveWhitespace = true };
doc.LoadXml(xml);
var cspParams = new CspParameters { KeyContainerName = "XML_DSIG_RSA_KEY" };
var rsaKey = new RSACryptoServiceProvider(cspParams);
var signedXml = new SignedXml(doc);
signedXml.SigningKey = rsaKey;
var reference = new Reference { Uri = "" };
var env = new XmlDsigEnvelopedSignatureTransform();
var excC14NTransform = new XmlDsigExcC14NTransform(false);
reference.AddTransform(env);
reference.AddTransform(excC14NTransform);
reference.DigestMethod = "http://www.w3.org/2001/04/xmlenc#sha256";
signedXml.AddReference(reference);
signedXml.ComputeSignature();
var c14n = Encoding.UTF8.GetString((excC14NTransform.GetOutput() as MemoryStream).ToArray());
Console.WriteLine(c14n);
}
приведет к другому XML (каждая строка заканчивается символом LF), и мы видим, что разрыв строки (& # 13;) был удален:
<a>something
something
</a>
Есть ли способ использовать класс SignedXml, чтобы использовать правильную каноническую форму? Может ли причиной этой проблемы быть разбор xml (при создании XmlDocument)?
Интересно, если это ошибка в.NET, и есть ли обходной путь для этого.