private static CRYPT_OID_INFO FindOidInfo(OidKeyType keyType, string key, OidGroup group) { Contract.Requires(key != null); IntPtr rawKey = IntPtr.Zero; RuntimeHelpers.PrepareConstrainedRegions(); try { if (keyType == OidKeyType.Oid) { rawKey = Marshal.StringToCoTaskMemAnsi(key); } else { rawKey = Marshal.StringToCoTaskMemUni(key); } // If the group alone isn't sufficient to suppress an active directory lookup, then our // first attempt should also include the suppression flag if (!OidGroupWillNotUseActiveDirectory(group)) { OidGroup localGroup = group | OidGroup.DisableSearchDS; IntPtr localOidInfo = CryptFindOIDInfo(keyType, rawKey, localGroup); if (localOidInfo != IntPtr.Zero) { return((CRYPT_OID_INFO)Marshal.PtrToStructure(localOidInfo, typeof(CRYPT_OID_INFO))); } } // Attempt to query with a specific group, to make try to avoid an AD lookup if possible IntPtr fullOidInfo = CryptFindOIDInfo(keyType, rawKey, group); if (fullOidInfo != IntPtr.Zero) { return((CRYPT_OID_INFO)Marshal.PtrToStructure(fullOidInfo, typeof(CRYPT_OID_INFO))); } // Finally, for compatibility with previous runtimes, if we have a group specified retry the // query with no group if (group != OidGroup.AllGroups) { IntPtr allGroupOidInfo = CryptFindOIDInfo(keyType, rawKey, OidGroup.AllGroups); if (allGroupOidInfo != IntPtr.Zero) { return((CRYPT_OID_INFO)Marshal.PtrToStructure(fullOidInfo, typeof(CRYPT_OID_INFO))); } } // Otherwise the lookup failed return(new CRYPT_OID_INFO()); } finally { if (rawKey != IntPtr.Zero) { Marshal.FreeCoTaskMem(rawKey); } } }
private static CRYPT_OID_INFO FindOidInfo(OidKeyType keyType, string key, OidGroup group) { IntPtr intPtr = IntPtr.Zero; RuntimeHelpers.PrepareConstrainedRegions(); CRYPT_OID_INFO result; try { if (keyType == OidKeyType.Oid) { intPtr = Marshal.StringToCoTaskMemAnsi(key); } else { intPtr = Marshal.StringToCoTaskMemUni(key); } if (!X509Utils.OidGroupWillNotUseActiveDirectory(group)) { OidGroup dwGroupId = group | OidGroup.DisableSearchDS; IntPtr intPtr2 = X509Utils.CryptFindOIDInfo(keyType, intPtr, dwGroupId); if (intPtr2 != IntPtr.Zero) { return((CRYPT_OID_INFO)Marshal.PtrToStructure(intPtr2, typeof(CRYPT_OID_INFO))); } } IntPtr intPtr3 = X509Utils.CryptFindOIDInfo(keyType, intPtr, group); if (intPtr3 != IntPtr.Zero) { result = (CRYPT_OID_INFO)Marshal.PtrToStructure(intPtr3, typeof(CRYPT_OID_INFO)); } else { if (group != OidGroup.AllGroups) { IntPtr intPtr4 = X509Utils.CryptFindOIDInfo(keyType, intPtr, OidGroup.AllGroups); if (intPtr4 != IntPtr.Zero) { return((CRYPT_OID_INFO)Marshal.PtrToStructure(intPtr4, typeof(CRYPT_OID_INFO))); } } result = default(CRYPT_OID_INFO); } } finally { if (intPtr != IntPtr.Zero) { Marshal.FreeCoTaskMem(intPtr); } } return(result); }
/// <summary> /// Функция CryptFindOIDInfo получает первую предопределенную или зарегистрированную структуру CRYPT_OID_INFO, /// согласованную с определенным типом ключа и с ключем. Поиск может быть ограничен идентификаторами объекта, /// принадлежащими определенной группе идентификаторов объекта. /// </summary> /// <param name="dwKeyType"></param> /// <param name="pvKey"></param> /// <param name="dwGroupId"></param> /// <returns></returns> internal static IntPtr CryptFindOIDInfo(OidKeyType dwKeyType, String pvKey, OidGroup dwGroupId) { if (SignServiceProvider.Csp == CspType.CryptoPro) { return(CApiExtUnixCryptoPro.CryptFindOIDInfo(dwKeyType, pvKey, dwGroupId)); } else if (SignServiceProvider.Csp == CspType.VipNet) { return(CApiExtUnixVipNet.CryptFindOIDInfo(dwKeyType, pvKey, dwGroupId)); } else { throw new Exception($"CryptFindOIDInfo. Указан неподдерживаемый тип криптопровайдера {SignServiceProvider.Csp}."); } }
private static CRYPT_OID_INFO FindOidInfo(OidKeyType keyType, string key, OidGroup group) { IntPtr num = IntPtr.Zero; RuntimeHelpers.PrepareConstrainedRegions(); try { num = keyType != OidKeyType.Oid ? Marshal.StringToCoTaskMemUni(key) : Marshal.StringToCoTaskMemAnsi(key); if (!X509Utils.OidGroupWillNotUseActiveDirectory(group)) { OidGroup dwGroupId = group | OidGroup.DisableSearchDS; IntPtr oidInfo = X509Utils.CryptFindOIDInfo(keyType, num, dwGroupId); if (oidInfo != IntPtr.Zero) { return((CRYPT_OID_INFO)Marshal.PtrToStructure(oidInfo, typeof(CRYPT_OID_INFO))); } } IntPtr oidInfo1 = X509Utils.CryptFindOIDInfo(keyType, num, group); if (oidInfo1 != IntPtr.Zero) { return((CRYPT_OID_INFO)Marshal.PtrToStructure(oidInfo1, typeof(CRYPT_OID_INFO))); } if (group != OidGroup.AllGroups && X509Utils.CryptFindOIDInfo(keyType, num, OidGroup.AllGroups) != IntPtr.Zero) { return((CRYPT_OID_INFO)Marshal.PtrToStructure(oidInfo1, typeof(CRYPT_OID_INFO))); } return(new CRYPT_OID_INFO()); } finally { if (num != IntPtr.Zero) { Marshal.FreeCoTaskMem(num); } } }
private static extern IntPtr CryptFindOIDInfo(OidKeyType dwKeyType, IntPtr pvKey, OidGroup dwGroupId);
private static CRYPT_OID_INFO FindOidInfo(OidKeyType keyType, string key, OidGroup group) { Contract.Requires(key != null); IntPtr rawKey = IntPtr.Zero; RuntimeHelpers.PrepareConstrainedRegions(); try { if (keyType == OidKeyType.Oid) { rawKey = Marshal.StringToCoTaskMemAnsi(key); } else { rawKey = Marshal.StringToCoTaskMemUni(key); } // If the group alone isn't sufficient to suppress an active directory lookup, then our // first attempt should also include the suppression flag if (!OidGroupWillNotUseActiveDirectory(group)) { OidGroup localGroup = group | OidGroup.DisableSearchDS; IntPtr localOidInfo = CryptFindOIDInfo(keyType, rawKey, localGroup); if (localOidInfo != IntPtr.Zero) { return (CRYPT_OID_INFO)Marshal.PtrToStructure(localOidInfo, typeof(CRYPT_OID_INFO)); } } // Attempt to query with a specific group, to make try to avoid an AD lookup if possible IntPtr fullOidInfo = CryptFindOIDInfo(keyType, rawKey, group); if (fullOidInfo != IntPtr.Zero) { return (CRYPT_OID_INFO)Marshal.PtrToStructure(fullOidInfo, typeof(CRYPT_OID_INFO)); } // Finally, for compatibility with previous runtimes, if we have a group specified retry the // query with no group if (group != OidGroup.AllGroups) { IntPtr allGroupOidInfo = CryptFindOIDInfo(keyType, rawKey, OidGroup.AllGroups); if (allGroupOidInfo != IntPtr.Zero) { return (CRYPT_OID_INFO)Marshal.PtrToStructure(fullOidInfo, typeof(CRYPT_OID_INFO)); } } // Otherwise the lookup failed return new CRYPT_OID_INFO(); } finally { if (rawKey != IntPtr.Zero) { Marshal.FreeCoTaskMem(rawKey); } } }
internal static bool TryFindOidInfo(string key, OidGroup group, OidKeyType keyType, bool lookupInActiveDirectory, out CRYPT_OID_INFO oidInfo) { Debug.Assert(!String.IsNullOrEmpty(key), "!String.IsNullOrEmpty(key)"); IntPtr keyPointer = IntPtr.Zero; RuntimeHelpers.PrepareConstrainedRegions(); try { // Setting the CRYPT_OID_DISABLE_SEARCH_DS_FLAG (0x80000000) in the group type suppresses // the network lookup of the OID information. We or the bit in directly, since it's not a // real group type, and we don't want to mix it into the enumeration itself if (!lookupInActiveDirectory) { group = (OidGroup)((uint)group | 0x80000000); } // Convert the key into a native representation based upon search type if (keyType == OidKeyType.Oid) { keyPointer = Marshal.StringToCoTaskMemAnsi(key); } else if (keyType == OidKeyType.Name || keyType == OidKeyType.CngAlgorithmId) { keyPointer = Marshal.StringToCoTaskMemUni(key); } else { Debug.Assert(false, "Unsupported key type"); } IntPtr oid = UnsafeNativeMethods.CryptFindOIDInfo(keyType, keyPointer, group); // Do the search, and if we succeeded, marshal the data back to the caller. The // CRYPT_OID_INFO being pointed to by the result of the search should not be freed by us // because it is owned by CAPI. if (oid != IntPtr.Zero) { if (!UseWin2k3OidStructures) { oidInfo = (CRYPT_OID_INFO)Marshal.PtrToStructure(oid, typeof(CRYPT_OID_INFO)); } else { oidInfo = UpgradeOidInfo((CRYPT_OID_INFO_WIN2K3)Marshal.PtrToStructure(oid, typeof(CRYPT_OID_INFO_WIN2K3))); } return true; } else { // Did not find the OID oidInfo = new CRYPT_OID_INFO(); return false; } } finally { if (keyPointer != IntPtr.Zero) { Marshal.FreeCoTaskMem(keyPointer); } } }
internal static extern IntPtr CryptFindOIDInfo(OidKeyType dwKeyType, IntPtr pvKey, OidGroup dwGroupId);