Неправильная канонизация (c14n), выполненная SignedXml - она ​​удаляет разрывы строк (& # 13;) - это ошибка.NET?

Мы получаем подписанные xmls от третьих лиц, которые используют Java. Наша реализация.NET правильно проверяет подписи, за исключением случаев, когда xml содержит & # 13; характеристика личности.

Похоже, что.NET удаляет этот символ разрыва строки где-то в процессе c14n.

Я провел несколько тестов в C# со следующим XML:

var xml = "<a>something&#13;\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&#xD;
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, и есть ли обходной путь для этого.

0 ответов

Другие вопросы по тегам