コード例 #1
1
ファイル: Helpers.cs プロジェクト: ChuangYang/corefx
        public static bool IsLegalSize(this int size, KeySizes[] legalSizes, out bool validatedByZeroSkipSizeKeySizes)
        {
            validatedByZeroSkipSizeKeySizes = false;
            for (int i = 0; i < legalSizes.Length; i++)
            {
                KeySizes currentSizes = legalSizes[i];
                
                // If a cipher has only one valid key size, MinSize == MaxSize and SkipSize will be 0
                if (currentSizes.SkipSize == 0)
                {
                    if (currentSizes.MinSize == size)
                    {
                        // Signal that we were validated by a 0-skipsize KeySizes entry. Needed to preserve a very obscure
                        // piece of back-compat behavior.
                        validatedByZeroSkipSizeKeySizes = true;
                        return true;
                    }
                }
                else if (size >= currentSizes.MinSize && size <= currentSizes.MaxSize)
                {
                    // If the number is in range, check to see if it's a legal increment above MinSize
                    int delta = size - currentSizes.MinSize;

                    // While it would be unusual to see KeySizes { 10, 20, 5 } and { 11, 14, 1 }, it could happen.
                    // So don't return false just because this one doesn't match.
                    if (delta % currentSizes.SkipSize == 0)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
コード例 #2
0
ファイル: Helpers.cs プロジェクト: johnhhm/corefx
 public static bool IsLegalSize(this int size, KeySizes[] legalSizes, out bool validatedByZeroSkipSizeKeySizes)
 {
     validatedByZeroSkipSizeKeySizes = false;
     for (int i = 0; i < legalSizes.Length; i++)
     {
         // If a cipher has only one valid key size, MinSize == MaxSize and SkipSize will be 0
         if (legalSizes[i].SkipSize == 0)
         {
             if (legalSizes[i].MinSize == size)
             {
                 // Signal that we were validated by a 0-skipsize KeySizes entry. Needed to preserve a very obscure
                 // piece of back-compat behavior.
                 validatedByZeroSkipSizeKeySizes = true;
                 return true;
             }
         }
         else
         {
             for (int j = legalSizes[i].MinSize; j <= legalSizes[i].MaxSize; j += legalSizes[i].SkipSize)
             {
                 if (j == size)
                     return true;
             }
         }
     }
     return false;
 }
コード例 #3
0
ファイル: RijndaelManaged.cs プロジェクト: dotnet/corefx
        public RijndaelManaged()
        {
            LegalBlockSizesValue = new KeySizes[] { new KeySizes(minSize: 128, maxSize: 128, skipSize: 0) };

            // This class wraps Aes
            _impl = Aes.Create();
        }
コード例 #4
0
ファイル: Helpers.cs プロジェクト: dotnet/corefx
        public static bool IsLegalSize(this int size, KeySizes[] legalSizes)
        {
            for (int i = 0; i < legalSizes.Length; i++)
            {
                KeySizes currentSizes = legalSizes[i];

                // If a cipher has only one valid key size, MinSize == MaxSize and SkipSize will be 0
                if (currentSizes.SkipSize == 0)
                {
                    if (currentSizes.MinSize == size)
                        return true;
                }
                else if (size >= currentSizes.MinSize && size <= currentSizes.MaxSize)
                {
                    // If the number is in range, check to see if it's a legal increment above MinSize
                    int delta = size - currentSizes.MinSize;

                    // While it would be unusual to see KeySizes { 10, 20, 5 } and { 11, 14, 1 }, it could happen.
                    // So don't return false just because this one doesn't match.
                    if (delta % currentSizes.SkipSize == 0)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
コード例 #5
0
        internal RijndaelImplementation()
        {
            LegalBlockSizesValue = new KeySizes[] { new KeySizes(minSize: 128, maxSize: 128, skipSize: 0) };

            // This class wraps Aes
            _impl = Aes.Create();
        }
コード例 #6
0
ファイル: KeySizes.cs プロジェクト: runefs/Marvin
		internal static bool IsLegalKeySize (KeySizes[] legalKeys, int size) 
		{
			foreach (KeySizes legalKeySize in legalKeys) {
				if (legalKeySize.IsLegal (size)) 
					return true;
			}
			return false;
		}
コード例 #7
0
	// Validate a key size and throw an exception if invalid.
	internal static void Validate(KeySizes[] sizes, int value, String resource)
			{
				if(!Validate(sizes, value))
				{
					throw new CryptographicException
						(_(resource), value.ToString());
				}
			}
コード例 #8
0
		/// <summary>
		/// Creates a ModifiedRijndael which can be used with larger key sizes and a specified number of rounds.
		/// </summary>
		public ModifiedRijndael()
		{
			_numRounds = -1; //defined by keysize
			PaddingValue = PaddingMode.PKCS7;
			ModeValue = CipherMode.CBC;
			KeySizeValue = 256;
			FeedbackSizeValue = BlockSizeValue = 128;
			LegalBlockSizesValue = new KeySizes[] { new KeySizes(128, 256, 64) };
			LegalKeySizesValue = new KeySizes[] { new KeySizes(128, 4096, 64) };
		}
コード例 #9
0
	// Constructor.
	public TripleDES()
			: base()
			{
				KeySizeValue = 192;
				BlockSizeValue = 64;
				FeedbackSizeValue = 64;
				LegalBlockSizesValue = new KeySizes [1];
				LegalBlockSizesValue[0] = new KeySizes(64, 64, 64);
				LegalKeySizesValue = new KeySizes [1];
				LegalKeySizesValue[0] = new KeySizes(128, 192, 64);
			}
コード例 #10
0
ファイル: RC2.cs プロジェクト: jjenki11/blaze-chem-rendering
	// Constructor.
	public RC2()
			: base()
			{
				KeySizeValue = 128;
				BlockSizeValue = 64;
				FeedbackSizeValue = 64;
				LegalBlockSizesValue = new KeySizes [1];
				LegalBlockSizesValue[0] = new KeySizes(64, 64, 64);
				LegalKeySizesValue = new KeySizes [1];
				LegalKeySizesValue[0] = new KeySizes(128, 128, 128);
			}
コード例 #11
0
	// Constructor.
	public Rijndael()
			: base()
			{
				KeySizeValue = 128;
				BlockSizeValue = 128;
				FeedbackSizeValue = 128;
				LegalBlockSizesValue = new KeySizes [1];
				LegalBlockSizesValue[0] = new KeySizes(128, 128, 128);
				LegalKeySizesValue = new KeySizes [1];
				LegalKeySizesValue[0] = new KeySizes(128, 256, 64);
			}
コード例 #12
0
ファイル: DES.cs プロジェクト: jjenki11/blaze-chem-rendering
	// Constructor.
	public DES()
			: base()
			{
				KeySizeValue = 64;
				BlockSizeValue = 64;
				FeedbackSizeValue = 64;
				LegalBlockSizesValue = new KeySizes [1];
				LegalBlockSizesValue[0] = new KeySizes(64, 64, 64);
				LegalKeySizesValue = new KeySizes [1];
				LegalKeySizesValue[0] = new KeySizes(64, 64, 64);
			}
コード例 #13
0
ファイル: Debuger.cs プロジェクト: kener1985/MyGitHubProj
 internal static void ShowLegalSize(KeySizes[] ks)
 {
     StringBuilder sTmp = new StringBuilder(128);
     foreach (KeySizes item in ks)
     {
         sTmp.Append("Max:").AppendLine(item.MaxSize.ToString());
         sTmp.Append("Skip:").AppendLine(item.SkipSize.ToString());
         sTmp.Append("Min:").Append(item.MinSize.ToString());
         System.Windows.Forms.MessageBox.Show(sTmp.ToString());
     }
 }
		public static void Validate
			(
			  this global::System.Net.Sockets.Socket socket
			, KeySizes[] ks
			, int i
			, string s
			)
		{
			throw new NotImplementedException("Silverlight Cryptography TODO!");

			return;
		}
コード例 #15
0
ファイル: DES.cs プロジェクト: jack-pappas/mono
	protected DES ()
	{
		KeySizeValue = 64; 
		BlockSizeValue = 64; 
		FeedbackSizeValue = 8;

		LegalKeySizesValue = new KeySizes[1];
		LegalKeySizesValue[0] = new KeySizes(64, 64, 0);

		LegalBlockSizesValue = new KeySizes[1];
		LegalBlockSizesValue[0] = new KeySizes(64, 64, 0);
	}
コード例 #16
0
ファイル: Aes.cs プロジェクト: nlhepler/mono
		protected Aes ()
		{
			KeySizeValue = 256;
			BlockSizeValue = 128;
			FeedbackSizeValue = 128;

			LegalKeySizesValue = new KeySizes [1];
			LegalKeySizesValue [0] = new KeySizes (128, 256, 64);

			LegalBlockSizesValue = new KeySizes [1];
			LegalBlockSizesValue [0] = new KeySizes (128, 128, 0);
		}
コード例 #17
0
ファイル: NullEncryption.cs プロジェクト: johnynek/brunet
    public NullEncryption()
    {
      KeySizeValue = 0;
      BlockSizeValue = 8;
      FeedbackSizeValue = 0;

      LegalKeySizesValue = new KeySizes[1];
      LegalKeySizesValue[0] = new KeySizes(0, 0, 0);

      LegalBlockSizesValue = new KeySizes[1];
      LegalBlockSizesValue[0] = new KeySizes(8, 8, 0);
    }
コード例 #18
0
ファイル: Rijndael.cs プロジェクト: Bewolf2/GenesisMono
		public Rijndael ()
#endif
		{
			KeySizeValue = 256;
			BlockSizeValue = 128;
			FeedbackSizeValue = 128;
	
			LegalKeySizesValue = new KeySizes [1];
			LegalKeySizesValue [0] = new KeySizes (128, 256, 64);

			LegalBlockSizesValue = new KeySizes [1];
			LegalBlockSizesValue [0] = new KeySizes (128, 256, 64);
		}
コード例 #19
0
ファイル: DES.cs プロジェクト: runefs/Marvin
	public DES ()
#endif
	{
		KeySizeValue = 64; 
		BlockSizeValue = 64; 
		FeedbackSizeValue = 8;

		LegalKeySizesValue = new KeySizes[1];
		LegalKeySizesValue[0] = new KeySizes(64, 64, 0);

		LegalBlockSizesValue = new KeySizes[1];
		LegalBlockSizesValue[0] = new KeySizes(64, 64, 0);
	}
コード例 #20
0
	protected TripleDES ()
	{
		// from SymmetricAlgorithm
		KeySizeValue = 192;
		BlockSizeValue = 64;
		FeedbackSizeValue = 8;

		LegalKeySizesValue = new KeySizes [1];
		LegalKeySizesValue [0] = new KeySizes (128, 192, 64);

		LegalBlockSizesValue = new KeySizes [1];
		LegalBlockSizesValue [0] = new KeySizes (64, 64, 0);
	}
コード例 #21
0
ファイル: RC2.cs プロジェクト: jack-pappas/mono
		protected RC2 ()
		{
			KeySizeValue = 128;
			BlockSizeValue = 64;
			FeedbackSizeValue = 8;

			// The RFC allows keys of 1 to 128 bytes, but MS impl only supports
			// 40 to 128 bits, sigh.
			LegalKeySizesValue = new KeySizes [1];
			LegalKeySizesValue [0] = new KeySizes (40, 128, 8);

			LegalBlockSizesValue = new KeySizes [1];
			LegalBlockSizesValue [0] = new KeySizes (64, 64, 0);
		}
コード例 #22
0
ファイル: Aes.cs プロジェクト: runefs/Marvin
		protected Aes ()
		{
			KeySizeValue = 256;
			BlockSizeValue = 128;
#if !NET_2_1
			// Silverlight 2.0 only supports CBC mode (i.e. no feedback)
			FeedbackSizeValue = 128;
#endif
			LegalKeySizesValue = new KeySizes [1];
			LegalKeySizesValue [0] = new KeySizes (128, 256, 64);

			LegalBlockSizesValue = new KeySizes [1];
			LegalBlockSizesValue [0] = new KeySizes (128, 128, 0);
		}
コード例 #23
0
        [System.Security.SecuritySafeCritical]  // auto-generated
        public DSACryptoServiceProvider(int dwKeySize, CspParameters parameters) {
            if (dwKeySize < 0)
                throw new ArgumentOutOfRangeException("dwKeySize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
            Contract.EndContractBlock();

            _parameters = Utils.SaveCspParameters(CspAlgorithmType.Dss, parameters, s_UseMachineKeyStore, ref _randomKeyContainer);
            LegalKeySizesValue = new KeySizes[] { new KeySizes(512, 1024, 64) }; // per the DSS spec
            _dwKeySize = dwKeySize;
            _sha1 = new SHA1CryptoServiceProvider();

            // If this is not a random container we generate, create it eagerly 
            // in the constructor so we can report any errors now.
            if (!_randomKeyContainer || Environment.GetCompatibilityFlag(CompatibilityFlag.EagerlyGenerateRandomAsymmKeys))
                GetKeyPair();
        }
コード例 #24
0
        public RC2()
#endif
        {
            KeySizeValue      = 128;
            BlockSizeValue    = 64;
            FeedbackSizeValue = 8;

            // The RFC allows keys of 1 to 128 bytes, but MS impl only supports
            // 40 to 128 bits, sigh.
            LegalKeySizesValue     = new KeySizes [1];
            LegalKeySizesValue [0] = new KeySizes(40, 128, 8);

            LegalBlockSizesValue     = new KeySizes [1];
            LegalBlockSizesValue [0] = new KeySizes(64, 64, 0);
        }
コード例 #25
0
	// Validate a key size value.
	internal static bool Validate(KeySizes[] sizes, int value)
			{
				if(sizes == null)
				{
					return false;
				}
				foreach(KeySizes size in sizes)
				{
					if(value >= size.MinSize && value <= size.MaxSize &&
					   ((value - size.MinSize) % size.SkipSize) == 0)
					{
						return true;
					}
				}
				return false;
			}
コード例 #26
0
        public Gost3410CryptoServiceProvider(CspParameters parameters)
        {
            _parameters = CapiHelper.SaveCspParameters(
                CapiHelper.CspAlgorithmType.PROV_GOST_2001_DH,
                parameters,
                s_useMachineKeyStore,
                out _randomKeyContainer);
            _keySpec           = _parameters.KeyNumber;
            LegalKeySizesValue = new KeySizes[] { new KeySizes(GostConstants.GOST_3410EL_SIZE, GostConstants.GOST_3410EL_SIZE, 0) };

            _gost3411 = Gost3411.Create();
            if (!_randomKeyContainer)
            {
                GetKeyPair();
            }
        }
コード例 #27
0
        public Gost3410_2012_256CryptoServiceProvider(CspParameters parameters)
        {
            _parameters = CapiHelper.SaveCspParameters(
                CapiHelper.CspAlgorithmType.Gost2012_256,
                parameters,
                s_useMachineKeyStore,
                out _randomKeyContainer);
            _keySpec           = _parameters.KeyNumber;
            LegalKeySizesValue = new KeySizes[] { new KeySizes(GostConstants.GOST3410_2012_256KEY_SIZE, GostConstants.GOST3410_2012_256KEY_SIZE, 0) };

            _hashImpl = Gost3411_2012_256.Create();
            if (!_randomKeyContainer)
            {
                GetKeyPair();
            }
        }
コード例 #28
0
        internal BCryptSymmetricAlgorithm(CngAlgorithm algorithm,
                                          CngProvider algorithmProvider,
                                          KeySizes[] legalBlockSizes,
                                          KeySizes[] legalkeySizes)
        {
            Debug.Assert(algorithm != null, "algorithm != null");
            Debug.Assert(algorithmProvider != null, "algorithmProvider != null");
            Debug.Assert(legalBlockSizes != null, "legalBlockSizes != null");
            Debug.Assert(legalkeySizes != null, "legalKeySizes != null");

            m_algorithm = algorithm;
            m_algorithmProvider = algorithmProvider;

            LegalBlockSizesValue = legalBlockSizes;
            LegalKeySizesValue = legalkeySizes;
        }
コード例 #29
0
        private RSACryptoServiceProvider(int keySize, CspParameters parameters, bool useDefaultKeySize)
        {
            if (keySize < 0)
            {
                throw new ArgumentOutOfRangeException("dwKeySize", "ArgumentOutOfRange_NeedNonNegNum");
            }
            _parameters = CapiHelper.SaveCspParameters(CapiHelper.CspAlgorithmType.Rsa, parameters, s_UseMachineKeyStore, ref _randomKeyContainer);

            _legalKeySizesValue = new KeySizes[] { new KeySizes(384, 16384, 8) };
            _keySize            = useDefaultKeySize ? 1024 : keySize;

            // If this is not a random container we generate, create it eagerly
            // in the constructor so we can report any errors now.
            if (!_randomKeyContainer)
            {
                GetKeyPair();
            }
        }
コード例 #30
0
        private RSACryptoServiceProvider(int keySize, CspParameters parameters, bool useDefaultKeySize)
        {
            if (keySize < 0)
            {
                throw new ArgumentOutOfRangeException("dwKeySize", "ArgumentOutOfRange_NeedNonNegNum");
            }
            _parameters = CapiHelper.SaveCspParameters(CapiHelper.CspAlgorithmType.Rsa, parameters, s_UseMachineKeyStore, ref _randomKeyContainer);

            _legalKeySizesValue = new KeySizes[] { new KeySizes(384, 16384, 8) };
            _keySize = useDefaultKeySize ? 1024 : keySize;

            // If this is not a random container we generate, create it eagerly 
            // in the constructor so we can report any errors now.
            if (!_randomKeyContainer)
            {
                GetKeyPair();
            }
        }
コード例 #31
0
        /// <summary>Default constructor. Starts as an uninitialized ECB instance.</summary>
        public BlowfishAlgorithm()
            : base()
        {
            KeySizeValue = BlowfishECB.MAX_KEY_LENGTH << 3;

            LegalBlockSizesValue = new KeySizes[1];
            LegalBlockSizesValue[0] = new KeySizes(
                    BlockSize,
                    BlockSize,
                    BlowfishECB.BLOCK_SIZE);

            LegalKeySizesValue = new KeySizes[1];
            LegalKeySizesValue[0] = new KeySizes(
                    0,
                    BlowfishECB.MAX_KEY_LENGTH << 3,
                    8);

            ModeValue = CipherMode.ECB;
        }
コード例 #32
0
        [System.Security.SecuritySafeCritical]  // auto-generated
        public DSACryptoServiceProvider(int dwKeySize, CspParameters parameters)
        {
            if (dwKeySize < 0)
            {
                throw new ArgumentOutOfRangeException("dwKeySize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
            }
            Contract.EndContractBlock();

            _parameters        = Utils.SaveCspParameters(CspAlgorithmType.Dss, parameters, s_UseMachineKeyStore, ref _randomKeyContainer);
            LegalKeySizesValue = new KeySizes[] { new KeySizes(512, 1024, 64) }; // per the DSS spec
            _dwKeySize         = dwKeySize;
            _sha1 = new SHA1CryptoServiceProvider();

            // If this is not a random container we generate, create it eagerly
            // in the constructor so we can report any errors now.
            if (!_randomKeyContainer || Environment.GetCompatibilityFlag(CompatibilityFlag.EagerlyGenerateRandomAsymmKeys))
            {
                GetKeyPair();
            }
        }
コード例 #33
0
ファイル: Blowfish.cs プロジェクト: PictoCrypt/ImageTools
        /// <summary>
        ///     constructor
        /// </summary>
        public Blowfish()
        {
            mBlowfishBase = null;
            mBlowfishBaseCbc = null;

            // FIXME: are we supposed to create a default key and IV?
            IVValue = null;
            KeyValue = null;
            KeySizeValue = BlowfishBase.MAXKEYLENGTH*8;

            LegalBlockSizesValue = new KeySizes[1];
            LegalBlockSizesValue[0] = new KeySizes(BlockSize, BlockSize, 8);

            LegalKeySizesValue = new KeySizes[1];
            LegalKeySizesValue[0] = new KeySizes(0, BlowfishBase.MAXKEYLENGTH*8, 8);

            ModeValue = CipherMode.ECB;

            m_rng = null;
        }
コード例 #34
0
        private void Common(int dwKeySize, CspParameters p)
        {
            // Microsoft RSA CSP can do between 384 and 16384 bits keypair
            LegalKeySizesValue     = new KeySizes [1];
            LegalKeySizesValue [0] = new KeySizes(384, 16384, 8);
            base.KeySize           = dwKeySize;

            rsa = new RSAManaged(KeySize);
            rsa.KeyGenerated += new RSAManaged.KeyGeneratedEventHandler(OnKeyGenerated);

            persistKey = (p != null);
            if (p == null)
            {
                p = new CspParameters(PROV_RSA_FULL);
#if NET_1_1
                if (useMachineKeyStore)
                {
                    p.Flags |= CspProviderFlags.UseMachineKeyStore;
                }
#endif
                store = new KeyPairPersistence(p);
                // no need to load - it cannot exists
            }
            else
            {
                store = new KeyPairPersistence(p);
                bool exists   = store.Load();
                bool required = (p.Flags & CspProviderFlags.UseExistingKey) != 0;

                if (required && !exists)
                {
                    throw new CryptographicException("Keyset does not exist");
                }

                if (store.KeyValue != null)
                {
                    persisted = true;
                    this.FromXmlString(store.KeyValue);
                }
            }
        }
コード例 #35
0
ファイル: Helpers.cs プロジェクト: jmhardison/corefx
 public static bool IsLegalSize(this int size, KeySizes[] legalSizes)
 {
     for (int i = 0; i < legalSizes.Length; i++)
     {
         // If a cipher has only one valid key size, MinSize == MaxSize and SkipSize will be 0
         if (legalSizes[i].SkipSize == 0)
         {
             if (legalSizes[i].MinSize == size)
                 return true;
         }
         else
         {
             for (int j = legalSizes[i].MinSize; j <= legalSizes[i].MaxSize; j += legalSizes[i].SkipSize)
             {
                 if (j == size)
                     return true;
             }
         }
     }
     return false;
 }
コード例 #36
0
        //
        // Summary:
        //  Constructs an InfoCardSymmetricAlgorithm
        //
        // Parameters:
        //  cryptoHandle  - A handle to the symmetric key to base the symmetric algorithm on.
        //
        public InfoCardSymmetricAlgorithm(SymmetricCryptoHandle cryptoHandle)
            : base()
        {
            m_cryptoHandle = (SymmetricCryptoHandle)cryptoHandle.Duplicate();

            try
            {
                m_parameters = (RpcSymmetricCryptoParameters)m_cryptoHandle.Parameters;

                KeySizeValue = m_parameters.keySize;
                BlockSizeValue = m_parameters.blockSize;
                FeedbackSizeValue = m_parameters.feedbackSize;
                LegalBlockSizesValue = new KeySizes[] { new KeySizes(BlockSizeValue, BlockSizeValue, 0) };
                LegalKeySizesValue = new KeySizes[] { new KeySizes(KeySizeValue, KeySizeValue, 0) };
            }
            catch
            {
                m_cryptoHandle.Dispose();
                throw;
            }
        }
コード例 #37
0
 // Validate "rgbKey" and "rgbIV" values for a call on
 // "CreateDecryptor" or "CreateEncryptor".
 internal void ValidateCreate(byte[] rgbKey, byte[] rgbIV)
 {
     if (rgbKey == null)
     {
         throw new ArgumentNullException("rgbKey");
     }
     KeySizes.Validate(LegalKeySizesValue, rgbKey.Length * 8,
                       "Crypto_InvalidKeySize");
     if (rgbIV != null)
     {
         // Verify the size of the IV against the block size.
         if ((rgbIV.Length * 8) != BlockSizeValue)
         {
             throw new CryptographicException
                       (_("Crypto_InvalidIVSize"),
                       rgbIV.Length.ToString());
         }
     }
     else if (ModeValue != CipherMode.ECB)
     {
         // We must have an IV in every mode except ECB.
         throw new ArgumentNullException("rgbIV");
     }
 }
コード例 #38
0
        [System.Security.SecurityCritical]  // auto-generated
        private RSACryptoServiceProvider(int dwKeySize, CspParameters parameters, bool useDefaultKeySize)
        {
            if (dwKeySize < 0)
            {
                throw new ArgumentOutOfRangeException("dwKeySize", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
            }
            Contract.EndContractBlock();

            _parameters = Utils.SaveCspParameters(CspAlgorithmType.Rsa, parameters, s_UseMachineKeyStore, ref _randomKeyContainer);

            LegalKeySizesValue = new KeySizes[] { new KeySizes(384, 16384, 8) };
            _dwKeySize         = useDefaultKeySize ? 1024 : dwKeySize;

            // If this is not a random container we generate, create it eagerly
            // in the constructor so we can report any errors now.
            if (!_randomKeyContainer
#if !FEATURE_CORECLR
                || Environment.GetCompatibilityFlag(CompatibilityFlag.EagerlyGenerateRandomAsymmKeys)
#endif //!FEATURE_CORECLR
                )
            {
                GetKeyPair();
            }
        }
コード例 #39
0
 public static bool IsLegalSize(this int size, KeySizes legalSizes)
 {
     return(size.IsLegalSize(legalSizes, out _));
 }
コード例 #40
0
ファイル: SymmetricAlgorithm.cs プロジェクト: xxponline/mono
 public bool ValidKeySize(int bitLength)
 {
     return(KeySizes.IsLegalKeySize(LegalKeySizesValue, bitLength));
 }
コード例 #41
0
 private void SetLegalKeySizesValue()
 {
     // CNG does not support 128-bit keys.
     LegalKeySizesValue = new KeySizes[] { new KeySizes(minSize: 3 * 64, maxSize: 3 * 64, skipSize: 0) };
 }
コード例 #42
0
        internal RSACryptoServiceProvider(int dwKeySize, CspParameters parameters, bool useDefaultKeySize)
        {
            int hr;

            //
            //  Save the CSP Parameters
            //

            if (parameters == null)
            {
                _parameters = new CspParameters(1, null, null, m_UseMachineKeyStore);
            }
            else
            {
                // Check the parameter options: specifying either a key container name or UseDefaultKeyContainer flag
                // requires unmanaged code permission
                if (((parameters.Flags & CspProviderFlags.UseDefaultKeyContainer) != 0) ||
                    ((parameters.KeyContainerName != null) && (parameters.KeyContainerName.Length > 0)))
                {
                    _UCpermission.Demand();
                    // If we specified a key container name for this key, then mark it persisted
                    if ((parameters.KeyContainerName != null) && (parameters.KeyContainerName.Length > 0))
                    {
                        // CAPI doesn't accept Container Names longer than 260 characters
                        if (parameters.KeyContainerName.Length > 260)
                        {
                            throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidKeyContainerName"));
                        }

                        _persistKeyInCSP = true;
                    }
                }
                _parameters = parameters;
            }


            //
            //  If no key spec has been specified, then set it to be
            //      AT_KEYEXCHANGE,  if a CALG_* has been specified, then
            //      map that to AT_* value
            if (_parameters.KeyNumber == -1)
            {
                _parameters.KeyNumber = AT_KEYEXCHANGE;
            }
            else if (_parameters.KeyNumber == CALG_RSA_KEYX)
            {
                _parameters.KeyNumber = AT_KEYEXCHANGE;
            }
            else if (_parameters.KeyNumber == CALG_RSA_SIGN)
            {
                _parameters.KeyNumber = AT_SIGNATURE;
            }

            // See if we have the Enhanced RSA provider on this machine
            _hasEnhancedProvider = HasEnhancedProvider();

            // Now determine legal key sizes.  If AT_SIGNATURE, then 384 -- 16386.  Otherwise, depends on
            // whether the strong provider is present.

            if (_parameters.KeyNumber == AT_SIGNATURE)
            {
                LegalKeySizesValue = new KeySizes[1] {
                    new KeySizes(384, 16384, 8)
                };
            }
            else if (_hasEnhancedProvider)
            {
                // it is, we have the strong provider
                LegalKeySizesValue = new KeySizes[1] {
                    new KeySizes(384, 16384, 8)
                };
            }
            else
            {
                // nope, all we have is the base provider
                LegalKeySizesValue = new KeySizes[1] {
                    new KeySizes(384, 512, 8)
                };
                // tone down the default key size
                _defaultKeySize = 512;
            }
            // Set the key size; this will throw an exception if dwKeySize is invalid.
            // Don't check if dwKeySize == 0, since that's the "default size", however
            // *our* default should be 1024 if the CSP can handle it.  So, if the
            // key size was unspecified in a constructor to us, it'll be -1 here and
            // change it to the default size.  If the user really put in a 0 give him back
            // the default for the CSP whatever it is.
            if (useDefaultKeySize)
            {
                dwKeySize = _defaultKeySize;
            }
            if (dwKeySize != 0)
            {
                KeySize = dwKeySize;
            }
            _dwKeySize = dwKeySize;

            //
            //  Create the CSP container for this set of keys
            //
            _hCSP = IntPtr.Zero;
            _hKey = IntPtr.Zero;
            hr    = _CreateCSP(_parameters, ref _hCSP);
            if (hr != 0)
            {
                throw new CryptographicException(Environment.GetResourceString("Cryptography_CSP_CouldNotAcquire"));
            }
            if (_hCSP == IntPtr.Zero)
            {
                throw new CryptographicException(Environment.GetResourceString("Cryptography_CSP_CouldNotAcquire"));
            }

            // If the key already exists, use it, else generate a new one
            hr = _GetUserKey(_hCSP, _parameters.KeyNumber, ref _hKey);
            if (hr != 0)
            {
                _hKey = _GenerateKey(_hCSP, _parameters.KeyNumber, dwKeySize << 16);
                if (_hKey == IntPtr.Zero)
                {
                    throw new CryptographicException(Environment.GetResourceString("Cryptography_CSP_CreateKey"));
                }
                // We just gen'd a new key pair, so we have both halves.
                _containerContents = KeyContainerContents.PublicAndExportablePrivate;
            }
            else
            {
                // If the key already exists, make sure to persist it
                _persistKeyInCSP = true;
                // we have both halves, but we don't know if it's exportable or not
                _containerContents = KeyContainerContents.Unknown;
            }

            _CSPHandleProtector = new __CSPHandleProtector(_hCSP, _persistKeyInCSP, _parameters);
            _KeyHandleProtector = new __KeyHandleProtector(_hKey);
        }