Pilot-ICE: чтение подписи XPS файла

Автор RostislavShkolnyj, 05.04.24, 10:53:39

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

RostislavShkolnyj

Как можно считать содержимое подписи XPS файла, созданной стандартными средствами PilotICE  (дата подписания, кто подписал...)?

В приложеном примере приведен C# код, текущей попытки это сделать через классы ContentInfo и SignedCms из библиотеки System.Security,
но в SignedCms.Decode(signatureData) возникает ошибка "ASN1 bad tag value met.".
Что в примере сделано не так?

Пример сформирован на базе примера из SDK: Ascon.Pilot.SDK.DocumentCryptoProviderSample.
При создании сертификата для подписывания файлов использовалась стандартная утилита "Make Certificate".
Подписание документов сторонними криптоалгоритмами (через интерфейс IDocumentCryptoProvider) не использовалось.


void testFailedAttemptToReadDetachedSignature(
   IFileProvider fileProvider
   , IDataObject obj // объект с XPS файлом, для которого есть подпись(и), которые пытаемся прочитать
   )
{
   // 1. получаем IFile для XPS файла в текущем снапшоте файлов объекта
   var xpsFile = obj.ActualFileSnapshot.Files.First(f =>".xps".Equals(Path.GetExtension(f.Name)));

   // 2. пробуем прочитать все подписи XPS
   foreach (var signatureRequest in xpsFile.SignatureRequests)
   {
      if (string.IsNullOrEmpty(signatureRequest.Sign) || !Guid.TryParse(signatureRequest.Sign, out var signId))
         continue;

      // 3. находим IFile открепленной подписи в текущем снапшоте по Guid из signatureRequest.Sign
      var sgnFile = obj.ActualFileSnapshot.Files.First(f => f.Id == signId);

      using (var xpsStream = fileProvider.OpenRead(xpsFile))
      using (var sgnStream = fileProvider.OpenRead(sgnFile))
      {
         try
         {
            // 4. считываем байтовое содержимое byte[] для подписанного файла и открепленной подписи
            var documentData = StreamToArray(xpsStream);
            var signatureData = StreamToArray(sgnStream);

            // 5. The ContentInfo class represents the CMS/PKCS #7 ContentInfo data structure as defined in the CMS/PKCS #7 standards document.
            // This data structure is the basis for all CMS/PKCS #7 messages.
            ContentInfo contentInfo = new ContentInfo(documentData);
            
            // 6. The SignedCms class enables signing and verifying of CMS/PKCS #7 messages.
            SignedCms cms = new SignedCms(contentInfo, detached: true);
            
            // [!!!] здесь выбрасывает ошибку 'System.Security.Cryptography.CryptographicException' in System.Security.dll
            cms.Decode(signatureData);
            
            // проверка подписи ...
            cms.CheckSignature(verifySignatureOnly: true);
               
            // чтение данных подписи ...
            var signer = cms.SignerInfos[0];
         }
         catch(Exception ex)
         {
            Console.WriteLine("Error: " + ex.Message); // "Error: ASN1 bad tag value met.\r\n"
         }
      }
   }
}

...

private byte[] StreamToArray(Stream stream)
{
   using (var ms = new MemoryStream())
   {
      stream.CopyTo(ms);
      return ms.ToArray();
   }
}