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