Для подписи XML в настоящий момент мы активно используем IolaCOM, причем в самых разных проектах. В этой библиотеке есть хорошо работающий метод
SignXML, который принимает XML в виде строки и возвращает его с подписью также в виде строки.
На совещании вы сказали, что в обертке Kalkan'а для .NET C# добавите возможность подписи XML. Мы рассчитываем, что это будет полноценная замена IolaCOM.
Получив новый SDK, я поэкспериментировал с KK_XMLsign_example и в нем обнаружились проблемы.
1) Нет такого же метода SignXML, который принимает и возвращает XML строку, показан лишь пример подписи XML файла. Файлы мне подписывать не нужно, более того, даже не всегда есть возможность искусственно создавать файлы.
Добавьте, пожалуйста, аналогичный IolaCOM метод.
2) Попытался подписать XML "через файлы" - не получилось. В вашем примере используется нестандартная для windows кодировка файлов, и я не смог ее воспроизвести. Вот мой код.
private const string xmlToSign =
@"<?xml version=""1.0""?>
<Root>
<Name>НҰРЛАН</Name>
<Surname>ҚҰСТҮТІНОВ</Surname>
<Position>Главный специалист</Position>
<Age>20</Age>
</Root>";
private void testSign() {
string signedXml = sign(xmlToSign, "gost.p12", "123456");
int x = 1;
}
private string sign(string xml, string key, string pass) {
XMLClass xmlEx = new XMLClass();
const string fileInput = "Kalkan_test.xml";
const string fileOutput = "Kalkan_test_signed.xml";
File.WriteAllText(fileInput, xml);
try {
int resultInit = xmlEx.initXML();
if (resultInit != 0) {
throw new Exception("initXML");
}
int resultSign = xmlEx.signXMLfile(fileInput, fileOutput, key, pass);
if (resultSign != 0) {
throw new Exception("signXMLfile");
}
string output = File.ReadAllText(fileOutput);
return output;
} finally {
int resultFree = xmlEx.freeXML();
}
}
Kalkan дает следующий некорректный Kalkan_test_signed.xml
<?xml version="1.0"?>
<Root>
<Name>НҰРЛАН</Name>
<Surname>ҚҰСТҮТІНОВ</Surname>
<Position>Главный специалист</Position>
<Age>20</Age>
<ds:Signature xmlns:ds="
www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
...
Таким образом, механизм подписи XML Kalkan'ом из .NET C# еще не рабочий и нуждается в доработке.