Exemple #1
0
        static CspCollection m_enumprovs()
        {
            Hashtable     ProvTypes   = get_provtypes();
            StringBuilder pszProvName = new StringBuilder();
            CspCollection csps        = new CspCollection();

            UInt32 dwIndex     = 0;
            UInt32 pdwProvType = 0;
            UInt32 pcbProvName = 0;

            while (AdvAPI.CryptEnumProviders(dwIndex, 0, 0, ref pdwProvType, null, ref pcbProvName))
            {
                pszProvName.Length = (Int32)pcbProvName;
                // retrieve CSP
                if (!AdvAPI.CryptEnumProviders(dwIndex++, 0, 0, ref pdwProvType, pszProvName, ref pcbProvName))
                {
                    throw new Win32Exception(Error.InvalidDataException);
                }
                String name   = pszProvName.ToString();
                String pType  = (String)ProvTypes[pdwProvType];
                IntPtr phProv = IntPtr.Zero;
                // retrieve CSP context
                if (!AdvAPI.CryptAcquireContext(ref phProv, null, name, pdwProvType, Wincrypt.CRYPT_VERIFYCONTEXT))
                {
                    throw new Win32Exception(Error.InavlidHandleException);
                }
                Int32            pdwDataLen = 0;
                ALG_IDCollection algs       = new ALG_IDCollection();
                if (AdvAPI.CryptGetProvParam(phProv, 0x16, null, ref pdwDataLen, Wincrypt.CRYPT_FIRST))
                {
                    Byte[] pbData = new Byte[Marshal.SizeOf(typeof(Wincrypt.PROV_ENUMALGS_EX))];
                    while (AdvAPI.CryptGetProvParam(phProv, 0x16, pbData, ref pdwDataLen, Wincrypt.CRYPT_NEXT))
                    {
                        IntPtr ptr = Marshal.AllocHGlobal(pbData.Length);
                        Marshal.Copy(pbData, 0, ptr, pbData.Length);
                        Wincrypt.PROV_ENUMALGS_EX AlgStructure =
                            (Wincrypt.PROV_ENUMALGS_EX)Marshal.PtrToStructure(ptr, typeof(Wincrypt.PROV_ENUMALGS_EX));
                        Marshal.FreeHGlobal(ptr);
                        ALG_ID alg = get_algparams(AlgStructure);
                        algs.Add(alg);
                    }
                    csps.Add(new CspLegacy(name, pType, algs));
                }
                else
                {
                    csps.Add(new CspLegacy(name, pType, algs));
                }
                AdvAPI.CryptReleaseContext(phProv, 0);
            }
            return(csps);
        }
        static Boolean deleteLegacyKey(AsymmetricAlgorithm privateKey)
        {
            if (privateKey == null)
            {
                return(false);
            }
            String keyContainer;
            String provName;
            UInt32 provType;

            switch (privateKey)
            {
            case RSACryptoServiceProvider rsaProv:
                keyContainer = rsaProv.CspKeyContainerInfo.KeyContainerName;
                provName     = rsaProv.CspKeyContainerInfo.ProviderName;
                provType     = (UInt32)rsaProv.CspKeyContainerInfo.ProviderType;
                break;

            case DSACryptoServiceProvider dsaProv:
                keyContainer = dsaProv.CspKeyContainerInfo.KeyContainerName;
                provName     = dsaProv.CspKeyContainerInfo.ProviderName;
                provType     = (UInt32)dsaProv.CspKeyContainerInfo.ProviderType;
                break;

            default:
                privateKey.Dispose();
                return(false);
            }
            IntPtr  phProv  = IntPtr.Zero;
            Boolean status2 = false;
            Boolean status1 = AdvAPI.CryptAcquireContext(
                ref phProv,
                keyContainer,
                provName,
                provType,
                Wincrypt.CRYPT_DELETEKEYSET | nCrypt2.NCRYPT_MACHINE_KEY_FLAG);

            if (!status1)
            {
                status2 = AdvAPI.CryptAcquireContext(
                    ref phProv,
                    keyContainer,
                    provName,
                    provType,
                    Wincrypt.CRYPT_DELETEKEYSET);
            }
            privateKey.Dispose();
            return(status1 || status2);
        }