Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
 /// <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}.");
     }
 }
Example #4
0
        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);
                }
            }
        }
Example #7
0
        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);
                }
            }
        }
Example #8
0
 internal static extern IntPtr CryptFindOIDInfo(OidKeyType dwKeyType,
                                                IntPtr pvKey,
                                                OidGroup dwGroupId);
Example #9
0
        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);
                }
            }
        }