public static CRYPT_OID_INFO FindOidInfo(CryptOidInfoKeyType keyType, string key, OidGroup group, bool fallBackToAllGroups) { const OidGroup CRYPT_OID_DISABLE_SEARCH_DS_FLAG = unchecked((OidGroup)0x80000000); Debug.Assert(key != null); IntPtr rawKey = IntPtr.Zero; try { if (keyType == CryptOidInfoKeyType.CRYPT_OID_INFO_OID_KEY) { rawKey = Marshal.StringToCoTaskMemAnsi(key); } else if (keyType == CryptOidInfoKeyType.CRYPT_OID_INFO_NAME_KEY) { rawKey = Marshal.StringToCoTaskMemUni(key); } else { throw new NotSupportedException(); } // 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 | CRYPT_OID_DISABLE_SEARCH_DS_FLAG; IntPtr localOidInfo = CryptFindOIDInfo(keyType, rawKey, localGroup); if (localOidInfo != IntPtr.Zero) { return Marshal.PtrToStructure<CRYPT_OID_INFO>(localOidInfo); } } // 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 Marshal.PtrToStructure<CRYPT_OID_INFO>(fullOidInfo); } if (fallBackToAllGroups && group != OidGroup.All) { // Finally, for compatibility with previous runtimes, if we have a group specified retry the // query with no group IntPtr allGroupOidInfo = CryptFindOIDInfo(keyType, rawKey, OidGroup.All); if (allGroupOidInfo != IntPtr.Zero) { return Marshal.PtrToStructure<CRYPT_OID_INFO>(fullOidInfo); } } // Otherwise the lookup failed. return new CRYPT_OID_INFO() { AlgId = -1 }; } finally { if (rawKey != IntPtr.Zero) { Marshal.FreeCoTaskMem(rawKey); } } }
private static extern IntPtr CryptFindOIDInfo(CryptOidInfoKeyType dwKeyType, IntPtr pvKey, OidGroup group);
public static CRYPT_OID_INFO FindOidInfo(CryptOidInfoKeyType keyType, String key, OidGroup group, bool fallBackToAllGroups) { const OidGroup CRYPT_OID_DISABLE_SEARCH_DS_FLAG = unchecked ((OidGroup)0x80000000); Debug.Assert(key != null); IntPtr rawKey = IntPtr.Zero; try { if (keyType == CryptOidInfoKeyType.CRYPT_OID_INFO_OID_KEY) { rawKey = Marshal.StringToCoTaskMemAnsi(key); } else if (keyType == CryptOidInfoKeyType.CRYPT_OID_INFO_NAME_KEY) { rawKey = Marshal.StringToCoTaskMemUni(key); } else { throw new NotSupportedException(); } // 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 | CRYPT_OID_DISABLE_SEARCH_DS_FLAG; IntPtr localOidInfo = CryptFindOIDInfo(keyType, rawKey, localGroup); if (localOidInfo != IntPtr.Zero) { return(Marshal.PtrToStructure <CRYPT_OID_INFO>(localOidInfo)); } } // 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(Marshal.PtrToStructure <CRYPT_OID_INFO>(fullOidInfo)); } if (fallBackToAllGroups && group != OidGroup.All) { // Finally, for compatibility with previous runtimes, if we have a group specified retry the // query with no group IntPtr allGroupOidInfo = CryptFindOIDInfo(keyType, rawKey, OidGroup.All); if (allGroupOidInfo != IntPtr.Zero) { return(Marshal.PtrToStructure <CRYPT_OID_INFO>(fullOidInfo)); } } // Otherwise the lookup failed. return(new CRYPT_OID_INFO() { AlgId = -1 }); } finally { if (rawKey != IntPtr.Zero) { Marshal.FreeCoTaskMem(rawKey); } } }
private static unsafe partial IntPtr CryptFindOIDInfo(CryptOidInfoKeyType dwKeyType, int *pvKey, OidGroup group);
private static unsafe partial CRYPT_OID_INFO *CryptFindOIDInfo(CryptOidInfoKeyType dwKeyType, void *pvKey, OidGroup group);