1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 // 6 // This file is one of a group of files (AesCng.cs, TripleDESCng.cs) that are almost identical except 7 // for the algorithm name. If you make a change to this file, there's a good chance you'll have to make 8 // the same change to the other files so please check. This is a pain but given that the contracts demand 9 // that each of these derive from a different class, it can't be helped. 10 // 11 12 using Internal.Cryptography; 13 using Internal.NativeCrypto; 14 15 namespace System.Security.Cryptography 16 { 17 public sealed class AesCng : Aes, ICngSymmetricAlgorithm 18 { AesCng()19 public AesCng() 20 { 21 _core = new CngSymmetricAlgorithmCore(this); 22 } 23 AesCng(string keyName)24 public AesCng(string keyName) 25 : this(keyName, CngProvider.MicrosoftSoftwareKeyStorageProvider) 26 { 27 } 28 AesCng(string keyName, CngProvider provider)29 public AesCng(string keyName, CngProvider provider) 30 : this(keyName, provider, CngKeyOpenOptions.None) 31 { 32 } 33 AesCng(string keyName, CngProvider provider, CngKeyOpenOptions openOptions)34 public AesCng(string keyName, CngProvider provider, CngKeyOpenOptions openOptions) 35 { 36 _core = new CngSymmetricAlgorithmCore(this, keyName, provider, openOptions); 37 } 38 39 public override byte[] Key 40 { 41 get 42 { 43 return _core.GetKeyIfExportable(); 44 } 45 set 46 { 47 _core.SetKey(value); 48 } 49 } 50 51 public override int KeySize 52 { 53 get 54 { 55 return base.KeySize; 56 } 57 58 set 59 { 60 _core.SetKeySize(value, this); 61 } 62 } 63 CreateDecryptor()64 public override ICryptoTransform CreateDecryptor() 65 { 66 // Do not change to CreateDecryptor(this.Key, this.IV). this.Key throws if a non-exportable hardware key is being used. 67 return _core.CreateDecryptor(); 68 } 69 CreateDecryptor(byte[] rgbKey, byte[] rgbIV)70 public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV) 71 { 72 return _core.CreateDecryptor(rgbKey, rgbIV); 73 } 74 CreateEncryptor()75 public override ICryptoTransform CreateEncryptor() 76 { 77 // Do not change to CreateEncryptor(this.Key, this.IV). this.Key throws if a non-exportable hardware key is being used. 78 return _core.CreateEncryptor(); 79 } 80 CreateEncryptor(byte[] rgbKey, byte[] rgbIV)81 public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV) 82 { 83 return _core.CreateEncryptor(rgbKey, rgbIV); 84 } 85 GenerateKey()86 public override void GenerateKey() 87 { 88 _core.GenerateKey(); 89 } 90 GenerateIV()91 public override void GenerateIV() 92 { 93 _core.GenerateIV(); 94 } 95 Dispose(bool disposing)96 protected override void Dispose(bool disposing) 97 { 98 base.Dispose(disposing); 99 } 100 101 byte[] ICngSymmetricAlgorithm.BaseKey { get { return base.Key; } set { base.Key = value; } } 102 int ICngSymmetricAlgorithm.BaseKeySize { get { return base.KeySize; } set { base.KeySize = value; } } 103 ICngSymmetricAlgorithm.IsWeakKey(byte[] key)104 bool ICngSymmetricAlgorithm.IsWeakKey(byte[] key) 105 { 106 return false; 107 } 108 ICngSymmetricAlgorithm.GetEphemeralModeHandle()109 SafeAlgorithmHandle ICngSymmetricAlgorithm.GetEphemeralModeHandle() 110 { 111 return AesBCryptModes.GetSharedHandle(Mode); 112 } 113 ICngSymmetricAlgorithm.GetNCryptAlgorithmIdentifier()114 string ICngSymmetricAlgorithm.GetNCryptAlgorithmIdentifier() 115 { 116 return Interop.NCrypt.NCRYPT_AES_ALGORITHM; 117 } 118 ICngSymmetricAlgorithm.PreprocessKey(byte[] key)119 byte[] ICngSymmetricAlgorithm.PreprocessKey(byte[] key) 120 { 121 return key; 122 } 123 124 private CngSymmetricAlgorithmCore _core; 125 } 126 } 127