Похоже, что .NET удаляет этот символ разрыва строки где-то в процессе c14n.
Я провел несколько тестов на C# со следующим xml:
Код: Выделить всё
var xml = "something
\nsomething\r\n";
Код: Выделить всё
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);
}
}
Код: Выделить всё
something
something
Код: Выделить всё
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);
}
Код: Выделить всё
something
something
Интересно, является ли это ошибкой в .NET и есть ли обходной путь для нее.
Подробнее здесь: https://stackoverflow.com/questions/476 ... -breaks-13
Мобильная версия