Автор: strelok671 
Приветствую!
Тут не один раз уже спрашивали...
 Спасибо, посмотреть на чужое творчество всегда полезно.
 Однако возникли вопросы.
То что вы строите soap обертку на лету, а я использую шаблон - это личные предпочтения.
Далее я увидел:
xmlObj.XmlDoc.GetElementsByTagName(SOAP_DS_PREF + ":Signature")[0].PrependChild(
xmlObj.XmlDoc.ImportNode(
xmlDigitalSignature.GetElementsByTagName("SignedInfo")[0], true));
и вы используете SmevSignedXml signedXml = new SmevSignedXml(xmlObj.XmlDoc);
на основе стандартной SignedXml. 
- У меня в результате подобного получалась структура подписи
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    ...
и СМЭВ, совместно с гисгмп, ругался - SMEV-10003 Неверная ЭЦП
Я не смог на основе стандартной SignedXml получить <ds:SignedInfo...
Если использовать SignedXmlPrefix, 
то там идет установка префикса после расчета подписи... 
и тоже SMEV-10003
Решилось просто. Берем SmevSignRequest, из примеров КриптоПро,
и меняем SmevSignedXml signedXml = new SmevSignedXml(doc);
на       XadesSignedXml signedXml = new XadesSignedXml(doc);
и видим что "SignedInfo" и все остальное имеет префикс.
соответственно меняем момент вставки подписи - .GetElementsByTagName("ds:SignedInfo")
Все. СМЭВ доволен.
 Осталось добавить timestamp, но это как нибудь потом...
Сейчас меня более интересует что я не могу проверить транспортную подпись СМЭВ.
И не могу проверить, мною же подписанные, N элементов FinalPayment в одном пакете