internal static int GetAlgId(IntPtr certHandle)
        {
            try
            {
                if (certHandle == IntPtr.Zero)
                {
                    throw new Exception("Ошибка при попытке получить Handle сертификата.");
                }

                var    certContext     = Marshal.PtrToStructure <CERT_CONTEXT>(certHandle);
                var    certInfo        = Marshal.PtrToStructure <CERT_INFO>(certContext.pCertInfo);
                var    publicKeyAlg    = certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId;
                string signatureAlgOid = GetSignatureAlg(publicKeyAlg);

                CRYPT_OID_INFO oidInfo = new CRYPT_OID_INFO();

                if (IsUnix)
                {
                    oidInfo = SignServiceUnix.GetHashAlg(signatureAlgOid);
                }
                else
                {
                    oidInfo = SignServiceWin.GetHashAlg(signatureAlgOid);
                }

                return((int)oidInfo.Algid);
            }
            catch (Exception ex)
            {
                throw new CryptographicException($"Ошибка при получении хэш алгоритма ГОСТ. {ex.Message}.");
            }
        }
        internal static HashAlgorithm GetHashAlgObject(IntPtr certificate, ref int algId)
        {
            var    certContext     = Marshal.PtrToStructure <CERT_CONTEXT>(certificate);
            var    certInfo        = Marshal.PtrToStructure <CERT_INFO>(certContext.pCertInfo);
            var    publicKeyAlg    = certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId;
            string signatureAlgOid = GetSignatureAlg(publicKeyAlg);

            if (IsUnix)
            {
                var algInfo = SignServiceUnix.GetHashAlg(signatureAlgOid);
                algId = (int)algInfo.Algid;

                if (algInfo.Algid == GOST341194)
                {
                    return(new HashAlgGost2001Unix());
                }
                else if (algInfo.Algid == GOST2012_256)
                {
                    return(new HashAlgGost2012_256Unix());
                }
                else if (algInfo.Algid == GOST2012_512)
                {
                    return(new HashAlgGost2012_512Unix());
                }
                else
                {
                    throw new Exception($"Ошибка при попытке определить функцию хэширования.");
                }
            }
            else
            {
                var algInfo = SignServiceWin.GetHashAlg(signatureAlgOid);
                algId = (int)algInfo.Algid;

                if (algInfo.Algid == GOST341194)
                {
                    return(new HashAlgGost2001Win());
                }
                else if (algInfo.Algid == GOST2012_256)
                {
                    return(new HashAlgGost2012_256Win());
                }
                else if (algInfo.Algid == GOST2012_512)
                {
                    return(new HashAlgGost2012_512Win());
                }
                else
                {
                    throw new Exception($"Ошибка при попытке определить функцию хэширования.");
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Метод получения алгоритма хэширования
        /// </summary>
        /// <param name="signatureAlgOid"></param>
        /// <returns></returns>
        private uint GetHashAlg(string publicKeyAlg)
        {
            string signatureAlgOid = SignServiceUtils.GetSignatureAlg(publicKeyAlg);

            if (SignServiceUtils.IsUnix)
            {
                log.LogDebug("Получаем алгоритм хэширования под Unix платформой.");

                var cryptOidInfo = SignServiceUnix.GetHashAlg(signatureAlgOid);
                return(cryptOidInfo.Algid);
            }
            else
            {
                log.LogDebug("Получаем алгоритм хэширования под Windows платформой.");

                var cryptOidInfo = SignServiceWin.GetHashAlg(signatureAlgOid);
                return(cryptOidInfo.Algid);
            }
        }