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($"Ошибка при попытке определить функцию хэширования."); } } }
/// <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); } }