Ошибка win32 код 2146881276 слишком большое значение asn1

Обновлено 16.03.2019

0x80093106

Добрый день! Уважаемые читатели и гости IT портала Pyatilistnik.org. Пару лет назад я устанавливал Windows 7 одному из своих друзей на его ноутбук. Все работало как часы, но на прошлой неделе мой друг написал мне, что у него на сайте taxcom.ru во время приема пакетов, выскочила ошибка «Не удалось получить размер для расшифрованных данных, причина нехватка памяти для ASN1. Код ошибки 0x80093106″ и попросил помочь в решении данной проблемы. Отказать ему я не мог, поэтому, когда появилось свободное время я приступил к ее устранению.

Что означает нехватка памяти для ASN1?

Есть такая система сдачи отчетности Такском, у пользователя выскочило уведомление:

[info]Уведомление о запрете использования сертификатов, выпущенных по ГОСТу 34.10-2001. Ошибка в процессе приема пакетов. В процессе приема документа от регламенту произошла ошибка. Не удалось получить размер для расшифрованных данных, причина нехватка памяти для ASN1. Код ошибки 0x80093106[/info]

0x80093106 нехватка памяти для ASN1

В итоге Windows 7 используя метод EnvelopedCms.Decode в приложении Microsoft .NET Framework, не может декодировать сообщения размером более 5 мегабайт (МБ). Кроме того, вы получаете сообщение об ошибке, похожее на следующее:

  • Необработанное исключение: System.Security.Cryptography.CryptographicException: ASN1 недостаточно памяти.
  • в System.Security.Cryptography.Pkcs.EnvelopedCms.OpenToDecode (Byte [] encodedMessage)
  • в System.Security.Cryptography.Pkcs.EnvelopedCms.Decode (Byte [] encodedMessage)

Эта проблема возникает из-за того, что размер буфера неправильно увеличивается в функции CryptMsgUpdate, когда метод EnvelopedCms.Decode добавляет декодированный контент в буфер во время процесса декодирования. Таким образом, целочисленное переполнение происходит для большого файла.

Как исправить ошибку 0x80093106

Чтобы у нас возвратилась возможность принимать и обрабатывать письма более пяти мегабайт вам необходимо установить специальное обновление от Microsoft, это как в случае с бесконечным обновлением системы, вам его придется загрузить отдельно. Исправление заменит библиотеку Msasn1.dll. Нужная нам KB Windows6.1-KB2480994-v2-x64 или более новая версия KB2729094, подробнее о нем (https://support.microsoft.com/ru-ru/help/2480994/asn1-out-of-memory-error-when-the-cryptmsgupdate-function-decodes-a-me)

  • Скачать KB2480994 можно у меня по ссылке, к сожалению MS данное обновление убрала и заменила, на сколько я понял KB2729094
  • Скачать KB2729094 по ссылке (https://support.microsoft.com/ru-ru/help/2729094/an-update-for-the-segoe-ui-symbol-font-in-windows-7-and-in-windows-ser) или у меня из облака одним пакетом (https://cloud.mail.ru/public/Dgmm/KU6ehFgkn)

Производим установку обновлений KB248099. Запускаем его и соглашаемся на установку.

0x80093106 и нехватка памяти для ASN1-01

Сам процесс установки обновления KB248099 занимаем менее минуты.

0x80093106 и нехватка памяти для ASN1-2

Обязательно потребуется перезагрузка.

0x80093106 и нехватка памяти для ASN1-3

После установки пробуем снова поработать с письмами более 5 мегабайт, у вас должна исчезнуть ошибка 0x80093106 и нехватка памяти для ASN1. На этом у меня все ,если остались вопросы, то жду их в комментариях. С вами был Иван Семин, автор и создатель IT блога Pyatilistnik.org,

У меня возникла проблема с использованием подпрограммы signatureCMS.decode. Смотрите код ниже.

Кажется, ошибка возникает, когда размер файла слишком большой в этом случае 11 МБ.

private static void RemoveZfoSignature(string zfoFileName)
{
    byte[] fileContents = File.ReadAllBytes(zfoFileName);
    var contentInfo = new ContentInfo(fileContents);
    var signedCms = new SignedCms(contentInfo);

    // This line throws the error 100% of the time
    signedCms.Decode(fileContents);

    signedCms.RemoveSignature(0);
    byte[] outfile = signedCms.ContentInfo.Content;
    string outFileName = zfoFileName.Replace(".zfo", "_tmp.zfo");
    File.WriteAllBytes(outFileName, outfile);
}

Вот точная ошибка:

"System.Security.Cryptography.CryptographicException: ASN1 не хватает памяти.

   в System.Security.Cryptography.Pkcs.SignedCms.OpenToDecode(Byte[] encodedMessage, ContentInfo contentInfo, логическое значение отключено)
   в System.Security.Cryptography.Pkcs.SignedCms.Decode(Byte[] encodedMessage)
   в ConsoleApplication2.Program.RemoveZfoSignature(String zfoFileName) в C:\Users\\Documents\Visual Studio 2008\ Проекты \ConsoleApplication2\ConsoleApplication2\Program.cs: строка 30"

Есть идеи, как это исправить?

Теперь я обновил код, чтобы он выглядел так, но теперь на removeSignature произошел сбой, сказав, что сообщение CMS не подписано.

/// <summary>
/// Removes the ZFO signature from the ZFO, so that it is possible to extract attachments.
/// </summary>
/// <param name="zfoFileName">
/// The zfo file name.
/// </param>
private static void RemoveZfoSignature(string zfoFileName)
    {
        string outFileName = zfoFileName.Replace(".zfo", "_tmp.zfo"); 
        FileStream inFile = null;
        FileStream outFile = null;
        inFile = File.Open(zfoFileName, FileMode.Open);
        outFile = File.Create(outFileName);
        LargeCMS.CMS cms = new LargeCMS.CMS(); 
        cms.Decode(inFile, outFile);

        // Clean up
        if (inFile != null) { inFile.Close(); }
        if (outFile != null) { outFile.Close(); }

        byte[] fileContents = File.ReadAllBytes(outFileName);
        var contentInfo = new ContentInfo(fileContents);
        var signedCms = new SignedCms(contentInfo);
        //signedCms.Decode(fileContents);
        signedCms.RemoveSignature(0);
        byte[] outfileContent = signedCms.ContentInfo.Content;

        File.WriteAllBytes(outFileName, outfileContent);
    }

2010-03-31 15:53

3
ответа

Решение

Согласно этой странице:

В структуре ASN есть счетчик, который увеличивается каждый раз, когда блок октетов обрабатывается, когда последовательность ASN, которая оборачивает октеты, кодируется с помощью BER. Он добавляет количество байтов, которые уже были обработаны, плюс новый размер блока; по мере увеличения числа обрабатываемых байтов это добавляется к счетчику, и скорость, с которой увеличивается счетчик, увеличивается. Поскольку счетчик представлен целым числом, он может переполниться. В Windows 7 код ASN проверяет наличие переполнения, поэтому функция завершается ошибкой. На платформах до Windows 7 переполнение все еще происходит, но это не было проверено. Этот счетчик не критичен для работы и не вызывал проблем в коде для предыдущих версий ОС.

Единственное разрешение, по-видимому, вызывает вызов функций нижнего уровня, перечисленных на этой странице. Смотрите здесь для примера.

Весь следующий код поступает с этой страницы (здесь дублируется на случай, если эта страница когда-либо отключится):

Файл form1.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography.X509Certificates;
using System.IO;

namespace LargeCMS
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            subjectTextBox.Text = "ALEX";
            originalTextBox.Text = "my1GBfile.txt";
            encodedTextBox.Text = "encodeddata.p7s";
            decodedTextBox.Text = "decodeddata.txt";
        }

        private void encodeButton_Click(object sender, EventArgs e)
        {
            // Variables
            X509Store store = null;
            X509Certificate2 cert = null;
            FileStream inFile = null;
            FileStream outFile = null;
            CMS cms = null;

            try
            {
                // Get user cert
                store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                store.Open(OpenFlags.MaxAllowed);
                cert = store.Certificates.Find(X509FindType.FindBySubjectName, subjectTextBox.Text, true)[0];

                // Open file with data to encode
                inFile = File.Open(originalTextBox.Text, FileMode.Open);

                // Create file for encoded data
                outFile = File.Create(encodedTextBox.Text);

                // Encode data
                cms = new CMS();
                cms.Encode(cert, inFile, outFile);

                MessageBox.Show("Sucess!!!");
            }
            catch (Exception ex)
            {
                // Show errors
                if (ex.InnerException != null)
                {
                    MessageBox.Show(ex.Message + "n" + ex.InnerException.Message);
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
            finally
            {
                // Clean up
                if (store != null) { store.Close(); }
                if (inFile != null) { inFile.Close(); }
                if (outFile != null) { outFile.Close(); }
            }
        }

        private void decodeButton_Click(object sender, EventArgs e)
        {
            // Variables
            FileStream inFile = null;
            FileStream outFile = null;
            CMS cms = null;

            try
            {
                // Open file with data to decode
                inFile = File.Open(encodedTextBox.Text, FileMode.Open);

                // Create file for encoded data
                outFile = File.Create(decodedTextBox.Text);

                // Decode data
                cms = new CMS();
                cms.Decode(inFile, outFile);

                MessageBox.Show("Sucess!!!");
            }
            catch (Exception ex)
            {
                if (ex.InnerException != null)
                {
                    MessageBox.Show(ex.Message + "n" + ex.InnerException.Message);
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
            finally
            {
                // Clean up
                if (inFile != null) { inFile.Close(); }
                if (outFile != null) { outFile.Close(); }
            }

        }
    }
}

Файл cms.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace LargeCMS
{
    class CMS
    {
        // File stream to use in callback function
        private FileStream m_callbackFile;

        // Streaming callback function for encoding
        private Boolean StreamOutputCallback(IntPtr pvArg, IntPtr pbData, int cbData, Boolean fFinal)
        {
            // Write all bytes to encoded file
            Byte[] bytes = new Byte[cbData];
            Marshal.Copy(pbData, bytes, 0, cbData);
            m_callbackFile.Write(bytes, 0, cbData);

            if (fFinal)
            {
                // This is the last piece. Close the file
                m_callbackFile.Flush();
                m_callbackFile.Close();
                m_callbackFile = null;
            }

            return true;
        }

        // Encode CMS with streaming to support large data
        public void Encode(X509Certificate2 cert, FileStream inFile, FileStream outFile)
        {
            // Variables
            Win32.CMSG_SIGNER_ENCODE_INFO SignerInfo;
            Win32.CMSG_SIGNED_ENCODE_INFO SignedInfo;
            Win32.CMSG_STREAM_INFO StreamInfo;
            Win32.CERT_CONTEXT[] CertContexts = null;
            Win32.BLOB[] CertBlobs;

            X509Chain chain = null;
            X509ChainElement[] chainElements = null;
            X509Certificate2[] certs = null;
            RSACryptoServiceProvider key = null;
            BinaryReader stream = null;
            GCHandle gchandle = new GCHandle();

            IntPtr hProv = IntPtr.Zero;
            IntPtr SignerInfoPtr = IntPtr.Zero;
            IntPtr CertBlobsPtr = IntPtr.Zero;
            IntPtr hMsg = IntPtr.Zero;
            IntPtr pbPtr = IntPtr.Zero;
            Byte[] pbData;
            int dwFileSize;
            int dwRemaining;
            int dwSize;
            Boolean bResult = false;

            try
            {
                // Get data to encode
                dwFileSize = (int)inFile.Length;
                stream = new BinaryReader(inFile);
                pbData = stream.ReadBytes(dwFileSize);

                // Prepare stream for encoded info
                m_callbackFile = outFile;

                // Get cert chain
                chain = new X509Chain();
                chain.Build(cert);
                chainElements = new X509ChainElement[chain.ChainElements.Count];
                chain.ChainElements.CopyTo(chainElements, 0);

                // Get certs in chain
                certs = new X509Certificate2[chainElements.Length];
                for (int i = 0; i < chainElements.Length; i++)
                {
                    certs[i] = chainElements[i].Certificate;
                }

                // Get context of all certs in chain
                CertContexts = new Win32.CERT_CONTEXT[certs.Length];
                for (int i = 0; i < certs.Length; i++)
                {
                    CertContexts[i] = (Win32.CERT_CONTEXT)Marshal.PtrToStructure(certs[i].Handle, typeof(Win32.CERT_CONTEXT));
                }

                // Get cert blob of all certs
                CertBlobs = new Win32.BLOB[CertContexts.Length];
                for (int i = 0; i < CertContexts.Length; i++)
                {
                    CertBlobs[i].cbData = CertContexts[i].cbCertEncoded;
                    CertBlobs[i].pbData = CertContexts[i].pbCertEncoded;
                }

                // Get CSP of client certificate
                key = (RSACryptoServiceProvider)certs[0].PrivateKey;

                bResult = Win32.CryptAcquireContext(
                    ref hProv,
                    key.CspKeyContainerInfo.KeyContainerName,
                    key.CspKeyContainerInfo.ProviderName,
                    key.CspKeyContainerInfo.ProviderType,
                    0
                );
                if (!bResult)
                {
                    throw new Exception("CryptAcquireContext error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                }

                // Populate Signer Info struct
                SignerInfo = new Win32.CMSG_SIGNER_ENCODE_INFO();
                SignerInfo.cbSize = Marshal.SizeOf(SignerInfo);
                SignerInfo.pCertInfo = CertContexts[0].pCertInfo;
                SignerInfo.hCryptProvOrhNCryptKey = hProv;
                SignerInfo.dwKeySpec = (int)key.CspKeyContainerInfo.KeyNumber;
                SignerInfo.HashAlgorithm.pszObjId = Win32.szOID_OIWSEC_sha1;

                // Populate Signed Info struct
                SignedInfo = new Win32.CMSG_SIGNED_ENCODE_INFO();
                SignedInfo.cbSize = Marshal.SizeOf(SignedInfo);

                SignedInfo.cSigners = 1;
                SignerInfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(SignerInfo));
                Marshal.StructureToPtr(SignerInfo, SignerInfoPtr, false);
                SignedInfo.rgSigners = SignerInfoPtr;

                SignedInfo.cCertEncoded = CertBlobs.Length;
                CertBlobsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(CertBlobs[0]) * CertBlobs.Length);
                for (int i = 0; i < CertBlobs.Length; i++)
                {
                    Marshal.StructureToPtr(CertBlobs[i], new IntPtr(CertBlobsPtr.ToInt64() + (Marshal.SizeOf(CertBlobs[i]) * i)), false);
                }               
                SignedInfo.rgCertEncoded = CertBlobsPtr;

                // Populate Stream Info struct
                StreamInfo = new Win32.CMSG_STREAM_INFO();
                StreamInfo.cbContent = dwFileSize;
                StreamInfo.pfnStreamOutput = new Win32.StreamOutputCallbackDelegate(StreamOutputCallback);

                // TODO: CMSG_DETACHED_FLAG

                // Open message to encode
                hMsg = Win32.CryptMsgOpenToEncode(
                    Win32.X509_ASN_ENCODING | Win32.PKCS_7_ASN_ENCODING,
                    0,
                    Win32.CMSG_SIGNED,
                    ref SignedInfo,
                    null,
                    ref StreamInfo
                );
                if (hMsg.Equals(IntPtr.Zero))
                {
                    throw new Exception("CryptMsgOpenToEncode error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                }

                // Process the whole message
                gchandle = GCHandle.Alloc(pbData, GCHandleType.Pinned);
                pbPtr = gchandle.AddrOfPinnedObject();
                dwRemaining = dwFileSize;
                dwSize = (dwFileSize < 1024 * 1000 * 100) ? dwFileSize : 1024 * 1000 * 100;
                while (dwRemaining > 0)
                {
                    // Update message piece by piece     
                    bResult = Win32.CryptMsgUpdate(
                        hMsg,
                        pbPtr,
                        dwSize,
                        (dwRemaining <= dwSize) ? true : false
                    );
                    if (!bResult)
                    {
                        throw new Exception("CryptMsgUpdate error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                    }

                    // Move to the next piece
                    pbPtr = new IntPtr(pbPtr.ToInt64() + dwSize);
                    dwRemaining -= dwSize;
                    if (dwRemaining < dwSize)
                    {
                        dwSize = dwRemaining;
                    }
                }
            }
            finally
            {
                // Clean up
                if (gchandle.IsAllocated)
                {
                    gchandle.Free();
                }
                if (stream != null)
                {
                    stream.Close();
                }
                if (m_callbackFile != null)
                {
                    m_callbackFile.Close();
                }
                if (!CertBlobsPtr.Equals(IntPtr.Zero))
                {
                    Marshal.FreeHGlobal(CertBlobsPtr);
                }

                if (!SignerInfoPtr.Equals(IntPtr.Zero))
                {
                    Marshal.FreeHGlobal(SignerInfoPtr);
                }
                if (!hProv.Equals(IntPtr.Zero))
                {
                    Win32.CryptReleaseContext(hProv, 0);
                }
                if (!hMsg.Equals(IntPtr.Zero))
                {
                    Win32.CryptMsgClose(hMsg);
                }
            }
        }

        // Decode CMS with streaming to support large data
        public void Decode(FileStream inFile, FileStream outFile)
        {
            // Variables
            Win32.CMSG_STREAM_INFO StreamInfo;
            Win32.CERT_CONTEXT SignerCertContext;

            BinaryReader stream = null;
            GCHandle gchandle = new GCHandle();

            IntPtr hMsg = IntPtr.Zero;
            IntPtr pSignerCertInfo = IntPtr.Zero;
            IntPtr pSignerCertContext = IntPtr.Zero;
            IntPtr pbPtr = IntPtr.Zero;
            IntPtr hStore = IntPtr.Zero;
            Byte[] pbData;
            Boolean bResult = false;
            int dwFileSize;
            int dwRemaining;
            int dwSize;
            int cbSignerCertInfo;

            try
            {
                // Get data to decode
                dwFileSize = (int)inFile.Length;
                stream = new BinaryReader(inFile);
                pbData = stream.ReadBytes(dwFileSize);

                // Prepare stream for decoded info
                m_callbackFile = outFile;

                // Populate Stream Info struct
                StreamInfo = new Win32.CMSG_STREAM_INFO();
                StreamInfo.cbContent = dwFileSize;
                StreamInfo.pfnStreamOutput = new Win32.StreamOutputCallbackDelegate(StreamOutputCallback);

                // Open message to decode
                hMsg = Win32.CryptMsgOpenToDecode(
                    Win32.X509_ASN_ENCODING | Win32.PKCS_7_ASN_ENCODING,
                    0,
                    0,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    ref StreamInfo
                );
                if (hMsg.Equals(IntPtr.Zero))
                {
                    throw new Exception("CryptMsgOpenToDecode error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                }

                // Process the whole message
                gchandle = GCHandle.Alloc(pbData, GCHandleType.Pinned);
                pbPtr = gchandle.AddrOfPinnedObject();
                dwRemaining = dwFileSize;
                dwSize = (dwFileSize < 1024 * 1000 * 100) ?  dwFileSize : 1024 * 1000 * 100;
                while (dwRemaining > 0)
                {
                    // Update message piece by piece     
                    bResult = Win32.CryptMsgUpdate(
                        hMsg,
                        pbPtr,
                        dwSize,
                        (dwRemaining <= dwSize) ? true : false
                    );
                    if (!bResult)
                    {
                        throw new Exception("CryptMsgUpdate error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                    }

                    // Move to the next piece
                    pbPtr = new IntPtr(pbPtr.ToInt64() + dwSize);
                    dwRemaining -= dwSize;
                    if (dwRemaining < dwSize)
                    {
                        dwSize = dwRemaining;
                    }
                }

                // Get signer certificate info
                cbSignerCertInfo = 0;
                bResult = Win32.CryptMsgGetParam(
                    hMsg,
                    Win32.CMSG_SIGNER_CERT_INFO_PARAM,
                    0,
                    IntPtr.Zero,
                    ref cbSignerCertInfo
                );
                if (!bResult)
                {
                    throw new Exception("CryptMsgGetParam error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                }

                pSignerCertInfo = Marshal.AllocHGlobal(cbSignerCertInfo);

                bResult = Win32.CryptMsgGetParam(
                    hMsg,
                    Win32.CMSG_SIGNER_CERT_INFO_PARAM,
                    0,
                    pSignerCertInfo,
                    ref cbSignerCertInfo
                );
                if (!bResult)
                {
                    throw new Exception("CryptMsgGetParam error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                }

                // Open a cert store in memory with the certs from the message
                hStore = Win32.CertOpenStore(
                    Win32.CERT_STORE_PROV_MSG,
                    Win32.X509_ASN_ENCODING | Win32.PKCS_7_ASN_ENCODING,
                    IntPtr.Zero,
                    0,
                    hMsg
                );
                if (hStore.Equals(IntPtr.Zero))
                {
                    throw new Exception("CertOpenStore error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                }

                // Find the signer's cert in the store
                pSignerCertContext = Win32.CertGetSubjectCertificateFromStore(
                    hStore,
                    Win32.X509_ASN_ENCODING | Win32.PKCS_7_ASN_ENCODING,
                    pSignerCertInfo
                );
                if (pSignerCertContext.Equals(IntPtr.Zero))
                {
                    throw new Exception("CertGetSubjectCertificateFromStore error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                }

                // Set message for verifying
                SignerCertContext = (Win32.CERT_CONTEXT)Marshal.PtrToStructure(pSignerCertContext, typeof(Win32.CERT_CONTEXT));                
                bResult = Win32.CryptMsgControl(
                    hMsg, 
                    0, 
                    Win32.CMSG_CTRL_VERIFY_SIGNATURE,
                    SignerCertContext.pCertInfo
                );
                if (!bResult)
                {
                    throw new Exception("CryptMsgControl error #" + Marshal.GetLastWin32Error().ToString(), new Win32Exception(Marshal.GetLastWin32Error()));
                }
            }
            finally
            {
                // Clean up
                if (gchandle.IsAllocated)
                {
                    gchandle.Free();
                }
                if (!pSignerCertContext.Equals(IntPtr.Zero))
                {
                    Win32.CertFreeCertificateContext(pSignerCertContext);
                }
                if (!pSignerCertInfo.Equals(IntPtr.Zero))
                {
                    Marshal.FreeHGlobal(pSignerCertInfo);
                }
                if (!hStore.Equals(IntPtr.Zero))
                {
                    Win32.CertCloseStore(hStore, Win32.CERT_CLOSE_STORE_FORCE_FLAG);
                }
                if (stream != null)
                {
                    stream.Close();
                }
                if (m_callbackFile != null)
                {
                    m_callbackFile.Close();
                }
                if (!hMsg.Equals(IntPtr.Zero))
                {
                    Win32.CryptMsgClose(hMsg);
                }
            }
        }
    }
}

2010-04-13 00:05

Я, кажется, достиг предела длины поста. Вот остальная часть кода по ссылке, указанной выше.

Файл win32.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.ComponentModel;
using System.Security.Cryptography;

namespace LargeCMS
{
    class Win32
    {
        #region "CONSTS"

        public const int X509_ASN_ENCODING = 0x00000001;
        public const int PKCS_7_ASN_ENCODING = 0x00010000;
        public const int CMSG_SIGNED = 2;
        public const int CMSG_DETACHED_FLAG = 0x00000004;
        public const int AT_KEYEXCHANGE = 1;
        public const int AT_SIGNATURE = 2;
        public const String szOID_OIWSEC_sha1 = "1.3.14.3.2.26";
        public const int CMSG_CTRL_VERIFY_SIGNATURE = 1;
        public const int CMSG_CERT_PARAM = 12;
        public const int CMSG_SIGNER_CERT_INFO_PARAM = 7;
        public const int CERT_STORE_PROV_MSG = 1;
        public const int CERT_CLOSE_STORE_FORCE_FLAG = 1;

        #endregion

        #region "STRUCTS"

        [StructLayout(LayoutKind.Sequential)]
        public struct CRYPT_ALGORITHM_IDENTIFIER
        {
            public String pszObjId;
            BLOB Parameters;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct CERT_ID
        {
            public int dwIdChoice;
            public BLOB IssuerSerialNumberOrKeyIdOrHashId;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct CMSG_SIGNER_ENCODE_INFO
        {
            public int cbSize;
            public IntPtr pCertInfo;
            public IntPtr hCryptProvOrhNCryptKey;
            public int dwKeySpec;
            public CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
            public IntPtr pvHashAuxInfo;
            public int cAuthAttr;
            public IntPtr rgAuthAttr;
            public int cUnauthAttr;
            public IntPtr rgUnauthAttr;
            public CERT_ID                    SignerId;
            public CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
            public IntPtr pvHashEncryptionAuxInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct CERT_CONTEXT
        {
            public int dwCertEncodingType;
            public IntPtr pbCertEncoded;
            public int cbCertEncoded;
            public IntPtr pCertInfo;
            public IntPtr hCertStore;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct BLOB
        {
            public int cbData;
            public IntPtr pbData;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct CMSG_SIGNED_ENCODE_INFO
        {
            public int cbSize;
            public int cSigners;
            public IntPtr rgSigners;
            public int cCertEncoded;
            public IntPtr rgCertEncoded;
            public int cCrlEncoded;
            public IntPtr rgCrlEncoded;
            public int cAttrCertEncoded;
            public IntPtr rgAttrCertEncoded;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct CMSG_STREAM_INFO
        {
            public int cbContent;
            public StreamOutputCallbackDelegate pfnStreamOutput;
            public IntPtr pvArg;
        }

        #endregion

        #region "DELEGATES"

        public delegate Boolean StreamOutputCallbackDelegate(IntPtr pvArg, IntPtr pbData, int cbData, Boolean fFinal);

        #endregion

        #region "API"

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern Boolean CryptAcquireContext(
          ref IntPtr hProv,
          String pszContainer,
          String pszProvider,
          int dwProvType,
          int dwFlags
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern IntPtr CryptMsgOpenToEncode(
            int dwMsgEncodingType,
            int dwFlags,
            int dwMsgType,
            ref CMSG_SIGNED_ENCODE_INFO pvMsgEncodeInfo,
            String pszInnerContentObjID,
            ref CMSG_STREAM_INFO pStreamInfo
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern IntPtr CryptMsgOpenToDecode(
            int dwMsgEncodingType,
            int dwFlags,
            int dwMsgType,
            IntPtr hCryptProv,
            IntPtr pRecipientInfo,
            ref CMSG_STREAM_INFO pStreamInfo
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern Boolean CryptMsgClose(
            IntPtr hCryptMsg
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern Boolean CryptMsgUpdate(
            IntPtr hCryptMsg,
            Byte[] pbData,
            int cbData,
            Boolean fFinal
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern Boolean CryptMsgUpdate(
            IntPtr hCryptMsg,
            IntPtr pbData,
            int cbData,
            Boolean fFinal
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern Boolean CryptMsgGetParam(
            IntPtr hCryptMsg,
            int dwParamType,
            int dwIndex,
            IntPtr pvData,
            ref int pcbData
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern Boolean CryptMsgControl(
            IntPtr hCryptMsg,
            int dwFlags,
            int dwCtrlType,
            IntPtr pvCtrlPara
        );

        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern Boolean CryptReleaseContext(
            IntPtr hProv,
            int dwFlags
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern IntPtr CertCreateCertificateContext(
            int dwCertEncodingType,
            IntPtr pbCertEncoded,
            int cbCertEncoded
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern Boolean CertFreeCertificateContext(
            IntPtr pCertContext
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern IntPtr CertOpenStore(
            int lpszStoreProvider,
            int dwMsgAndCertEncodingType,
            IntPtr hCryptProv,
            int dwFlags,
            IntPtr pvPara
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern IntPtr CertGetSubjectCertificateFromStore(
            IntPtr hCertStore,
            int dwCertEncodingType,
            IntPtr pCertId
        );

        [DllImport("Crypt32.dll", SetLastError = true)]
        public static extern IntPtr CertCloseStore(
            IntPtr hCertStore,
            int dwFlags
        );

        #endregion
    }
}

2010-04-13 00:20

Если вы видите эту ошибку в файле < 100 МБ и только в Windows 7, возможно, это связано с ошибкой в ​​64-разрядной версии Windows 7. Я сообщил об этом в Microsoft две недели назад и получил сегодня электронное письмо с подтверждением ошибки и сообщением о том, что исправление проходит внутреннее тестирование и, скорее всего, будет включено в Win 7 SP1 в феврале 2011 года (дата не подтверждена).

Если вы не можете дождаться, решение Win32/CryptMsg, предложенное другими, кажется лучшим решением.

Обновление: сегодня Microsoft выпустила официальное исправление, получите его здесь: http://support.microsoft.com/kb/2480994 Они также подтвердили, что это исправление будет включено в SP2, а не SP1.

2010-11-09 15:28


Offline

KVI

 


#1
Оставлено
:

26 декабря 2011 г. 21:45:39(UTC)

KVI

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.09.2010(UTC)
Сообщений: 73
Мужчина
Откуда: АО ИНФИНИТУМ, Москва

Сказал «Спасибо»: 3 раз

Здравствуйте все.

При выполнении декодирования CMS-сообщения encodedEnvelopedCms длиной 142344192 байт
получаем Cryptographic Exception с мессаджем САБЖ

envelopedCms.Decode(encodedEnvelopedCms);

1) В чем может быть причина?
2) Исходное сообщение перед зашифровкой имело длину около 84 МБайт. Можно ли уменьшить размер зашифрованного CMS-сообщения?


Вверх

WWW


Offline

Андрей Писарев

 


#2
Оставлено
:

26 декабря 2011 г. 21:53:07(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,003
Мужчина
Российская Федерация

Сказал «Спасибо»: 457 раз
Поблагодарили: 1911 раз в 1477 постах

KVI написал:

Здравствуйте все.

При выполнении декодирования CMS-сообщения encodedEnvelopedCms длиной 142344192 байт
получаем Cryptographic Exception с мессаджем САБЖ

envelopedCms.Decode(encodedEnvelopedCms);

1) В чем может быть причина?
2) Исходное сообщение перед зашифровкой имело длину около 84 МБайт. Можно ли уменьшить размер зашифрованного CMS-сообщения?

кодировка зашифрованного «сообщения» в итоге base64?

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Максим Коллегин

 


#3
Оставлено
:

26 декабря 2011 г. 22:41:24(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,283
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 673 раз в 593 постах

Используйте «поточный» режим. В примерах есть.

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

KVI

 


#4
Оставлено
:

26 декабря 2011 г. 22:49:08(UTC)

KVI

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.09.2010(UTC)
Сообщений: 73
Мужчина
Откуда: АО ИНФИНИТУМ, Москва

Сказал «Спасибо»: 3 раз

Шифрование делается так:

1. envelopedCms.Encrypt()
2. envelopedCms.Encode()

Наверное, Encode() кодирует в Base64.


Вверх

WWW


Offline

KVI

 


#5
Оставлено
:

26 декабря 2011 г. 22:59:36(UTC)

KVI

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.09.2010(UTC)
Сообщений: 73
Мужчина
Откуда: АО ИНФИНИТУМ, Москва

Сказал «Спасибо»: 3 раз

maxdm написал:

Используйте «поточный» режим. В примерах есть.

Нам надо передать большой открытый файл, предварительно его зашифровав, с клиента на сервер и там некоторое время хранить в зашифрованом виде.
С потоковым режимом, как я понял, передаваемые куски файла шифруются и потом сразу расшифровываются.

Как можно по другому?


Вверх

WWW


Offline

Максим Коллегин

 


#6
Оставлено
:

26 декабря 2011 г. 23:44:02(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,283
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 673 раз в 593 постах

Неправильно поняли. Просто шифруется не одним куском, а частями.
http://cryptopro.ru/foru….aspx?g=posts&t=2079

Отредактировано пользователем 26 декабря 2011 г. 23:44:44(UTC)
 | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

KVI

 


#7
Оставлено
:

11 января 2012 г. 19:06:33(UTC)

KVI

Статус: Активный участник

Группы: Участники

Зарегистрирован: 17.09.2010(UTC)
Сообщений: 73
Мужчина
Откуда: АО ИНФИНИТУМ, Москва

Сказал «Спасибо»: 3 раз

Спасибо, получилось, наконец.

Пришлось повозиться с CryptoStream.FlushFinalBlock().

Вот, что получилось (ключ и синхропосылка для расшифровки передаются отдельно с помощью KeyExchange):

// Класс WCFStream. Прозрачное шифрование.

public override int Read(byte[] buffer, int offset, int bufferLen)
{
var bytesRead = _file.Read(buffer, offset, bufferLen);

if (_encryptor != null)
{
_fout.Position = 0;

if (bytesRead == 0)
{
if (!_encryptor.HasFlushedFinalBlock)
_encryptor.FlushFinalBlock();
}
else
_encryptor.Write(buffer, 0, bytesRead);

bytesRead = (int)_fout.Position;
_fout.Position = 0;
bytesRead = _fout.Read(buffer, 0, bytesRead);
}

_totalBytesRead += bytesRead;

if (Reading != null)
Reading(this, new ReadingEventArgs(bytesRead, _totalBytesRead, _length));

return bytesRead;
}


Вверх

WWW

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Permalink

Cannot retrieve contributors at this time

description ms.assetid title ms.topic ms.date

The following table contains return values that may be returned by functions performing Abstract Syntax Notation One (ASN.1) encoding or decoding.

cb1f34dd-dab4-4ffb-a73b-79a214290509

ASN.1 Encoding/Decoding Return Values

article

05/31/2018

The following table contains return values that may be returned by functions performing Abstract Syntax Notation One (ASN.1) encoding or decoding.

Defined constant Text message Hexadecimal value
CRYPT_E_ASN1_ERROR ASN.1 Certificate encode/decode return value base 0x80093100
CRYPT_E_ASN1_INTERNAL ASN.1 internal encode or decode error 0x80093101
CRYPT_E_ASN1_EOD ASN.1 unexpected end of data 0x80093102
CRYPT_E_ASN1_CORRUPT ASN.1 corrupted data 0x80093103
CRYPT_E_ASN1_LARGE ASN.1 value too large 0x80093104
CRYPT_E_ASN1_CONSTRAINT ASN.1 constraint violated 0x80093105
CRYPT_E_ASN1_MEMORY ASN.1 out of memory 0x80093106
CRYPT_E_ASN1_OVERFLOW ASN.1 buffer overflow 0x80093107
CRYPT_E_ASN1_BADPDU ASN.1 function not supported for this PDU 0x80093108
CRYPT_E_ASN1_BADARGS ASN.1 bad arguments to function call 0x80093109
CRYPT_E_ASN1_BADREAL ASN.1 bad real value 0x8009310A
CRYPT_E_ASN1_BADTAG ASN.1 bad tag value met 0x8009310B
CRYPT_E_ASN1_CHOICE ASN.1 bad choice value 0x8009310C
CRYPT_E_ASN1_RULE ASN.1 bad encoding rule 0x8009310D
CRYPT_E_ASN1_UTF8 ASN.1 bad Unicode (UTF8) 0x8009310E
CRYPT_E_ASN1_PDU_TYPE ASN.1 bad PDU type 0x80093133
CRYPT_E_ASN1_NYI ASN.1 not yet implemented 0x80093134
CRYPT_E_ASN1_EXTENDED ASN.1 skipped unknown extensions 0x80093201
CRYPT_E_ASN1_NOEOD ASN.1 end of data expected 0x80093202

Пройдите диагностику и выполните рекомендуемые действия, а затем попробуйте подписать документ или отчёт ещё раз.

Если ошибка повторяется, переустановите КриптоПро CSP с утилитой очистки следов CSPClean.

  1. Откройте «Панель управления» → «Программы и компоненты» и удалите КриптоПро CSP.

  2. Скачайте утилиту CSPClean и запустите её. Появится окно с предупреждением, что все продукты компании Крипто-Про будут уничтожены. Нажмите «Да».

    Если вы самостоятельно сохранили сspclean сайта Крипто-Про, то при запуске может появиться запрос на удаление контейнеров из реестра — отклоните его.

  3. Перезагрузите компьютер. Затем установите КриптоПро CSP с помощью веб-диска и перезагрузите компьютер ещё раз.

Если ошибка сохранится, обратитесь в поддержку прямо из окна с ошибкой. Если уже закрыли его, вернитесь в Эльбу и нажмите на знак вопроса внизу справа.

Понравилась статья? Поделить с друзьями:
  • Ошибка win32 имя принтера задано неверно
  • Ошибка win32 и как ее устранить
  • Ошибка win32 exe как исправить
  • Ошибка win32 api error 126
  • Ошибка win 7 с usb