public static unsafe CRYPT_OID_INFO FindAlgIdOidInfo(Interop.BCrypt.ECC_CURVE_ALG_ID_ENUM algId) { CRYPT_OID_INFO *fullOidInfo = CryptFindOIDInfo( CryptOidInfoKeyType.CRYPT_OID_INFO_ALGID_KEY, &algId, OidGroup.HashAlgorithm); if (fullOidInfo != null) { return(*fullOidInfo); } // Otherwise the lookup failed. return(new CRYPT_OID_INFO() { AlgId = -1 }); }
internal static unsafe 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; CRYPT_OID_INFO *localOidInfo = CryptFindOIDInfo(keyType, rawKey, localGroup); if (localOidInfo != null) { return(*localOidInfo); } } // Attempt to query with a specific group, to make try to avoid an AD lookup if possible CRYPT_OID_INFO *fullOidInfo = CryptFindOIDInfo(keyType, rawKey, group); if (fullOidInfo != null) { return(*fullOidInfo); } if (fallBackToAllGroups && group != OidGroup.All) { // Finally, for compatibility with previous runtimes, if we have a group specified retry the // query with no group CRYPT_OID_INFO *allGroupOidInfo = CryptFindOIDInfo(keyType, rawKey, OidGroup.All); if (allGroupOidInfo != null) { return(*allGroupOidInfo); } } // Otherwise the lookup failed. return(new CRYPT_OID_INFO() { AlgId = -1 }); } finally { if (rawKey != IntPtr.Zero) { Marshal.FreeCoTaskMem(rawKey); } } }