14
14
15
15
namespace Microsoft . Data . SqlClient . ManualTesting . Tests . AlwaysEncrypted
16
16
{
17
- public static class AKVUnitTests
17
+ public class AKVUnitTests : IClassFixture < AzureKeyVaultKeyFixture >
18
18
{
19
19
const string EncryptionAlgorithm = "RSA_OAEP" ;
20
20
public static readonly byte [ ] s_columnEncryptionKey = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 } ;
21
21
private const string cekCacheName = "_columnEncryptionKeyCache" ;
22
22
private const string signatureVerificationResultCacheName = "_columnMasterKeyMetadataSignatureVerificationCache" ;
23
23
24
+ private readonly AzureKeyVaultKeyFixture _fixture ;
25
+
26
+ public AKVUnitTests ( AzureKeyVaultKeyFixture fixture )
27
+ {
28
+ _fixture = fixture ;
29
+ }
30
+
24
31
private static void ValidateAKVTraces ( List < EventWrittenEventArgs > eventData , Guid threadActivityId )
25
32
{
26
33
Assert . NotNull ( eventData ) ;
@@ -64,36 +71,36 @@ private static void ValidateAKVTraces(List<EventWrittenEventArgs> eventData, Gui
64
71
}
65
72
66
73
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . IsAKVSetupAvailable ) ) ]
67
- public static void LegacyAuthenticationCallbackTest ( )
74
+ public void LegacyAuthenticationCallbackTest ( )
68
75
{
69
76
Guid activityId = Trace . CorrelationManager . ActivityId = Guid . NewGuid ( ) ;
70
77
using DataTestUtility . AKVEventListener AKVListener = new ( ) ;
71
78
72
79
// SqlClientCustomTokenCredential implements legacy authentication callback to request access token at client-side.
73
80
SqlColumnEncryptionAzureKeyVaultProvider akvProvider = new SqlColumnEncryptionAzureKeyVaultProvider ( new SqlClientCustomTokenCredential ( ) ) ;
74
- byte [ ] encryptedCek = akvProvider . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , EncryptionAlgorithm , s_columnEncryptionKey ) ;
75
- byte [ ] decryptedCek = akvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , EncryptionAlgorithm , encryptedCek ) ;
81
+ byte [ ] encryptedCek = akvProvider . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , EncryptionAlgorithm , s_columnEncryptionKey ) ;
82
+ byte [ ] decryptedCek = akvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , EncryptionAlgorithm , encryptedCek ) ;
76
83
77
84
Assert . Equal ( s_columnEncryptionKey , decryptedCek ) ;
78
85
ValidateAKVTraces ( AKVListener . EventData , activityId ) ;
79
86
}
80
87
81
88
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . IsAKVSetupAvailable ) ) ]
82
- public static void TokenCredentialTest ( )
89
+ public void TokenCredentialTest ( )
83
90
{
84
91
Guid activityId = Trace . CorrelationManager . ActivityId = Guid . NewGuid ( ) ;
85
92
using DataTestUtility . AKVEventListener AKVListener = new ( ) ;
86
93
87
94
SqlColumnEncryptionAzureKeyVaultProvider akvProvider = new SqlColumnEncryptionAzureKeyVaultProvider ( DataTestUtility . GetTokenCredential ( ) ) ;
88
- byte [ ] encryptedCek = akvProvider . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , EncryptionAlgorithm , s_columnEncryptionKey ) ;
89
- byte [ ] decryptedCek = akvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , EncryptionAlgorithm , encryptedCek ) ;
95
+ byte [ ] encryptedCek = akvProvider . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , EncryptionAlgorithm , s_columnEncryptionKey ) ;
96
+ byte [ ] decryptedCek = akvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , EncryptionAlgorithm , encryptedCek ) ;
90
97
91
98
Assert . Equal ( s_columnEncryptionKey , decryptedCek ) ;
92
99
ValidateAKVTraces ( AKVListener . EventData , activityId ) ;
93
100
}
94
101
95
102
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . IsAKVSetupAvailable ) ) ]
96
- public static void TokenCredentialRotationTest ( )
103
+ public void TokenCredentialRotationTest ( )
97
104
{
98
105
Guid activityId = Trace . CorrelationManager . ActivityId = Guid . NewGuid ( ) ;
99
106
using DataTestUtility . AKVEventListener AKVListener = new ( ) ;
@@ -103,19 +110,19 @@ public static void TokenCredentialRotationTest()
103
110
104
111
SqlColumnEncryptionAzureKeyVaultProvider newAkvProvider = new SqlColumnEncryptionAzureKeyVaultProvider ( DataTestUtility . GetTokenCredential ( ) ) ;
105
112
106
- byte [ ] encryptedCekWithNewProvider = newAkvProvider . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , EncryptionAlgorithm , s_columnEncryptionKey ) ;
107
- byte [ ] decryptedCekWithOldProvider = oldAkvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , EncryptionAlgorithm , encryptedCekWithNewProvider ) ;
113
+ byte [ ] encryptedCekWithNewProvider = newAkvProvider . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , EncryptionAlgorithm , s_columnEncryptionKey ) ;
114
+ byte [ ] decryptedCekWithOldProvider = oldAkvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , EncryptionAlgorithm , encryptedCekWithNewProvider ) ;
108
115
Assert . Equal ( s_columnEncryptionKey , decryptedCekWithOldProvider ) ;
109
116
110
- byte [ ] encryptedCekWithOldProvider = oldAkvProvider . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , EncryptionAlgorithm , s_columnEncryptionKey ) ;
111
- byte [ ] decryptedCekWithNewProvider = newAkvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , EncryptionAlgorithm , encryptedCekWithOldProvider ) ;
117
+ byte [ ] encryptedCekWithOldProvider = oldAkvProvider . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , EncryptionAlgorithm , s_columnEncryptionKey ) ;
118
+ byte [ ] decryptedCekWithNewProvider = newAkvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , EncryptionAlgorithm , encryptedCekWithOldProvider ) ;
112
119
Assert . Equal ( s_columnEncryptionKey , decryptedCekWithNewProvider ) ;
113
120
114
121
ValidateAKVTraces ( AKVListener . EventData , activityId ) ;
115
122
}
116
123
117
124
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . IsAKVSetupAvailable ) ) ]
118
- public static void ReturnSpecifiedVersionOfKeyWhenItIsNotTheMostRecentVersion ( )
125
+ public void ReturnSpecifiedVersionOfKeyWhenItIsNotTheMostRecentVersion ( )
119
126
{
120
127
Uri keyPathUri = new Uri ( DataTestUtility . AKVOriginalUrl ) ;
121
128
Uri vaultUri = new Uri ( keyPathUri . GetLeftPart ( UriPartial . Authority ) ) ;
@@ -161,7 +168,7 @@ public static void ThrowWhenUrlHasLessThanThreeSegments()
161
168
}
162
169
163
170
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . IsAKVSetupAvailable ) ) ]
164
- public static void DecryptedCekIsCachedDuringDecryption ( )
171
+ public void DecryptedCekIsCachedDuringDecryption ( )
165
172
{
166
173
Guid activityId = Trace . CorrelationManager . ActivityId = Guid . NewGuid ( ) ;
167
174
using DataTestUtility . AKVEventListener AKVListener = new ( ) ;
@@ -170,67 +177,67 @@ public static void DecryptedCekIsCachedDuringDecryption()
170
177
byte [ ] plaintextKey1 = { 1 , 2 , 3 } ;
171
178
byte [ ] plaintextKey2 = { 1 , 2 , 3 } ;
172
179
byte [ ] plaintextKey3 = { 0 , 1 , 2 , 3 } ;
173
- byte [ ] encryptedKey1 = akvProvider . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , plaintextKey1 ) ;
174
- byte [ ] encryptedKey2 = akvProvider . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , plaintextKey2 ) ;
175
- byte [ ] encryptedKey3 = akvProvider . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , plaintextKey3 ) ;
180
+ byte [ ] encryptedKey1 = akvProvider . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , plaintextKey1 ) ;
181
+ byte [ ] encryptedKey2 = akvProvider . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , plaintextKey2 ) ;
182
+ byte [ ] encryptedKey3 = akvProvider . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , plaintextKey3 ) ;
176
183
177
- byte [ ] decryptedKey1 = akvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , encryptedKey1 ) ;
184
+ byte [ ] decryptedKey1 = akvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , encryptedKey1 ) ;
178
185
Assert . Equal ( 1 , GetCacheCount ( cekCacheName , akvProvider ) ) ;
179
186
Assert . Equal ( plaintextKey1 , decryptedKey1 ) ;
180
187
181
- decryptedKey1 = akvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , encryptedKey1 ) ;
188
+ decryptedKey1 = akvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , encryptedKey1 ) ;
182
189
Assert . Equal ( 1 , GetCacheCount ( cekCacheName , akvProvider ) ) ;
183
190
Assert . Equal ( plaintextKey1 , decryptedKey1 ) ;
184
191
185
- byte [ ] decryptedKey2 = akvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , encryptedKey2 ) ;
192
+ byte [ ] decryptedKey2 = akvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , encryptedKey2 ) ;
186
193
Assert . Equal ( 2 , GetCacheCount ( cekCacheName , akvProvider ) ) ;
187
194
Assert . Equal ( plaintextKey2 , decryptedKey2 ) ;
188
195
189
- byte [ ] decryptedKey3 = akvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , encryptedKey3 ) ;
196
+ byte [ ] decryptedKey3 = akvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , encryptedKey3 ) ;
190
197
Assert . Equal ( 3 , GetCacheCount ( cekCacheName , akvProvider ) ) ;
191
198
Assert . Equal ( plaintextKey3 , decryptedKey3 ) ;
192
199
193
200
ValidateAKVTraces ( AKVListener . EventData , activityId ) ;
194
201
}
195
202
196
203
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . IsAKVSetupAvailable ) ) ]
197
- public static void SignatureVerificationResultIsCachedDuringVerification ( )
204
+ public void SignatureVerificationResultIsCachedDuringVerification ( )
198
205
{
199
206
Guid activityId = Trace . CorrelationManager . ActivityId = Guid . NewGuid ( ) ;
200
207
using DataTestUtility . AKVEventListener AKVListener = new ( ) ;
201
208
202
209
SqlColumnEncryptionAzureKeyVaultProvider akvProvider = new ( new SqlClientCustomTokenCredential ( ) ) ;
203
- byte [ ] signature = akvProvider . SignColumnMasterKeyMetadata ( DataTestUtility . AKVUrl , true ) ;
204
- byte [ ] signature2 = akvProvider . SignColumnMasterKeyMetadata ( DataTestUtility . AKVUrl , true ) ;
205
- byte [ ] signatureWithoutEnclave = akvProvider . SignColumnMasterKeyMetadata ( DataTestUtility . AKVUrl , false ) ;
210
+ byte [ ] signature = akvProvider . SignColumnMasterKeyMetadata ( _fixture . GeneratedKeyUri , true ) ;
211
+ byte [ ] signature2 = akvProvider . SignColumnMasterKeyMetadata ( _fixture . GeneratedKeyUri , true ) ;
212
+ byte [ ] signatureWithoutEnclave = akvProvider . SignColumnMasterKeyMetadata ( _fixture . GeneratedKeyUri , false ) ;
206
213
207
- Assert . True ( akvProvider . VerifyColumnMasterKeyMetadata ( DataTestUtility . AKVUrl , true , signature ) ) ;
214
+ Assert . True ( akvProvider . VerifyColumnMasterKeyMetadata ( _fixture . GeneratedKeyUri , true , signature ) ) ;
208
215
Assert . Equal ( 1 , GetCacheCount ( signatureVerificationResultCacheName , akvProvider ) ) ;
209
216
210
- Assert . True ( akvProvider . VerifyColumnMasterKeyMetadata ( DataTestUtility . AKVUrl , true , signature ) ) ;
217
+ Assert . True ( akvProvider . VerifyColumnMasterKeyMetadata ( _fixture . GeneratedKeyUri , true , signature ) ) ;
211
218
Assert . Equal ( 1 , GetCacheCount ( signatureVerificationResultCacheName , akvProvider ) ) ;
212
219
213
- Assert . True ( akvProvider . VerifyColumnMasterKeyMetadata ( DataTestUtility . AKVUrl , true , signature2 ) ) ;
220
+ Assert . True ( akvProvider . VerifyColumnMasterKeyMetadata ( _fixture . GeneratedKeyUri , true , signature2 ) ) ;
214
221
Assert . Equal ( 1 , GetCacheCount ( signatureVerificationResultCacheName , akvProvider ) ) ;
215
222
216
- Assert . True ( akvProvider . VerifyColumnMasterKeyMetadata ( DataTestUtility . AKVUrl , false , signatureWithoutEnclave ) ) ;
223
+ Assert . True ( akvProvider . VerifyColumnMasterKeyMetadata ( _fixture . GeneratedKeyUri , false , signatureWithoutEnclave ) ) ;
217
224
Assert . Equal ( 2 , GetCacheCount ( signatureVerificationResultCacheName , akvProvider ) ) ;
218
225
219
226
ValidateAKVTraces ( AKVListener . EventData , activityId ) ;
220
227
}
221
228
222
229
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . IsAKVSetupAvailable ) ) ]
223
- public static void CekCacheEntryIsEvictedAfterTtlExpires ( )
230
+ public void CekCacheEntryIsEvictedAfterTtlExpires ( )
224
231
{
225
232
Guid activityId = Trace . CorrelationManager . ActivityId = Guid . NewGuid ( ) ;
226
233
using DataTestUtility . AKVEventListener AKVListener = new ( ) ;
227
234
228
235
SqlColumnEncryptionAzureKeyVaultProvider akvProvider = new ( new SqlClientCustomTokenCredential ( ) ) ;
229
236
akvProvider . ColumnEncryptionKeyCacheTtl = TimeSpan . FromSeconds ( 5 ) ;
230
237
byte [ ] plaintextKey = { 1 , 2 , 3 } ;
231
- byte [ ] encryptedKey = akvProvider . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , plaintextKey ) ;
238
+ byte [ ] encryptedKey = akvProvider . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , plaintextKey ) ;
232
239
233
- akvProvider . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , encryptedKey ) ;
240
+ akvProvider . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , encryptedKey ) ;
234
241
Assert . True ( CekCacheContainsKey ( encryptedKey , akvProvider ) ) ;
235
242
Assert . Equal ( 1 , GetCacheCount ( cekCacheName , akvProvider ) ) ;
236
243
@@ -242,7 +249,7 @@ public static void CekCacheEntryIsEvictedAfterTtlExpires()
242
249
}
243
250
244
251
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . IsAKVSetupAvailable ) ) ]
245
- public static void CekCacheShouldBeDisabledWhenCustomProviderIsRegisteredGlobally ( )
252
+ public void CekCacheShouldBeDisabledWhenCustomProviderIsRegisteredGlobally ( )
246
253
{
247
254
if ( SQLSetupStrategyAzureKeyVault . IsAKVProviderRegistered )
248
255
{
@@ -255,9 +262,9 @@ public static void CekCacheShouldBeDisabledWhenCustomProviderIsRegisteredGloball
255
262
SqlColumnEncryptionAzureKeyVaultProvider akvProviderInGlobalCache =
256
263
globalProviders [ "AZURE_KEY_VAULT" ] as SqlColumnEncryptionAzureKeyVaultProvider ;
257
264
byte [ ] plaintextKey = { 1 , 2 , 3 } ;
258
- byte [ ] encryptedKey = akvProviderInGlobalCache . EncryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , plaintextKey ) ;
265
+ byte [ ] encryptedKey = akvProviderInGlobalCache . EncryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , plaintextKey ) ;
259
266
260
- akvProviderInGlobalCache . DecryptColumnEncryptionKey ( DataTestUtility . AKVUrl , "RSA_OAEP" , encryptedKey ) ;
267
+ akvProviderInGlobalCache . DecryptColumnEncryptionKey ( _fixture . GeneratedKeyUri , "RSA_OAEP" , encryptedKey ) ;
261
268
Assert . Equal ( 0 , GetCacheCount ( cekCacheName , akvProviderInGlobalCache ) ) ;
262
269
}
263
270
}
0 commit comments