From dc68faa3f39c8560cc4cad2e3fbe5bf39e240d64 Mon Sep 17 00:00:00 2001 From: David-Engel Date: Wed, 28 Aug 2019 19:01:46 -0700 Subject: [PATCH 01/26] AE corrections --- release-notes/1.0/1.0.19123.2-Preview.md | 5 +++-- release-notes/1.0/1.0.19128.1-Preview.md | 5 +++-- release-notes/1.0/1.0.19189.1-Preview.md | 5 +++-- release-notes/1.0/1.0.19221.1-Preview.md | 5 +++-- release-notes/1.0/1.0.19239.1.md | 5 +++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/release-notes/1.0/1.0.19123.2-Preview.md b/release-notes/1.0/1.0.19123.2-Preview.md index 1932ba6d4d..8002ad57a8 100644 --- a/release-notes/1.0/1.0.19123.2-Preview.md +++ b/release-notes/1.0/1.0.19123.2-Preview.md @@ -123,7 +123,7 @@ namespace Microsoft.Data.SqlClient.DataClassification UTF-8 support does not require any application code changes. These SqlClient changes simply optimize the communication between the client and server when the server supports UTF-8 and the underlying column collation is UTF-8. See the UTF-8 section under [What's new in SQL Server 2019 preview](https://docs.microsoft.com/en-us/sql/sql-server/what-s-new-in-sql-server-ver15?view=sqlallproducts-allversions#utf-8-support-ctp-23). -### Always Encrypted with Enclaves +### Always Encrypted In general, existing documentation which uses System.Data.SqlClient on .NET Framework **and built-in column master key store providers** should now work with .NET Core, too. @@ -132,5 +132,6 @@ In general, existing documentation which uses System.Data.SqlClient on .NET Fram **Notes:** -* Custom key store providers, like the Azure Key Vault provider, will need to be updated to support Microsoft.Data.SqlClient. Similarly, enclave providers will also need to be updated to support Microsoft.Data.SqlClient. +* There is no key store provider for Azure Key Vault and Microsoft.Data.SqlClient at this time. +* Always Encrypted with secure enclaves is not supported with Microsoft.Data.SqlClient. * Always Encrypted is only supported against .NET Framework and .NET Core targets. It is not supported against .NET Standard since .NET Standard is missing certain encryption dependencies. diff --git a/release-notes/1.0/1.0.19128.1-Preview.md b/release-notes/1.0/1.0.19128.1-Preview.md index dc4c0cdd38..e3bc0e5d52 100644 --- a/release-notes/1.0/1.0.19128.1-Preview.md +++ b/release-notes/1.0/1.0.19128.1-Preview.md @@ -126,7 +126,7 @@ namespace Microsoft.Data.SqlClient.DataClassification UTF-8 support does not require any application code changes. These SqlClient changes simply optimize the communication between the client and server when the server supports UTF-8 and the underlying column collation is UTF-8. See the UTF-8 section under [What's new in SQL Server 2019 preview](https://docs.microsoft.com/en-us/sql/sql-server/what-s-new-in-sql-server-ver15?view=sqlallproducts-allversions#utf-8-support-ctp-23). -### Always Encrypted with Enclaves +### Always Encrypted In general, existing documentation which uses System.Data.SqlClient on .NET Framework **and built-in column master key store providers** should now work with .NET Core, too. @@ -135,5 +135,6 @@ In general, existing documentation which uses System.Data.SqlClient on .NET Fram **Notes:** -* Custom key store providers, like the Azure Key Vault provider, will need to be updated to support Microsoft.Data.SqlClient. Similarly, enclave providers will also need to be updated to support Microsoft.Data.SqlClient. +* There is no key store provider for Azure Key Vault and Microsoft.Data.SqlClient at this time. +* Always Encrypted with secure enclaves is not supported with Microsoft.Data.SqlClient. * Always Encrypted is only supported against .NET Framework and .NET Core targets. It is not supported against .NET Standard since .NET Standard is missing certain encryption dependencies. diff --git a/release-notes/1.0/1.0.19189.1-Preview.md b/release-notes/1.0/1.0.19189.1-Preview.md index 9d57c02e36..d3fcad8260 100644 --- a/release-notes/1.0/1.0.19189.1-Preview.md +++ b/release-notes/1.0/1.0.19189.1-Preview.md @@ -131,7 +131,7 @@ namespace Microsoft.Data.SqlClient.DataClassification UTF-8 support does not require any application code changes. These SqlClient changes simply optimize the communication between the client and server when the server supports UTF-8 and the underlying column collation is UTF-8. See the UTF-8 section under [What's new in SQL Server 2019 preview](https://docs.microsoft.com/sql/sql-server/what-s-new-in-sql-server-ver15?view=sqlallproducts-allversions#utf-8-support-ctp-23). -### Always Encrypted with Enclaves +### Always Encrypted In general, existing documentation which uses System.Data.SqlClient on .NET Framework **and built-in column master key store providers** should now work with .NET Core, too. @@ -140,5 +140,6 @@ In general, existing documentation which uses System.Data.SqlClient on .NET Fram **Notes:** -* Custom key store providers, like the Azure Key Vault provider, will need to be updated to support Microsoft.Data.SqlClient. Similarly, enclave providers will also need to be updated to support Microsoft.Data.SqlClient. +* There is no key store provider for Azure Key Vault and Microsoft.Data.SqlClient at this time. +* Always Encrypted with secure enclaves is not supported with Microsoft.Data.SqlClient. * Always Encrypted is only supported against .NET Framework and .NET Core targets. It is not supported against .NET Standard since .NET Standard is missing certain encryption dependencies. diff --git a/release-notes/1.0/1.0.19221.1-Preview.md b/release-notes/1.0/1.0.19221.1-Preview.md index d72eddcd89..d6532a5b18 100644 --- a/release-notes/1.0/1.0.19221.1-Preview.md +++ b/release-notes/1.0/1.0.19221.1-Preview.md @@ -137,7 +137,7 @@ namespace Microsoft.Data.SqlClient.DataClassification UTF-8 support does not require any application code changes. These SqlClient changes simply optimize the communication between the client and server when the server supports UTF-8 and the underlying column collation is UTF-8. See the UTF-8 section under [What's new in SQL Server 2019 preview](https://docs.microsoft.com/sql/sql-server/what-s-new-in-sql-server-ver15?view=sqlallproducts-allversions#utf-8-support-ctp-23). -### Always Encrypted with Enclaves +### Always Encrypted In general, existing documentation which uses System.Data.SqlClient on .NET Framework **and built-in column master key store providers** should now work with .NET Core, too. @@ -150,5 +150,6 @@ Different authentication modes can be specified by using the _Authentication_ co **Notes:** -* Custom key store providers, like the Azure Key Vault provider, will need to be updated to support Microsoft.Data.SqlClient. Similarly, enclave providers will also need to be updated to support Microsoft.Data.SqlClient. +* There is no key store provider for Azure Key Vault and Microsoft.Data.SqlClient at this time. +* Always Encrypted with secure enclaves is not supported with Microsoft.Data.SqlClient. * Always Encrypted is only supported against .NET Framework and .NET Core targets. It is not supported against .NET Standard since .NET Standard is missing certain encryption dependencies. diff --git a/release-notes/1.0/1.0.19239.1.md b/release-notes/1.0/1.0.19239.1.md index 7ece298c26..4897ca183a 100644 --- a/release-notes/1.0/1.0.19239.1.md +++ b/release-notes/1.0/1.0.19239.1.md @@ -139,7 +139,7 @@ namespace Microsoft.Data.SqlClient.DataClassification UTF-8 support does not require any application code changes. These SqlClient changes simply optimize the communication between the client and server when the server supports UTF-8 and the underlying column collation is UTF-8. See the UTF-8 section under [What's new in SQL Server 2019 preview](https://docs.microsoft.com/sql/sql-server/what-s-new-in-sql-server-ver15?view=sqlallproducts-allversions#utf-8-support-ctp-23). -### Always Encrypted with Enclaves +### Always Encrypted In general, existing documentation which uses System.Data.SqlClient on .NET Framework **and built-in column master key store providers** should now work with .NET Core, too. @@ -152,5 +152,6 @@ In general, existing documentation which uses System.Data.SqlClient on .NET Fram **Notes:** -* Custom key store providers, like the Azure Key Vault provider, will need to be updated to support Microsoft.Data.SqlClient. Similarly, enclave providers will also need to be updated to support Microsoft.Data.SqlClient. +* There is no key store provider for Azure Key Vault and Microsoft.Data.SqlClient at this time. +* Always Encrypted with secure enclaves is not supported with Microsoft.Data.SqlClient. * Always Encrypted is only supported against .NET Framework and .NET Core targets. It is not supported against .NET Standard since .NET Standard is missing certain encryption dependencies. From eb433186206540a51400292f400c7400e0bd3fc9 Mon Sep 17 00:00:00 2001 From: dengel Date: Fri, 30 Aug 2019 08:56:16 -0700 Subject: [PATCH 02/26] Reverting VS generated changes to some compiled cs files --- .../netfx/src/Microsoft.Data.SqlClient.csproj | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj index ead51decb3..a7623a1ad6 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj @@ -149,16 +149,10 @@ - - Component - - - Component - + + - - Component - + @@ -167,9 +161,7 @@ - - Component - + @@ -251,9 +243,7 @@ - - Component - + From d49f957b8d27d9cb072269c1b4ca673e1c25c0db Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Fri, 30 Aug 2019 19:13:09 +0100 Subject: [PATCH 03/26] fix invalid formatting in several comments (#168) remove hardcoded document file path from project --- .../Microsoft/Data/SqlClient/SqlAuthenticationProvider.cs | 5 +++-- .../SqlClient/SqlClientEncryptionAlgorithmFactoryList.cs | 4 ++-- .../netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs | 2 +- .../netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs | 2 +- .../src/Microsoft/Data/SqlClient/SqlSecurityUtility.cs | 4 ++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlAuthenticationProvider.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlAuthenticationProvider.cs index 257757e84a..524c31f88a 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlAuthenticationProvider.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlAuthenticationProvider.cs @@ -10,8 +10,9 @@ namespace Microsoft.Data.SqlClient { /// The public base class for auth providers. /// Implementations of this class must provide a default constructor if they are intended to be instantiated from app.config. /// - public abstract class SqlAuthenticationProvider { - + public abstract class SqlAuthenticationProvider + { + /// /// Get an authentication provider by method. /// /// Authentication method. diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlClientEncryptionAlgorithmFactoryList.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlClientEncryptionAlgorithmFactoryList.cs index 207ab6f829..8dc76d060f 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlClientEncryptionAlgorithmFactoryList.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlClientEncryptionAlgorithmFactoryList.cs @@ -32,9 +32,9 @@ internal static SqlClientEncryptionAlgorithmFactoryList GetInstance() } /// - /// Get the registered list of algorithms as a comma seperated list with algorithm names + /// Get the registered list of algorithms as a comma separated list with algorithm names /// wrapped in single quotes. - /// + /// internal string GetRegisteredCipherAlgorithmNames() { StringBuilder builder = new StringBuilder(); diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs index d7640fd3b7..e3d57e710d 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs @@ -3409,7 +3409,7 @@ private SqlParameter GetSqlParameterWithQueryText(string queryText) /// /// Constructs the sp_describe_parameter_encryption request with the values from the original RPC call. - /// Prototype for is + /// Prototype for sp_describe_parameter_encryption is /// exec sp_describe_parameter_encryption @tsql=N'[SQL Statement]', @params=N'@p1 varbinary(256)' /// /// Original RPC request diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs index 3587a0a9f6..14790613cd 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs @@ -241,7 +241,7 @@ internal bool IsColumnEncryptionSettingEnabled /// /// Example: /// - /// Dictionary customKeyStoreProviders = new Dictionary(); + /// Dictionary<string, SqlColumnEncryptionKeyStoreProvider> customKeyStoreProviders = new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>(); /// MySqlClientHSMProvider myProvider = new MySqlClientHSMProvider(); /// customKeyStoreProviders.Add(@"HSM Provider", myProvider); /// SqlConnection.RegisterColumnEncryptionKeyStoreProviders(customKeyStoreProviders); diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlSecurityUtility.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlSecurityUtility.cs index 9cd2d457d2..aecc653796 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlSecurityUtility.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlSecurityUtility.cs @@ -262,7 +262,7 @@ internal static void DecryptSymmetricKey(SqlCipherMetadata md, string serverName } /// - /// Decrypts the symmetric key and saves it in metadata. + /// Decrypts the symmetric key and saves it in metadata. /// internal static void DecryptSymmetricKey(SqlTceCipherInfoEntry? sqlTceCipherInfoEntry, string serverName, out SqlClientSymmetricKey sqlClientSymmetricKey, out SqlEncryptionKeyInfo? encryptionkeyInfoChosen) { @@ -315,7 +315,7 @@ internal static int GetBase64LengthFromByteLength(int byteLength) } /// - /// Verifies Column Master Key Signature. + /// Verifies Column Master Key Signature. /// internal static void VerifyColumnMasterKeySignature(string keyStoreName, string keyPath, string serverName, bool isEnclaveEnabled, byte[] CMKSignature) { From 9443f0cc562246930879629c7da58af5eb55bac6 Mon Sep 17 00:00:00 2001 From: Rasmus Melchior Jacobsen Date: Fri, 30 Aug 2019 20:20:32 +0200 Subject: [PATCH 04/26] Fix bad usage of ArrayPool in TdsParserStateObject (#171) Apply https://github.com/dotnet/corefx/pull/37270 to M.D.SqlClient. Fixes #145. --- .../Data/SqlClient/TdsParserStateObject.cs | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObject.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObject.cs index eab2d1eb84..6c14613d77 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObject.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParserStateObject.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Buffers; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; @@ -1650,14 +1649,12 @@ internal bool TryReadString(int length, out string value) int cBytes = length << 1; byte[] buf; int offset = 0; - bool rentedBuffer = false; if (((_inBytesUsed + cBytes) > _inBytesRead) || (_inBytesPacket < cBytes)) { if (_bTmp == null || _bTmp.Length < cBytes) { - _bTmp = ArrayPool.Shared.Rent(cBytes); - rentedBuffer = true; + _bTmp = new byte[cBytes]; } if (!TryReadByteArray(_bTmp, cBytes)) @@ -1683,10 +1680,6 @@ internal bool TryReadString(int length, out string value) } value = System.Text.Encoding.Unicode.GetString(buf, offset, cBytes); - if (rentedBuffer) - { - ArrayPool.Shared.Return(_bTmp, clearArray: true); - } return true; } @@ -1719,7 +1712,6 @@ internal bool TryReadStringWithEncoding(int length, System.Text.Encoding encodin } byte[] buf = null; int offset = 0; - bool rentedBuffer = false; if (isPlp) { @@ -1737,8 +1729,7 @@ internal bool TryReadStringWithEncoding(int length, System.Text.Encoding encodin { if (_bTmp == null || _bTmp.Length < length) { - _bTmp = ArrayPool.Shared.Rent(length); - rentedBuffer = true; + _bTmp = new byte[length]; } if (!TryReadByteArray(_bTmp, length)) @@ -1766,10 +1757,6 @@ internal bool TryReadStringWithEncoding(int length, System.Text.Encoding encodin // BCL optimizes to not use char[] underneath value = encoding.GetString(buf, offset, length); - if (rentedBuffer) - { - ArrayPool.Shared.Return(_bTmp, clearArray: true); - } return true; } From c8a4cb35065b86b0998a69500e7836b9b0999466 Mon Sep 17 00:00:00 2001 From: Javad Date: Thu, 5 Sep 2019 10:42:00 -0700 Subject: [PATCH 05/26] Update ExceptionsAlgorithmErrors.cs --- .../ExceptionsAlgorithmErrors.cs | 149 +++++++++++++++--- 1 file changed, 128 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/ExceptionsAlgorithmErrors.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/ExceptionsAlgorithmErrors.cs index e0e9d93356..a1f2b2c0fd 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/ExceptionsAlgorithmErrors.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/ExceptionsAlgorithmErrors.cs @@ -6,6 +6,8 @@ using System.Security.Cryptography.X509Certificates; using Xunit; using System.Reflection; +using static Microsoft.Data.SqlClient.Tests.AlwaysEncryptedTests.Utility; +using System.Collections.Generic; namespace Microsoft.Data.SqlClient.Tests.AlwaysEncryptedTests { @@ -15,11 +17,12 @@ public class ExceptionsAlgorithmErrors : IClassFixture public static Assembly systemData = Assembly.GetAssembly(typeof(SqlConnection)); public static Type sqlClientSymmetricKey = systemData.GetType("Microsoft.Data.SqlClient.SqlClientSymmetricKey"); public static ConstructorInfo sqlColumnEncryptionKeyConstructor = sqlClientSymmetricKey.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(byte[]) }, null); - + [Fact] [PlatformSpecific(TestPlatforms.Windows)] - public void TestNullCEK() { - TargetInvocationException e = Assert.Throws(() => sqlColumnEncryptionKeyConstructor.Invoke(new object[] {new byte[] {}})); + public void TestNullCEK() + { + TargetInvocationException e = Assert.Throws(() => sqlColumnEncryptionKeyConstructor.Invoke(new object[] { new byte[] { } })); string expectedMessage = "Internal error. Column encryption key cannot be null.\r\nParameter name: encryptionKey"; Assert.Contains(expectedMessage, e.InnerException.Message); e = Assert.Throws(() => sqlColumnEncryptionKeyConstructor.Invoke(new object[] { null })); @@ -28,9 +31,11 @@ public void TestNullCEK() { [Fact] [PlatformSpecific(TestPlatforms.Windows)] - public void TestInvalidKeySize () { - byte[] key = Utility.GenerateRandomBytes(48); - for (int i =0; i < key.Length; i++) { + public void TestInvalidKeySize() + { + byte[] key = Utility.GenerateRandomBytes(48); + for (int i = 0; i < key.Length; i++) + { key[i] = 0x00; } TargetInvocationException e = Assert.Throws(() => @@ -41,11 +46,12 @@ public void TestInvalidKeySize () { [Fact] [PlatformSpecific(TestPlatforms.Windows)] - public void TestInvalidEncryptionType() { - Object cipherMD = Utility.GetSqlCipherMetadata (0, 2, null, 3, 0x01); - Utility.AddEncryptionKeyToCipherMD (cipherMD, CertFixture.encryptedCek, 0, 0, 0, new byte[]{0x01, 0x02, 0x03}, CertFixture.certificatePath, "MSSQL_CERTIFICATE_STORE", "RSA_OAEP"); + public void TestInvalidEncryptionType() + { + Object cipherMD = Utility.GetSqlCipherMetadata(0, 2, null, 3, 0x01); + Utility.AddEncryptionKeyToCipherMD(cipherMD, CertFixture.encryptedCek, 0, 0, 0, new byte[] { 0x01, 0x02, 0x03 }, CertFixture.certificatePath, "MSSQL_CERTIFICATE_STORE", "RSA_OAEP"); byte[] plainText = Encoding.Unicode.GetBytes("HelloWorld"); - byte[] cipherText = Utility.EncryptDataUsingAED (plainText, CertFixture.cek, Utility.CColumnEncryptionType.Deterministic); + byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, Utility.CColumnEncryptionType.Deterministic); string expectedMessage = "Encryption type '3' specified for the column in the database is either invalid or corrupted. Valid encryption types for algorithm 'AEAD_AES_256_CBC_HMAC_SHA256' are: 'Deterministic', 'Randomized'.\r\nParameter name: encryptionType"; TargetInvocationException e = Assert.Throws(() => Utility.DecryptWithKey(cipherText, cipherMD, "testsrv")); @@ -57,7 +63,8 @@ public void TestInvalidEncryptionType() { [Fact] [PlatformSpecific(TestPlatforms.Windows)] - public void TestInvalidCipherText() { + public void TestInvalidCipherText() + { // Attempt to decrypt 53 random bytes string expectedMessage = "Specified ciphertext has an invalid size of 53 bytes, which is below the minimum 65 bytes required for decryption.\r\nParameter name: cipherText"; byte[] cipherText = Utility.GenerateRandomBytes(53); // minimum length is 65 @@ -67,7 +74,8 @@ public void TestInvalidCipherText() { [Fact] [PlatformSpecific(TestPlatforms.Windows)] - public void TestInvalidAlgorithmVersion() { + public void TestInvalidAlgorithmVersion() + { string expectedMessage = "The specified ciphertext's encryption algorithm version '40' does not match the expected encryption algorithm version '01'.\r\nParameter name: cipherText"; byte[] plainText = Encoding.Unicode.GetBytes("Hello World"); byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, Utility.CColumnEncryptionType.Deterministic); @@ -79,12 +87,14 @@ public void TestInvalidAlgorithmVersion() { [Fact] [PlatformSpecific(TestPlatforms.Windows)] - public void TestInvalidAuthenticationTag() { + public void TestInvalidAuthenticationTag() + { string expectedMessage = "Specified ciphertext has an invalid authentication tag.\r\nParameter name: cipherText"; byte[] plainText = Encoding.Unicode.GetBytes("Hello World"); byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, Utility.CColumnEncryptionType.Deterministic); // Zero out 4 bytes of authentication tag - for (int i =0; i < 4; i++) { + for (int i = 0; i < 4; i++) + { cipherText[1] = 0x00; } TargetInvocationException e = Assert.Throws(() => Utility.DecryptDataUsingAED(cipherText, CertFixture.cek, Utility.CColumnEncryptionType.Deterministic)); @@ -94,18 +104,118 @@ public void TestInvalidAuthenticationTag() { [Fact] [ActiveIssue(9658)] [PlatformSpecific(TestPlatforms.Windows)] - public void TestNullColumnEncryptionAlgorithm () { + public void TestNullColumnEncryptionAlgorithm() + { string expectedMessage = "Internal error. Encryption algorithm cannot be null. Valid algorithms are: 'AES_256_CBC', 'AEAD_AES_256_CBC_HMAC_SHA256'.\r\nParameter name: encryptionAlgorithm"; - Object cipherMD = Utility.GetSqlCipherMetadata (0, 0, null, 1, 0x01); - Utility.AddEncryptionKeyToCipherMD (cipherMD, CertFixture.encryptedCek, 0, 0, 0, new byte[]{0x01, 0x02, 0x03}, CertFixture.certificatePath, "MSSQL_CERTIFICATE_STORE", "RSA_OAEP"); + Object cipherMD = Utility.GetSqlCipherMetadata(0, 0, null, 1, 0x01); + Utility.AddEncryptionKeyToCipherMD(cipherMD, CertFixture.encryptedCek, 0, 0, 0, new byte[] { 0x01, 0x02, 0x03 }, CertFixture.certificatePath, "MSSQL_CERTIFICATE_STORE", "RSA_OAEP"); byte[] plainText = Encoding.Unicode.GetBytes("HelloWorld"); - byte[] cipherText = Utility.EncryptDataUsingAED (plainText, CertFixture.cek, Utility.CColumnEncryptionType.Deterministic); + byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, CColumnEncryptionType.Deterministic); TargetInvocationException e = Assert.Throws(() => Utility.DecryptWithKey(cipherText, cipherMD, "testsrv")); Assert.Contains(expectedMessage, e.InnerException.Message); e = Assert.Throws(() => Utility.EncryptWithKey(plainText, cipherMD, "testsrv")); Assert.Contains(expectedMessage, e.InnerException.Message); } + + [Fact] + [PlatformSpecific(TestPlatforms.Windows)] + public void TestUnknownEncryptionAlgorithmId() + { + string errorMessage = "Encryption algorithm id '3' for the column in the database is either invalid or corrupted. Valid encryption algorithm ids are: '1', '2'.\r\nParameter name: cipherAlgorithmId"; + Object cipherMD = Utility.GetSqlCipherMetadata(0, 3, null, 1, 0x01); + Utility.AddEncryptionKeyToCipherMD(cipherMD, CertFixture.encryptedCek, 0, 0, 0, new byte[] { 0x01, 0x02, 0x03 }, CertFixture.certificatePath, "MSSQL_CERTIFICATE_STORE", "RSA_OAEP"); + byte[] plainText = Encoding.Unicode.GetBytes("HelloWorld"); + byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, CColumnEncryptionType.Deterministic); + + Exception decryptEx = Assert.Throws(() => Utility.DecryptWithKey(plainText, cipherMD, "localhost")); + Assert.Equal(errorMessage, decryptEx.InnerException.Message); + + Exception encryptEx = Assert.Throws(() => Utility.EncryptWithKey(plainText, cipherMD, "localhost")); + Assert.Equal(errorMessage, encryptEx.InnerException.Message); + } + + [Fact] + [PlatformSpecific(TestPlatforms.Windows)] + public void TestUnknownCustomKeyStoreProvider() + { + string errorMessage = "Failed to decrypt a column encryption key. Invalid key store provider name: 'Dummy_Provider'. A key store provider name must denote either a system key store provider or a registered custom key store provider. Valid system key store provider names are: 'MSSQL_CERTIFICATE_STORE', 'MSSQL_CNG_STORE', 'MSSQL_CSP_PROVIDER'. Valid (currently registered) custom key store provider names are: . Please verify key store provider information in column master key definitions in the database, and verify all custom key store providers used in your application are registered properly."; + Object cipherMD = Utility.GetSqlCipherMetadata(0, 1, null, 1, 0x03); + Utility.AddEncryptionKeyToCipherMD(cipherMD, CertFixture.encryptedCek, 0, 0, 0, new byte[] { 0x01, 0x02, 0x03 }, CertFixture.certificatePath, "Dummy_Provider", "RSA_OAEP"); + byte[] plainText = Encoding.Unicode.GetBytes("HelloWorld"); + byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, CColumnEncryptionType.Deterministic); + + Exception decryptEx = Assert.Throws(() => Utility.DecryptWithKey(plainText, cipherMD, "localhost")); + Assert.Equal(errorMessage, decryptEx.InnerException.Message); + + Exception encryptEx = Assert.Throws(() => Utility.EncryptWithKey(plainText, cipherMD, "localhost")); + Assert.Equal(errorMessage, encryptEx.InnerException.Message); + } + + [Fact] + [ActiveIssue(9658)] + [PlatformSpecific(TestPlatforms.Windows)] + public void TestTceUnknownEncryptionAlgorithm() + { + string errorMessage = "Encryption algorithm 'Dummy' for the column in the database is either invalid or corrupted. Valid algorithms are: 'AEAD_AES_256_CBC_HMAC_SHA256', 'AES_256_CBC'."; + Object cipherMD = Utility.GetSqlCipherMetadata(0, 0, "Dummy", 1, 0x01); + Utility.AddEncryptionKeyToCipherMD(cipherMD, CertFixture.encryptedCek, 0, 0, 0, new byte[] { 0x01, 0x02, 0x03 }, CertFixture.certificatePath, "MSSQL_CERTIFICATE_STORE", "RSA_OAEP"); + byte[] plainText = Encoding.Unicode.GetBytes("HelloWorld"); + byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, Utility.CColumnEncryptionType.Deterministic); + + Exception decryptEx = Assert.Throws(() => Utility.DecryptWithKey(cipherText, cipherMD, "localhost")); + Assert.Equal(errorMessage, decryptEx.InnerException.Message); + + Exception encryptEx = Assert.Throws(() => Utility.EncryptWithKey(plainText, cipherMD, "localhost")); + Assert.Equal(errorMessage, encryptEx.InnerException.Message); + } + + [Fact] + [PlatformSpecific(TestPlatforms.Windows)] + public void TestExceptionsFromCertStore() + { + byte[] corruptedCek = Utility.GenerateInvalidEncryptedCek(CertFixture.cek, Utility.ECEKCorruption.SIGNATURE); + + // Pass a garbled encrypted CEK + string[] errorMessages = { + string.Format("Failed to decrypt a column encryption key using key store provider: 'MSSQL_CERTIFICATE_STORE'. The last 10 bytes of the encrypted column encryption key are: '{0}'.\r\nSpecified encrypted column encryption key contains an invalid encryption algorithm version '00'. Expected version is '01'.\r\nParameter name: encryptedColumnEncryptionKey", BitConverter.ToString(corruptedCek,corruptedCek.Length-10,10)), + string.Format("Specified encrypted column encryption key signature does not match the signature computed with the column master key (certificate) in 'CurrentUser/My/{0}'. The encrypted column encryption key may be corrupt, or the specified path may be incorrect.\r\nParameter name: encryptedColumnEncryptionKey", CertFixture.thumbprint) + }; + + Object cipherMD = Utility.GetSqlCipherMetadata(0, 1, null, 1, 0x01); + Utility.AddEncryptionKeyToCipherMD(cipherMD, corruptedCek, 0, 0, 0, new byte[] { 0x01, 0x02, 0x03 }, CertFixture.certificatePath, "MSSQL_CERTIFICATE_STORE", "RSA_OAEP"); + byte[] plainText = Encoding.Unicode.GetBytes("HelloWorld"); + byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, CColumnEncryptionType.Deterministic); + + Exception decryptEx = Assert.Throws(() => Utility.DecryptWithKey(cipherText, cipherMD, "localhost")); + Assert.Equal(errorMessages[0], decryptEx.InnerException.Message); + } + + [Fact] + [PlatformSpecific(TestPlatforms.Windows)] + public void TestExceptionsFromCustomKeyStore() + { + string[] errorMessages = { + string.Format("Failed to decrypt a column encryption key using key store provider: 'DummyProvider'. Verify the properties of the column encryption key and its column master key in your database. The last 10 bytes of the encrypted column encryption key are: '{0}'.\r\nThe method or operation is not implemented.", BitConverter.ToString(CertFixture.encryptedCek, CertFixture.encryptedCek.Length-10, 10)), + string.Format("The method or operation is not implemented.") + }; + + IDictionary customProviders = new Dictionary(); + customProviders.Add("DummyProvider", new DummyKeyStoreProvider()); + SqlConnection.RegisterColumnEncryptionKeyStoreProviders(customProviders); + + Object cipherMD = Utility.GetSqlCipherMetadata(0, 1, null, 1, 0x01); + Utility.AddEncryptionKeyToCipherMD(cipherMD, CertFixture.encryptedCek, 0, 0, 0, new byte[] { 0x01, 0x02, 0x03 }, CertFixture.certificatePath, "DummyProvider", "DummyAlgo"); + byte[] plainText = Encoding.Unicode.GetBytes("HelloWorld"); + byte[] cipherText = Utility.EncryptDataUsingAED(plainText, CertFixture.cek, CColumnEncryptionType.Deterministic); + + Exception decryptEx = Assert.Throws(() => Utility.DecryptWithKey(cipherText, cipherMD, "localhost")); + Assert.Equal(errorMessages[0], decryptEx.InnerException.Message); + + Exception encryptEx = Assert.Throws(() => Utility.EncryptWithKey(plainText, cipherMD, "localhost")); + Assert.Equal(errorMessages[0], encryptEx.InnerException.Message); + + } } public class CertFixture : IDisposable @@ -136,6 +246,3 @@ public void Dispose() } } } - - - From 6104b35bc0f5a90384a8db7a17fa9908ef840b33 Mon Sep 17 00:00:00 2001 From: Javad Date: Thu, 5 Sep 2019 11:31:02 -0700 Subject: [PATCH 06/26] Update Utility.cs --- .../AlwaysEncryptedTests/Utility.cs | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs index 4634d7b2a0..02e93f9639 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; @@ -96,6 +96,80 @@ internal static byte[] GenerateRandomBytes(int length) return randomBytes; } + + /// + /// Takes a well formed encrypted CEK and corrupts it based on ECEKCorruption flags + /// + /// An encrypted cek that is wellformed (can be successfully decrypted) + /// Type of corrupted desired + /// A byte array containing corrupted CEK (decryption will throw an exception) + internal static byte[] GenerateInvalidEncryptedCek(byte[] encryptedCek, ECEKCorruption type) + { + byte[] cipherText = null; + switch (type) + { + case ECEKCorruption.ALGORITHM_VERSION: + cipherText = new byte[encryptedCek.Length]; + cipherText[0] = 0x10; + break; + + case ECEKCorruption.CEK_LENGTH: + int sourceIndex = 0; + int targetIndex = 0; + cipherText = new byte[encryptedCek.Length - 10]; + + // Remove 10 bytes from the encrypted CEK, copy the signatures as is (signature validation comes later) + cipherText[sourceIndex] = encryptedCek[targetIndex]; + sourceIndex++; + targetIndex++; + + short keyPathLen = BitConverter.ToInt16(encryptedCek, sourceIndex); + sourceIndex += 2; + // Copy it over as is + Buffer.BlockCopy(encryptedCek, sourceIndex, cipherText, targetIndex, 2); + targetIndex += 2; + + // Read ciphertext length + short cipherTextLen = BitConverter.ToInt16(encryptedCek, sourceIndex); + sourceIndex += 2; + // Reduce this by 5 and copy to target + Buffer.BlockCopy(BitConverter.GetBytes(cipherTextLen - 5), 0, cipherText, targetIndex, 2); + targetIndex += 2; + + // Copy the cipherText + Buffer.BlockCopy(encryptedCek, sourceIndex, cipherText, targetIndex, cipherTextLen - 5); + sourceIndex += cipherTextLen; + targetIndex += cipherTextLen - 5; + + // Copy the key path + Buffer.BlockCopy(encryptedCek, sourceIndex, cipherText, targetIndex, keyPathLen); + sourceIndex += keyPathLen; + targetIndex += keyPathLen; + + // Copy the signature + Buffer.BlockCopy(encryptedCek, sourceIndex, cipherText, targetIndex, encryptedCek.Length - sourceIndex - 6); + break; + + case ECEKCorruption.SIGNATURE: + cipherText = new byte[encryptedCek.Length]; + Buffer.BlockCopy(encryptedCek, 0, cipherText, 0, cipherText.Length); + // Wipe out the signature (signature is 32 bytes long) + for (int i = 0; i < 32; i++) + { + cipherText[cipherText.Length - i - 1] = 0x00; + } + + break; + + case ECEKCorruption.SIGNATURE_LENGTH: + // Make the signature shorter by 7 bytes, its length is 32 bytes + cipherText = new byte[encryptedCek.Length - 7]; + Buffer.BlockCopy(encryptedCek, 0, cipherText, 0, cipherText.Length); + break; + } + + return cipherText; + } internal static X509Certificate2 CreateCertificate() { From 878d0e1a3598267972386ba3ab648301ba1d799c Mon Sep 17 00:00:00 2001 From: Javad Date: Thu, 5 Sep 2019 11:31:18 -0700 Subject: [PATCH 07/26] Update ApiShould.cs --- .../ManualTests/AlwaysEncrypted/ApiShould.cs | 262 +++++++++++++++++- 1 file changed, 251 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs index d641057748..d252cf0227 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. @@ -242,11 +242,13 @@ public void SqlParameterProperties() Assert.Equal(0, param1.Scale); Assert.Equal(0, param1.Precision); Assert.Equal(charParamSize, param1.Size); + Assert.Equal(SqlDbType.Decimal, param2.SqlDbType); Assert.Equal(DbType.Decimal, param2.DbType); Assert.Equal(decimalParamScale, param2.Scale); Assert.Equal(decimalParamPrecision, param2.Precision); Assert.Equal(0, param2.Size); + Assert.Equal(SqlDbType.Time, param3.SqlDbType); Assert.Equal(DbType.Time, param3.DbType); Assert.Equal(timeParamScale, param3.Scale); @@ -271,6 +273,7 @@ public void SqlParameterProperties() Size = charParamSize, Value = "DifferentColumnValue" }; + sqlCmd.Parameters.Add(param1); SqlParameter param2 = new SqlParameter("@p2", SqlDbType.Decimal) @@ -290,17 +293,20 @@ public void SqlParameterProperties() }; sqlCmd.Parameters.Add(param3); sqlCmd.ExecuteNonQuery(); + // Validate that all properties have stayed the same for all parameters. Assert.Equal(SqlDbType.NVarChar, param1.SqlDbType); Assert.Equal(DbType.String, param1.DbType); Assert.Equal(0, param1.Scale); Assert.Equal(0, param1.Precision); Assert.Equal(charParamSize, param1.Size); + Assert.Equal(SqlDbType.Decimal, param2.SqlDbType); Assert.Equal(DbType.Decimal, param2.DbType); Assert.Equal(decimalParamScale, param2.Scale); Assert.Equal(decimalParamPrecision, param2.Precision); Assert.Equal(0, param2.Size); + Assert.Equal(SqlDbType.Time, param3.SqlDbType); Assert.Equal(DbType.Time, param3.DbType); Assert.Equal(timeParamScale, param3.Scale); @@ -353,6 +359,7 @@ private void VerifyRecordPresent(SqlConnection sqlConnection, Customer customer, Assert.True(string.Equals(sqlDataReader.GetDataTypeName(0), @"int", StringComparison.OrdinalIgnoreCase), "unexpected data type"); Assert.True(string.Equals(sqlDataReader.GetDataTypeName(1), @"nvarchar", StringComparison.InvariantCultureIgnoreCase), "unexpected data type"); Assert.True(string.Equals(sqlDataReader.GetDataTypeName(2), @"nvarchar", StringComparison.InvariantCultureIgnoreCase), "unexpected data type"); + Assert.Equal(customer.Id, sqlDataReader.GetInt32(0)); Assert.Equal(customer.FirstName, sqlDataReader.GetString(1)); Assert.Equal(customer.LastName, sqlDataReader.GetString(2)); @@ -401,6 +408,7 @@ public void TestSqlDataAdapterFillDataTable() { Value = "a" }; + cmd.Parameters.Add(dummyParam); cmd.Parameters.AddWithValue(@"CustomerId", values[0]); @@ -454,6 +462,7 @@ public void TestSqlDataAdapterFillSchema(SchemaType schemaType) DataTable dataTable = new DataTable(); DataTable dataTable2 = adapter.FillSchema(dataTable, schemaType); DataColumnCollection dataColumns = dataTable2.Columns; + ValidateSchema(dataTable2.Columns); ValidateSchema(dataTable.Columns); @@ -461,6 +470,7 @@ public void TestSqlDataAdapterFillSchema(SchemaType schemaType) DataSet dataSet = new DataSet(); DataTable[] dataSet2 = adapter.FillSchema(dataSet, schemaType); Assert.Single(dataSet2); + ValidateSchema(dataSet2[0].Columns); ValidateSchema(dataSet.Tables[0].Columns); } @@ -595,17 +605,20 @@ public void TestSqlDataAdapterBatchUpdate(int numberofRows) int lastRowId = dataTable.Rows.Count; lastRowId++; dataTable.Rows.RemoveAt(1); + DataRow row = dataTable.NewRow(); row["CustomerId"] = 45 + lastRowId; row["FirstName"] = string.Format(@"Microsoft{0}", lastRowId); row["LastName"] = string.Format(@"Corporation{0}", lastRowId); dataTable.Rows.Add(row); lastRowId++; + row = dataTable.NewRow(); row["CustomerId"] = 45 + lastRowId; row["FirstName"] = string.Format(@"Microsoft{0}", lastRowId); row["LastName"] = string.Format(@"Corporation{0}", lastRowId); dataTable.Rows.Add(row); + rowsAffected = adapter.Update(dataTable); } } @@ -693,8 +706,11 @@ public void TestExecuteReaderWithCommandBehavior(CommandBehavior commandBehavior { sqlCommand.Parameters.AddWithValue(@"FirstName", values[1]); sqlCommand.Parameters.AddWithValue(@"CustomerId", values[0]); + IAsyncResult asyncResult = sqlCommand.BeginExecuteReader(commandBehavior); + Assert.False(asyncResult == null, "asyncResult should not be null."); + rowsAffected = 0; using (SqlDataReader sqlDataReader = sqlCommand.EndExecuteReader(asyncResult)) @@ -742,6 +758,7 @@ public void TestExecuteReaderWithCommandBehavior(CommandBehavior commandBehavior Assert.True(3 == sqlDataReader.FieldCount, "value returned by sqlDataReader.FieldCount is unexpected."); } } + // Based on the command behavior, verify the appropriate outcome. switch (commandBehavior) { @@ -749,12 +766,14 @@ public void TestExecuteReaderWithCommandBehavior(CommandBehavior commandBehavior Assert.True(sqlConnection.State.Equals(ConnectionState.Closed), "CommandBehavior.CloseConnection did not close the connection after command execution."); break; + case CommandBehavior.SingleResult: case CommandBehavior.SequentialAccess: //Assert.True(rowsAffected == 1, "rowsAffected did not match the expected number of rows."); Assert.True(sqlConnection.State.Equals(ConnectionState.Open), "CommandBehavior.SingleResult or SequentialAccess closed the connection after command execution."); break; + case CommandBehavior.SingleRow: // Assert.True(rowsAffected == 1, "rowsAffected did not match the expected number of rows."); Assert.True(sqlConnection.State == ConnectionState.Open, @@ -780,9 +799,11 @@ public void TestExecuteReaderWithCommandBehavior(CommandBehavior commandBehavior public void TestPrepareWithExecuteNonQuery() { IList values = GetValues(dataHint: 52); + Assert.True(values != null && values.Count >= 3, @"values should not be null and count should be >= 3."); int numberOfRows = 10; + // Insert a bunch of rows in to the table. int rowsAffected = InsertRows(tableName: tableName, numberofRows: numberOfRows, values: values); @@ -800,15 +821,20 @@ public void TestPrepareWithExecuteNonQuery() sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); sqlCommand.Parameters.Add(@"LastName", SqlDbType.NVarChar, ((string)values[2]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; sqlCommand.Parameters[2].Value = values[2]; + sqlCommand.Prepare(); + rowsAffected = -1; rowsAffected = sqlCommand.ExecuteNonQuery(); + sqlCommand.Parameters[0].Value = (int)values[0] + 1; sqlCommand.Parameters[1].Value = values[1]; sqlCommand.Parameters[2].Value = values[2]; + rowsAffected = -1; rowsAffected = sqlCommand.ExecuteNonQuery(); } @@ -837,16 +863,22 @@ public void TestAsyncWriteDelayWithExecuteNonQueryAsync() sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); sqlCommand.Parameters.Add(@"LastName", SqlDbType.NVarChar, ((string)values[2]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; sqlCommand.Parameters[2].Value = values[2]; + sqlCommand.Prepare(); rowsAffected = -1; + CommandHelper.s_debugForceAsyncWriteDelay?.SetValue(null, 10000); + Task executeTask = VerifyExecuteNonQueryAsync(sqlCommand); rowsAffected = executeTask.Result; + Assert.True(rowsAffected == 10, "Unexpected number of rows affected as returned by ExecuteNonQueryAsync."); + sqlCommand.Parameters[0].Value = (int)values[0] + 1; sqlCommand.Parameters[1].Value = values[1]; sqlCommand.Parameters[2].Value = values[2]; @@ -864,7 +896,9 @@ public void TestAsyncWriteDelayWithExecuteNonQueryAsync() public void TestAsyncWriteDelayWithExecuteReaderAsync() { IList values = GetValues(dataHint: 53); + Assert.True(values != null && values.Count >= 3, @"values should not be null and count should be >= 3."); + int numberOfRows = 10; // Insert a bunch of rows in to the table. @@ -884,12 +918,16 @@ public void TestAsyncWriteDelayWithExecuteReaderAsync() sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); sqlCommand.Parameters.Add(@"LastName", SqlDbType.NVarChar, ((string)values[2]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; sqlCommand.Parameters[2].Value = values[2]; + sqlCommand.Prepare(); rowsAffected = -1; + CommandHelper.s_debugForceAsyncWriteDelay?.SetValue(null, 10000); + Task executeTask = VerifyExecuteNonQueryAsync(sqlCommand); rowsAffected = executeTask.Result; @@ -898,6 +936,7 @@ public void TestAsyncWriteDelayWithExecuteReaderAsync() sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; sqlCommand.Parameters[2].Value = values[2]; + rowsAffected = 0; Task executeReaderTask = sqlCommand.ExecuteReaderAsync(); @@ -921,7 +960,9 @@ public void TestAsyncWriteDelayWithExecuteReaderAsync() public void TestPrepareWithExecuteNonQueryAsync() { IList values = GetValues(dataHint: 53); + Assert.True(values != null && values.Count >= 3, @"values should not be null and count should be >= 3."); + int numberOfRows = 10; // Insert a bunch of rows in to the table. @@ -941,15 +982,19 @@ public void TestPrepareWithExecuteNonQueryAsync() sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); sqlCommand.Parameters.Add(@"LastName", SqlDbType.NVarChar, ((string)values[2]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; sqlCommand.Parameters[2].Value = values[2]; + sqlCommand.Prepare(); rowsAffected = -1; Task executeTask = VerifyExecuteNonQueryAsync(sqlCommand); rowsAffected = executeTask.Result; + Assert.True(rowsAffected == 10, "Unexpected number of rows affected as returned by ExecuteNonQueryAsync."); + sqlCommand.Parameters[0].Value = (int)values[0] + 1; sqlCommand.Parameters[1].Value = values[1]; sqlCommand.Parameters[2].Value = values[2]; @@ -957,6 +1002,7 @@ public void TestPrepareWithExecuteNonQueryAsync() rowsAffected = -1; executeTask = VerifyExecuteNonQueryAsync(sqlCommand); rowsAffected = executeTask.Result; + Assert.True(rowsAffected == 0, "Unexpected number of rows affected as returned by ExecuteNonQueryAsync."); } } @@ -987,9 +1033,12 @@ public void TestPrepareWithExecuteReaderAsync(CommandBehavior commandBehavior) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; + sqlCommand.Prepare(); + rowsAffected = 0; IAsyncResult asyncResult = sqlCommand.BeginExecuteReader(commandBehavior); @@ -998,6 +1047,7 @@ public void TestPrepareWithExecuteReaderAsync(CommandBehavior commandBehavior) while (sqlDataReader.Read()) { rowsAffected++; + Assert.True(values != null && values.Count >= 3, @"values should not be null and should be with atleast 3 elements."); Assert.True(sqlDataReader.GetInt32(0) == (int)values[0], "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetString(1) == (string)values[1], "FirstName value read from the table was incorrect."); @@ -1008,9 +1058,12 @@ public void TestPrepareWithExecuteReaderAsync(CommandBehavior commandBehavior) sqlCommand.Parameters[0].Value = (int)values[0] + 1; sqlCommand.Parameters[1].Value = values[1]; + Task executeTask = VerifyExecuteNonQueryAsync(sqlCommand); + rowsAffected = -1; rowsAffected = executeTask.Result; + Assert.True(rowsAffected == -1, "Unexpected number of rows affected as returned by ExecuteNonQueryAsync."); } } @@ -1047,6 +1100,7 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; } @@ -1059,9 +1113,11 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) Assert.True(sqlDataReader.GetName(0) == @"CustomerId", "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetName(1) == @"FirstName", "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetName(2) == @"LastName", "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetOrdinal(@"CustomerId") == 0, "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetOrdinal(@"FirstName") == 1, "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetOrdinal(@"LastName") == 2, "LastName value read from the table was incorrect."); + VerifyDataTypes(sqlDataReader, value); while (sqlDataReader.Read()) @@ -1076,6 +1132,7 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) textValue = new char[((string)values[2]).Length]; sqlDataReader.GetChars(2, 0, textValue, 0, textValue.Length); + Assert.True(new string(textValue) == (string)values[2], @"Value returned by GetChars is unexpected."); // GetFieldValue @@ -1110,6 +1167,7 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) // GetSqlValues readValues = new object[values.Count]; numberofValuesRead = sqlDataReader.GetSqlValues(readValues); + Assert.True(numberofValuesRead == (int)values.Count, "the number of values returned by GetSqlValues is unexpected."); Assert.True(((System.Data.SqlTypes.SqlInt32)readValues[0]).Value == (int)values[0], @"Value returned by GetSqlValues is unexpected."); @@ -1125,9 +1183,12 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) // IsDBNullAsync Task isDbNullTask = sqlDataReader.IsDBNullAsync(0); + Assert.True(isDbNullTask.Result == false, @"IsDBNullAsync unexpectedly returned false."); + isDbNullTask = sqlDataReader.IsDBNullAsync(1); Assert.True(isDbNullTask.Result == false, @"IsDBNullAsync unexpectedly returned false."); + isDbNullTask = sqlDataReader.IsDBNullAsync(2); Assert.True(isDbNullTask.Result == false, @"IsDBNullAsync unexpectedly returned false."); } @@ -1136,6 +1197,7 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) Assert.True(3 == sqlDataReader.FieldCount, "value returned by sqlDataReader.FieldCount is unexpected."); } } + using (SqlCommand sqlCommand = new SqlCommand($"INSERT INTO [{tableName}] VALUES (@CustomerId, @FirstName, @LastName /*, @BinaryColumn, @NvarcharMaxColumn*/)", sqlConnection, transaction: null, @@ -1143,10 +1205,13 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) { sqlCommand.Parameters.AddWithValue(@"CustomerId", 60); SqlParameter firstNameParameter = new SqlParameter(@"FirstName", System.Data.SqlDbType.NVarChar, 50); + firstNameParameter.Direction = System.Data.ParameterDirection.Input; firstNameParameter.Value = DBNull.Value; + sqlCommand.Parameters.Add(firstNameParameter); sqlCommand.Parameters.AddWithValue(@"LastName", @"Corporation60"); + sqlCommand.ExecuteNonQuery(); } @@ -1180,6 +1245,7 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) } } } + using (SqlCommand sqlCommand = new SqlCommand($"UPDATE [{tableName}] SET FirstName = @FirstName WHERE CustomerId = @CustomerId", sqlConnection, @@ -1196,71 +1262,112 @@ public void TestSqlDataReaderAPIs(SqlCommandColumnEncryptionSetting value) } } } + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] [InlineData(CommandBehavior.SequentialAccess)] public void TestSqlDataReaderAPIsWithSequentialAccess(object value) { char[] textValue = null; CommandBehavior commandBehavior = (CommandBehavior)value; + IList values = GetValues(dataHint: 56); + Assert.True(values != null && values.Count >= 3, @"values should not be null and count should be >= 3."); + int numberOfRows = 10; + // Insert a bunch of rows in to the table. int rowsAffected = InsertRows(tableName: tableName, numberofRows: numberOfRows, values: values); + Assert.Equal(rowsAffected, numberOfRows); + using (SqlConnection sqlConnection = new SqlConnection(DataTestUtility.TcpConnStr)) { sqlConnection.Open(); - using (SqlCommand sqlCommand = new SqlCommand($"SELECT CustomerId, FirstName, LastName /* , BinaryColumn, NvarcharMaxColumn */ FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + using (SqlCommand sqlCommand = new SqlCommand($"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", sqlConnection, transaction: null, columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; + sqlCommand.Prepare(); rowsAffected = 0; + IAsyncResult asyncResult = sqlCommand.BeginExecuteReader(commandBehavior); using (SqlDataReader sqlDataReader = sqlCommand.EndExecuteReader(asyncResult)) { Assert.True(sqlDataReader.GetName(0) == @"CustomerId", "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetName(1) == @"FirstName", "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetName(2) == @"LastName", "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetOrdinal(@"CustomerId") == 0, "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetOrdinal(@"FirstName") == 1, "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetOrdinal(@"LastName") == 2, "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetFieldType(0) == typeof(System.Int32), "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetFieldType(1) == typeof(System.String), "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetFieldType(2) == typeof(System.String), "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetProviderSpecificFieldType(0) == typeof(System.Data.SqlTypes.SqlInt32), "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetProviderSpecificFieldType(1) == typeof(System.Data.SqlTypes.SqlString), "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetProviderSpecificFieldType(2) == typeof(System.Data.SqlTypes.SqlString), "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetDataTypeName(0) == @"int", "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetDataTypeName(1) == @"nvarchar", "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetDataTypeName(2) == @"nvarchar", "LastName value read from the table was incorrect."); + while (sqlDataReader.Read()) { textValue = new char[((string)values[1]).Length]; sqlDataReader.GetChars(1, 0, textValue, 0, textValue.Length); Assert.True(new string(textValue) == (string)values[1], @"Value returned by GetChars is unexpected."); + textValue = new char[((string)values[2]).Length]; sqlDataReader.GetChars(2, 0, textValue, 0, textValue.Length); Assert.True(new string(textValue) == (string)values[2], @"Value returned by GetChars is unexpected."); } } } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. - using (SqlCommand sqlCommand = new SqlCommand($"SELECT CustomerId, FirstName, LastName /*, BinaryColumn, NvarcharMaxColumn */ FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + using (SqlCommand sqlCommand = new SqlCommand($@"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + sqlConnection, + transaction:null, + columnEncryptionSetting:SqlCommandColumnEncryptionSetting.Enabled)) + { + sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); + sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + + sqlCommand.Parameters[0].Value = values[0]; + sqlCommand.Parameters[1].Value = values[1]; + + using(SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) + { + while (sqlDataReader.Read()) + { + Exception ex = Assert.Throws(() => sqlDataReader.GetTextReader(1)); + Assert.Equal("Retrieving encrypted column 'FirstName' with CommandBehavior=SequentialAccess is not supported.", ex.Message); + } + } + } + + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. + using (SqlCommand sqlCommand = new SqlCommand($"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", sqlConnection, transaction: null, columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { while (sqlDataReader.Read()) @@ -1272,15 +1379,18 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) } } } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = - new SqlCommand($"SELECT CustomerId, FirstName, LastName /*, BinaryColumn, NvarcharMaxColumn */ FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + new SqlCommand($"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", sqlConnection, transaction: null, columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { while (sqlDataReader.Read()) @@ -1295,14 +1405,59 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) } } } + + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. + using (SqlCommand sqlCommand = new SqlCommand($@"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + sqlConnection, + transaction:null, + columnEncryptionSetting:SqlCommandColumnEncryptionSetting.Enabled)) + { + sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); + sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + + sqlCommand.Parameters[0].Value = values[0]; + sqlCommand.Parameters[1].Value = values[1]; + + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) + { + while (sqlDataReader.Read()) + { + object[] readValues = new object[values.Count]; + int numberofValuesRead = sqlDataReader.GetValues(readValues); + + Assert.True(numberofValuesRead == values.Count, "the number of values returned by GetValues is unexpected."); + + for(int i = 0; i < numberofValuesRead; i++) + { + + if (i != 3) + { + Assert.True(readValues[i].ToString()==values[i].ToString(), @"the values returned by GetValues is unexpected."); + } + else + { + Assert.True(((byte[])values[i]).SequenceEqual((byte[])readValues[i]), + @"Value returned by GetValues is unexpected."); + } + } + } + } + } + + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = - new SqlCommand($"SELECT CustomerId, FirstName, LastName /*, BinaryColumn, NvarcharMaxColumn */ FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", - sqlConnection, transaction: null, columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) + new SqlCommand( + $"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + sqlConnection, + transaction: null, + columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { while (sqlDataReader.Read()) @@ -1310,6 +1465,7 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) // GetSqlValues object[] readValues = new object[values.Count]; int numberofValuesRead = sqlDataReader.GetSqlValues(readValues); + Assert.True(numberofValuesRead == values.Count, "the number of values returned by GetSqlValues is unexpected."); Assert.True(((System.Data.SqlTypes.SqlInt32)readValues[0]).Value == (int)values[0], @"Value returned by GetSqlValues is unexpected."); @@ -1320,40 +1476,80 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) } } } + + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. + using(SqlCommand sqlCommand = new SqlCommand($@"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + sqlConnection, + transaction:null, + columnEncryptionSetting:SqlCommandColumnEncryptionSetting.Enabled)) + { + sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); + sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + + sqlCommand.Parameters[0].Value = values[0]; + sqlCommand.Parameters[1].Value = values[1]; + + using(SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) + { + while (sqlDataReader.Read()) + { + // GetSqlValues + object[] readValues = new object[values.Count]; + int numberofValuesRead = sqlDataReader.GetSqlValues(readValues); + + Assert.True(numberofValuesRead==values.Count, "the number of values returned by GetSqlValues is unexpected."); + Assert.True(((System.Data.SqlTypes.SqlInt32)readValues[0]).Value==(int)values[0], + @"Value returned by GetSqlValues is unexpected."); + Assert.True(((System.Data.SqlTypes.SqlString)readValues[1]).Value==(string)values[1], + @"Value returned by GetSqlValues is unexpected."); + Assert.True(((System.Data.SqlTypes.SqlString)readValues[2]).Value==(string)values[2], + @"Value returned by GetSqlValues is unexpected."); + } + } + } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = - new SqlCommand($"SELECT CustomerId, FirstName, LastName /*, BinaryColumn, NvarcharMaxColumn */ FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + new SqlCommand($"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", sqlConnection, transaction: null, columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { while (sqlDataReader.Read()) { // IsDBNullAsync Task isDbNullTask = sqlDataReader.IsDBNullAsync(0); + Assert.True(isDbNullTask.Result == false, @"IsDBNullAsync unexpectedly returned false."); + isDbNullTask = sqlDataReader.IsDBNullAsync(1); Assert.True(isDbNullTask.Result == false, @"IsDBNullAsync unexpectedly returned false."); + isDbNullTask = sqlDataReader.IsDBNullAsync(2); Assert.True(isDbNullTask.Result == false, @"IsDBNullAsync unexpectedly returned false."); } } } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = - new SqlCommand($"SELECT CustomerId, FirstName, LastName /*, BinaryColumn, NvarcharMaxColumn */ FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + new SqlCommand($"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", sqlConnection, transaction: null, columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { while (sqlDataReader.Read()) @@ -1361,23 +1557,28 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) // GetFieldValueAsync Task getCustomerIdTask = sqlDataReader.GetFieldValueAsync(0); Assert.True(getCustomerIdTask.Result == (int)values[0], @"Value returned by GetFieldValueAsync is unexpected."); + Task getFirstNameTask = sqlDataReader.GetFieldValueAsync(1); Assert.True(getFirstNameTask.Result == (string)values[1], @"Value returned by GetFieldValueAsync is unexpected."); + Task getLastNameTask = sqlDataReader.GetFieldValueAsync(2); Assert.True(getLastNameTask.Result == (string)values[2], @"Value returned by GetFieldValueAsync is unexpected."); } } } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = - new SqlCommand($"SELECT CustomerId, FirstName, LastName /*, BinaryColumn, NvarcharMaxColumn */ FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", + new SqlCommand($"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @FirstName AND CustomerId = @CustomerId", sqlConnection, transaction: null, columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int); sqlCommand.Parameters.Add(@"FirstName", SqlDbType.NVarChar, ((string)values[1]).Length); + sqlCommand.Parameters[0].Value = values[0]; sqlCommand.Parameters[1].Value = values[1]; + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { while (sqlDataReader.Read()) @@ -1389,6 +1590,7 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) } } } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = new SqlCommand($"SELECT * FROM [{tableName}] WHERE LastName = @LastName AND CustomerId = @CustomerId", @@ -1397,9 +1599,11 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int).Value = values[0]; sqlCommand.Parameters.Add(@"LastName", SqlDbType.NVarChar).Value = values[2]; + Task readAsyncTask = ReadAsync(sqlCommand, values, commandBehavior); readAsyncTask.Wait(); } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = new SqlCommand($"UPDATE [{tableName}] SET FirstName = @FirstName WHERE CustomerId = @CustomerId", @@ -1409,24 +1613,29 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) { sqlCommand.Parameters.AddWithValue(@"FirstName", values[1]); sqlCommand.Parameters.AddWithValue(@"CustomerId", values[0]); + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { Assert.True(sqlDataReader.RecordsAffected == numberOfRows, @"number of rows returned by sqlDataReader.RecordsAffected is incorrect."); } } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. - using (SqlCommand sqlCommand = new SqlCommand($"INSERT INTO [{tableName}] VALUES (@CustomerId, @FirstName, @LastName /*, @BinaryColumn, @NvarcharMaxColumn*/)", + using (SqlCommand sqlCommand = new SqlCommand($"INSERT INTO [{tableName}] VALUES (@CustomerId, @FirstName, @LastName )", sqlConnection, transaction: null, columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled)) { sqlCommand.Parameters.AddWithValue(@"CustomerId", 60); SqlParameter firstNameParameter = new SqlParameter(@"FirstName", System.Data.SqlDbType.NVarChar, 50); + firstNameParameter.Direction = System.Data.ParameterDirection.Input; firstNameParameter.Value = DBNull.Value; + sqlCommand.Parameters.Add(firstNameParameter); sqlCommand.Parameters.AddWithValue(@"LastName", @"Corporation60"); sqlCommand.ExecuteNonQuery(); } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = new SqlCommand($"SELECT * FROM [{tableName}] WHERE LastName = @LastName AND CustomerId = @CustomerId", @@ -1436,6 +1645,7 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int).Value = 60; sqlCommand.Parameters.Add(@"LastName", SqlDbType.NVarChar).Value = @"Corporation60"; + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { while (sqlDataReader.Read()) @@ -1447,6 +1657,7 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) } } } + // We use different commands for every API test, since SequentialAccess does not let you access a column more than once. using (SqlCommand sqlCommand = new SqlCommand($"SELECT * FROM [{tableName}] WHERE LastName = @LastName AND CustomerId = @CustomerId", @@ -1456,15 +1667,19 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) { sqlCommand.Parameters.Add(@"CustomerId", SqlDbType.Int).Value = 60; sqlCommand.Parameters.Add(@"LastName", SqlDbType.NVarChar).Value = @"Corporation60"; + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(commandBehavior)) { while (sqlDataReader.Read()) { // IsDBNullAsync Task isDbNullTask = sqlDataReader.IsDBNullAsync(0); + Assert.True(isDbNullTask.Result == false, @"IsDBNullAsync unexpectedly returned false."); + isDbNullTask = sqlDataReader.IsDBNullAsync(1); Assert.True(isDbNullTask.Result == true, @"IsDBNullAsync unexpectedly returned true."); + isDbNullTask = sqlDataReader.IsDBNullAsync(2); Assert.True(isDbNullTask.Result == false, @"IsDBNullAsync unexpectedly returned false."); } @@ -1472,6 +1687,7 @@ public void TestSqlDataReaderAPIsWithSequentialAccess(object value) } } } + [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] [InlineData(CommandBehavior.Default)] [InlineData(CommandBehavior.SequentialAccess)] @@ -1479,11 +1695,16 @@ public void TestSqlCommandSequentialAccessCodePaths(object value) { CommandBehavior commandBehavior = (CommandBehavior)value; IList values = GetValues(dataHint: 57); + Assert.True(values != null && values.Count >= 3, @"values should not be null and count should be >= 3."); + int numberOfRows = 300; + //Insert a bunch of rows in to the table. int rowsAffected = InsertRows(tableName: tableName, numberofRows: numberOfRows, values: values); + Assert.True(rowsAffected == numberOfRows, "number of rows affected is unexpected."); + using (SqlConnection sqlConnection = new SqlConnection(DataTestUtility.TcpConnStr)) { sqlConnection.Open(); @@ -1495,6 +1716,7 @@ public void TestSqlCommandSequentialAccessCodePaths(object value) { sqlCommand.Parameters.AddWithValue(@"CustomerId", values[0]); sqlCommand.Parameters.AddWithValue(@"FirstName", values[1]); + using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader()) { Assert.True(sqlDataReader.VisibleFieldCount == values.Count, @"sqlDataReader.VisibleFieldCount returned unexpected result."); @@ -1502,6 +1724,7 @@ public void TestSqlCommandSequentialAccessCodePaths(object value) } } } + private SqlDataAdapter CreateSqlDataAdapter(SqlConnection sqlConnection) { // Create a SqlDataAdapter. @@ -1540,6 +1763,7 @@ private SqlDataAdapter CreateSqlDataAdapter(SqlConnection sqlConnection) ); adapter.InsertCommand.Parameters.Add("@FirstName", SqlDbType.NVarChar, 50, "FirstName"); adapter.InsertCommand.Parameters.Add("@LastName", SqlDbType.NVarChar, 50, "LastName"); + adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; // Set the DELETE command and parameter. @@ -1607,6 +1831,7 @@ private DataTable CreateDataTable(string tableName, int numberofRows) row["CustomerId"] = 45 + i + 1; row["FirstName"] = string.Format(@"Microsoft{0}", i); row["LastName"] = string.Format(@"Corporation{0}", i); + table.Rows.Add(row); } @@ -1667,7 +1892,9 @@ private async Task ReadAsync(SqlCommand sqlCommand, IList values { Assert.True(sqlCommand != null, @"sqlCommand should not be null."); Assert.True(values != null && values.Count >= 3, @"values should not be null and values.count should be >= 3."); + string xmlResult = null; + using (SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync(commandBehavior)) { while (await sqlDataReader.ReadAsync()) @@ -1688,6 +1915,7 @@ private async Task ReadAsync(SqlCommand sqlCommand, IList values private async Task VerifyExecuteNonQueryAsync(SqlCommand sqlCommand) { int rowsAffected = await sqlCommand.ExecuteNonQueryAsync(); + return rowsAffected; } @@ -1699,6 +1927,7 @@ private async Task VerifyExecuteNonQueryAsync(SqlCommand sqlCommand) private async Task VerifyExecuteScalarAsync(SqlCommand sqlCommand) { object result = await sqlCommand.ExecuteScalarAsync(); + return result; } @@ -1715,6 +1944,7 @@ private IList GetValues(int dataHint) string.Format("Microsoft{0}", dataHint), string.Format("Corporation{0}", dataHint) }; + return values; } @@ -1733,9 +1963,11 @@ private void VerifyDataTypes(SqlDataReader sqlDataReader, SqlCommandColumnEncryp Assert.True(sqlDataReader.GetFieldType(0) == typeof(System.Int32), "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetFieldType(1) == typeof(System.String), "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetFieldType(2) == typeof(System.String), "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetProviderSpecificFieldType(0) == typeof(System.Data.SqlTypes.SqlInt32), "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetProviderSpecificFieldType(1) == typeof(System.Data.SqlTypes.SqlString), "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetProviderSpecificFieldType(2) == typeof(System.Data.SqlTypes.SqlString), "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetDataTypeName(0) == @"int", "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetDataTypeName(1) == @"nvarchar", "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetDataTypeName(2) == @"nvarchar", "LastName value read from the table was incorrect."); @@ -1745,9 +1977,11 @@ private void VerifyDataTypes(SqlDataReader sqlDataReader, SqlCommandColumnEncryp Assert.True(sqlDataReader.GetFieldType(0) == typeof(System.Byte[]), "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetFieldType(1) == typeof(System.Byte[]), "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetFieldType(2) == typeof(System.Byte[]), "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetProviderSpecificFieldType(0) == typeof(System.Data.SqlTypes.SqlBinary), "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetProviderSpecificFieldType(1) == typeof(System.Data.SqlTypes.SqlBinary), "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetProviderSpecificFieldType(2) == typeof(System.Data.SqlTypes.SqlBinary), "LastName value read from the table was incorrect."); + Assert.True(sqlDataReader.GetDataTypeName(0) == @"varbinary", "CustomerId value read from the table was incorrect."); Assert.True(sqlDataReader.GetDataTypeName(1) == @"varbinary", "FirstName value read from the table was incorrect."); Assert.True(sqlDataReader.GetDataTypeName(2) == @"varbinary", "LastName value read from the table was incorrect."); @@ -1768,15 +2002,18 @@ private void TestDataAdapterFillResults(DataTable dataTable, IList value Assert.Equal(values[2], row.ItemArray[2]); } } + public void Dispose() { using (SqlConnection sqlConnection = new SqlConnection(DataTestUtility.TcpConnStr)) { sqlConnection.Open(); + Table.DeleteData(fixture.ApiTestTable.Name, sqlConnection); } } } + struct Customer { public Customer(int id, string firstName, string lastName) @@ -1785,8 +2022,11 @@ public Customer(int id, string firstName, string lastName) FirstName = firstName; LastName = lastName; } + public int Id { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } } -} \ No newline at end of file +} From 869fd644ecd283428d8132d5de4bb268237b4297 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Fri, 6 Sep 2019 10:33:49 -0700 Subject: [PATCH 08/26] Release | Update Release notes for Hotfix release (#178) --- CHANGELOG.md | 4 + release-notes/1.0/1.0.19249.1.md | 147 +++++++++++++++++++++++++++++++ release-notes/1.0/1.0.md | 3 +- release-notes/1.0/README.md | 3 +- 4 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 release-notes/1.0/1.0.19249.1.md diff --git a/CHANGELOG.md b/CHANGELOG.md index a1d72a5a14..ef0e7599ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +## [Hotfix & Stable Release 1.0.19249.1] - 2019-09-06 +### Fixed Issues +- Fixed issues with large data reading in Unix applications when data is spanned over multiple packets. [#171](https://github.com/dotnet/SqlClient/pull/171) + ## [Stable Release 1.0.19239.1] - 2019-08-27 Initial release. Release Notes uploaded in [1.0.md](release-notes\1.0\1.0.md) diff --git a/release-notes/1.0/1.0.19249.1.md b/release-notes/1.0/1.0.19249.1.md new file mode 100644 index 0000000000..9e77f15f8d --- /dev/null +++ b/release-notes/1.0/1.0.19249.1.md @@ -0,0 +1,147 @@ +# Release Notes + +## Hotfix & Stable release Microsoft.Data.SqlClient 1.0.192349.1 released 6 September 2019 + +This update brings the below changes over the previous stable release [v1.0.19239.1](1.0.19239.1.md): + +### Fixed +- Fixed issues with large data reading in Unix applications when data is spanned over multiple packets. [#171](https://github.com/dotnet/SqlClient/pull/171) + +### Target Platform Support + +* .NET Framework 4.6+ +* .NET Core 2.1+ (Windows x86, Windows x64, Linux, macOS) +* .NET Standard 2.0+ (Windows x86, Windows x64, Linux, macOS) + +### Dependencies + +#### .NET Framework + +* System.Data.Common 4.3.0 +* Microsoft.Data.SqlClient.SNI 1.0.19235.1 +* Microsoft.Identity.Client 3.0.8 + +#### .NET Core + +* Microsoft.Win32.Registry 4.5.0 +* runtime.native.System.Data.SqlClient.sni 4.4.0 +* System.Security.Principal.Windows 4.5.0 +* System.Text.Encoding.CodePages 4.5.0 +* System.Configuration.ConfigurationManager 4.5.0 +* Microsoft.Identity.Client 3.0.8 + +#### .NET Standard + +* Microsoft.Win32.Registry 4.5.0 +* runtime.native.System.Data.SqlClient.sni 4.4.0 +* System.Buffers 4.4.0 +* System.Diagnostics.DiagnosticSource 4.5.0 +* System.Memory 4.5.1 +* System.Security.Principal.Windows 4.5.0 +* System.Text.Encoding.CodePages 4.5.0 +* System.Configuration.ConfigurationManager 4.5.0 +* Microsoft.Identity.Client 3.0.8 + +### New Features + +#### New features over .NET Framework 4.7.2 System.Data.SqlClient + +* [Active Directory Interactive Authentication](#active-directory-interactive-authentication-(In-.net-framework)) - Applicable to Azure SQL Database and Azure Data Warehouse +* [Data Classification](#data-classification) - Available in Azure SQL Database and Microsoft SQL Server 2019 since CTP 2.0. +* [UTF-8 support](#utf-8-support) - Available in Microsoft SQL Server SQL Server 2019 since CTP 2.3. + +#### New features over .NET Core 2.2 System.Data.SqlClient + +* [Active Directory Password Authentication](#active-directory-password-authentication-(in-.net-core)) - Applicable to Azure SQL Database and Azure Data Warehouse +* [Data Classification](#data-classification) - Available in Azure SQL Database and Microsoft SQL Server 2019 since CTP 2.0. +* [UTF-8 support](#utf-8-support) - Available in Microsoft SQL Server SQL Server 2019 since CTP 2.3. +* [Always Encrypted with Enclaves](#always-encrypted-with-enclaves) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. Enclave support was introduced in Microsoft Sql Server 2019 CTP 2.0. + + +### Active Directory Interactive Authentication (In .NET Framework) + +Microsoft.Data.SqlClient now supports "**Interactive Authentication with Azure Active Directory (AAD)**" for .NET Framework applications, also known as "*Multi-factor AAD authentication*" and "*Active Directory Universal Authentication*". Azure MFA helps safeguard access to data and applications while meeting user demand for a simple sign-in process. It delivers strong authentication with a range of easy verification options (phone call, text message, smart cards with pin, or mobile app notification), allowing users to choose the method they prefer. Interactive MFA with Azure AD can result in a pop-up dialog box for validation. + +To connect to a database using Interactive Authentication mode and an Azure AD identity, the `Authentication` keyword in the database connection string must be set to `Active Directory Interactive`. An example to connect using this mode of authentication is below: + +```C# +string ConnectionString = +@"Data Source=n9lxnyuzhv.database.windows.net; Authentication=Active Directory Interactive; Initial Catalog=testdb;"; +using (SqlConnection conn = new SqlConnection(ConnectionString)) { + conn.Open(); +} +``` + +### Active Directory Password Authentication (In .NET Core) +Microsoft.Data.SqlClient now supports "**Azure Active Directory (AAD) Password Authentication**" for .NET Core applications. This authentication mode supports authentication to Azure SQL DB/DW with Azure AD for native or federated Azure AD users. + +To connect to a database using AD Password Authentication mode and an Azure AD identity, the `Authentication` keyword in the database connection string must be set to `Active Directory Password` and user credentials must be provided. An example to connect using this mode of authentication is below: + +```C# +string ConnectionString = +@"Data Source=n9lxnyuzhv.database.windows.net; Authentication=Active Directory Password; Initial Catalog=testdb;UID=user@domain.com;PWD=***"; +using (SqlConnection conn = new SqlConnection(ConnectionString)) { + conn.Open(); +} +``` + +### Data Classification + +Data Classification brings a new set of APIs exposing read-only Data Sensitivity and Classification information about objects retrieved via SqlDataReader when the underlying source supports the feature and contains metadata about [data sensitivity and classification](https://docs.microsoft.com/sql/relational-databases/security/sql-data-discovery-and-classification?view=sql-server-2017): + +```C# +public class SqlDataReader +{ + public Microsoft.Data.SqlClient.DataClassification.SensitivityClassification SensitivityClassification +} + +namespace Microsoft.Data.SqlClient.DataClassification +{ + public class ColumnSensitivity + { + public System.Collections.ObjectModel.ReadOnlyCollection SensitivityProperties + } + public class InformationType + { + public string Id + public string Name + } + public class Label + { + public string Id + public string Name + } + public class SensitivityClassification + { + public System.Collections.ObjectModel.ReadOnlyCollection ColumnSensitivities + public System.Collections.ObjectModel.ReadOnlyCollection InformationTypes + public System.Collections.ObjectModel.ReadOnlyCollection Labels + } + public class SensitivityProperty + { + public Microsoft.Data.SqlClient.DataClassification.InformationType InformationType + public Microsoft.Data.SqlClient.DataClassification.Label Label + } +} +``` + +### UTF-8 Support + +UTF-8 support does not require any application code changes. These SqlClient changes simply optimize the communication between the client and server when the server supports UTF-8 and the underlying column collation is UTF-8. See the UTF-8 section under [What's new in SQL Server 2019 preview](https://docs.microsoft.com/sql/sql-server/what-s-new-in-sql-server-ver15?view=sqlallproducts-allversions#utf-8-support-ctp-23). + +### Always Encrypted + +In general, existing documentation which uses System.Data.SqlClient on .NET Framework **and built-in column master key store providers** should now work with .NET Core, too. + +* [Develop using Always Encrypted with .NET Framework Data Provider](https://docs.microsoft.com/sql/relational-databases/security/encryption/develop-using-always-encrypted-with-net-framework-data-provider?view=sql-server-2017) +* [Always Encrypted: Protect sensitive data and store encryption keys in the Windows certificate store](https://docs.microsoft.com/azure/sql-database/sql-database-always-encrypted) + +### Known Issues + +* User Data Types (UDTs) may not work with Microsoft.Data.SqlClient. + +**Notes:** + +* There is no key store provider for Azure Key Vault and Microsoft.Data.SqlClient at this time. +* Always Encrypted with secure enclaves is not supported with Microsoft.Data.SqlClient. +* Always Encrypted is only supported against .NET Framework and .NET Core targets. It is not supported against .NET Standard since .NET Standard is missing certain encryption dependencies. diff --git a/release-notes/1.0/1.0.md b/release-notes/1.0/1.0.md index b92b1fcbba..bb3961eea8 100644 --- a/release-notes/1.0/1.0.md +++ b/release-notes/1.0/1.0.md @@ -4,7 +4,8 @@ The following Microsoft.Data.SqlClient 1.0 stable releases have been shipped: | Release Date | Description | Notes | | :-- | :-- | :--: | -| 2019/08/23 | 1.0.19239.1 | [release notes](1.0.19239.1.md) | +| 2019/09/06 | 1.0.19249.1 | [release notes](1.0.19249.1.md) | +| 2019/08/27 | 1.0.19239.1 | [release notes](1.0.19239.1.md) | The following Microsoft.Data.SqlClient 1.0 preview releases have been shipped: diff --git a/release-notes/1.0/README.md b/release-notes/1.0/README.md index af5fd087ec..4add565f7e 100644 --- a/release-notes/1.0/README.md +++ b/release-notes/1.0/README.md @@ -4,7 +4,8 @@ The following Microsoft.Data.SqlClient 1.0 stable releases have been shipped: | Release Date | Description | Notes | | :-- | :-- | :--: | -| 2019/08/23 | 1.0.19239.1 | [release notes](1.0.19239.1.md) | +| 2019/09/06 | 1.0.19249.1 | [release notes](1.0.19249.1.md) | +| 2019/08/27 | 1.0.19239.1 | [release notes](1.0.19239.1.md) | The following Microsoft.Data.SqlClient 1.0 preview releases have been shipped: From 762082431ab2e9e6ac0957a5d513f1251840f3de Mon Sep 17 00:00:00 2001 From: dengel Date: Fri, 6 Sep 2019 10:48:15 -0700 Subject: [PATCH 09/26] AE corrections to release notes --- release-notes/1.0/1.0.19123.2-Preview.md | 2 +- release-notes/1.0/1.0.19128.1-Preview.md | 2 +- release-notes/1.0/1.0.19189.1-Preview.md | 2 +- release-notes/1.0/1.0.19221.1-Preview.md | 2 +- release-notes/1.0/1.0.19239.1.md | 3 +-- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/release-notes/1.0/1.0.19123.2-Preview.md b/release-notes/1.0/1.0.19123.2-Preview.md index 8002ad57a8..c81456277e 100644 --- a/release-notes/1.0/1.0.19123.2-Preview.md +++ b/release-notes/1.0/1.0.19123.2-Preview.md @@ -46,7 +46,7 @@ New features over .NET Core 2.2 System.Data.SqlClient. * [Data Classification](#data-classification) - Available in Azure SQL Database and Microsoft SQL Server 2019 since CTP 2.0. * [UTF-8 support](#utf-8-support) - Available in Microsoft SQL Server SQL Server 2019 since CTP 2.3. -* [Always Encrypted with Enclaves](#always-encrypted-with-enclaves) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. Enclave support was introduced in Microsoft Sql Server 2019 CTP 2.0. +* [Always Encrypted](#always-encrypted) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. ### Fixed diff --git a/release-notes/1.0/1.0.19128.1-Preview.md b/release-notes/1.0/1.0.19128.1-Preview.md index e3bc0e5d52..f3fc691fc1 100644 --- a/release-notes/1.0/1.0.19128.1-Preview.md +++ b/release-notes/1.0/1.0.19128.1-Preview.md @@ -46,7 +46,7 @@ New features over .NET Core 2.2 System.Data.SqlClient. * [Data Classification](#data-classification) - Available in Azure SQL Database and Microsoft SQL Server 2019 since CTP 2.0. * [UTF-8 support](#utf-8-support) - Available in Microsoft SQL Server SQL Server 2019 since CTP 2.3. -* [Always Encrypted with Enclaves](#always-encrypted-with-enclaves) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. Enclave support was introduced in Microsoft Sql Server 2019 CTP 2.0. +* [Always Encrypted](#always-encrypted) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. ### Fixed diff --git a/release-notes/1.0/1.0.19189.1-Preview.md b/release-notes/1.0/1.0.19189.1-Preview.md index d3fcad8260..df6b7fc3c7 100644 --- a/release-notes/1.0/1.0.19189.1-Preview.md +++ b/release-notes/1.0/1.0.19189.1-Preview.md @@ -81,7 +81,7 @@ This update does not add any major features over the previous preview release bu * [Data Classification](#data-classification) - Available in Azure SQL Database and Microsoft SQL Server 2019 since CTP 2.0. * [UTF-8 support](#utf-8-support) - Available in Microsoft SQL Server SQL Server 2019 since CTP 2.3. -* [Always Encrypted with Enclaves](#always-encrypted-with-enclaves) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. Enclave support was introduced in Microsoft Sql Server 2019 CTP 2.0. +* [Always Encrypted](#always-encrypted) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. ### Known Issues diff --git a/release-notes/1.0/1.0.19221.1-Preview.md b/release-notes/1.0/1.0.19221.1-Preview.md index d6532a5b18..0f16666ef3 100644 --- a/release-notes/1.0/1.0.19221.1-Preview.md +++ b/release-notes/1.0/1.0.19221.1-Preview.md @@ -86,7 +86,7 @@ This update brings the below changes over the previous preview release: * [Data Classification](#data-classification) - Available in Azure SQL Database and Microsoft SQL Server 2019 since CTP 2.0. * [UTF-8 support](#utf-8-support) - Available in Microsoft SQL Server SQL Server 2019 since CTP 2.3. -* [Always Encrypted with Enclaves](#always-encrypted-with-enclaves) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. Enclave support was introduced in Microsoft Sql Server 2019 CTP 2.0. +* [Always Encrypted](#always-encrypted) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. * [Authentication](#authentication): Active Directory Password authentication mode. ### Known Issues diff --git a/release-notes/1.0/1.0.19239.1.md b/release-notes/1.0/1.0.19239.1.md index 4897ca183a..931b3bc364 100644 --- a/release-notes/1.0/1.0.19239.1.md +++ b/release-notes/1.0/1.0.19239.1.md @@ -65,8 +65,7 @@ This update brings the below changes over the previous preview release: * [Active Directory Password Authentication](#active-directory-password-authentication-(in-.net-core)) - Applicable to Azure SQL Database and Azure Data Warehouse * [Data Classification](#data-classification) - Available in Azure SQL Database and Microsoft SQL Server 2019 since CTP 2.0. * [UTF-8 support](#utf-8-support) - Available in Microsoft SQL Server SQL Server 2019 since CTP 2.3. -* [Always Encrypted with Enclaves](#always-encrypted-with-enclaves) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. Enclave support was introduced in Microsoft Sql Server 2019 CTP 2.0. - +* [Always Encrypted](#always-encrypted) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. ### Active Directory Interactive Authentication (In .NET Framework) From 5b06cda6019a90c966f08293b35d6322b18dc265 Mon Sep 17 00:00:00 2001 From: David Engel Date: Fri, 6 Sep 2019 10:54:29 -0700 Subject: [PATCH 10/26] AE corrections to release notes --- release-notes/1.0/1.0.19249.1.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/release-notes/1.0/1.0.19249.1.md b/release-notes/1.0/1.0.19249.1.md index 9e77f15f8d..1efd2d4eb0 100644 --- a/release-notes/1.0/1.0.19249.1.md +++ b/release-notes/1.0/1.0.19249.1.md @@ -55,8 +55,7 @@ This update brings the below changes over the previous stable release [v1.0.1923 * [Active Directory Password Authentication](#active-directory-password-authentication-(in-.net-core)) - Applicable to Azure SQL Database and Azure Data Warehouse * [Data Classification](#data-classification) - Available in Azure SQL Database and Microsoft SQL Server 2019 since CTP 2.0. * [UTF-8 support](#utf-8-support) - Available in Microsoft SQL Server SQL Server 2019 since CTP 2.3. -* [Always Encrypted with Enclaves](#always-encrypted-with-enclaves) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. Enclave support was introduced in Microsoft Sql Server 2019 CTP 2.0. - +* [Always Encrypted](#always-encrypted) - Always Encrypted is available in Microsoft SQL Server 2016 and higher. ### Active Directory Interactive Authentication (In .NET Framework) From e87581b8d173c9cc26c5e0c7b0b1328996552588 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Fri, 6 Sep 2019 16:02:58 -0700 Subject: [PATCH 11/26] Update version for next development phase (1.1.0-dev) (#179) --- tools/props/Versions.props | 2 +- tools/targets/GenerateNugetPackage.targets | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/props/Versions.props b/tools/props/Versions.props index 15cf159322..a49be23c63 100644 --- a/tools/props/Versions.props +++ b/tools/props/Versions.props @@ -5,6 +5,6 @@ $(AssemblyFileVersion) $(AssemblyFileVersion) 1.0.0-beta.18578.2 - 1.0.0 + 1.1.0-dev diff --git a/tools/targets/GenerateNugetPackage.targets b/tools/targets/GenerateNugetPackage.targets index 42b205a0b7..fbc24bd886 100644 --- a/tools/targets/GenerateNugetPackage.targets +++ b/tools/targets/GenerateNugetPackage.targets @@ -2,7 +2,7 @@ - $(NugetPackageVersion)-dev + $(NugetPackageVersion)-debug - + - + - - - - - - - - - - + diff --git a/Localize/loc/fr/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl b/Localize/loc/fr/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl index ea600c6535..1b7edfbdb6 100644 --- a/Localize/loc/fr/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl +++ b/Localize/loc/fr/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl @@ -9232,20 +9232,11 @@ - + - + - - - - - - - - - - + diff --git a/Localize/loc/ja/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl b/Localize/loc/ja/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl index 91cf566d36..3ae93d9478 100644 --- a/Localize/loc/ja/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl +++ b/Localize/loc/ja/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl @@ -9232,20 +9232,11 @@ - + - + - - - - - - - - - - + diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx index dda1246600..2c3a9e34c8 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx +++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx @@ -2497,7 +2497,7 @@ No se puede usar 'Authentication=Active Directory Integrated' con las palabras clave de cadena de conexión 'User ID', 'UID', 'Password' o 'PWD'. - No se puede usar 'Authentication=Active Directory Interactive' con las palabras clave de cadena de conexión 'User ID', 'UID', 'Password' o 'PWD'. + No se puede usar "Authentication=Active Directory Interactive" con las palabras clave de cadena de conexión "User ID", "UID", "Password" ni "PWD". No se puede usar 'Authentication=Active Directory Integrated' si se ha establecido la propiedad Credential. diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx index 0fd9a68d81..2a308c57eb 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx +++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx @@ -2494,10 +2494,10 @@ Impossible d'utiliser 'Authentication avec 'Integrated Security'. - Impossible d'utiliser 'Authentication=Active Directory Integrated' avec les mots clés de la chaîne de connexion 'User ID', 'UID', 'Password' ou 'PWD'. + Impossible d'utiliser 'Authentication=Active Directory Integrated' avec les mots clés de la chaîne de connexion 'User ID", "UID", "Password" ou "PWD". - Impossible d'utiliser 'Authentication=Active Directory Interactive' avec les mots clés de la chaîne de connexion 'User ID', 'UID', 'Password' ou 'PWD'. + Impossible d'utiliser 'Authentication=Active Directory Interactive' avec les mots clés de chaîne de connexion 'User ID', 'UID', 'Password' et 'PWD'. Impossible d'utiliser 'Authentication=Active Directory Integrated', si la propriété Credential a été définie. diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ru.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ru.resx index 0408af651f..0e3a68dd6e 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ru.resx +++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ru.resx @@ -2497,7 +2497,7 @@ Нельзя использовать 'Authentication=Active Directory Integrated' с ключевыми словами строки подключения 'User ID', 'UID', 'Password' или 'PWD'. - Нельзя использовать 'Authentication=Active Directory Interactive' с ключевыми словами строки подключения 'User ID', 'UID', 'Password' или 'PWD'. + Невозможно использовать "Authentication=Active Directory Interactive" с ключевыми словами строки подключения "User ID", "UID", "Password" или "PWD". Не удается использовать 'Authentication=Active Directory Integrated', если задано свойство «Credential». From 6934d713a3c6ef9610d823d8f2cff473cbc745f5 Mon Sep 17 00:00:00 2001 From: csigs Date: Mon, 9 Sep 2019 11:45:03 -0700 Subject: [PATCH 13/26] LEGO: check in for master to temporary branch. (#181) --- .../netfx/src/Resources/Strings.resx.lcl | 2 +- .../netfx/src/Resources/Strings.resx.lcl | 9 +++------ .../netfx/src/Resources/Strings.resx.lcl | 2 +- .../netfx/src/Resources/Strings.resx.lcl | 8 ++++---- .../netfx/src/Resources/Strings.resx.lcl | 6 +++--- .../netfx/src/Resources/Strings.resx.lcl | 2 +- 6 files changed, 13 insertions(+), 16 deletions(-) diff --git a/Localize/loc/de/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl b/Localize/loc/de/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl index 7c9bfdeee2..1396c2c107 100644 --- a/Localize/loc/de/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl +++ b/Localize/loc/de/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl @@ -9227,7 +9227,7 @@ - + diff --git a/Localize/loc/es/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl b/Localize/loc/es/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl index d2143a65eb..d3876477cf 100644 --- a/Localize/loc/es/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl +++ b/Localize/loc/es/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl @@ -9227,7 +9227,7 @@ - + @@ -9235,9 +9235,6 @@ - - - @@ -9704,7 +9701,7 @@ - + @@ -9713,7 +9710,7 @@ - + diff --git a/Localize/loc/ko/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl b/Localize/loc/ko/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl index 1243b42332..dc82e734f8 100644 --- a/Localize/loc/ko/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl +++ b/Localize/loc/ko/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl @@ -9236,7 +9236,7 @@ - + diff --git a/Localize/loc/pt-BR/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl b/Localize/loc/pt-BR/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl index 442a7ffe99..729e91e938 100644 --- a/Localize/loc/pt-BR/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl +++ b/Localize/loc/pt-BR/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl @@ -9227,7 +9227,7 @@ - + @@ -9236,7 +9236,7 @@ - + @@ -9704,7 +9704,7 @@ - + @@ -9713,7 +9713,7 @@ - + diff --git a/Localize/loc/ru/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl b/Localize/loc/ru/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl index 6bcc567f77..942cafb386 100644 --- a/Localize/loc/ru/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl +++ b/Localize/loc/ru/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl @@ -9227,7 +9227,7 @@ - + @@ -9704,7 +9704,7 @@ - + @@ -9713,7 +9713,7 @@ - + diff --git a/Localize/loc/zh-Hans/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl b/Localize/loc/zh-Hans/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl index 9f59f159cb..7111345535 100644 --- a/Localize/loc/zh-Hans/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl +++ b/Localize/loc/zh-Hans/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx.lcl @@ -9236,7 +9236,7 @@ - + From 71926bebd222be1171c5db20a01e2a7b86e4075a Mon Sep 17 00:00:00 2001 From: Gary Zhang Date: Mon, 9 Sep 2019 14:56:00 -0700 Subject: [PATCH 14/26] Port tests from CoreCryptoTests --- .../AlwaysEncrypted/CoreCryptoTests.cs | 118 +++++ .../TestFixtures/SQLSetupStrategy.cs | 2 + .../TestFixtures/Setup/CertificateUtility.cs | 127 +++++ .../Setup/CryptoNativeBaselineReader.cs | 424 +++++++++++++++++ .../TestFixtures/Setup/CryptoVector.cs | 281 ++++++++++++ .../Setup/TCECryptoNativeBaseline.txt | 434 ++++++++++++++++++ .../Setup/TCECryptoNativeBaselineRsa.txt | 37 ++ ....Data.SqlClient.ManualTesting.Tests.csproj | 13 +- 8 files changed, 1435 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs create mode 100644 src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CryptoNativeBaselineReader.cs create mode 100644 src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CryptoVector.cs create mode 100644 src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/TCECryptoNativeBaseline.txt create mode 100644 src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/TCECryptoNativeBaselineRsa.txt diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs new file mode 100644 index 0000000000..020011941b --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs @@ -0,0 +1,118 @@ +using Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted.Setup; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data.SqlClient; +using System.Diagnostics; +using Xunit; + +namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted +{ + public class CoreCryptoTests : IClassFixture + { + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + public void TestAeadCryptoWithNativeBaseline() + { + // Initialize the reader for resource text file which has the native code generated baseline. + CryptoNativeBaselineReader cryptoNativeBaselineReader = new CryptoNativeBaselineReader(); + + // Read and initialized the crypto vectors from the resource text file. + cryptoNativeBaselineReader.InitializeCryptoVectors(); + + IList cryptoParametersListForTest = cryptoNativeBaselineReader.CryptoVectors; + + Assert.True(cryptoParametersListForTest.Count >= 1, @"Invalid number of AEAD test vectors. Expected at least 1."); + + // For each crypto vector, run the test to compare the output generated through sqlclient's code and the native code. + foreach(CryptoVector cryptoParameter in cryptoParametersListForTest) + { + // For Deterministic encryption, compare the result of encrypting the cell data (or plain text). + if (cryptoParameter.CryptoVectorEncryptionTypeVal == CryptoVectorEncryptionType.Deterministic) + { + TestEncryptionResultUsingAead(cryptoParameter.PlainText, + cryptoParameter.RootKey, + cryptoParameter.CryptoVectorEncryptionTypeVal == CryptoVectorEncryptionType.Deterministic ? CertificateUtility.CColumnEncryptionType.Deterministic : CertificateUtility.CColumnEncryptionType.Randomized, + cryptoParameter.FinalCell); + } + + // For Randomized and Deterministic encryption, try the decryption of final cell value and compare against the native code baseline's plain text. + TestDecryptionResultUsingAead(cryptoParameter.FinalCell, + cryptoParameter.RootKey, + cryptoParameter.CryptoVectorEncryptionTypeVal == CryptoVectorEncryptionType.Deterministic ? CertificateUtility.CColumnEncryptionType.Deterministic : CertificateUtility.CColumnEncryptionType.Randomized, + cryptoParameter.PlainText); + } + } + + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + public void TestRsaCryptoWithNativeBaseline() + { + // Initialize the reader for resource text file which has the native code generated baseline. + CryptoNativeBaselineReader cryptoNativeBaselineReader = new CryptoNativeBaselineReader(); + + // Read and initialized the crypto vectors from the resource text file. + cryptoNativeBaselineReader.InitializeCryptoVectors(CryptNativeTestVectorType.Rsa); + + IList cryptoParametersListForTest = cryptoNativeBaselineReader.CryptoVectors; + + Assert.True(cryptoParametersListForTest.Count >= 3, @"Invalid number of RSA test vectors. Expected at least 3 (RSA Keypair + PFX + test vectors)."); + Assert.True(cryptoParametersListForTest[0].CryptNativeTestVectorTypeVal == CryptNativeTestVectorType.RsaKeyPair, @"First entry must be an RSA key pair."); + Assert.True(cryptoParametersListForTest[1].CryptNativeTestVectorTypeVal == CryptNativeTestVectorType.RsaPfx, @"2nd entry must be a PFX."); + + byte[] rsaKeyPair = cryptoParametersListForTest[0].RsaKeyPair; + byte[] rsaPfx = cryptoParametersListForTest[1].RsaKeyPair; + + // For each crypto vector, run the test to compare the output generated through sqlclient's code and the native code. + foreach (CryptoVector cryptoParameter in cryptoParametersListForTest) + { + if (cryptoParameter.CryptNativeTestVectorTypeVal == CryptNativeTestVectorType.Rsa) + { + // Verify that we are using the right padding scheme for RSA encryption + byte[] plaintext = CertificateUtility.DecryptRsaDirectly(rsaPfx, cryptoParameter.CiphertextCek, @"Test"); + Assert.True(cryptoParameter.PlaintextCek.SequenceEqual(plaintext), "Plaintext CEK Value does not match with the native code baseline."); + + // Verify that the signed blob is conforming to our envelope (SHA-256, PKCS 1 padding) + bool signatureVerified = CertificateUtility.VerifyRsaSignatureDirectly(cryptoParameter.HashedCek, cryptoParameter.SignedCek, rsaPfx); + Assert.True(signatureVerified, "Plaintext CEK signature scheme does not match with the native code baseline."); + + //// TODO: Programmatically install the in-memory PFX into the right store (based on path) & use the public API + //plaintext = Utility.VerifyRsaSignature(cryptoParameter.PathCek, cryptoParameter.FinalcellCek, rsaPfx); + //CError.Compare(cryptoParameter.PlaintextCek.SequenceEqual(plaintext), "Plaintext CEK Value does not match with the native code baseline (end to end)."); + } + } + } + + + /// + /// Helper function to test the result of encryption using Aead. + /// + /// + /// + /// + /// + private void TestEncryptionResultUsingAead(byte[] plainText, byte[] rootKey, CertificateUtility.CColumnEncryptionType encryptionType, byte[] expectedFinalCellValue) + { + // Encrypt. + byte[] encryptedCellData = CertificateUtility.EncryptDataUsingAED(plainText, rootKey, encryptionType); + Debug.Assert(encryptedCellData != null && encryptedCellData.Length > 0); + + Assert.True(encryptedCellData.SequenceEqual(expectedFinalCellValue), "Final Cell Value does not match with the native code baseline."); + } + + /// + /// Helper function to test the result of decryption using Aead. + /// + /// + /// + /// + /// + private void TestDecryptionResultUsingAead(byte[] cipherText, byte[] rootKey, CertificateUtility.CColumnEncryptionType encryptionType, byte[] expectedPlainText) + { + // Decrypt. + byte[] decryptedCellData = CertificateUtility.DecryptDataUsingAED(cipherText, rootKey, encryptionType); + Debug.Assert(decryptedCellData != null); + + Assert.True(decryptedCellData.SequenceEqual(expectedPlainText), "Decrypted cell data does not match with the native code baseline."); + } + } +} diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SQLSetupStrategy.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SQLSetupStrategy.cs index 503ce740d0..b3a5e2aafb 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SQLSetupStrategy.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SQLSetupStrategy.cs @@ -11,6 +11,8 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted { public class SQLSetupStrategy : IDisposable { + internal const string ColumnEncryptionAlgorithmName = @"AEAD_AES_256_CBC_HMAC_SHA256"; + private readonly X509Certificate2 certificate; public string keyPath { get; private set; } public Table ApiTestTable { get; private set; } diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs index 883262ba53..2377146caa 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs @@ -2,6 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; +using System.Diagnostics; +using System.Reflection; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; @@ -13,6 +16,72 @@ private CertificateUtility() { } + /// + /// System.Data assembly. + /// + public static Assembly systemData = Assembly.GetAssembly(typeof(SqlConnection)); + public static Type sqlClientSymmetricKey = systemData.GetType("Microsoft.Data.SqlClient.SqlClientSymmetricKey"); + public static ConstructorInfo sqlColumnEncryptionKeyConstructor = sqlClientSymmetricKey.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(byte[]) }, null); + public static Type sqlAeadAes256CbcHmac256Factory = systemData.GetType("Microsoft.Data.SqlClient.SqlAeadAes256CbcHmac256Factory"); + public static MethodInfo sqlAeadAes256CbcHmac256FactoryCreate = sqlAeadAes256CbcHmac256Factory.GetMethod("Create", BindingFlags.Instance | BindingFlags.NonPublic); + public static Type sqlClientEncryptionAlgorithm = systemData.GetType("Microsoft.Data.SqlClient.SqlClientEncryptionAlgorithm"); + public static MethodInfo sqlClientEncryptionAlgorithmEncryptData = sqlClientEncryptionAlgorithm.GetMethod("EncryptData", BindingFlags.Instance | BindingFlags.NonPublic); + public static Type SqlColumnEncryptionCertificateStoreProvider = systemData.GetType("Microsoft.Data.SqlClient.SqlColumnEncryptionCertificateStoreProvider"); + public static MethodInfo SqlColumnEncryptionCertificateStoreProviderRSADecrypt = SqlColumnEncryptionCertificateStoreProvider.GetMethod("RSADecrypt", BindingFlags.Instance | BindingFlags.NonPublic); + public static MethodInfo SqlColumnEncryptionCertificateStoreProviderRSAVerifySignature = SqlColumnEncryptionCertificateStoreProvider.GetMethod("RSAVerifySignature", BindingFlags.Instance | BindingFlags.NonPublic); + public static MethodInfo sqlClientEncryptionAlgorithmDecryptData = sqlClientEncryptionAlgorithm.GetMethod("DecryptData", BindingFlags.Instance | BindingFlags.NonPublic); + + /// + /// ECEK Corruption types (useful for testing) + /// + internal enum ECEKCorruption + { + ALGORITHM_VERSION, + CEK_LENGTH, + SIGNATURE, + SIGNATURE_LENGTH + } + + /// + /// Encryption Type as per the test code. Different than product code's enumeration. + /// + internal enum CColumnEncryptionType + { + PlainText = 0, + Deterministic, + Randomized + } + + /// + /// Encrypt Data using AED + /// + /// + /// + internal static byte[] EncryptDataUsingAED(byte[] plainTextData, byte[] key, CColumnEncryptionType encryptionType) + { + Debug.Assert(plainTextData != null); + Debug.Assert(key != null && key.Length > 0); + byte[] encryptedData = null; + + Object columnEncryptionKey = sqlColumnEncryptionKeyConstructor.Invoke(new object[] { key }); + Debug.Assert(columnEncryptionKey != null); + + Object aesFactory = Activator.CreateInstance(sqlAeadAes256CbcHmac256Factory); + Debug.Assert(aesFactory != null); + + object[] parameters = new object[] { columnEncryptionKey, encryptionType, SQLSetupStrategy.ColumnEncryptionAlgorithmName }; + Object authenticatedAES = sqlAeadAes256CbcHmac256FactoryCreate.Invoke(aesFactory, parameters); + Debug.Assert(authenticatedAES != null); + + parameters = new object[] { plainTextData }; + Object finalCellBlob = sqlClientEncryptionAlgorithmEncryptData.Invoke(authenticatedAES, parameters); + Debug.Assert(finalCellBlob != null); + + encryptedData = (byte[])finalCellBlob; + + return encryptedData; + } + /// /// Create a self-signed certificate. /// @@ -62,5 +131,63 @@ internal static void RemoveCertificate(X509Certificate2 certificate) } } } + + internal static byte[] DecryptRsaDirectly(byte[] rsaPfx, byte[] ciphertextCek, string masterKeyPath) + { + Debug.Assert(rsaPfx != null && rsaPfx.Length > 0); + // The rest of the parameters may be invalid for exception handling test cases + + X509Certificate2 x509 = new X509Certificate2(rsaPfx, @"P@zzw0rD!SqlvN3x+"); + + Debug.Assert(x509.HasPrivateKey); + + SqlColumnEncryptionCertificateStoreProvider rsaProvider = new SqlColumnEncryptionCertificateStoreProvider(); + Object RsaDecryptionResult = SqlColumnEncryptionCertificateStoreProviderRSADecrypt.Invoke(rsaProvider, new object[] { ciphertextCek, x509 }); + + return (byte[])RsaDecryptionResult; + } + + internal static bool VerifyRsaSignatureDirectly(byte[] hashedCek, byte[] signedCek, byte[] rsaPfx) + { + Debug.Assert(rsaPfx != null && rsaPfx.Length > 0); + + X509Certificate2 x509 = new X509Certificate2(rsaPfx, @"P@zzw0rD!SqlvN3x+"); + Debug.Assert(x509.HasPrivateKey); + + SqlColumnEncryptionCertificateStoreProvider rsaProvider = new SqlColumnEncryptionCertificateStoreProvider(); + Object RsaVerifySignatureResult = SqlColumnEncryptionCertificateStoreProviderRSAVerifySignature.Invoke(rsaProvider, new object[] { hashedCek, signedCek, x509 }); + + return (bool)RsaVerifySignatureResult; + + } + + /// + /// Decrypt Data using AEAD + /// + internal static byte[] DecryptDataUsingAED(byte[] encryptedCellBlob, byte[] key, CColumnEncryptionType encryptionType) + { + Debug.Assert(encryptedCellBlob != null && encryptedCellBlob.Length > 0); + Debug.Assert(key != null && key.Length > 0); + + byte[] decryptedData = null; + + Object columnEncryptionKey = sqlColumnEncryptionKeyConstructor.Invoke(new object[] { key }); + Debug.Assert(columnEncryptionKey != null); + + Object aesFactory = Activator.CreateInstance(sqlAeadAes256CbcHmac256Factory); + Debug.Assert(aesFactory != null); + + object[] parameters = new object[] { columnEncryptionKey, encryptionType, SQLSetupStrategy.ColumnEncryptionAlgorithmName }; + Object authenticatedAES = sqlAeadAes256CbcHmac256FactoryCreate.Invoke(aesFactory, parameters); + Debug.Assert(authenticatedAES != null); + + parameters = new object[] { encryptedCellBlob }; + Object decryptedValue = sqlClientEncryptionAlgorithmDecryptData.Invoke(authenticatedAES, parameters); + Debug.Assert(decryptedValue != null); + + decryptedData = (byte[])decryptedValue; + + return decryptedData; + } } } diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CryptoNativeBaselineReader.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CryptoNativeBaselineReader.cs new file mode 100644 index 0000000000..5621b99d84 --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CryptoNativeBaselineReader.cs @@ -0,0 +1,424 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted.Setup +{ + /// + /// Class which reads the crypto test value vectors from resource text file, which was generated with native code. + /// + internal class CryptoNativeBaselineReader + { + /// + /// Root Key Identifier, to refer inside resource text file. + /// + private const string RootKeyIdentifier = @"ROOTKEY"; + + /// + /// Plain Text Identifier, to refer inside resource text file. + /// + private const string PlainTextIdentifier = @"PLAINTEXT"; + + /// + /// Encryption Type Identifier, to refer inside resource text file. + /// + private const string EncryptionTypeIdentifier = @"ENC_TYPE"; + + /// + /// Final Cell Value Identifier, to refer inside resource text file. + /// + private const string FinalCellIdentifier = @"FINAL_CELL"; + + /// + /// Key pair (RSA blob) Value Identifier, to refer inside resource text file. + /// + private const string KeyPairIdentifier = @"KEYPAIR"; + + /// + /// Key pair (RSA blob) Value Identifier, to refer inside resource text file. + /// + private const string PfxIdentifier = @"PFX"; + + /// + /// CEK plaintext Value Identifier, to refer inside resource text file. + /// + private const string PlaintextCekIdentifier = @"PLAINTEXT_CEK"; + + /// + /// CEK ciphertext Value Identifier, to refer inside resource text file. + /// + private const string CiphertextCekIdentifier = @"CIPHERTEXT_CEK"; + + /// + /// CEK plaintext Value Identifier, to refer inside resource text file. + /// + private const string HashedCekIdentifier = @"HASHED_CEK"; + + /// + /// CEK ciphertext Value Identifier, to refer inside resource text file. + /// + private const string SignedCekIdentifier = @"SIGNED_CEK"; + + /// + /// CEK ciphertext Value Identifier, to refer inside resource text file. + /// + private const string PathCekIdentifier = @"PATH_CEK"; + + /// + /// CEK ciphertext Value Identifier, to refer inside resource text file. + /// + private const string FinalcellCekIdentifier = @"FINALCELL_CEK"; + + + /// + /// Resource Data. + /// + private static readonly string m_resource = "TCECryptoNativeBaseline.txt"; + + /// + /// Resource Data for RSA test vectors. + /// + private static readonly string m_resource_rsa = "TCECryptoNativeBaselineRsa.txt"; + + + /// + /// Resource Data. + /// + private static readonly string m_resource_data = File.ReadAllText(m_resource, Encoding.UTF8); + + /// + /// Resource Data for RSA test vectors. + /// + private static readonly string m_resource_data_rsa = File.ReadAllText(m_resource_rsa, Encoding.UTF8); + + /// + /// Byte Data identifier regex, to search inside resource text file. + /// + private static readonly Regex regexdataIdentifier = new Regex(@"0x"); + + /// + /// Root Key Data identifier regex, to search inside resource text file. + /// + private static readonly Regex regexRootKeyIdentifier = new Regex(RootKeyIdentifier); + + /// + /// Plain text data identifier regex, to search inside resource text file. + /// + private static readonly Regex regexPlainTextIdentifier = new Regex(PlainTextIdentifier); + + /// + /// Encryption Type identifier regex, to search inside resource text file. + /// + private static readonly Regex regexEncryptionTypeIdentifier = new Regex(EncryptionTypeIdentifier); + + /// + /// Encryption Type Data identifier regex, to search inside resource text file. + /// + private static readonly Regex regexEncryptionTypeDataIdentifier = new Regex("[0-9]"); + + /// + /// Encryption Type Data identifier regex, to search inside resource text file. + /// + private static readonly Regex regexEncryptionTypeDataPath = new Regex("= [0-9a-zA-Z/]"); + + /// + /// Final Cell identifier regex, to search inside resource text file. + /// + private static readonly Regex regexFinalCellIdentifier = new Regex(FinalCellIdentifier); + + /// + /// Key pair (RSA blob) identifier regex, to search inside resource text file. + /// + private static readonly Regex regexKeyPairIdentifier = new Regex(KeyPairIdentifier); + + /// + /// Key pair (RSA blob) identifier regex, to search inside resource text file. + /// + private static readonly Regex regexPfxIdentifier = new Regex(PfxIdentifier); + + /// + /// Plaintext CEK identifier regex, to search inside resource text file. + /// + private static readonly Regex regexPlaintextCekIdentifier = new Regex(PlaintextCekIdentifier); + + /// + /// Ciphertext CEK identifier regex, to search inside resource text file. + /// + private static readonly Regex regexCiphertextCekIdentifier = new Regex(CiphertextCekIdentifier); + + /// + /// Ciphertext CEK identifier regex, to search inside resource text file. + /// + private static readonly Regex regexHashedCekIdentifier = new Regex(HashedCekIdentifier); + + /// + /// Ciphertext CEK identifier regex, to search inside resource text file. + /// + private static readonly Regex regexSignedCekIdentifier = new Regex(SignedCekIdentifier); + + /// + /// Ciphertext CEK identifier regex, to search inside resource text file. + /// + private static readonly Regex regexPathCekIdentifier = new Regex(PathCekIdentifier); + + /// + /// Ciphertext CEK identifier regex, to search inside resource text file. + /// + private static readonly Regex regexFinalcellCekCekIdentifier = new Regex(FinalcellCekIdentifier); + + /// + /// Parameter Data End identifier, to search inside resource text file. + /// + private static readonly Regex regexEndParameterIdentifier = new Regex(@"\r"); + + private readonly IList m_CryptoVectors; + + public IList CryptoVectors + { + get + { + return m_CryptoVectors; + } + } + + /// + /// Constructor. + /// + public CryptoNativeBaselineReader() + { + Debug.Assert(m_resource_data != null); + m_CryptoVectors = new List(); + } + + /// + /// Initialize crypto vectors. + /// + public void InitializeCryptoVectors() + { + InitializeCryptoVectors(CryptNativeTestVectorType.Aead); + } + + /// + /// Initialize crypto vectors. + /// + public void InitializeCryptoVectors(CryptNativeTestVectorType testVectorType) + { + switch( testVectorType ) + { + case CryptNativeTestVectorType.Aead: + InitializeCryptoVectorsAead(); + break; + case CryptNativeTestVectorType.Rsa: + InitializeCryptoVectorsRsa(); + break; + }; + } + + /// + /// Initialize crypto test vectors for AEAD tests + /// + private void InitializeCryptoVectorsAead() + { + int startIndex, resourceIndex = 0; + CryptoVector CryptoVector; + string rootKey, plainText, encryptionType, finalCellBlob; + bool extractResult = false; + + while (resourceIndex < m_resource_data.Length) + { + // 1 - Extract RootKey from the resource text file. + extractResult = ExtractCryptoParameter(m_resource_data, regexRootKeyIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(!extractResult || resourceIndex >= startIndex); + + // If input data is over, break. + if (!extractResult) + { + break; + } + + rootKey = m_resource_data.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(rootKey)); + + // 2 - Extract Plain Text from the resource text file. + extractResult = ExtractCryptoParameter(m_resource_data, regexPlainTextIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(extractResult && resourceIndex >= startIndex); + + plainText = m_resource_data.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(plainText)); + + // 3 - Extract Test Encryption Type from the resource text file. + extractResult = ExtractCryptoParameter(m_resource_data, regexEncryptionTypeIdentifier, regexEncryptionTypeDataIdentifier, regexEndParameterIdentifier, 0, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(extractResult && resourceIndex >= startIndex); + + encryptionType = m_resource_data.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(plainText)); + + // 4 - Extract Final Cell Value from the resource text file. + extractResult = ExtractCryptoParameter(m_resource_data, regexFinalCellIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(extractResult && resourceIndex >= startIndex); + + finalCellBlob = m_resource_data.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(finalCellBlob)); + + // 5 - Instantiate a new crypto vector with these parameters and add it to the vector list. + CryptoVector = new CryptoVector(StringToByteArray(rootKey), StringToByteArray(plainText), StringToByteArray(finalCellBlob), (CryptoVectorEncryptionType)Enum.Parse(typeof(CryptoVectorEncryptionType), encryptionType, ignoreCase: true)); + + m_CryptoVectors.Add(CryptoVector); + } + } + + /// + /// Initialize RSA test vector data + /// + private void InitializeCryptoVectorsRsa() + { + int startIndex, resourceIndex = 0; + CryptoVector CryptoVector; + string keyPair, plaintextCek, ciphertextCek, hashedCek, signedCek, pathCek, finalcellCek; + bool extractResult = false; + + // 1 - Extract RSA Key pair from the resource text file. + extractResult = ExtractCryptoParameter(m_resource_data_rsa, regexKeyPairIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(!extractResult || resourceIndex >= startIndex); + + // If input data is over, break. + if (!extractResult) + { + return; + } + + keyPair = m_resource_data_rsa.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(keyPair)); + + CryptoVector = new CryptoVector(StringToByteArray(keyPair), CryptNativeTestVectorType.RsaKeyPair); + m_CryptoVectors.Add(CryptoVector); + + // 1a - Extract a matching PFX from the resource text file. + extractResult = ExtractCryptoParameter(m_resource_data_rsa, regexPfxIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(!extractResult || resourceIndex >= startIndex); + + // If input data is over, break. + if (!extractResult) + { + return; + } + + string pfx = m_resource_data_rsa.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(keyPair)); + + CryptoVector = new CryptoVector(StringToByteArray(pfx), CryptNativeTestVectorType.RsaPfx); + m_CryptoVectors.Add(CryptoVector); + + while (resourceIndex < m_resource_data.Length) + { + // 2 - Extract Plain Text & ciphertext from the resource text file. + extractResult = ExtractCryptoParameter(m_resource_data_rsa, regexPlaintextCekIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + if (!extractResult) + { + break; + } + + Debug.Assert(extractResult && resourceIndex >= startIndex); + + plaintextCek = m_resource_data_rsa.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(plaintextCek)); + + extractResult = ExtractCryptoParameter(m_resource_data_rsa, regexCiphertextCekIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(extractResult && resourceIndex >= startIndex); + + ciphertextCek = m_resource_data_rsa.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(ciphertextCek)); + + extractResult = ExtractCryptoParameter(m_resource_data_rsa, regexPathCekIdentifier, regexEncryptionTypeDataPath, regexEndParameterIdentifier, 0, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(extractResult && resourceIndex >= startIndex); + + pathCek = m_resource_data_rsa.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(pathCek)); + + extractResult = ExtractCryptoParameter(m_resource_data_rsa, regexHashedCekIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(extractResult && resourceIndex >= startIndex); + + hashedCek = m_resource_data_rsa.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(hashedCek)); + + extractResult = ExtractCryptoParameter(m_resource_data_rsa, regexSignedCekIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(extractResult && resourceIndex >= startIndex); + + signedCek = m_resource_data_rsa.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(signedCek)); + + extractResult = ExtractCryptoParameter(m_resource_data_rsa, regexFinalcellCekCekIdentifier, regexdataIdentifier, regexEndParameterIdentifier, 2, resourceIndex, out startIndex, out resourceIndex); + Debug.Assert(extractResult && resourceIndex >= startIndex); + + finalcellCek = m_resource_data_rsa.Substring(startIndex, resourceIndex - startIndex); + Debug.Assert(!string.IsNullOrWhiteSpace(signedCek)); + + // 3 - Instantiate a new crypto vector with these parameters and add it to the vector list. + CryptoVector = new CryptoVector( + StringToByteArray(plaintextCek) + , StringToByteArray(ciphertextCek) + , StringToByteArray(hashedCek) + , StringToByteArray(signedCek) + , pathCek.Substring(2) + , StringToByteArray(finalcellCek)); + + m_CryptoVectors.Add(CryptoVector); + } + } + + /// + /// Extract the crypto properties.Tries to match regex1 followed by regex2 followed by regex3. + /// + /// + /// + /// + /// + /// + /// + /// + /// + private bool ExtractCryptoParameter(string input, Regex regex1, Regex regex2, Regex regex3, int dataPadding, int startIndex, out int outputStartIndex, out int runningIndex) + { + outputStartIndex = 0; + runningIndex = 0; + + // Match regex1, regex2, regex3 in that order. + // If regex1 match was not successful, then return false to indicate completion of parsing most likely. + Match regexMatch = regex1.Match(input, startIndex); + if (!regexMatch.Success) + { + return false; + } + + runningIndex = regexMatch.Index; + + regexMatch = regex2.Match(input, runningIndex); + Debug.Assert(regexMatch.Success); + + outputStartIndex = regexMatch.Index + dataPadding; + runningIndex = regexMatch.Index + dataPadding; + + regexMatch = regex3.Match(input, runningIndex); + Debug.Assert(regexMatch.Success); + + // The final index is passed back to caller so it know where to start next. + runningIndex = regexMatch.Index; + + return true; + } + + internal static byte[] StringToByteArray(string hex) + { + Debug.Assert(!string.IsNullOrWhiteSpace(hex)); + return Enumerable.Range(0, hex.Length) + .Where(x => x % 2 == 0) + .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) + .ToArray(); + } + } +} diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CryptoVector.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CryptoVector.cs new file mode 100644 index 0000000000..47e328c5af --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CryptoVector.cs @@ -0,0 +1,281 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted.Setup +{ + /// + /// Encryption Type as per the test code. Different than product code's enumeration. + /// + internal enum CryptoVectorEncryptionType + { + /// + /// Randomized. + /// + Randomized = 2, + + /// + /// Deterministic + /// + Deterministic = 3, + } + + /// + /// Native test vector type + /// + internal enum CryptNativeTestVectorType + { + /// + /// An AEAD (symmetric) test vector value + /// + Aead, + /// + /// An RSA (CEK encrypted by CMK) test vector value + /// + Rsa, + /// + /// Special case of RSA test vector, which holds a key pair + /// + RsaKeyPair, + /// + /// Special case of RSA test vector, which holds a PFX, password = @"P@zzw0rD!SqlvN3x+" + /// + RsaPfx, + } + + /// + /// Represents crypto related parameters to use in testing. + /// + internal class CryptoVector + { + /// + /// Root Key. + /// + private readonly byte[] m_blob0; + + /// + /// Plain Text. + /// + private readonly byte[] m_blob1; + + /// + /// Final Encrypted Cell Value. + /// + private readonly byte[] m_blob2; + + /// + /// Generic Blob3 + /// + private readonly byte[] m_blob3; + + /// + /// Generic Blob4 + /// + private readonly byte[] m_blob4; + + /// + /// Generic String data 0 + /// + private readonly string m_string0; + + /// + /// Test Encryption Type - Is different from product mapped Encryption Type. + /// + private readonly CryptoVectorEncryptionType m_cryptoVectorEncryptionType; + + /// + /// Defineds the test vector type. + /// + private readonly CryptNativeTestVectorType m_CryptNativeTestVectorType; + + /// + /// Return the root key. + /// + public byte[] RootKey + { + get + { + return m_blob0; + } + } + + /// + /// Return the plain text. + /// + public byte[] PlainText + { + get + { + return m_blob1; + } + } + + /// + /// Return the final cell. + /// + public byte[] FinalCell + { + get + { + return m_blob2; + } + } + + /// + /// Plaintext CEK + /// + public byte[] PlaintextCek + { + get + { + return m_blob0; + } + } + + /// + /// Ciphertext CEK + /// + public byte[] CiphertextCek + { + get + { + return m_blob1; + } + } + + //Precalculated hashed CEK + public byte[] HashedCek + { + get + { + return m_blob2; + } + } + + /// + /// Precalculated Signed CEK blob + /// + public byte[] SignedCek + { + get + { + return m_blob3; + } + } + + /// + /// Precalculated final cell CEK + /// + public byte[] FinalcellCek + { + get + { + return m_blob4; + } + } + + /// + /// RSA key pair + /// + public byte[] RsaKeyPair + { + get + { + return m_blob0; + } + } + + /// + /// Return the test crypto vector encryption type. + /// + public CryptoVectorEncryptionType CryptoVectorEncryptionTypeVal + { + get + { + return m_cryptoVectorEncryptionType; + } + } + + public CryptNativeTestVectorType CryptNativeTestVectorTypeVal + { + get + { + return m_CryptNativeTestVectorType; + } + } + + public string PathCek + { + get + { + return m_string0; + } + } + + /// + /// Constructor for AEAD. + /// + /// + /// + /// + /// + public CryptoVector(byte[] rootKey, byte[] plainText, byte[] finalCell, CryptoVectorEncryptionType cryptoVectorEncryptionType) + { + Debug.Assert(rootKey != null); + Debug.Assert(plainText != null); + Debug.Assert(finalCell != null); + + m_blob0 = rootKey; + m_blob1 = plainText; + m_blob2 = finalCell; + m_cryptoVectorEncryptionType = cryptoVectorEncryptionType; + m_CryptNativeTestVectorType = CryptNativeTestVectorType.Aead; + m_string0 = null; + m_blob3 = null; + m_blob4 = null; + } + + /// + /// Constructor for RSA test vector + /// + /// + /// + public CryptoVector(byte[] plaintextCek, byte[] ciphertextCek, byte[] hashedCek, byte[] signedCek, string pathCek, byte[] finalcellCek) + { + Debug.Assert(plaintextCek != null); + Debug.Assert(ciphertextCek != null); + Debug.Assert(hashedCek != null); + Debug.Assert(signedCek != null); + + m_blob0 = plaintextCek; + m_blob1 = ciphertextCek; + m_blob2 = hashedCek; + m_blob3 = signedCek; + m_blob4 = finalcellCek; + m_string0 = pathCek; + m_cryptoVectorEncryptionType = CryptoVectorEncryptionType.Randomized; + m_CryptNativeTestVectorType = CryptNativeTestVectorType.Rsa; + } + + /// + /// Constructor for RSA Key pair (special case for RSA) + /// + /// + public CryptoVector(byte[] rsaKeyPair, CryptNativeTestVectorType cryptNativeTestVectorType) + { + Debug.Assert(rsaKeyPair != null); + + m_blob0 = rsaKeyPair; + m_blob1 = null; + m_blob2 = null; + m_blob3 = null; + m_blob4 = null; + m_cryptoVectorEncryptionType = CryptoVectorEncryptionType.Randomized; + m_CryptNativeTestVectorType = cryptNativeTestVectorType; + m_string0 = null; + } + } +} diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/TCECryptoNativeBaseline.txt b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/TCECryptoNativeBaseline.txt new file mode 100644 index 0000000000..dfd0490d0c --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/TCECryptoNativeBaseline.txt @@ -0,0 +1,434 @@ +---------------------------------------------------- +[KEYPAIR] = 0x +---------------------------------------------------- +---------------------------------------------------- +[PLAINTEXT_CEK] = 0x +[CIPHERTEXT_CEK] = 0x +[CIPHERTEXT_LEN] = 0 +---------------------------------------------------- +---------------------------------------------------- +[PLAINTEXT_CEK] = 0x +[CIPHERTEXT_CEK] = 0x +[CIPHERTEXT_LEN] = 0 +---------------------------------------------------- +---------------------------------------------------- +[PLAINTEXT_CEK] = 0x +[CIPHERTEXT_CEK] = 0x +[CIPHERTEXT_LEN] = 0 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0xa6 +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = 0x64af2934fc407babb6cce2aa51bbbbb0aa095cacad7fc542fcc0cee9f3f0e385 +[ENC_TYPE] = 3 +[IV] = 0xb84bb3384f45d1cf28dcc036dca7da5a +[CIPHERTEXT] = 0x2c37ae2e5345ba7aa745d987e5c30b34 +[TAG] = 0x0429a42011dea1a2b5c21442ff80f8a57be99dcaa79d19a80b17d4232c626ac4 +[FINAL_CELL] = 0x010429a42011dea1a2b5c21442ff80f8a57be99dcaa79d19a80b17d4232c626ac4b84bb3384f45d1cf28dcc036dca7da5a2c37ae2e5345ba7aa745d987e5c30b34 +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x01000000 +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = 0x64af2934fc407babb6cce2aa51bbbbb0aa095cacad7fc542fcc0cee9f3f0e385 +[ENC_TYPE] = 3 +[IV] = 0xd5d46d03c0d49beb7ec0945212c12df3 +[CIPHERTEXT] = 0x683e03f9923d675cc1f98251eb94d77c +[TAG] = 0xc46c9847a3e51ab1de07c74025bc74c9b8810d6eed73a92596ceead22f964c7f +[FINAL_CELL] = 0x01c46c9847a3e51ab1de07c74025bc74c9b8810d6eed73a92596ceead22f964c7fd5d46d03c0d49beb7ec0945212c12df3683e03f9923d675cc1f98251eb94d77c +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x0001020304050607 +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = 0x64af2934fc407babb6cce2aa51bbbbb0aa095cacad7fc542fcc0cee9f3f0e385 +[ENC_TYPE] = 3 +[IV] = 0x142a2a0488212dbbca0e4d56203df877 +[CIPHERTEXT] = 0x0c0ed63d9b40566dc2b5ce338daeb1ff +[TAG] = 0xb15efa6ea52a3e631f7f8de403ffbe093e68a347633d09e82392cc7e11b0a367 +[FINAL_CELL] = 0x01b15efa6ea52a3e631f7f8de403ffbe093e68a347633d09e82392cc7e11b0a367142a2a0488212dbbca0e4d56203df8770c0ed63d9b40566dc2b5ce338daeb1ff +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = 0x64af2934fc407babb6cce2aa51bbbbb0aa095cacad7fc542fcc0cee9f3f0e385 +[ENC_TYPE] = 3 +[IV] = 0x633d09f3e958c98dbc470bad07589d26 +[CIPHERTEXT] = 0xda91dbd9c188e3301a23db20bc17056905307cfdbdc01ac812f40616b04f0837 +[TAG] = 0x11f5deca1e5f30075fea466769c785a79ce533ea9202f54334c041fd4745e488 +[FINAL_CELL] = 0x0111f5deca1e5f30075fea466769c785a79ce533ea9202f54334c041fd4745e488633d09f3e958c98dbc470bad07589d26da91dbd9c188e3301a23db20bc17056905307cfdbdc01ac812f40616b04f0837 +[FINAL_CB] = 81 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = 0x64af2934fc407babb6cce2aa51bbbbb0aa095cacad7fc542fcc0cee9f3f0e385 +[ENC_TYPE] = 3 +[IV] = 0xbbf0017c8f8c15853640fbbfc48bccc3 +[CIPHERTEXT] = 0x1fcec55af204d04d270b67a3c85b8fad57def617863631df032e74c97df257e59c61a56c1718565990cf5322f06a7770 +[TAG] = 0x4459450fbb5fa64bdd353230bec27313688cbe2e9ea076ccce5eda30061230c9 +[FINAL_CELL] = 0x014459450fbb5fa64bdd353230bec27313688cbe2e9ea076ccce5eda30061230c9bbf0017c8f8c15853640fbbfc48bccc31fcec55af204d04d270b67a3c85b8fad57def617863631df032e74c97df257e59c61a56c1718565990cf5322f06a7770 +[FINAL_CB] = 97 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627 +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = 0x64af2934fc407babb6cce2aa51bbbbb0aa095cacad7fc542fcc0cee9f3f0e385 +[ENC_TYPE] = 3 +[IV] = 0x4ec68167d5da189cf54e787771fbeb4c +[CIPHERTEXT] = 0xdf7230136bf75a505f66b64ea780325403729c241496ab3736681249be5a0619857e2dfa0e1c4fbfae55feb101166ceb +[TAG] = 0x2354b8cd3fc361c05f7b636be7902e0a58754b9b18fdc41db4689a09babcb8c9 +[FINAL_CELL] = 0x012354b8cd3fc361c05f7b636be7902e0a58754b9b18fdc41db4689a09babcb8c94ec68167d5da189cf54e787771fbeb4cdf7230136bf75a505f66b64ea780325403729c241496ab3736681249be5a0619857e2dfa0e1c4fbfae55feb101166ceb +[FINAL_CB] = 97 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = 0x64af2934fc407babb6cce2aa51bbbbb0aa095cacad7fc542fcc0cee9f3f0e385 +[ENC_TYPE] = 3 +[IV] = 0x460d680b314f81455d32ea89c13fe0d3 +[CIPHERTEXT] = 0xb6756fbd247cc63074fd48994bc236add09a1d9789c0a541573f5f140344c9a13c567a877a72cf94f4cacbf292208b5aff3c63f4faa12f2b7302c21e536315f5b0520deb37f716d478ce5d8995657a80c5d4df63a4c3f572756ff97319503e9993518ef854ef7366699537e2767e04e461944dd827bec11f684b7608b34691b407a7e58dae80c3942e5350071d5de05b1fc6b250b1522d7d1a8927b954b51f944d4c13df8f80b92bed98ded11719e9f04a086fdc25fb3c17ddea49e802810f4cfa4244cd020109053820106718ba8c5b0bfbbb2e7ca9295322c917c67ba503a9fc095b36ec877da034e685fb556a18bacdba76d8b0e8f7ad7081f68179e27716fdbcc9ea54d3151f5e636e2820021bdb2ac75704979eec9c16ecf30ff59678f956d5f6d15fc5e5345ac19e783adef37e460f182608436c9feaeb98c3d548f372005210d9fca412e79ccee087c3bba8882f9438c779d36a91404386fdf2057dd23f37e5ab421cd9bb669495aa744a77797191d7448bb625adf25d6ccb2eadf06c836a7db6e29d3ad4d743c3e4af073bbfaefca78186b0e5cea19f180301ac17ab295c86d7e4407cf5effba96c9694327e715ee773d643b0f3111c7e86f5b47b1d595fe20ed110908b192f0ec8ad6017a8c244eb735449d3a8fa7c1cc3ce2d42373b8c673dfa058b3fa08497964ad8fad429559eba78b5210ac8adf71105b149668028e4961d3f741d92a907c47ec7d7d02212f742a85e1f008c5d9bb88101eca2daa67460ba7e501694c8c3a4991e540d17a3403f09543ba01245e88b4b84d43f4aa04f218e7bfe9a5463efd4cdcfa159eff4943674e6c21cb1e97a94ae94a0bf3b748352ead04fdd912bacafe43305a76c615366127f206bd8b3c91f9104d1ce8b1cf088ed304434e57d5583d05a55313101356f1e3a6e7306e0ce5a211c2a8ddd6226d5362e655b47f5c567817cac313866ad24196f10d92f1205298fa346d3e940f4a96d6b13d0793234fd68f72ec46d4007b9809577cfbd04efa8a693ffdde131b8ffd31fa1167d70187c653e7e322714e718cc27bdeac23bab31c7ee7f31d54124aa79f145e40ed1619f29b377bbc8b27addfff93f5eea746bff5552d9449b14dc4745e0d94df5d154cb5ed53b38620d53b677017ee1474e425f0b972c5bce18305da9f8736f3b06d4a2949937f5dabf778bf9128dd72fca9594b36547f2154b96ee7d5905ca706f92087d6e760de71e0b9f1b2d8de991b85246da7d3e3dff35f7ff3f51944a11d3daa06f6e381acace5da5cc7d207ab2a4e78dcc40fa4cde6cfe3420d00323d008164e11e0ad4b896abfa8436472c4e0cc9d19ba86998eeb07c29f5554bb64086fd74605893fd1999d84fe651077df991cdb8cd88eddef9a0840ff611ceefb281920f0fad81dbf22e7a7312af88c4fc947d12455f84154eb1d4f54598331cd9867ae0276aa3f0c96b215378355067673e063aaa89df66dd6442a93587a137d8bbbee9ffc5f4f4ae2ab23efca91544d9bd9fcd7e823420763847922d0cab8c1cd1affe867e76d8af10ce5d85832b1959454bf62b294ab24fcd2a9ebf38cb4f47b19ae4bd76283d9058d27974318b832d578a60f0b1bd9f84c5eb68303d20fcb56aea1388bb9ac1b66c9290f0de6857a9622f11dc5e26623a10d8e9333a50002ee5df4df9c462abbd64fc63a45e561f5c0b03ac1a5baef1767b29eb3ad23db6bf4bd84881d8a1f11e05072160c77895c69d4374948e4e069ad2a354b2d248d6c2096033539b09500a39da7ecf876772784360d0a481a92c186096cec9814c13b9ea3627be19ecf336428152aa21246bf35a80e8c0f4d29609e693c9190da426d33e174968297b18f7924923443b10b105d88571d3ac1ab5b3c1a33b060e695bd0017c7d6152698d38a73f4ee74b8bc2c34e78a55bf7051d70e9f9ec99fe8eecfc32d183e833a85d9e83587684931eddf2a7aede2481cea56459185201bbd3197c09a3930728cc5df5b2985249926e1a0bb570c289210bc88f0b615142756a7e1fced2d2371336bb581240461c3a1dcd8db865d72adfdd155c8ed6e19f14e32c074010187cf2f69a081afec754e137bdf3b47ec28b0d942c683785d57bc6439067996719051f91bf446ae95f3b16bf66df6621f3ecfc25f90756b3eb4084dbf7ad3ae0a407f43f834cbc2ff1a89686c38d1576e45d0b7219883eac63368d3c524204e0cfd0dede82c43856667bd332edb3ab8362cff5f05d0b4dad66feb6361df458d63e7d31fa8ba207b27868157e5c34fc150d32b5865fde49b9b98b4a896a960e880c9bc841ba6d4de4fb2eac37ad400c9e08465189d15655abdf9a6f95d38c3a4bd27419c8b8dba95846ffa105bea440c09a010410dcb71f033b0cc4fb9bc2e515c89617078a925a6489b4581964100417e9df678191c992b6dae98c7230c017188f62b2220103e372404a51cca9d15d7aa03ab2015b4822ea5b1048843795e4499d2c56306d92072fc08c6ea67741fce179adc6fa8978bbc7bf64a638844860fd4afe050b998912dd696fabc09650863ff330b326f529184e99ac991043d588cf7b4e496b105000e843b3666b558676f49994d53b8a84dc3fa5f7b4761cc985b06e789aad6fd401812ae28a5d34c8ef357c31881b5c8ac5dc05d1a817cc97792540da38e3ba1c88db6674fda97d4530eb3974514bdca9c00069976ac467987898e570606940c4dbe7cfe67525c5d734a9188b48ed86f79b009e5c7b31e283f3021f64916ec6a8d322906b35aea7433c3d90ddd0a7e91a250168eedc2a943ebb49b4f6da0350d2caf74b199fedd45be85eada96b47d3ba526e7b19cfeedf9ef5d6cc38e143e80dd061b95e04f82e52c1b08243973e18e2f6d845f68681f53964c2ae353483ead +[TAG] = 0x2cb78100f342a857b967f8de488616f872e4aa854ced985c41b37ed7d6c759e1 +[FINAL_CELL] = 0x012cb78100f342a857b967f8de488616f872e4aa854ced985c41b37ed7d6c759e1460d680b314f81455d32ea89c13fe0d3b6756fbd247cc63074fd48994bc236add09a1d9789c0a541573f5f140344c9a13c567a877a72cf94f4cacbf292208b5aff3c63f4faa12f2b7302c21e536315f5b0520deb37f716d478ce5d8995657a80c5d4df63a4c3f572756ff97319503e9993518ef854ef7366699537e2767e04e461944dd827bec11f684b7608b34691b407a7e58dae80c3942e5350071d5de05b1fc6b250b1522d7d1a8927b954b51f944d4c13df8f80b92bed98ded11719e9f04a086fdc25fb3c17ddea49e802810f4cfa4244cd020109053820106718ba8c5b0bfbbb2e7ca9295322c917c67ba503a9fc095b36ec877da034e685fb556a18bacdba76d8b0e8f7ad7081f68179e27716fdbcc9ea54d3151f5e636e2820021bdb2ac75704979eec9c16ecf30ff59678f956d5f6d15fc5e5345ac19e783adef37e460f182608436c9feaeb98c3d548f372005210d9fca412e79ccee087c3bba8882f9438c779d36a91404386fdf2057dd23f37e5ab421cd9bb669495aa744a77797191d7448bb625adf25d6ccb2eadf06c836a7db6e29d3ad4d743c3e4af073bbfaefca78186b0e5cea19f180301ac17ab295c86d7e4407cf5effba96c9694327e715ee773d643b0f3111c7e86f5b47b1d595fe20ed110908b192f0ec8ad6017a8c244eb735449d3a8fa7c1cc3ce2d42373b8c673dfa058b3fa08497964ad8fad429559eba78b5210ac8adf71105b149668028e4961d3f741d92a907c47ec7d7d02212f742a85e1f008c5d9bb88101eca2daa67460ba7e501694c8c3a4991e540d17a3403f09543ba01245e88b4b84d43f4aa04f218e7bfe9a5463efd4cdcfa159eff4943674e6c21cb1e97a94ae94a0bf3b748352ead04fdd912bacafe43305a76c615366127f206bd8b3c91f9104d1ce8b1cf088ed304434e57d5583d05a55313101356f1e3a6e7306e0ce5a211c2a8ddd6226d5362e655b47f5c567817cac313866ad24196f10d92f1205298fa346d3e940f4a96d6b13d0793234fd68f72ec46d4007b9809577cfbd04efa8a693ffdde131b8ffd31fa1167d70187c653e7e322714e718cc27bdeac23bab31c7ee7f31d54124aa79f145e40ed1619f29b377bbc8b27addfff93f5eea746bff5552d9449b14dc4745e0d94df5d154cb5ed53b38620d53b677017ee1474e425f0b972c5bce18305da9f8736f3b06d4a2949937f5dabf778bf9128dd72fca9594b36547f2154b96ee7d5905ca706f92087d6e760de71e0b9f1b2d8de991b85246da7d3e3dff35f7ff3f51944a11d3daa06f6e381acace5da5cc7d207ab2a4e78dcc40fa4cde6cfe3420d00323d008164e11e0ad4b896abfa8436472c4e0cc9d19ba86998eeb07c29f5554bb64086fd74605893fd1999d84fe651077df991cdb8cd88eddef9a0840ff611ceefb281920f0fad81dbf22e7a7312af88c4fc947d12455f84154eb1d4f54598331cd9867ae0276aa3f0c96b215378355067673e063aaa89df66dd6442a93587a137d8bbbee9ffc5f4f4ae2ab23efca91544d9bd9fcd7e823420763847922d0cab8c1cd1affe867e76d8af10ce5d85832b1959454bf62b294ab24fcd2a9ebf38cb4f47b19ae4bd76283d9058d27974318b832d578a60f0b1bd9f84c5eb68303d20fcb56aea1388bb9ac1b66c9290f0de6857a9622f11dc5e26623a10d8e9333a50002ee5df4df9c462abbd64fc63a45e561f5c0b03ac1a5baef1767b29eb3ad23db6bf4bd84881d8a1f11e05072160c77895c69d4374948e4e069ad2a354b2d248d6c2096033539b09500a39da7ecf876772784360d0a481a92c186096cec9814c13b9ea3627be19ecf336428152aa21246bf35a80e8c0f4d29609e693c9190da426d33e174968297b18f7924923443b10b105d88571d3ac1ab5b3c1a33b060e695bd0017c7d6152698d38a73f4ee74b8bc2c34e78a55bf7051d70e9f9ec99fe8eecfc32d183e833a85d9e83587684931eddf2a7aede2481cea56459185201bbd3197c09a3930728cc5df5b2985249926e1a0bb570c289210bc88f0b615142756a7e1fced2d2371336bb581240461c3a1dcd8db865d72adfdd155c8ed6e19f14e32c074010187cf2f69a081afec754e137bdf3b47ec28b0d942c683785d57bc6439067996719051f91bf446ae95f3b16bf66df6621f3ecfc25f90756b3eb4084dbf7ad3ae0a407f43f834cbc2ff1a89686c38d1576e45d0b7219883eac63368d3c524204e0cfd0dede82c43856667bd332edb3ab8362cff5f05d0b4dad66feb6361df458d63e7d31fa8ba207b27868157e5c34fc150d32b5865fde49b9b98b4a896a960e880c9bc841ba6d4de4fb2eac37ad400c9e08465189d15655abdf9a6f95d38c3a4bd27419c8b8dba95846ffa105bea440c09a010410dcb71f033b0cc4fb9bc2e515c89617078a925a6489b4581964100417e9df678191c992b6dae98c7230c017188f62b2220103e372404a51cca9d15d7aa03ab2015b4822ea5b1048843795e4499d2c56306d92072fc08c6ea67741fce179adc6fa8978bbc7bf64a638844860fd4afe050b998912dd696fabc09650863ff330b326f529184e99ac991043d588cf7b4e496b105000e843b3666b558676f49994d53b8a84dc3fa5f7b4761cc985b06e789aad6fd401812ae28a5d34c8ef357c31881b5c8ac5dc05d1a817cc97792540da38e3ba1c88db6674fda97d4530eb3974514bdca9c00069976ac467987898e570606940c4dbe7cfe67525c5d734a9188b48ed86f79b009e5c7b31e283f3021f64916ec6a8d322906b35aea7433c3d90ddd0a7e91a250168eedc2a943ebb49b4f6da0350d2caf74b199fedd45be85eada96b47d3ba526e7b19cfeedf9ef5d6cc38e143e80dd061b95e04f82e52c1b08243973e18e2f6d845f68681f53964c2ae353483ead +[FINAL_CB] = 2113 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = 0x64af2934fc407babb6cce2aa51bbbbb0aa095cacad7fc542fcc0cee9f3f0e385 +[ENC_TYPE] = 3 +[IV] = 0x5d454d738151b1b91bad047d994c87cc +[CIPHERTEXT] = 0x6ca97c611321f2afe65ec4a69fec195ce2e021394237d360ed5438c64ee1c34b523a94a684f52c69ae856a94b2f3dd047932ec2c4c038354fae776f37c70f24f2873389acd95843b0d4b3a48c30b87cc1a6441e64ea2d164c0ea0e0461a82c180e582371ebfc3a7b5c43994e222dc5c66f15702aa451460c505675658a302e02ff80bca819d595e4365e5b82afb777fabae77cfa3ab083d0b4bd6aadf4ee5d579def4591edd21f838431330dfb93d1ee37dd08d0de6db9f009bc04eae27710b019a5b2144c8e8435ad4d7d92744c50016bc755032974c08323da2b6a30bf779c3b8b1a87d3ef7f52e5d8af66bccc309b4660a686682962d47020ee6bfe6e9ab330d3995bb58978cfc6c3d7d21b6c41843fcee0cf712ec71afd59cf91380e44bebed765a5d8f4be5429e4e89fd6f80f90a62d4dbd01a94205e82b3f2b7fc3682b39188dbf010d27616c305721e5c5b78e7ff9d23bd4448ed15f9c7773b1dfc58257b86aee5e24a2274faa4563c98bbc8bf0c400e1766d959c3582b0b26eab59020cab5f3601cf43ab11d5ec99dfa4802c7d385a90bd57df8eeb308067158ef7ee1586419d2436ba482066d67969e64b9b9848f434e1c100f95ec50717fd5dc0c8d14eb49c2919f38609dded60229c9475fea51ac1a98fabfb24dd32fe5df9389a058c89f1d41cffed4137e31c04fa18d3b915ba7cd9954d6ac1a42a0321b266a9941c333b8f458885f3e6972b701603796fbc0005a403231ed97aeaa7d6528ab52141727680aded97b8b2e4ac66a0d32833b2d336d7a271e6e0693955eb0886021901922fb420dae0d05e7b1a28fefdca20f93978acd6aea7d3b6f4a894d3ec188193180b1789d60aa567383579ffb76a059fef671acf81d6e2c3de1f86d7252407d5d0619cd3a7da93a9763a73500d0e6de39337393db9147e2a48a453a7ae440a92b72812148847dd450075be9a9cf6dbafa9ad2cfd9fae1655f060da2cb4690dcacf9d9fa51c9c89ccdf97f489bd9e01447f98a6b3db3aeeea143932501a9649b28e0ee555119e9176f7f76bf758de7aa32c1490ee96c3250d784f7cfbf20a7338a373739c5b1a8678cdcd34718e0edaadb005e928d0566aff89ad42f28b87196c1bd464a18c455cf286b1c49b292b811bf7f86585e623edca2498c73f728496ae778026411e867b4c9fc4bbbe8649aa411d7aa61915fa15a53defb69170ccaef8a05e8ebfe1cc7e3cf4893b0061e61bdf32a39f1dfd5fb4b13df98e0dfb5ce7e76d8fc476f8b364e094ecd9fd0d0caa5df7c5d96bb60c4b08afb7c951e153e0a8ecd4dd3b2c80af31a13cd135192c82c1bcf782fa1dc37488614f2454bdf9ae3c9330ffd05d3f083c748310d9d89fc70c96e614d21e54a4b78c86abbb1605a1d84cc7c6e4352efe825ecee5c011cbd16fb4efa070dfb3777537be2f2e640733a97edda581374002d2eec0136982f50b475d1b71c987a04c9039644072480860be4f3b5cc127b1b658fbfbbd59b6c7e0f3aad99c203baaf6af50efed54f6d68a68e6821bc3bd120fd25b936a4ec7196a2470895bb10e72488ba91d45f700b86e06bfe619b7544ecc2eee622fb7e4bf9c679403b900c1c38f5aa3a817aee8a89af1ac24739c12073cac870362068997d93c9d7bd1ddb95e498cd8ce0f415cea0f177c61b61ecd71ec144d3a5e1a4e8ee1e6b2681e0d60c5cecc994b358a426bdba6b910e6b6850690986389a4b0b1b34ed84252078bc0f759ca43fefb9f248228128d89c79c8a26908d9164808dbc141d905af69df114609615a661a23b3541e797f724cbf6fb648699d27341fdb6c04b8b82f0881d39cea1a6ce9b2cf9fa5ebb879b3b929bfffdfe6d06b6c1ab463e09b1c3b8a3bc27a389544cdedb434d76addb9f938b43fa7167e59a80e67766e7cc4123fe43897434c7cc026b300f341920d054ff2f6c44e090c2f5dd1ff996a75dd22392ef5a502da33951a6c3e9710e9163fce9fb43a392d22953b74504295d70c5df5d0e8de35e64b5309bc4d102bd15d6e746d61b27e5637f50321fec8f73440fa72ffafaaf3f2d4859b5f09ab22f0089338eeeeca4c958d0a8385c01148ac1ff2a7c95704951ecef9f30c82ed57e248147c63b60ace74ea55f99accc9787ef526ff9da7e780b688a9fa75c4e70f9c771e212f2eeb281b5aea24698b696eccc3de5815a4eae583bdb51ca67df17cfde511ca923c54a1b1030269b875f2e2426a94ddf24b2af7b0896e0d51968e0ae5e20b3d5431cf2008f0a7f4d6b59ba7313052a6e78c2bdfee0c9ba169b999f4b1d5cd48ce11519cd7a1ff2cba17ba6069daf88ee76b57463ba4adfd71d2c05297f3a91ab3d6d82a82669a3bffb00fa011883373879cac91e9298bc9d583f5efe245dc75c9bc1c4a6f974a60358dc6c401a1d9240c951c79fcaf8c00d919540b7190f772656471874388918899384091b92aaf9a7b5acacf3df492f9512d58bede0849148a51e96f121596348f9f9c8f05197a3d793c7c49852f2c39560aa52dc4710e90413dcd19b12d3dc1a158f24f9616abdcbc4c21458e0041f3d6a32c2582df37390309201e27e8a29c64ac9efedf3d90339cb33d487ffccd34a29015accaae2b7450a2cd03362ffffad8dbc9570de8afbdef223498806fd5f2fe8ba8a4cf6ca91048581b1ede3d673c5822f3fd6f2c1c641c0b940141b6131fb3fe141cabfdf811bae7a49de6ea01aa75aa0f46b3b0f15f0ab8772063781a5eaaec593ec4f0b9431b7f40f7e0c8e188faf38e5110811bc87fe5b16477f7acfa19dffe4cd83ee46ca37e8201ecdad56fa22e521929801b4a0e03ce7368b64917a9e3ee7f515c1dac8df3145344eb8fc612eed7246fd38f0b630d5deafc28de0a26ef9346b86827e98d563e92bbd691280f5d1f2471f8264de2ee5a4e0aef2b05c42147e0a41a3a0e03abb8eed7beb3a58f1ac90db6315beb0e19f02d7b913c6a76fe0bc6cd86329c00739cb962b9517aa82a1752fac76b76e9db79448bd138e545c925cc325d5e36673ec559433cf27d15eb122fb17dfe1a83b3eb468a2f21f57e8e23d211988ec10daaafdff0b39b2c7c51a3f3c23081f89f291ff2f14326f9bd9321e6f9b7faaff29ca1df4333b3e475cf4e17993e368df809fd77e04fc112a48af168a50429317bf56f4bc584100cb0509a68baf3ffad3b9f63cedd457d49981188f7878836fa964b76acaf781028abd5b3fe543ffb5faffc5ae038a89546906d77048f50c0b5958fb2575edb37894eeb40064162b3ea8c8d7a19f1b3d8ff5409453ff5a399e4255bac5a2dfd285fbe3f670955d7408510c4aaafe320612adc590014d052ab8cd5c5a7bc11ba17b0bb9d4dc3d5295093faf4dd5eb834a8cc321bb2a97bc8a26b3b2148c87f025353e94fb56b48a3fedd1622412e603753e70527cffd1610507f2b1ec03d7c66f9f67c9c00bc863efc341fa7fc28f2a41c7c34166bbb48d537b493744eb47cc36de7333dc9d9510bc92a8d64c786caaf374e2f9c4eff60fa2c497ca4c0447024853d9fe8790c2c39ba9ee346d1ece5832de171c1469c821995314994e29369c264a414b0481b2098817bede2dbf64dbb868be8f68da3f9277574b6140064c8cf5e28d69b8186ec54db492774316e87fcf47f519540d357944830b8449876b57ef72cd089ab7a2106031e10fd5a2b3bcd0934dd37622769a7f0f37983b3bfa4142d70905f958775bdc7c5c574bdaad882f7e8065a544b8272d2290c278732accfc52b5042b8147b1b5f44c2dc89a53c6eaa17062483a793019481b336dfac59b8f81cee8abb1e992d6eb6045720700a04994136be5d810c8cd5d42ca73e554796bf342e024a8b7d3c99849b8f24cd6aeb7ab40d88ad488dac35a6c121dbf3694f5f76582632098507e2a3bd12e30de8f6a3e1c90db7a55565467061609cee6bd4a44e49ba0eac772aa886cdcb2ebf3d9510b2439846647309e54f4520d9d6f46ca0fe0dc36af1f6c84428f59b44b5b18055ce061a86aa2085fad102cf37150c62460bc7dd9c1373ecab26bd1a15a5f4f3db19e0dc9cedac8e9c619780047bf7d82462107a5e68834eb7818d1fe71122b55aa7880cc80f247078ab3eac382bd654c3e347ab6141a2654c75096c417ccd856d959d928464b9af0fb4595366fe1e645ff41e660b8db37fa2f9c01f3757d74c672957a26af1ea563a9b4967a9b0846b040a54733b702a7229269309742ec9b189cf986f45729ef16e354a4a42bceb1cc157d5305806617e30b79db99c98f07de4161774264d33f96b06ddca4200076ce3b3444a8915901c7720ced6246dc31dc8296246d9820bc500f68918516c6b84914f56af4ad08bb78a6f6eb1be3bcec7f58d3e7a3bca36a8a771ddfdf6b2f82e8787ed23a62ad0c0ed484bcb9f5f8b266bdf900aeb33ededfbefccdd80e855c41f24dc70d0955529d8a08e1fd93d3ec23edab252ae300165aee447caec70c8304cb5843b13b506a239ed2967f3b22ebeafbaef1e830f7ff122b22d5a0469b731d8aa9a722c43e3004e987783f4dd060a98b87773dde8ec3350e9b9d4439d0a7c8e674bc38d7ad47f9c71b136784654839560b4e6243005c021db2b8f9900f2b12415309d9926b12fffd6286708d148e1c6e4864b1eeb3ed8a93b1e2512660bde7f3b758b72496667210e06c81e961a9e098901b608658c34f1368d387441ca7b298bf48c9c5e07fc5d2f53dc81174ad4135a67002b6db040935fc743cbade24246445de142d6b4de1a7a83d9b876287c8f810d4fc3e2fd6b23f1deb3cacd19f1db38d6e114d85e668c67e653fa556100535775f8f2bd36d0f24aaadd3d479c616017f304d0294bd9cd3287662cdc87dfcb0f5d5d507f66485e4457b1a91870aacb104b05e03fe7f4147b028725fee5d2cd9cf28c2cb14a2a0556e79ebdac04f12f36c31ac050f5ae13542c217fc7c8311f8ec76d6468fd64e271cdac7a1d366089dcb45f085ef8b40b0e138186ad55ba72d679937ed9f62b08e1b64e90a7d46f22a29437d7f23f504f8e4401837346d63e6bf3e317017d197f088613bea45545cddc3629ae2570d93dc7c1df01c9a864e7208e4c246af83240baf7f57fa8b62ad72f0b66c165ef3b41958b7a66c765aed0f9e52bc6f5f113aa1ccad6c9db52ca79400feea1c31911f4edc48b73323792986a7e4238a02640dc16fec7b9b0320cde76966a8f0a5b1c03b85447844bda72c7fff45966cc36dc42ffd4e7995a6652718309fde331e5daf466ed2f38f5e715718b79d82d460ddb6cdcf6ade6ea34fb1c497622222e2b1092bff1f8f2f30efe35326ecf30a1cd9c285c65b1d8fe7a9929f1b83cc30104b132b3ffd65342d3f6cb529239f4295a551cce62e861470fca89ea58ffde5cdbb672c01ce7fad77aab0551faad646f75ba8b66de118b84c27ac8f6698fa02eff22e14cbdfa9f625abbb7ee359bc24d5a5d80126b0bd2c724e777e113b51b0a16a4349f3e99c378fca5ae1530c9bc90b +[TAG] = 0xb86cdcba0f15244a19a10470981ef813838f72557b67f02dcbf25697d4411c02 +[FINAL_CELL] = 0x01b86cdcba0f15244a19a10470981ef813838f72557b67f02dcbf25697d4411c025d454d738151b1b91bad047d994c87cc6ca97c611321f2afe65ec4a69fec195ce2e021394237d360ed5438c64ee1c34b523a94a684f52c69ae856a94b2f3dd047932ec2c4c038354fae776f37c70f24f2873389acd95843b0d4b3a48c30b87cc1a6441e64ea2d164c0ea0e0461a82c180e582371ebfc3a7b5c43994e222dc5c66f15702aa451460c505675658a302e02ff80bca819d595e4365e5b82afb777fabae77cfa3ab083d0b4bd6aadf4ee5d579def4591edd21f838431330dfb93d1ee37dd08d0de6db9f009bc04eae27710b019a5b2144c8e8435ad4d7d92744c50016bc755032974c08323da2b6a30bf779c3b8b1a87d3ef7f52e5d8af66bccc309b4660a686682962d47020ee6bfe6e9ab330d3995bb58978cfc6c3d7d21b6c41843fcee0cf712ec71afd59cf91380e44bebed765a5d8f4be5429e4e89fd6f80f90a62d4dbd01a94205e82b3f2b7fc3682b39188dbf010d27616c305721e5c5b78e7ff9d23bd4448ed15f9c7773b1dfc58257b86aee5e24a2274faa4563c98bbc8bf0c400e1766d959c3582b0b26eab59020cab5f3601cf43ab11d5ec99dfa4802c7d385a90bd57df8eeb308067158ef7ee1586419d2436ba482066d67969e64b9b9848f434e1c100f95ec50717fd5dc0c8d14eb49c2919f38609dded60229c9475fea51ac1a98fabfb24dd32fe5df9389a058c89f1d41cffed4137e31c04fa18d3b915ba7cd9954d6ac1a42a0321b266a9941c333b8f458885f3e6972b701603796fbc0005a403231ed97aeaa7d6528ab52141727680aded97b8b2e4ac66a0d32833b2d336d7a271e6e0693955eb0886021901922fb420dae0d05e7b1a28fefdca20f93978acd6aea7d3b6f4a894d3ec188193180b1789d60aa567383579ffb76a059fef671acf81d6e2c3de1f86d7252407d5d0619cd3a7da93a9763a73500d0e6de39337393db9147e2a48a453a7ae440a92b72812148847dd450075be9a9cf6dbafa9ad2cfd9fae1655f060da2cb4690dcacf9d9fa51c9c89ccdf97f489bd9e01447f98a6b3db3aeeea143932501a9649b28e0ee555119e9176f7f76bf758de7aa32c1490ee96c3250d784f7cfbf20a7338a373739c5b1a8678cdcd34718e0edaadb005e928d0566aff89ad42f28b87196c1bd464a18c455cf286b1c49b292b811bf7f86585e623edca2498c73f728496ae778026411e867b4c9fc4bbbe8649aa411d7aa61915fa15a53defb69170ccaef8a05e8ebfe1cc7e3cf4893b0061e61bdf32a39f1dfd5fb4b13df98e0dfb5ce7e76d8fc476f8b364e094ecd9fd0d0caa5df7c5d96bb60c4b08afb7c951e153e0a8ecd4dd3b2c80af31a13cd135192c82c1bcf782fa1dc37488614f2454bdf9ae3c9330ffd05d3f083c748310d9d89fc70c96e614d21e54a4b78c86abbb1605a1d84cc7c6e4352efe825ecee5c011cbd16fb4efa070dfb3777537be2f2e640733a97edda581374002d2eec0136982f50b475d1b71c987a04c9039644072480860be4f3b5cc127b1b658fbfbbd59b6c7e0f3aad99c203baaf6af50efed54f6d68a68e6821bc3bd120fd25b936a4ec7196a2470895bb10e72488ba91d45f700b86e06bfe619b7544ecc2eee622fb7e4bf9c679403b900c1c38f5aa3a817aee8a89af1ac24739c12073cac870362068997d93c9d7bd1ddb95e498cd8ce0f415cea0f177c61b61ecd71ec144d3a5e1a4e8ee1e6b2681e0d60c5cecc994b358a426bdba6b910e6b6850690986389a4b0b1b34ed84252078bc0f759ca43fefb9f248228128d89c79c8a26908d9164808dbc141d905af69df114609615a661a23b3541e797f724cbf6fb648699d27341fdb6c04b8b82f0881d39cea1a6ce9b2cf9fa5ebb879b3b929bfffdfe6d06b6c1ab463e09b1c3b8a3bc27a389544cdedb434d76addb9f938b43fa7167e59a80e67766e7cc4123fe43897434c7cc026b300f341920d054ff2f6c44e090c2f5dd1ff996a75dd22392ef5a502da33951a6c3e9710e9163fce9fb43a392d22953b74504295d70c5df5d0e8de35e64b5309bc4d102bd15d6e746d61b27e5637f50321fec8f73440fa72ffafaaf3f2d4859b5f09ab22f0089338eeeeca4c958d0a8385c01148ac1ff2a7c95704951ecef9f30c82ed57e248147c63b60ace74ea55f99accc9787ef526ff9da7e780b688a9fa75c4e70f9c771e212f2eeb281b5aea24698b696eccc3de5815a4eae583bdb51ca67df17cfde511ca923c54a1b1030269b875f2e2426a94ddf24b2af7b0896e0d51968e0ae5e20b3d5431cf2008f0a7f4d6b59ba7313052a6e78c2bdfee0c9ba169b999f4b1d5cd48ce11519cd7a1ff2cba17ba6069daf88ee76b57463ba4adfd71d2c05297f3a91ab3d6d82a82669a3bffb00fa011883373879cac91e9298bc9d583f5efe245dc75c9bc1c4a6f974a60358dc6c401a1d9240c951c79fcaf8c00d919540b7190f772656471874388918899384091b92aaf9a7b5acacf3df492f9512d58bede0849148a51e96f121596348f9f9c8f05197a3d793c7c49852f2c39560aa52dc4710e90413dcd19b12d3dc1a158f24f9616abdcbc4c21458e0041f3d6a32c2582df37390309201e27e8a29c64ac9efedf3d90339cb33d487ffccd34a29015accaae2b7450a2cd03362ffffad8dbc9570de8afbdef223498806fd5f2fe8ba8a4cf6ca91048581b1ede3d673c5822f3fd6f2c1c641c0b940141b6131fb3fe141cabfdf811bae7a49de6ea01aa75aa0f46b3b0f15f0ab8772063781a5eaaec593ec4f0b9431b7f40f7e0c8e188faf38e5110811bc87fe5b16477f7acfa19dffe4cd83ee46ca37e8201ecdad56fa22e521929801b4a0e03ce7368b64917a9e3ee7f515c1dac8df3145344eb8fc612eed7246fd38f0b630d5deafc28de0a26ef9346b86827e98d563e92bbd691280f5d1f2471f8264de2ee5a4e0aef2b05c42147e0a41a3a0e03abb8eed7beb3a58f1ac90db6315beb0e19f02d7b913c6a76fe0bc6cd86329c00739cb962b9517aa82a1752fac76b76e9db79448bd138e545c925cc325d5e36673ec559433cf27d15eb122fb17dfe1a83b3eb468a2f21f57e8e23d211988ec10daaafdff0b39b2c7c51a3f3c23081f89f291ff2f14326f9bd9321e6f9b7faaff29ca1df4333b3e475cf4e17993e368df809fd77e04fc112a48af168a50429317bf56f4bc584100cb0509a68baf3ffad3b9f63cedd457d49981188f7878836fa964b76acaf781028abd5b3fe543ffb5faffc5ae038a89546906d77048f50c0b5958fb2575edb37894eeb40064162b3ea8c8d7a19f1b3d8ff5409453ff5a399e4255bac5a2dfd285fbe3f670955d7408510c4aaafe320612adc590014d052ab8cd5c5a7bc11ba17b0bb9d4dc3d5295093faf4dd5eb834a8cc321bb2a97bc8a26b3b2148c87f025353e94fb56b48a3fedd1622412e603753e70527cffd1610507f2b1ec03d7c66f9f67c9c00bc863efc341fa7fc28f2a41c7c34166bbb48d537b493744eb47cc36de7333dc9d9510bc92a8d64c786caaf374e2f9c4eff60fa2c497ca4c0447024853d9fe8790c2c39ba9ee346d1ece5832de171c1469c821995314994e29369c264a414b0481b2098817bede2dbf64dbb868be8f68da3f9277574b6140064c8cf5e28d69b8186ec54db492774316e87fcf47f519540d357944830b8449876b57ef72cd089ab7a2106031e10fd5a2b3bcd0934dd37622769a7f0f37983b3bfa4142d70905f958775bdc7c5c574bdaad882f7e8065a544b8272d2290c278732accfc52b5042b8147b1b5f44c2dc89a53c6eaa17062483a793019481b336dfac59b8f81cee8abb1e992d6eb6045720700a04994136be5d810c8cd5d42ca73e554796bf342e024a8b7d3c99849b8f24cd6aeb7ab40d88ad488dac35a6c121dbf3694f5f76582632098507e2a3bd12e30de8f6a3e1c90db7a55565467061609cee6bd4a44e49ba0eac772aa886cdcb2ebf3d9510b2439846647309e54f4520d9d6f46ca0fe0dc36af1f6c84428f59b44b5b18055ce061a86aa2085fad102cf37150c62460bc7dd9c1373ecab26bd1a15a5f4f3db19e0dc9cedac8e9c619780047bf7d82462107a5e68834eb7818d1fe71122b55aa7880cc80f247078ab3eac382bd654c3e347ab6141a2654c75096c417ccd856d959d928464b9af0fb4595366fe1e645ff41e660b8db37fa2f9c01f3757d74c672957a26af1ea563a9b4967a9b0846b040a54733b702a7229269309742ec9b189cf986f45729ef16e354a4a42bceb1cc157d5305806617e30b79db99c98f07de4161774264d33f96b06ddca4200076ce3b3444a8915901c7720ced6246dc31dc8296246d9820bc500f68918516c6b84914f56af4ad08bb78a6f6eb1be3bcec7f58d3e7a3bca36a8a771ddfdf6b2f82e8787ed23a62ad0c0ed484bcb9f5f8b266bdf900aeb33ededfbefccdd80e855c41f24dc70d0955529d8a08e1fd93d3ec23edab252ae300165aee447caec70c8304cb5843b13b506a239ed2967f3b22ebeafbaef1e830f7ff122b22d5a0469b731d8aa9a722c43e3004e987783f4dd060a98b87773dde8ec3350e9b9d4439d0a7c8e674bc38d7ad47f9c71b136784654839560b4e6243005c021db2b8f9900f2b12415309d9926b12fffd6286708d148e1c6e4864b1eeb3ed8a93b1e2512660bde7f3b758b72496667210e06c81e961a9e098901b608658c34f1368d387441ca7b298bf48c9c5e07fc5d2f53dc81174ad4135a67002b6db040935fc743cbade24246445de142d6b4de1a7a83d9b876287c8f810d4fc3e2fd6b23f1deb3cacd19f1db38d6e114d85e668c67e653fa556100535775f8f2bd36d0f24aaadd3d479c616017f304d0294bd9cd3287662cdc87dfcb0f5d5d507f66485e4457b1a91870aacb104b05e03fe7f4147b028725fee5d2cd9cf28c2cb14a2a0556e79ebdac04f12f36c31ac050f5ae13542c217fc7c8311f8ec76d6468fd64e271cdac7a1d366089dcb45f085ef8b40b0e138186ad55ba72d679937ed9f62b08e1b64e90a7d46f22a29437d7f23f504f8e4401837346d63e6bf3e317017d197f088613bea45545cddc3629ae2570d93dc7c1df01c9a864e7208e4c246af83240baf7f57fa8b62ad72f0b66c165ef3b41958b7a66c765aed0f9e52bc6f5f113aa1ccad6c9db52ca79400feea1c31911f4edc48b73323792986a7e4238a02640dc16fec7b9b0320cde76966a8f0a5b1c03b85447844bda72c7fff45966cc36dc42ffd4e7995a6652718309fde331e5daf466ed2f38f5e715718b79d82d460ddb6cdcf6ade6ea34fb1c497622222e2b1092bff1f8f2f30efe35326ecf30a1cd9c285c65b1d8fe7a9929f1b83cc30104b132b3ffd65342d3f6cb529239f4295a551cce62e861470fca89ea58ffde5cdbb672c01ce7fad77aab0551faad646f75ba8b66de118b84c27ac8f6698fa02eff22e14cbdfa9f625abbb7ee359bc24d5a5d80126b0bd2c724e777e113b51b0a16a4349f3e99c378fca5ae1530c9bc90b +[FINAL_CB] = 3953 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0xa6 +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = 0x708d9313de59fe25069ff84f68d3d3095c659cc3ec34775907daeafa3f678c70 +[ENC_TYPE] = 3 +[IV] = 0xeb1ebe648b4b1637611fcfb08f2afcef +[CIPHERTEXT] = 0x04cd5442d8da266b5ee4372b429c0fdb +[TAG] = 0xc0841dba3f3c0510c76a8aed6d4f85b3e0487f2cc0fc05ff0a504611e153d761 +[FINAL_CELL] = 0x01c0841dba3f3c0510c76a8aed6d4f85b3e0487f2cc0fc05ff0a504611e153d761eb1ebe648b4b1637611fcfb08f2afcef04cd5442d8da266b5ee4372b429c0fdb +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x01000000 +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = 0x708d9313de59fe25069ff84f68d3d3095c659cc3ec34775907daeafa3f678c70 +[ENC_TYPE] = 3 +[IV] = 0xe004882b6fa8f266b69e7c4e4040eb8c +[CIPHERTEXT] = 0xf9d46e740217c864b9111e1ebdf0b1f1 +[TAG] = 0x1b1b89506b2d02a0d6c80e121a106520c6c1e854d6f23ce45e67103d87f12ffe +[FINAL_CELL] = 0x011b1b89506b2d02a0d6c80e121a106520c6c1e854d6f23ce45e67103d87f12ffee004882b6fa8f266b69e7c4e4040eb8cf9d46e740217c864b9111e1ebdf0b1f1 +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x0001020304050607 +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = 0x708d9313de59fe25069ff84f68d3d3095c659cc3ec34775907daeafa3f678c70 +[ENC_TYPE] = 3 +[IV] = 0x2f8b7076b8ba489795814ec5e2c7566e +[CIPHERTEXT] = 0xd9e6ec018c4d7c7ec68753a70af85bfd +[TAG] = 0x5347f396130ba56dcace66abaceb5453363c9d2af32da627bcb6f42422d3081a +[FINAL_CELL] = 0x015347f396130ba56dcace66abaceb5453363c9d2af32da627bcb6f42422d3081a2f8b7076b8ba489795814ec5e2c7566ed9e6ec018c4d7c7ec68753a70af85bfd +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = 0x708d9313de59fe25069ff84f68d3d3095c659cc3ec34775907daeafa3f678c70 +[ENC_TYPE] = 3 +[IV] = 0x58adcc9eca15cd3241ee9e219de9463d +[CIPHERTEXT] = 0x1aa8f4776731d8fb5a39e5d35e61ad0dbb18c16c513efe262bb771f39a3999b3 +[TAG] = 0xd2b2a020d5bea8ec9b2864bb3a465c2a7c33e9d695bb47610fa1b6b978fb3d6d +[FINAL_CELL] = 0x01d2b2a020d5bea8ec9b2864bb3a465c2a7c33e9d695bb47610fa1b6b978fb3d6d58adcc9eca15cd3241ee9e219de9463d1aa8f4776731d8fb5a39e5d35e61ad0dbb18c16c513efe262bb771f39a3999b3 +[FINAL_CB] = 81 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = 0x708d9313de59fe25069ff84f68d3d3095c659cc3ec34775907daeafa3f678c70 +[ENC_TYPE] = 3 +[IV] = 0x91915e7ee249a312e8eb1eb87dec2178 +[CIPHERTEXT] = 0x2685eeb42895f08cb05c6a284e39ea83963b1e30d6ff1e6a2a66e547812c26310bcd0849c152219634b74a8b95f04b13 +[TAG] = 0xa90d838e862aa0ad5856fcb80312a997941f63627925bab4901900fe767d863f +[FINAL_CELL] = 0x01a90d838e862aa0ad5856fcb80312a997941f63627925bab4901900fe767d863f91915e7ee249a312e8eb1eb87dec21782685eeb42895f08cb05c6a284e39ea83963b1e30d6ff1e6a2a66e547812c26310bcd0849c152219634b74a8b95f04b13 +[FINAL_CB] = 97 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627 +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = 0x708d9313de59fe25069ff84f68d3d3095c659cc3ec34775907daeafa3f678c70 +[ENC_TYPE] = 3 +[IV] = 0x7a46a982a7d881fbc196b79df839e19b +[CIPHERTEXT] = 0x280fa4ed05ea2414135aee6239c903e549f1a6cbf3344181b37c4983d13e9ea94fb0258fc5980884316e6c3837bf5046 +[TAG] = 0x118da74dda1daba158c4cb7b32b2adfa5ab0c5b6fdf7ad2cad11dddff643b3eb +[FINAL_CELL] = 0x01118da74dda1daba158c4cb7b32b2adfa5ab0c5b6fdf7ad2cad11dddff643b3eb7a46a982a7d881fbc196b79df839e19b280fa4ed05ea2414135aee6239c903e549f1a6cbf3344181b37c4983d13e9ea94fb0258fc5980884316e6c3837bf5046 +[FINAL_CB] = 97 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = 0x708d9313de59fe25069ff84f68d3d3095c659cc3ec34775907daeafa3f678c70 +[ENC_TYPE] = 3 +[IV] = 0x7127ff836f43522d117522c4fa208a53 +[CIPHERTEXT] = 0x548e980356a963d91e8a7a806401e1c5ad0a5c988bc2d069eb514db5343074f66e67478c4a08b0c0cf2a3a22143e7e250d202bb2effa0a124875d8eb9ea15faf41fde4467103b598c24cbc605e211a71c9206151e5848f3ed2cdee310f0af35e514791b0c318e6fff4d93ffe12cfe87a1b811ee2853440d46dc6241fd399ac6eb99eb1173a4490cce1ccfe3c32b32f6e63e779d6941bc1b3de10139d58d1c27775dbc4164949b408587dbfc852a8b4eabe1ddae95c2327bbf28a6e484fce055f936b0d136e021cb0989f6270bd70328bcea18f52382b3c8285a21fbbfe419462f1a38884c794cda6ce8e45ae03cf39cbf73027c0fac0a5911ed3460827b6e7f48f40b432f35d009bda3fb09e836b934d33ba26a77f6b5ef219996d05cfc281d9822a41707d5f5152f0dbd8b687a7f2356b22c5aed05c828b92d57ee33bf1968f327f9f384dcb37d4a91048f9e29ceae55f3fe08c01c537d8c2aff4f2983b88238e3c1cbf8b88c8007414948d34745ef1a0bc9efe50e2f0266bce9fd4c37001b24a5a3eeb49053c915fadfc8534aba15f7ec96a877478c4175441b6a30ec834f92668f7004d677ee1060730e82fb5044abd750c78aa10c5752813cb9a96f8f25e3c74046e58305519a7c7d90a788d61e6f65ef900310db58516686d056874bf71f4ca03fd062a6f9e151abb64d03bb9bcdf65e192fa62940c51adec96f839c883c01685a5c5e3c37126c0861b67a79eed7d2e3792f0ecb62f6bcce069fd98a63916731f5b5738baa16a207cd2dcd9bc3cfe24660c765907f4439f0f1201c56b7526e9779a28e6b97d639bfce6b5a2f09ee7448fcddcfc0881b361d02e914f9a1e5300d3ca30a75f4ebf931c541590fea162d456e48356c79b033badc3a852ecba1910beaaa1b85968b5b20543ee4757f2cec6165bf9b1c816fc04f3ddde4f280a0213580aec5d7d19487184999940c7d3431aac49b97e80ef2e3e78b969a8c1cf030d4d7a64ee15da229cb5218df0dfdbd87c9fb037c3062d7276bb5b4fd995b930e51f939eddaf1ae15409bb142d16887fa71b169e65907f539d008a7653ef4721990826fac757a12bea47c4165683bea29ed256f2cc99fdd3078e383051b3cb2aa70068362d1cbcd9302eb016d8a9a15f71d8696ea5880dd3d5f4868d521ff452580002386605eed2e30d4bdb9015d77e4d0ee2b775b68136e134713b6dba341e496eaf667ef0abeec663e0d5e22ac8bac29cd3e1d0f2d46d24a2f1f38acc48cf7e9b7b3efdf0ad22fb760c35a47adba4e9377b78aaa39784623f460b04c29bc42b3d3afe3cddc5bd620ff648adabbfcb1ada3fa15f48f0014b736a9bbff90748d23d0fbf41d8d7e6081bd5b2c9906bb127f38d8cb0dc1456603c7a9b1ebc03dad535cf98807fca762e07ac5cce6b2346312e1e87b2a60a531a17a477e9e73039d0b6dd9c8d4ad139a6a52c6cb18a7d6face33cdff28545262d0c4f6e105f049f5b55abdcb925e120778fdbaa8116e5680cae23a15a50906ecdc9c00c9125aa5de4e3f49c3a07febb47c892a6add0f60e7092afef0b59a2037df4e054276ccd5efb7220d807b24acf468b10adfa1126d705cafba066eee9b2c6b674ac3a443de27e9fd250529de78359056774796fda07a8aa4d49003dc52dab1e60ae7db3e9ec75701fea0558be799c3fb0109c9a88735105f9a539371518771624e4d4c91f8b610d045ccae6ea13f5f2d07c159f7eee426c17c17f31416f18c8a8dee2c888950d488fa62d5de733f2c62815fed4ff1b687097cc27205263966c3ae5f287dde53577d61b621cad1dffe63be7cb82ce70bb804c3a0975356e1d9caa9bf555313b9e43f2ede477e3b6c5ac6c789ade853bef817a89758319aedae9b08d581e42827fe13dbdeee877cdbd274938835e5478282c3505b4c682ddee7e329430a7eb8e7a1bb6f82623bd7c2cd65d57d7dde6df723641fd712419b6df7f1d05d8ab9d483b33ecac036aea7e6cc7246b8ab8e54de438bd584aff944602a1da4f54553f282a507e02e4dfc649c643282be91018ebb002c009871be081b91d289ddcbca4a4208ce49d4b39da6db6f7d30fa18b94fb3837e9149b179dc058049b761619e1ea791c53731ef733151707f782211997a92f6be80c1b6b5d5a158fa4c5f993d18742b709c38a27f9740da2ffd1797f4778e6f95a70c57cbd47a6a6e98df3b7a9a4c6a543e2161c1cf3e07f284451cfeb3c2a6922cc7059738f541f68feb387ddccee11eaf691f43538a6c0ec70f31d91fd1fca2259f9261788d496826cb8c6e1be7b7ef3cf4429850a2b4e9fed35eead7bb46154de8c142127c10383966adbd4c91358b1b2732ee2739cb8761816dc38a301f199c872c4488836048ba57eba1058529300d3e2a3867c481b8751836b1ce6e61c04c0796ad021a2c8fab4b909bfd873913510cdc0c9a85a2f7ab1b1e567b7ac10a412d4c0173402e887f22754239fbec22495712a002024514edf518c38bb6c0283ede7d3ff8b892d89b1395ad37f500c46464bb636722c78c10653ae98ca3920eb1dc3300e2c1b4e91fafd48d3644738aae39c28ad6b8528f716e040b2f5d4344ac4681f7c21c8de3fc4938cd2423a1759421dc712187765b503302e06088f9ec99339f17d29858f24c13abbe0ae28fadb9b97cd50254550ecd632cab87df3b966ed9185f06dcdcc0919751bd6dc617a314658e936d9f078959f0e2108c70f00ea36b2291c922f30a59400cd9b7c7e2f8c65741071d8e519e8d4bc970ea263d392eb16336c4f3593dff75bdfe300b9481239f589797dd0752ac92c942571be099b739b60978ea8bc6feda4cd3c5533a5260ec00608b4439d5c1f3eb38fe562bf4c17b5a9bbf08caa51971611e1cbc5d6f884d16e4aaa98c2117cf3048d +[TAG] = 0xb4272329aef4b8c5e94c67c138e4e1b4aa3c9118394819aacb8f832ae0c910a7 +[FINAL_CELL] = 0x01b4272329aef4b8c5e94c67c138e4e1b4aa3c9118394819aacb8f832ae0c910a77127ff836f43522d117522c4fa208a53548e980356a963d91e8a7a806401e1c5ad0a5c988bc2d069eb514db5343074f66e67478c4a08b0c0cf2a3a22143e7e250d202bb2effa0a124875d8eb9ea15faf41fde4467103b598c24cbc605e211a71c9206151e5848f3ed2cdee310f0af35e514791b0c318e6fff4d93ffe12cfe87a1b811ee2853440d46dc6241fd399ac6eb99eb1173a4490cce1ccfe3c32b32f6e63e779d6941bc1b3de10139d58d1c27775dbc4164949b408587dbfc852a8b4eabe1ddae95c2327bbf28a6e484fce055f936b0d136e021cb0989f6270bd70328bcea18f52382b3c8285a21fbbfe419462f1a38884c794cda6ce8e45ae03cf39cbf73027c0fac0a5911ed3460827b6e7f48f40b432f35d009bda3fb09e836b934d33ba26a77f6b5ef219996d05cfc281d9822a41707d5f5152f0dbd8b687a7f2356b22c5aed05c828b92d57ee33bf1968f327f9f384dcb37d4a91048f9e29ceae55f3fe08c01c537d8c2aff4f2983b88238e3c1cbf8b88c8007414948d34745ef1a0bc9efe50e2f0266bce9fd4c37001b24a5a3eeb49053c915fadfc8534aba15f7ec96a877478c4175441b6a30ec834f92668f7004d677ee1060730e82fb5044abd750c78aa10c5752813cb9a96f8f25e3c74046e58305519a7c7d90a788d61e6f65ef900310db58516686d056874bf71f4ca03fd062a6f9e151abb64d03bb9bcdf65e192fa62940c51adec96f839c883c01685a5c5e3c37126c0861b67a79eed7d2e3792f0ecb62f6bcce069fd98a63916731f5b5738baa16a207cd2dcd9bc3cfe24660c765907f4439f0f1201c56b7526e9779a28e6b97d639bfce6b5a2f09ee7448fcddcfc0881b361d02e914f9a1e5300d3ca30a75f4ebf931c541590fea162d456e48356c79b033badc3a852ecba1910beaaa1b85968b5b20543ee4757f2cec6165bf9b1c816fc04f3ddde4f280a0213580aec5d7d19487184999940c7d3431aac49b97e80ef2e3e78b969a8c1cf030d4d7a64ee15da229cb5218df0dfdbd87c9fb037c3062d7276bb5b4fd995b930e51f939eddaf1ae15409bb142d16887fa71b169e65907f539d008a7653ef4721990826fac757a12bea47c4165683bea29ed256f2cc99fdd3078e383051b3cb2aa70068362d1cbcd9302eb016d8a9a15f71d8696ea5880dd3d5f4868d521ff452580002386605eed2e30d4bdb9015d77e4d0ee2b775b68136e134713b6dba341e496eaf667ef0abeec663e0d5e22ac8bac29cd3e1d0f2d46d24a2f1f38acc48cf7e9b7b3efdf0ad22fb760c35a47adba4e9377b78aaa39784623f460b04c29bc42b3d3afe3cddc5bd620ff648adabbfcb1ada3fa15f48f0014b736a9bbff90748d23d0fbf41d8d7e6081bd5b2c9906bb127f38d8cb0dc1456603c7a9b1ebc03dad535cf98807fca762e07ac5cce6b2346312e1e87b2a60a531a17a477e9e73039d0b6dd9c8d4ad139a6a52c6cb18a7d6face33cdff28545262d0c4f6e105f049f5b55abdcb925e120778fdbaa8116e5680cae23a15a50906ecdc9c00c9125aa5de4e3f49c3a07febb47c892a6add0f60e7092afef0b59a2037df4e054276ccd5efb7220d807b24acf468b10adfa1126d705cafba066eee9b2c6b674ac3a443de27e9fd250529de78359056774796fda07a8aa4d49003dc52dab1e60ae7db3e9ec75701fea0558be799c3fb0109c9a88735105f9a539371518771624e4d4c91f8b610d045ccae6ea13f5f2d07c159f7eee426c17c17f31416f18c8a8dee2c888950d488fa62d5de733f2c62815fed4ff1b687097cc27205263966c3ae5f287dde53577d61b621cad1dffe63be7cb82ce70bb804c3a0975356e1d9caa9bf555313b9e43f2ede477e3b6c5ac6c789ade853bef817a89758319aedae9b08d581e42827fe13dbdeee877cdbd274938835e5478282c3505b4c682ddee7e329430a7eb8e7a1bb6f82623bd7c2cd65d57d7dde6df723641fd712419b6df7f1d05d8ab9d483b33ecac036aea7e6cc7246b8ab8e54de438bd584aff944602a1da4f54553f282a507e02e4dfc649c643282be91018ebb002c009871be081b91d289ddcbca4a4208ce49d4b39da6db6f7d30fa18b94fb3837e9149b179dc058049b761619e1ea791c53731ef733151707f782211997a92f6be80c1b6b5d5a158fa4c5f993d18742b709c38a27f9740da2ffd1797f4778e6f95a70c57cbd47a6a6e98df3b7a9a4c6a543e2161c1cf3e07f284451cfeb3c2a6922cc7059738f541f68feb387ddccee11eaf691f43538a6c0ec70f31d91fd1fca2259f9261788d496826cb8c6e1be7b7ef3cf4429850a2b4e9fed35eead7bb46154de8c142127c10383966adbd4c91358b1b2732ee2739cb8761816dc38a301f199c872c4488836048ba57eba1058529300d3e2a3867c481b8751836b1ce6e61c04c0796ad021a2c8fab4b909bfd873913510cdc0c9a85a2f7ab1b1e567b7ac10a412d4c0173402e887f22754239fbec22495712a002024514edf518c38bb6c0283ede7d3ff8b892d89b1395ad37f500c46464bb636722c78c10653ae98ca3920eb1dc3300e2c1b4e91fafd48d3644738aae39c28ad6b8528f716e040b2f5d4344ac4681f7c21c8de3fc4938cd2423a1759421dc712187765b503302e06088f9ec99339f17d29858f24c13abbe0ae28fadb9b97cd50254550ecd632cab87df3b966ed9185f06dcdcc0919751bd6dc617a314658e936d9f078959f0e2108c70f00ea36b2291c922f30a59400cd9b7c7e2f8c65741071d8e519e8d4bc970ea263d392eb16336c4f3593dff75bdfe300b9481239f589797dd0752ac92c942571be099b739b60978ea8bc6feda4cd3c5533a5260ec00608b4439d5c1f3eb38fe562bf4c17b5a9bbf08caa51971611e1cbc5d6f884d16e4aaa98c2117cf3048d +[FINAL_CB] = 2113 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = 0x708d9313de59fe25069ff84f68d3d3095c659cc3ec34775907daeafa3f678c70 +[ENC_TYPE] = 3 +[IV] = 0xe19f3b6ce91592acb024de4ffb9244b1 +[CIPHERTEXT] = 0xb839194b4d3aa2d43824e083891d55923b5fffa79f179e9f429b77dbe2c4a9284e4ac3040e6d61332f7c53a3347656246c46d7ef4d1ce9c6a25b12960c0fe0789a93798d1f73731a72479f18c0217e6502be7aa0c388e156d651f787560bee465194fa6ef75eff21a8fc6d11e3535a5361deca0092c017d0f77023b5f6b26bfc9e3b360b15ee789ae34a1ec7567823a75b1e3eacabedf1958b9ec39d7884c34c64799c741adc26a583dede15af6a6834c48f1dfa662ec457f2883428a5617f71094a14148e7690d80575778020450aeb0295e67f7d575140f6940277a85152588c257f3d1963cef4645012d6c9cc596ae03c72532cc56ac652090cd15fe6b2e2789a8f4c810ece46cbf8b38cb9591c7b521503f36fcbbe9d3ecf4e3260a7e6d6dddcc6fc03acfb98257e715f9dbf9701e8db849f2228d6ad8e585acdc1ef60b42b8ca211381c2bc16ef3b272370bcf480a0f91d0b6c4e7960dd0972fcaae2f4b2f119e890e87dfb4fb0ff4c0f86b71aa2b12cdce305be7ee4bf7f11e19a7dc251c942ce59a6535a36fd1660a2155a1dec3db4a3bc4573e68fcb9e8bbe019b278c8c5a44b5b900c1516127aed0c88ce2d8902f0f94edc042be73cb80fd1ce06978bd1cb793c738fdf9091750ee93f565dba6741a0e66dc25c69f435cd05fb89da54a74beb6582d84bd07917eb481b739e87de8775959531292b913e96cf5f78529f5f756d334eae220ff7f2edd51d43d3374a6df92af413f38eac19333666bf2481691aeead946ad21594c65f2c673e4bc9ce6b3e0da421b5d05572ff4fb104cbd57b0086e0b7950ed1e745b990d1113afeaeaa7d5dbb88e464ebf3423edf680cd2172a4d8c19a2371cf83d3650ec21f06235be2528ee8fa970a135f82168674753aca79f2e085586d57f642cb96a8c8b59728409aa0012ae83dcb9de55487a529dc4e662cf161b13565111fbae5e8450527e00017d029ebda56fb552c3462e6eaa05e60a3b5b2312e5099ab2059648d392dca7c96757a355a2b41d67ed0834bf2cb2b7b8a82e219b68e05b3b56f86d72b3a790b52451ff8dcdd0a001e1ff03b813220718b26f1cba4306056c13b5ec5f40520a8f341cb9cb211824c27f8d3b990e192508f6c4f4525aeec2ffe502988a11a32d0a558b437e6910af68b8f5cf9f1b02fa2377e063005118db9263b240042f3b96439774cd05bde080420a77f5b46404af7ee50ae9f0ee4141e564b3d3db809fff73f19ac047c853d929bc05425f99235560fe9213b5fd760f070a40c61d25758b2fc5c9b6ee42d24c068e110c6a8cc799f5d3428a79b0d3329d536b9a9825fb90cf8c9a8bff73ff76d223af30488c50671f59981546548167338243598aecf80377adfdd8968a21b410012e7ca69494a998c175d8d1dc374db45b0e9ef31d1c4c793fe41fa467d49186abef917ea9c962e3ff0ee946f365f8f224a750d5ff079e2f0972b788163c9f63a3dfb514709f85f5d98b71bba3ea068641d2299d26b524728e1d73eaf520bd29b197d48580acd64991763aec74ec1b71012e71ad8207775fbc1a4e6f4447e4c8dad1d558b8dc6c86dbeca518fdebbe73fb284bc3e854c060b29b79386c555600793acf25a4031fb56d5ea0bf7dd5b1738aba14ed4db53baa1e83a2c612a71446b51b53e3d8ed3e829c8ce6603288fd05e6613952b1785791cdcbe60a266ded9f1160ed7c5567952b828f68746872d80ec820c131932147864533a0c06a5c8206404ff3ab3c9153208476166900aaf84642a9200c296c82a39e5e645d1b8bce025ba719bff08c4bb5f94e7300300a1b9a571f2e8fc93ef7d95889731872dcd3d16a27ef946fb2e35ff3c4cf4542719cdedf3a16aeb06297a6a9fb8ed9cf7f087c759cafb355d687c5a7d3686148a40a832463dc355a14874576d890e03f6d1537230cd5900c0978ef7ea5ae177b0b3975447fa2e640ce1d070ab81d8ee1453753b24931bba2760370f1e6e0ce089c49a9fa22accf9bec8c5420568c9ad39c0d2810d0c26ded1c2cbf1949be6746bb173c0c70aa83642999f13de054039adf27830f76c6730d21f46584ce50c9bb127720798b798983ff3db963bd6129640c05f0030ba1676c76c17c671aea77dce7cc2d54e6417283fbb03ea527f681ad07c9252d936f4b88215a0c659da05fa193b78f5173f304e99265cef4f2485632d523c45f1a99488029078991886d0a5c14d3636d5fcec435308edd9768696d873db4ca777fadb2aeff7c17087c12d637d030df480e43551e1b9e38ba0786468e5eb3de34a0e901a2992a7252e30724f04f84ec145c213b1569d80eadead93d8cac6129be96de087153afebc00c273a8e55c68d152ff41cda0dd38ea671071b4b5d109147fdd85ecae7758084e5708bc969b72212947fa5dd19cf5b5234f15fb35b0eddfdf02c466d945bc40e75865ab27041f70671549a58dd931b8e43c3830921a5b34fd37aad1dca3b57ea41f7b51e9b1db7aa64304a41a1274b04571fc7f94efb548c0841234f83ced7cc82c463f3de0db17c207339f9ea281883c6e1760b2af298981cd62a913b40f3fb0782fff7960b55725c781adfde11660934b81b018090c75a61f66966f4f414ab47ed7029dc7f94dca7286718cdd5186239b3731337f8e12f3d786e89c6b04683c7f73998f025e3db66704dd8b30526772afa6c10589de532e02f8e6e834aaf2914169096f5c9ee8cd9cd2aaa5865f9bc9a980acc1cd9e3ca17e9868c1c16b7f8055a28f63018cf989e608b030189bb638eafcdbcec2e6bfe7a5415381a6b62bbb48e68dfc8428d615f1aaf0d0d35c542036e435fcc72e6b14cccf4b61adb9898bb7919b227e4e778c9393a18413369de3528dd97c90a6f222931aa47e06676ff837578f661621ca791873df1b48c6541edb611d5e987cf83d665da424882b23f3e8a0a4d6080445b95e051f0fb364869214d54fc8bc34f172545795de9af212a7412970e7508be181c85533c848fd55cd6020b001da50e7930497fcdae91d1e2a647af4f1c74fa12b1b6ddd64c002b64b2cdb212d658803a9808f82d5819747aaa6f78891f029d58d1b9846213882e973757798d4a2701a380915bcc9a97266497f77dec31e01865af46f51e265e19d57825a52d359dbffb0f34d671ae22fbac65dceaf83ad2e297c46d7d90fe2f26d35436213116e73dce10abf9dffb5d54de62a9ffffebebd71fd1cced7c1a2119cbbac07218abe0955ad943c025e8a701cae2f8ad0f646923d25dd53c483d0d26e5a81914ba1af9de213789e67a95114302c5fc667dda6bf94042fafab9770212b1ec6a7796b5f00e8e3d242380e51beed87e732715e1fb2315a26021eb964ccc337e207b5034ede9a192d26f3b5cd26ea1a3e36df3847d3f5ddbda808ddd7e54a444d87422c60aa7e593a9748b91c2074e2d59a1f56086bb399ea5f9f7f06eb999957363bc9e94db8e67598a504a0ed52c1970209752c786457b0e899a146cc1de547d8bb564eb758ddf39a21ee27ef9a801ed33d809cb3cf188a8e90781bc3a3eecc11fd8b900449e6f485e77930a8b4346ce46cbffcbdfbb9e48283222f0a16737b440c480f332c4bcc6ad94a488f50eeb2f1d19df15cc5764afc4d3d83cc1ac55d63001a59219ecef4509d5040d1a8f9dab743b96eb7e10092028ca1c33e6b2b00e443864762e4ec5751ba8ec618f2ba52ea8632e5c8455d3b98eb87556fb5974023aeaf484da0b8d8f549d94cecba7dd5e9013472f0f7e78ffb71bb3c54dd0818042e956fb75e0661ddc1c844bca080b28ac4654f083f0b6f8cc9042af8c0edf2d3a1c7885a9cd25619af2f237033ece775baf9a16f075d481ede570a008e1ddf716e9c458224e845976c9167094f2909b5b3b83677ce0f17adb0f3e068b35ba17426efa30f2a3f24f302a8d53395c3bee581df2cdf01d03d0012e5125a6a4ed8d93f82851f480fcd8d44a5c63385ab336c080d5cc0b3f8f194acb5940017515195fddfead4a2c860b3ef0158a7ddad29e1ece1e4c27e94dc02bde55e4489d630e534f41a5640841bcaee4cab16a0c39cb150489ecf05cd3ba797bb8d6842c72e216ccfb550a6b12f0450ff11e02ff9110dab699bc1a6743ad38e68c2b288a91606d886085d320f775d557041d33159e277f0e73900e89a98cf7f2b7439c2226416b381d092b2a1ad1483949c154d6540195196f5f8c377510f04a9d7cb8c328561950ab547377d582162989934d5f69c6fdb31bdff4ccff396bb3300a2925d8c97d1bce06d32e5c319af210bd708a47bd9772f9c466f05070ae7b483719968708fa2e8a37a535ac5ab4ce1bebce0eb64bbef3535d0c04e34ed680b22492cfeb2b73d9b76da3149af46d7249e4e53058949a2816da06d6f52b7bbec624327b7f28c193a32af475c68c10feda77ebb319224113d43b603e20e88fcf49e8601b841ec7d997e626ee90ce8a63a2bc2fad5797a0629f295eb0a792751726370315daa397f732be5f3331fed79ead301a4a5e10194e8e0236d1f40ca92c5ff5d289c46daf146b6e2f77dd46be88ad5a8762de87bb80f3163c0a65a209be7be387d06ed37906b697e26642c64a87e8949f8657e53fe7a3496ae6dfacfe9da900869079f9d5c86134b8fb412a170b9bf1d22f7864c40ad42b9b6c7266e1fc894dff7ed14b64cfba3fa2e5cee98802c02ad235cea02e7c6a01f816e5c52ba2f9259a36ef5fb6d515fb3027294079d58967251b14880d73ff53ce9ba7cc1e22251f69e6d46e639b69c3efb3c7b23bb22591262dd02f4b2dcaec5ff1afce5b615386e97d3374dcb781715b0b9449040d86ac19c9ad16de5cf1dd87eaaf1f75623c384b06715091fb8e0dae467b74b2fe94b85574ba882805d61209f0fbe38609579c48d083e7bd6d5c44bc7d6c0a0e6d5c54935dd6769a0ef43c4a170fc1be123d037a7ecfbebbf2db669daa763b1a49782c1e5a63ccaa7628699eb641285982488fca444d5287d6c883658cc16427f744dd6ef5a813dd2a596732db916c7f17300706197175ff284a4757ee344cb34c9ef42b896f7502b19e8ef8e9b5b64c0b44f684f1037a54f01f63f7e6e70c41654c73c628a06442c986f492f52c5cdedd466e69bf0d1b64536eaaf917018ec11943c980c9feb03abafbe57a77598ffc97768785f2ef81987591516d7d55b0a2f2cdcb38ee597b2572ece24e97f311a9f167eb806e4b31b6fce65bd4d6a8622706d172ae4b434ad48d38309606c8bfd8a1a5984288a5f4ebb92a56cfea8796b7eae48dd3de6a0d8342b92cae10754651a51f8489f18d85ae0e85e7a756df02f6a049ed8c3b1a0b1ac57bf7f409b2cff11d8695c0b2d38eb70a9323c22751ecf7e67a3b91308ee964356a1a125f29d6510c72eda8174af112a74d07cca539725d81b424679fd4f11e7a33a593ef966679f26ae33bf820b81bc19e58af1c77ccac06c9ed10646243968e39ed9944064e6e19b66590b1f6a9582661078a99fde67a +[TAG] = 0x69f41d6f126037a7956d6d661136e0c34f8e4647b8e9ed3bccaff869bad96b0c +[FINAL_CELL] = 0x0169f41d6f126037a7956d6d661136e0c34f8e4647b8e9ed3bccaff869bad96b0ce19f3b6ce91592acb024de4ffb9244b1b839194b4d3aa2d43824e083891d55923b5fffa79f179e9f429b77dbe2c4a9284e4ac3040e6d61332f7c53a3347656246c46d7ef4d1ce9c6a25b12960c0fe0789a93798d1f73731a72479f18c0217e6502be7aa0c388e156d651f787560bee465194fa6ef75eff21a8fc6d11e3535a5361deca0092c017d0f77023b5f6b26bfc9e3b360b15ee789ae34a1ec7567823a75b1e3eacabedf1958b9ec39d7884c34c64799c741adc26a583dede15af6a6834c48f1dfa662ec457f2883428a5617f71094a14148e7690d80575778020450aeb0295e67f7d575140f6940277a85152588c257f3d1963cef4645012d6c9cc596ae03c72532cc56ac652090cd15fe6b2e2789a8f4c810ece46cbf8b38cb9591c7b521503f36fcbbe9d3ecf4e3260a7e6d6dddcc6fc03acfb98257e715f9dbf9701e8db849f2228d6ad8e585acdc1ef60b42b8ca211381c2bc16ef3b272370bcf480a0f91d0b6c4e7960dd0972fcaae2f4b2f119e890e87dfb4fb0ff4c0f86b71aa2b12cdce305be7ee4bf7f11e19a7dc251c942ce59a6535a36fd1660a2155a1dec3db4a3bc4573e68fcb9e8bbe019b278c8c5a44b5b900c1516127aed0c88ce2d8902f0f94edc042be73cb80fd1ce06978bd1cb793c738fdf9091750ee93f565dba6741a0e66dc25c69f435cd05fb89da54a74beb6582d84bd07917eb481b739e87de8775959531292b913e96cf5f78529f5f756d334eae220ff7f2edd51d43d3374a6df92af413f38eac19333666bf2481691aeead946ad21594c65f2c673e4bc9ce6b3e0da421b5d05572ff4fb104cbd57b0086e0b7950ed1e745b990d1113afeaeaa7d5dbb88e464ebf3423edf680cd2172a4d8c19a2371cf83d3650ec21f06235be2528ee8fa970a135f82168674753aca79f2e085586d57f642cb96a8c8b59728409aa0012ae83dcb9de55487a529dc4e662cf161b13565111fbae5e8450527e00017d029ebda56fb552c3462e6eaa05e60a3b5b2312e5099ab2059648d392dca7c96757a355a2b41d67ed0834bf2cb2b7b8a82e219b68e05b3b56f86d72b3a790b52451ff8dcdd0a001e1ff03b813220718b26f1cba4306056c13b5ec5f40520a8f341cb9cb211824c27f8d3b990e192508f6c4f4525aeec2ffe502988a11a32d0a558b437e6910af68b8f5cf9f1b02fa2377e063005118db9263b240042f3b96439774cd05bde080420a77f5b46404af7ee50ae9f0ee4141e564b3d3db809fff73f19ac047c853d929bc05425f99235560fe9213b5fd760f070a40c61d25758b2fc5c9b6ee42d24c068e110c6a8cc799f5d3428a79b0d3329d536b9a9825fb90cf8c9a8bff73ff76d223af30488c50671f59981546548167338243598aecf80377adfdd8968a21b410012e7ca69494a998c175d8d1dc374db45b0e9ef31d1c4c793fe41fa467d49186abef917ea9c962e3ff0ee946f365f8f224a750d5ff079e2f0972b788163c9f63a3dfb514709f85f5d98b71bba3ea068641d2299d26b524728e1d73eaf520bd29b197d48580acd64991763aec74ec1b71012e71ad8207775fbc1a4e6f4447e4c8dad1d558b8dc6c86dbeca518fdebbe73fb284bc3e854c060b29b79386c555600793acf25a4031fb56d5ea0bf7dd5b1738aba14ed4db53baa1e83a2c612a71446b51b53e3d8ed3e829c8ce6603288fd05e6613952b1785791cdcbe60a266ded9f1160ed7c5567952b828f68746872d80ec820c131932147864533a0c06a5c8206404ff3ab3c9153208476166900aaf84642a9200c296c82a39e5e645d1b8bce025ba719bff08c4bb5f94e7300300a1b9a571f2e8fc93ef7d95889731872dcd3d16a27ef946fb2e35ff3c4cf4542719cdedf3a16aeb06297a6a9fb8ed9cf7f087c759cafb355d687c5a7d3686148a40a832463dc355a14874576d890e03f6d1537230cd5900c0978ef7ea5ae177b0b3975447fa2e640ce1d070ab81d8ee1453753b24931bba2760370f1e6e0ce089c49a9fa22accf9bec8c5420568c9ad39c0d2810d0c26ded1c2cbf1949be6746bb173c0c70aa83642999f13de054039adf27830f76c6730d21f46584ce50c9bb127720798b798983ff3db963bd6129640c05f0030ba1676c76c17c671aea77dce7cc2d54e6417283fbb03ea527f681ad07c9252d936f4b88215a0c659da05fa193b78f5173f304e99265cef4f2485632d523c45f1a99488029078991886d0a5c14d3636d5fcec435308edd9768696d873db4ca777fadb2aeff7c17087c12d637d030df480e43551e1b9e38ba0786468e5eb3de34a0e901a2992a7252e30724f04f84ec145c213b1569d80eadead93d8cac6129be96de087153afebc00c273a8e55c68d152ff41cda0dd38ea671071b4b5d109147fdd85ecae7758084e5708bc969b72212947fa5dd19cf5b5234f15fb35b0eddfdf02c466d945bc40e75865ab27041f70671549a58dd931b8e43c3830921a5b34fd37aad1dca3b57ea41f7b51e9b1db7aa64304a41a1274b04571fc7f94efb548c0841234f83ced7cc82c463f3de0db17c207339f9ea281883c6e1760b2af298981cd62a913b40f3fb0782fff7960b55725c781adfde11660934b81b018090c75a61f66966f4f414ab47ed7029dc7f94dca7286718cdd5186239b3731337f8e12f3d786e89c6b04683c7f73998f025e3db66704dd8b30526772afa6c10589de532e02f8e6e834aaf2914169096f5c9ee8cd9cd2aaa5865f9bc9a980acc1cd9e3ca17e9868c1c16b7f8055a28f63018cf989e608b030189bb638eafcdbcec2e6bfe7a5415381a6b62bbb48e68dfc8428d615f1aaf0d0d35c542036e435fcc72e6b14cccf4b61adb9898bb7919b227e4e778c9393a18413369de3528dd97c90a6f222931aa47e06676ff837578f661621ca791873df1b48c6541edb611d5e987cf83d665da424882b23f3e8a0a4d6080445b95e051f0fb364869214d54fc8bc34f172545795de9af212a7412970e7508be181c85533c848fd55cd6020b001da50e7930497fcdae91d1e2a647af4f1c74fa12b1b6ddd64c002b64b2cdb212d658803a9808f82d5819747aaa6f78891f029d58d1b9846213882e973757798d4a2701a380915bcc9a97266497f77dec31e01865af46f51e265e19d57825a52d359dbffb0f34d671ae22fbac65dceaf83ad2e297c46d7d90fe2f26d35436213116e73dce10abf9dffb5d54de62a9ffffebebd71fd1cced7c1a2119cbbac07218abe0955ad943c025e8a701cae2f8ad0f646923d25dd53c483d0d26e5a81914ba1af9de213789e67a95114302c5fc667dda6bf94042fafab9770212b1ec6a7796b5f00e8e3d242380e51beed87e732715e1fb2315a26021eb964ccc337e207b5034ede9a192d26f3b5cd26ea1a3e36df3847d3f5ddbda808ddd7e54a444d87422c60aa7e593a9748b91c2074e2d59a1f56086bb399ea5f9f7f06eb999957363bc9e94db8e67598a504a0ed52c1970209752c786457b0e899a146cc1de547d8bb564eb758ddf39a21ee27ef9a801ed33d809cb3cf188a8e90781bc3a3eecc11fd8b900449e6f485e77930a8b4346ce46cbffcbdfbb9e48283222f0a16737b440c480f332c4bcc6ad94a488f50eeb2f1d19df15cc5764afc4d3d83cc1ac55d63001a59219ecef4509d5040d1a8f9dab743b96eb7e10092028ca1c33e6b2b00e443864762e4ec5751ba8ec618f2ba52ea8632e5c8455d3b98eb87556fb5974023aeaf484da0b8d8f549d94cecba7dd5e9013472f0f7e78ffb71bb3c54dd0818042e956fb75e0661ddc1c844bca080b28ac4654f083f0b6f8cc9042af8c0edf2d3a1c7885a9cd25619af2f237033ece775baf9a16f075d481ede570a008e1ddf716e9c458224e845976c9167094f2909b5b3b83677ce0f17adb0f3e068b35ba17426efa30f2a3f24f302a8d53395c3bee581df2cdf01d03d0012e5125a6a4ed8d93f82851f480fcd8d44a5c63385ab336c080d5cc0b3f8f194acb5940017515195fddfead4a2c860b3ef0158a7ddad29e1ece1e4c27e94dc02bde55e4489d630e534f41a5640841bcaee4cab16a0c39cb150489ecf05cd3ba797bb8d6842c72e216ccfb550a6b12f0450ff11e02ff9110dab699bc1a6743ad38e68c2b288a91606d886085d320f775d557041d33159e277f0e73900e89a98cf7f2b7439c2226416b381d092b2a1ad1483949c154d6540195196f5f8c377510f04a9d7cb8c328561950ab547377d582162989934d5f69c6fdb31bdff4ccff396bb3300a2925d8c97d1bce06d32e5c319af210bd708a47bd9772f9c466f05070ae7b483719968708fa2e8a37a535ac5ab4ce1bebce0eb64bbef3535d0c04e34ed680b22492cfeb2b73d9b76da3149af46d7249e4e53058949a2816da06d6f52b7bbec624327b7f28c193a32af475c68c10feda77ebb319224113d43b603e20e88fcf49e8601b841ec7d997e626ee90ce8a63a2bc2fad5797a0629f295eb0a792751726370315daa397f732be5f3331fed79ead301a4a5e10194e8e0236d1f40ca92c5ff5d289c46daf146b6e2f77dd46be88ad5a8762de87bb80f3163c0a65a209be7be387d06ed37906b697e26642c64a87e8949f8657e53fe7a3496ae6dfacfe9da900869079f9d5c86134b8fb412a170b9bf1d22f7864c40ad42b9b6c7266e1fc894dff7ed14b64cfba3fa2e5cee98802c02ad235cea02e7c6a01f816e5c52ba2f9259a36ef5fb6d515fb3027294079d58967251b14880d73ff53ce9ba7cc1e22251f69e6d46e639b69c3efb3c7b23bb22591262dd02f4b2dcaec5ff1afce5b615386e97d3374dcb781715b0b9449040d86ac19c9ad16de5cf1dd87eaaf1f75623c384b06715091fb8e0dae467b74b2fe94b85574ba882805d61209f0fbe38609579c48d083e7bd6d5c44bc7d6c0a0e6d5c54935dd6769a0ef43c4a170fc1be123d037a7ecfbebbf2db669daa763b1a49782c1e5a63ccaa7628699eb641285982488fca444d5287d6c883658cc16427f744dd6ef5a813dd2a596732db916c7f17300706197175ff284a4757ee344cb34c9ef42b896f7502b19e8ef8e9b5b64c0b44f684f1037a54f01f63f7e6e70c41654c73c628a06442c986f492f52c5cdedd466e69bf0d1b64536eaaf917018ec11943c980c9feb03abafbe57a77598ffc97768785f2ef81987591516d7d55b0a2f2cdcb38ee597b2572ece24e97f311a9f167eb806e4b31b6fce65bd4d6a8622706d172ae4b434ad48d38309606c8bfd8a1a5984288a5f4ebb92a56cfea8796b7eae48dd3de6a0d8342b92cae10754651a51f8489f18d85ae0e85e7a756df02f6a049ed8c3b1a0b1ac57bf7f409b2cff11d8695c0b2d38eb70a9323c22751ecf7e67a3b91308ee964356a1a125f29d6510c72eda8174af112a74d07cca539725d81b424679fd4f11e7a33a593ef966679f26ae33bf820b81bc19e58af1c77ccac06c9ed10646243968e39ed9944064e6e19b66590b1f6a9582661078a99fde67a +[FINAL_CB] = 3953 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0xa6 +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0xed2617072fcb81507034ebafe1716cd9 +[CIPHERTEXT] = 0x14e5aaa669ac370a645011ad7d7c86f6 +[TAG] = 0x1dbbe549d62ec235f438e3687c30ab0ce5b51c5a627237d7040e421d67320e77 +[FINAL_CELL] = 0x011dbbe549d62ec235f438e3687c30ab0ce5b51c5a627237d7040e421d67320e77ed2617072fcb81507034ebafe1716cd914e5aaa669ac370a645011ad7d7c86f6 +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x01000000 +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x1a19543a594123219f330212e61ac9fd +[CIPHERTEXT] = 0x68f4ede889f876ee0d09de4ce579421b +[TAG] = 0xa264c8eefd3b6ab14c109f08e4057aa52c0129805d8dcce0410ccb8a5b020664 +[FINAL_CELL] = 0x01a264c8eefd3b6ab14c109f08e4057aa52c0129805d8dcce0410ccb8a5b0206641a19543a594123219f330212e61ac9fd68f4ede889f876ee0d09de4ce579421b +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x0001020304050607 +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x7db40d49e50ef51e832df42388774e06 +[CIPHERTEXT] = 0xbbf5c58232ef911cd78ec3a8207ab208 +[TAG] = 0x015ce983b1b2a477e121b447f7ae4b18d50a118ad41015031f529e41ee6905fe +[FINAL_CELL] = 0x01015ce983b1b2a477e121b447f7ae4b18d50a118ad41015031f529e41ee6905fe7db40d49e50ef51e832df42388774e06bbf5c58232ef911cd78ec3a8207ab208 +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x243713787ab8a6e5dcc2642f725de18c +[CIPHERTEXT] = 0x490bf855c9beb06c662175445d8748c8c311f548cad99c815b05f773e7a4d063 +[TAG] = 0x3f96f26191f084cfd412bca6bba022abc74abebc6c54b90268f15ee664d043e5 +[FINAL_CELL] = 0x013f96f26191f084cfd412bca6bba022abc74abebc6c54b90268f15ee664d043e5243713787ab8a6e5dcc2642f725de18c490bf855c9beb06c662175445d8748c8c311f548cad99c815b05f773e7a4d063 +[FINAL_CB] = 81 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0xfa8dbd0596be0ab81fc16cdaa40e509e +[CIPHERTEXT] = 0x0b5bd819cbfe82b3fe048a9a03281ab4ccde1f7b4dfd7742944cc2d7ca2e8f983d8572a7ccfb3b7669ea0c1bd9e7f356 +[TAG] = 0xca32778974f92b248f06c6d899e2283be6f32f9b86c5cf46537eb147cfcca2f0 +[FINAL_CELL] = 0x01ca32778974f92b248f06c6d899e2283be6f32f9b86c5cf46537eb147cfcca2f0fa8dbd0596be0ab81fc16cdaa40e509e0b5bd819cbfe82b3fe048a9a03281ab4ccde1f7b4dfd7742944cc2d7ca2e8f983d8572a7ccfb3b7669ea0c1bd9e7f356 +[FINAL_CB] = 97 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627 +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x67f45c6026dfad480cfbd45d5f279027 +[CIPHERTEXT] = 0x9efadc0ac6b5dc6410ec61095a98d497b3e76a490415c63973ef3851f10eaa808ba11ef539478be475b8382cd5f1e85f +[TAG] = 0xaadf401aec5c370696ffc84f37830274ec72bf93349bdefb8604d0c4358023a3 +[FINAL_CELL] = 0x01aadf401aec5c370696ffc84f37830274ec72bf93349bdefb8604d0c4358023a367f45c6026dfad480cfbd45d5f2790279efadc0ac6b5dc6410ec61095a98d497b3e76a490415c63973ef3851f10eaa808ba11ef539478be475b8382cd5f1e85f +[FINAL_CB] = 97 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x38e59161ddcda2c3f916d63f97d40eb7 +[CIPHERTEXT] = 0x02e42b37d70a93ea1584c2f6d787473b7a007b2d9573bca45266661d357c5b57998178570d9a73f9fa2a3823360ccaa61c7a022bc92aae1bd37d4e702eb30a3f144b1413a595a02beb0c92d31f30b01f8fe02c9597a93a2808e5f29a0dd2c3a6bd6ad0ebf775257fd692a4e523c50cf64b46aee88ebb620c0da23edb8add3a0190940361acfdbd4708a938fb2e22b707c3fe980e6ab55225ed6d1c9c5e307d4369719d5edfcc617e5f680987b0560d533e8ad816cac470eb078f172e2893adc3b3aa435ad0d46916a6e2990f822c80cc5cf475d3857807d179609616aabd83c3f273622118e0569ab9085020060d339632e0a956dcad889ed31dfc864329d6df2f858fce1ae123589ee1b70d6fc0da4be0ec87bbfc6019fb87916ca6e9430925b752b2e49d395a97bf36f8940e5dd0ed89eb5f7ade3083165fefc7ce4fa0be74a53d933a792b2a16e1b3e92d83ea10969160a86e391fef9b54591b49c6f4cd0b88b2396dc3e232310e6c31abf1a16338970d92f3816ca3db1deccd286a3f0df4c94a38d32de87058c78c5d14d9653016f759042f1494869b1c2cb1bffb8ae80a041e0076873cc11d6ca2640ec4629cacddae73bd2ba2ece9ea00dd02a07cf0daf6b79de850209a2b619bb853c74852835e9de10854ac3f36f0e4a612d171cb9732b83f15e67665e28cd6a8c4c09794b27008c865047820b1c0f5d498f560e78c748bd7d82fa654e60dff62c9e5a3eaa3f2a9b21bed69fee9f3e755a1debeb9406a6575795f9f8f849f309f168234081ff39518904400f7e18123b53df4420f96dc727bf7a401e10c0da23137227bdde6e64a79d2409ef61fe0b63a8b4dc99b50ca0b310c32befeb0caa92879c3ea89d76d1fff356b11bb1d779fbad24a686f3cbfe98170c530c1c7bb1516d418c08d3cfea1b5a807e86f5f747a3284f902122c939acaffc41e1c7ea40de83f44645c79681bffc0df1cf5d531d5867c34210fc99ce27d3d9502420bd9fa3d790c11d86fd8a0cef908c1fe1612fadc821df35c926f11b851d6b54b7c691a85dc893b212589cb5bf373926b516804ecb64b74203cb03cd74b29ec3754fe1bcd67bf2388d5c903fd27859fcfe8a4aaa38adb1b9d53fd32c139c449df53db3990255a9927685ec9a08a37a1fa8485585c16eacdd98094dad75c4750640eb8dc5658db8ffc50d4bf28e74a3d1752d2731396343147f13ea5f24f59d64e8603bee0ab3877bb3379cb424d5c32c8c51688a799ab0aeb21dc1e216bbe48b79221a1e85ec2551831cd326ff5c463cd0bad875077f8f042f2bfef7a605cb2fd83201f8d22671188c6294b77db823ef8a3cbe4dffdbf2afd86458dfeaff2ea8dde23430e382aab979b9fc72f58b4117e8a936ccc1fd3ac95ac2912d5070fb85ac5bb5db88e89d592f40a71e78ac0e6a971cb3ef710d5f029398567c7c5056432247cb476e4acace1acc527393b555ff6d090c44e49bf793f78d590eca458c7d3d256aa10a3e1a8d2b549e1dea2966f00df41cfaac4fad3766695a961ab3cc2fd8e039b95a9c6362e4d7ad38909909cd5e8da35e6898b79c425494b26020d55653440aff0d35a63b1acd7bbe3c6a47f0d48c8c66865dd48f524db7d4f7f038539c8971ec68710062ee192597bc0ae2c53bc38125b140398bc3a9e5216ec8a073075e513ef195ee51760e7081d6d8c30282ead1307be18c36df754136b3180d71f94685d87c827d2531bcb693331e97bf458df5cee7542b6d0ee74e0276cde89bbb0f253637e60901a780c2fd37772accbb2ca33b00f56049a4b82764af5cbcd9179a60290899c739ebe26f17409a89c64ce16279f0f5a128aba11836d602432968f68ff16ee7b1e99b76ee96efa1329507f95aebd4f28c00e2672e56898d02f47611e90678fee3680d540066b82d68bc81956c23a5773b9445e21e157efe97c3ad136ef07f8ece82dc5d8d1d2e81e0227b6f67358886144da4388847603294e0bd448cc8daf13535f13a8a6af6cec673de60f8b32111a83b749eb003518e278e837b555aab3f8e0e73fb7504073e3f511c5ade470e2258224f768817d08255fbd3f658f5b0c50028d804160296e7822b8be1ad9b2da31bcc5621f2576935149dde4fa25a0c00a407fd75759b268148aabd8d17441e7de67f23c1ee27e04302e4d4fa992103ca6d0b6538fc0b92cfbf20ad14f4390925bd7fe0fea81b207964045ef7ea1164c311cbe6f7e668224cdcf81f57a0e383b904cc545a0c94631266bb3cf81df825403c18b39a7a021f390852cf499ce2ed971b572abb184f1e1f0a49513621569949d4633cbb22ac8a194e611fe48cc57bd568981efddda6252e516e7a07baaf3faff4ad55a6a4e547cde4cfff87d73c213272ab83acf24cc49d28f33ba5145b1122f235514442cb08add276ca206317987d2c1f51dc0f8f7bdf1514975152368599418d5297e397f3525083458ff96ad15e07adb63878f8296850d574dd6e42f42e7a02bf25c75b6a8356036ee4b6d185d7b0ab090915071f2431c03a922a3bb82b2ae1fdd1c4dba5a7185d2ad094754c40b083ed0b3bfa9cbb1b4175e1828961be6e56553dc39272a53d0e0cdfadbcdb2ab79ff335b1b9fe94f50baee3c78ba2a986c0a65423ffeed5ac09929fb212258fa0290d83d12232f27550505953e9f0f45c4d5bf21a07d9eb22b7cf4caaad9941ad3b68a2e65e8c4908fe98482798d2bd42c6568a5730828830f8ca861abcde028f842844d0492226c082e4afde492737ca1b689ab5ef6b49b5b95f608d4da363e9d392cfec60fe84a96ee04636ec6871cd73c278516893c24845bfa4c9430777520d14bec98bc70a02e4fd1ba7ededa00df3765da4dc3b4b601b3572279bd2fef57b41763128bed26d1b5e7026130c505dc0db3 +[TAG] = 0x58b34f168af8c9b1a49aa771e560b785f0f10bf31d1c25af97ae1c8a037edeca +[FINAL_CELL] = 0x0158b34f168af8c9b1a49aa771e560b785f0f10bf31d1c25af97ae1c8a037edeca38e59161ddcda2c3f916d63f97d40eb702e42b37d70a93ea1584c2f6d787473b7a007b2d9573bca45266661d357c5b57998178570d9a73f9fa2a3823360ccaa61c7a022bc92aae1bd37d4e702eb30a3f144b1413a595a02beb0c92d31f30b01f8fe02c9597a93a2808e5f29a0dd2c3a6bd6ad0ebf775257fd692a4e523c50cf64b46aee88ebb620c0da23edb8add3a0190940361acfdbd4708a938fb2e22b707c3fe980e6ab55225ed6d1c9c5e307d4369719d5edfcc617e5f680987b0560d533e8ad816cac470eb078f172e2893adc3b3aa435ad0d46916a6e2990f822c80cc5cf475d3857807d179609616aabd83c3f273622118e0569ab9085020060d339632e0a956dcad889ed31dfc864329d6df2f858fce1ae123589ee1b70d6fc0da4be0ec87bbfc6019fb87916ca6e9430925b752b2e49d395a97bf36f8940e5dd0ed89eb5f7ade3083165fefc7ce4fa0be74a53d933a792b2a16e1b3e92d83ea10969160a86e391fef9b54591b49c6f4cd0b88b2396dc3e232310e6c31abf1a16338970d92f3816ca3db1deccd286a3f0df4c94a38d32de87058c78c5d14d9653016f759042f1494869b1c2cb1bffb8ae80a041e0076873cc11d6ca2640ec4629cacddae73bd2ba2ece9ea00dd02a07cf0daf6b79de850209a2b619bb853c74852835e9de10854ac3f36f0e4a612d171cb9732b83f15e67665e28cd6a8c4c09794b27008c865047820b1c0f5d498f560e78c748bd7d82fa654e60dff62c9e5a3eaa3f2a9b21bed69fee9f3e755a1debeb9406a6575795f9f8f849f309f168234081ff39518904400f7e18123b53df4420f96dc727bf7a401e10c0da23137227bdde6e64a79d2409ef61fe0b63a8b4dc99b50ca0b310c32befeb0caa92879c3ea89d76d1fff356b11bb1d779fbad24a686f3cbfe98170c530c1c7bb1516d418c08d3cfea1b5a807e86f5f747a3284f902122c939acaffc41e1c7ea40de83f44645c79681bffc0df1cf5d531d5867c34210fc99ce27d3d9502420bd9fa3d790c11d86fd8a0cef908c1fe1612fadc821df35c926f11b851d6b54b7c691a85dc893b212589cb5bf373926b516804ecb64b74203cb03cd74b29ec3754fe1bcd67bf2388d5c903fd27859fcfe8a4aaa38adb1b9d53fd32c139c449df53db3990255a9927685ec9a08a37a1fa8485585c16eacdd98094dad75c4750640eb8dc5658db8ffc50d4bf28e74a3d1752d2731396343147f13ea5f24f59d64e8603bee0ab3877bb3379cb424d5c32c8c51688a799ab0aeb21dc1e216bbe48b79221a1e85ec2551831cd326ff5c463cd0bad875077f8f042f2bfef7a605cb2fd83201f8d22671188c6294b77db823ef8a3cbe4dffdbf2afd86458dfeaff2ea8dde23430e382aab979b9fc72f58b4117e8a936ccc1fd3ac95ac2912d5070fb85ac5bb5db88e89d592f40a71e78ac0e6a971cb3ef710d5f029398567c7c5056432247cb476e4acace1acc527393b555ff6d090c44e49bf793f78d590eca458c7d3d256aa10a3e1a8d2b549e1dea2966f00df41cfaac4fad3766695a961ab3cc2fd8e039b95a9c6362e4d7ad38909909cd5e8da35e6898b79c425494b26020d55653440aff0d35a63b1acd7bbe3c6a47f0d48c8c66865dd48f524db7d4f7f038539c8971ec68710062ee192597bc0ae2c53bc38125b140398bc3a9e5216ec8a073075e513ef195ee51760e7081d6d8c30282ead1307be18c36df754136b3180d71f94685d87c827d2531bcb693331e97bf458df5cee7542b6d0ee74e0276cde89bbb0f253637e60901a780c2fd37772accbb2ca33b00f56049a4b82764af5cbcd9179a60290899c739ebe26f17409a89c64ce16279f0f5a128aba11836d602432968f68ff16ee7b1e99b76ee96efa1329507f95aebd4f28c00e2672e56898d02f47611e90678fee3680d540066b82d68bc81956c23a5773b9445e21e157efe97c3ad136ef07f8ece82dc5d8d1d2e81e0227b6f67358886144da4388847603294e0bd448cc8daf13535f13a8a6af6cec673de60f8b32111a83b749eb003518e278e837b555aab3f8e0e73fb7504073e3f511c5ade470e2258224f768817d08255fbd3f658f5b0c50028d804160296e7822b8be1ad9b2da31bcc5621f2576935149dde4fa25a0c00a407fd75759b268148aabd8d17441e7de67f23c1ee27e04302e4d4fa992103ca6d0b6538fc0b92cfbf20ad14f4390925bd7fe0fea81b207964045ef7ea1164c311cbe6f7e668224cdcf81f57a0e383b904cc545a0c94631266bb3cf81df825403c18b39a7a021f390852cf499ce2ed971b572abb184f1e1f0a49513621569949d4633cbb22ac8a194e611fe48cc57bd568981efddda6252e516e7a07baaf3faff4ad55a6a4e547cde4cfff87d73c213272ab83acf24cc49d28f33ba5145b1122f235514442cb08add276ca206317987d2c1f51dc0f8f7bdf1514975152368599418d5297e397f3525083458ff96ad15e07adb63878f8296850d574dd6e42f42e7a02bf25c75b6a8356036ee4b6d185d7b0ab090915071f2431c03a922a3bb82b2ae1fdd1c4dba5a7185d2ad094754c40b083ed0b3bfa9cbb1b4175e1828961be6e56553dc39272a53d0e0cdfadbcdb2ab79ff335b1b9fe94f50baee3c78ba2a986c0a65423ffeed5ac09929fb212258fa0290d83d12232f27550505953e9f0f45c4d5bf21a07d9eb22b7cf4caaad9941ad3b68a2e65e8c4908fe98482798d2bd42c6568a5730828830f8ca861abcde028f842844d0492226c082e4afde492737ca1b689ab5ef6b49b5b95f608d4da363e9d392cfec60fe84a96ee04636ec6871cd73c278516893c24845bfa4c9430777520d14bec98bc70a02e4fd1ba7ededa00df3765da4dc3b4b601b3572279bd2fef57b41763128bed26d1b5e7026130c505dc0db3 +[FINAL_CB] = 2113 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[PLAINTEXT] = 0x6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a +[ENCKEY] = 0xad2db65a8c5c1ec4e1cde78b36bdee713e35bdbe4932d4b93d05a8a821233ee6 +[MACKEY] = 0x9202112ff50d91ed88366e4995574be55945f49bfde9e0a1a408b6f31487b41f +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0xb05900fa9ff9d48aa181e9d4a12b1b8b +[CIPHERTEXT] = 0x83e27adb86171966e8a7fee14328f02b5068b9f503a7561e2d6b24ffcd1e0a9d236190714ddd86908381a766811de03ec8d3cf0a3b91853bc48d8a15e7a5aad7a7e5854ccfd2e565ba6daca363a5fcbd997c88a0eb3762ad67032bb139d6a15440888856e4f9fa318a48b183b758a105f61963e7edcfbce23b154a1054cda535d4376b64e0773c892f35e5e37c83bb9509b55e437df67263bc7aa61c7f8d8e00225994e821d3a9df8b4abbe55bd199026835c2b4d40618dff448b1af5879d294b27dfe0381f252bed31ab6c89059727c43c570914ef7527526ef67442cfc6c2917cede121a7f199072a2049aeea625c59b4ae6ffb483267283a275e4f247ead211903f0364fd3b1213ce1f0a39372d374436eff18b27af2cdf0d9ff25b1ce9d0e5e100c40c474a5ce3d5b744cc178270b35c8f0f78b560eac71a9f85e9b4472cf75a6935ae19e61cc067bd5e747bd62bdbdc2fa9af024131e27dc93b0a148724e613a5d6ca702ce2b1b0f80e9baaf3b1057dafaff036ea8b57ddecfd6d65eea9a50ab7b286c87108bfa088cf2a6424e893740d66eb256b5cff67833fb2f892b060687cf689792830e9edf96a2f1d392baabd5bbcca8fed77d4c40be67cf2db0c5cef651cd75abc5e5ed83bc4b4e58345d34baf01f7888b3d05d66e406f2d5d6c04bcd0b0a335efa48e4a2caf9e137001fc397f6aab5e2c853b9d5c4201bcdf00eca6b0c4d5bc4086751bfdab4157b26fe6e1f7813b5ff9d743cca942b8c34a276df3d1154ba85600e0b324c56c2204ea929606971dbe9d382a23d5e1e283b78c9f34cddd086568b5c72f2ce3ed344996245fbf206c3cf2c036dc7ba0352cb1d971a592a06b274f6278bd0bd97a69d9cc3dbd52d2eb36f6aca3c6abbddb37abaa2a0d217c5b4f4d0af87968ade7f5e44f57253047c61fe0104186656fb84bfea93db72b9d08bcf9dc50548c0aa8db61fd6e4fe91970119495be1c058150a0112837c1abb7128de418c6bbcfd53c2f83614615f857a0be5d3d26f93a9db2013b7d7a93eb323df3dd5ed9349ebe8194c653c525892808f151d9775664e23e6977ea1214d962999b0378271f0513bb99f4842390b2c9d4b2d19919d28228484dfa7c0afe59d9cb88b8725470c25bcbcb1dc21817ed8baf1717a7767ec4fde1db875f692dae8c4b10d304774831a1106ee13e3299890d381eeac6503d8f562e0ea73e8423223b1dbe1ba96225c7bc21fcb3ce9be9044b1e682cf356a8d17c296e341a51192d9eda5da5f03e2ea0b17b665fc246f2ae5cbf026a4d090d8b7458c6bd537288ad15b531a76e76ca59f660459fe8d47d89475398a784a655949df02b02149699bcb6b3f0a744b93f85794b47a616f2c8a95546155087143005d13ad17cddef34a3b916aeb17c0a23aa63c50247b095083e73e891100f2b16b7642e7072b0cfd3fe025184f1ff324a670bbbda18fd630fd6d6fd190b0ca74351dce6c349c5caf17aa83d1e8e53ea3feaac0e2a015f4be19a4ddee482076c2a5d055cb29db9f48bf3b809d9ac1bdf3bfc917d6737ac9c7e346b1245fe8c56112c5e8e976c43f46894457825bd045c21d2ac6390384ed76bfe23a9e335282de3ae8ac7ced9ae975432be6c19a32a9cff62bd2bef4deb8a3f40a32973efc91d0d4ae7531e533679f8dedc9e03c19059caec4b45655f99e00aa25f503999e2bec64a107bcee7add494993767346273a849b3deb4a699b5f50a472e906ac0ac9791d311cedc451478527f698bf02e289434251ef16dc5efebabc162c80013b1732b54df2a374356575f598631120148c610ec09eba694d57de4026ecfbaccb79f2c8c65b52df3669a427c6f2ef20078fa675e1cbf2b0c281cca1bc5d1777f86cd9260e787243a705b1f801188cee00e40a3bb77f32383feb641c1fe571c322f41bcaf99f949fdf681456b0d20ffdcb1272d6e4d78bb59fd9d51a901543c9d8a6080bf03eb0c1e4aa70f7309ef53b54c20c0207e46fa243e03e27d5d35819b97b874cfdacb30e10f0e32b74e0855866cd82076ab791e62991bb89bfe9198483f92f93fd742cab6d9c786fca2a891c375e6e20fdc70f70b30b82607e1e0c456ef46241aee4e8a06ab1d0824ad4aaabb17dbb8874b511cdf2c4655b202398b85bb12d4de9a69dc49fc5c5046f6645ae19a17e336f0e497a13684bfe51846b6276c64f00b6bf30a0878422907298f32028e051faa9ab50d8d022170e5ebd1098130bc65cca2607f9f790cb9c71a5316f4be62f9f003ef7c6bf43fd3361334db3bf671892c8bf5832724023cddc569023d6ceb7a51f88f9aaead5f897d1e453565b38128d26397d52ce6582e2c1314aac671787d8f21eb3a06b3617e41d4870509a779d4afe466e9e5d93485b4603672d6ae6606e7652681c94db8b50b73c957dce7d12ae43add71a441f527a3c9978aef76e0c2c9f14bb1ba43a75b11734e47ed82615aa070482b65e27c02dba3dfb4f92c1716eb2f9f76646297f9c04107ff1b4863904dd7ff70ff349f4b56d32c84ae62a2ffbd0eaca0ae48ad6231a64d4ea5221cb9357f0a5dc21949e549389ee4749b5d754f108f2be9e85257e1ac2ba6b30be0cb9d2b394f360eeeb1131df1e439c6223bdfc779051241a73928ef1d417f88d6ef011350f7401947d2297c1f9a2f83ffad0fd072a21f4e03c6e701ade5fc52636989f370719b27ed29d13038d1d9a0259edc68f8ee38531b91c2a1b0a7b62ac1e868a20b8ac6a6bec14e3e47bc776db9ec86864d66676ac115ef71a0b7e088bad01001140b394ce7ba4e7af36c9cdb0b781f79cdf776021094b109098796ba1e0798014716c2e24a8c5e8ce396745653bd8ed19ff08a0d70d6082e011afe41a799945062bc016094ff7409f569e02f6ac6f8a022662fb216e02f833963643d181394a21f4038a34df4382192d9a45b4cf70cfc80bfd0e95cc1c40fc4154f8bc663da2fcb92dadf9dd94c97aecc9c9c584d40beb52a91fb589b7e9a7228eecc97e0b885bf314f047312825de627ca7d6da620f60e5a8e5deddeb38408cba07c7b99171a6a9f0959c406b6b84079cf94d4e7461a7b9fa4d802fa464f8f1d4218f51b67c6e4096fd58a5a43a1b130c10396ade1b58ef6acd32895c203a4e81ac06336a2348f4a9fd299491c0cb6c4a8de4dc467795a97aa381ba4209f43110df3e049e2be0c9d32976aa02b338adb6e992a784beb44ffb95533789cff16ce507e2f9ced3ca0f3c9fe464baf27b3012a95b0869acae0e6a5228e94841b6ae3df6ddd8e9f261898e2364d1b2ef535641f3ff93613fe5321a70f2b80a5b35969b0c598a4a05ce8cb32fdc4a932515119b6a344c26d384de7e93d6ca4ce7863ef67f96a2abe29a4af9af95f97f8d2d68f5e32c642609b0bf9461ac08a9ba6543e9ecac6f344b6d3e42225ef682310890dab64de16e03ea6f07854c8d33fb0c8b4e982e231d607f3cec640c5f0aa702deecb5176a747bf3e78156c136432b0a07895da5663e21bb7d16bf8ba1d36b4f933d0d6ea81210c612bc320e1782a96613ab1d049a8f9b08d064643a149158fe145d752d0a3adbea2e1a8940876274a1a6ff370b000bd32736bf5e2b4edb8a0da334e8ce98790ee12a9512e8cd37b156b1b0eb8f0bc899c57afb8eb9a879d893636ccaa2407183f2de12804b37cd1cdab72845a40804b362256e8a1fe308e1b88f51e8d8640660a283a7d47900eb5050fb9c052931b402a4a1101ac2210dbf29861eff1c1529627c52ce0dc8d9436b75f88534d234fc34d1c9a3b140afc336186d940ed6ed890a6739382f66ab1ec42c4fe23f766db41a6aa8a89b8c1e9a33420674cce0f1399c041316d1fa070b283dd7bb0dbd6d39a85858f3dd806223cb7b0e24cd15830c32d8a5b19f3287c7a735b74714942ac6b815359862122e5225e159e4e427c5105cdc13cb84d070e0205eeab1accb8c39c7d45dd3f56a1217ceb36053db514e922e4c603ff3a9982c5b8ac7b701c7922ceec01c555cbfca8e835470091e2f2f53777102e691896705976bc90ce21acd9ccb4afbf62809037d9385208a44730d970d6a21b036fdde91249a5e3f28eb5bdb31acbb36d786a15cf773d2f535cd5ba618b66044b51397df69e394cd24a5c15092c16db5577ec7e345f4d46374bc33852f59aa0c15350e53ca63838c0a4bb5d39a23abbf5db8a2750da7560e89c8af6aa46f8cd7a0806854ec1886015c4a1823c27aed35fade6085b30a1b23a0634e2c216f57a093f5a393c9fca56432f47a1ccb0aba3df69279939ed141011e1c91b16a1981788cad519ff292ec2af6614657b657b784809809f6f95fda0918d60115d996a8e730801885d355e57d139deef798cc3f427795fc0c8cc7a087e35efc8294c24da740f27a2dbe2e1f84634f3276d6ecfb71778d4036f56c72669b78b21d4dce34e04823c9381388b8b091d8476bdbe2ba67e822b9676d3ffee7a63ccc43d78f571587a22399416f7525da16b1ffb088cf37d86e97cc2c678b39b6ce0f93e3d6ac18b1766cc8e1c89e702bee6b3f02c72e05160fa02c0c502ab1f519c8fb356fb6b23e59bc37b2276a3f4d3bd537fbfdf153e8886c9497b969479fa372b87450b73adfe47e5bcaa57278a7dfa6c5497e5e762a83d8c51f3ad4b6b43efafba7a80d4b595657af9f6a090def650a946c43d45ddcaadee33216f3611ead09ddcf55a2265abb80d2bb334ddd0061515d04352bb0e1de89fff3b5baa653533d7abf99b1ded7bfd0b8d21549fe90022e49d84b22d799536869a056079dfbd46c33a55625c7a0590d6af628348efd8c8af5ab6b3d52fa7a32d01876154c5ad03c51b840f30ad798f8ef3ed47eb8a58f73fd536e09b370eddc132028c4c05d2afec79846d3b4aca766feba4587ec3b00ae2643829f30e214e398e8721c33a9ca145d3b4995b3af7675a6af0665b3b483eeb80a6fe45788e6793c689cfca69b08d01f00f9ba5845de354fce65606e0a7e148f87afebfc96061bc53453ed6f4eea561d31103c69d0df4a051aa867c2fe08e0e16604a91ebaaa7331061fe883814ee96c6463f57d6c260ad0dc3ce0b433fcddd325a2244048a22700cb09a8b870bb84a3595d7aa47afd7c9c4da90d43da57c7eefad75e4a814f078d790570b5f74f759d83cff9abaf19adfc622884679fccf4ce33f6d5760736ec26738f7b7d3805ca842cfe3fcda93e7e1addcd2bde828f151841fdbe13a6d015776a7fe03b7272594fcde523fcecdc1c2b33ec69649ed6443ebf96a9221d37fae6a9bfed6751797210113808fc1891884c88818175e220de486ce8dd9c5b5b85aab4a7a2600bc8bbe23cf239e1edccaf1753ac03627083f87da257dde8cc3fc66782a230aee71d9a605f7cc45e05035739405d63a21eb9eb0e3bad5c14286bcfaf96666187913b403a413516f03db5b7da49e35e12000cbdf3f9383a73e7ef31bcfe207228dbcc20be5b3a489b71c8214471901836d53911bf942c2685fdc +[TAG] = 0xd243e34022380d5fc8f352a3d5b8dc82f6105921fa8a5564ba6fe69be55fa930 +[FINAL_CELL] = 0x01d243e34022380d5fc8f352a3d5b8dc82f6105921fa8a5564ba6fe69be55fa930b05900fa9ff9d48aa181e9d4a12b1b8b83e27adb86171966e8a7fee14328f02b5068b9f503a7561e2d6b24ffcd1e0a9d236190714ddd86908381a766811de03ec8d3cf0a3b91853bc48d8a15e7a5aad7a7e5854ccfd2e565ba6daca363a5fcbd997c88a0eb3762ad67032bb139d6a15440888856e4f9fa318a48b183b758a105f61963e7edcfbce23b154a1054cda535d4376b64e0773c892f35e5e37c83bb9509b55e437df67263bc7aa61c7f8d8e00225994e821d3a9df8b4abbe55bd199026835c2b4d40618dff448b1af5879d294b27dfe0381f252bed31ab6c89059727c43c570914ef7527526ef67442cfc6c2917cede121a7f199072a2049aeea625c59b4ae6ffb483267283a275e4f247ead211903f0364fd3b1213ce1f0a39372d374436eff18b27af2cdf0d9ff25b1ce9d0e5e100c40c474a5ce3d5b744cc178270b35c8f0f78b560eac71a9f85e9b4472cf75a6935ae19e61cc067bd5e747bd62bdbdc2fa9af024131e27dc93b0a148724e613a5d6ca702ce2b1b0f80e9baaf3b1057dafaff036ea8b57ddecfd6d65eea9a50ab7b286c87108bfa088cf2a6424e893740d66eb256b5cff67833fb2f892b060687cf689792830e9edf96a2f1d392baabd5bbcca8fed77d4c40be67cf2db0c5cef651cd75abc5e5ed83bc4b4e58345d34baf01f7888b3d05d66e406f2d5d6c04bcd0b0a335efa48e4a2caf9e137001fc397f6aab5e2c853b9d5c4201bcdf00eca6b0c4d5bc4086751bfdab4157b26fe6e1f7813b5ff9d743cca942b8c34a276df3d1154ba85600e0b324c56c2204ea929606971dbe9d382a23d5e1e283b78c9f34cddd086568b5c72f2ce3ed344996245fbf206c3cf2c036dc7ba0352cb1d971a592a06b274f6278bd0bd97a69d9cc3dbd52d2eb36f6aca3c6abbddb37abaa2a0d217c5b4f4d0af87968ade7f5e44f57253047c61fe0104186656fb84bfea93db72b9d08bcf9dc50548c0aa8db61fd6e4fe91970119495be1c058150a0112837c1abb7128de418c6bbcfd53c2f83614615f857a0be5d3d26f93a9db2013b7d7a93eb323df3dd5ed9349ebe8194c653c525892808f151d9775664e23e6977ea1214d962999b0378271f0513bb99f4842390b2c9d4b2d19919d28228484dfa7c0afe59d9cb88b8725470c25bcbcb1dc21817ed8baf1717a7767ec4fde1db875f692dae8c4b10d304774831a1106ee13e3299890d381eeac6503d8f562e0ea73e8423223b1dbe1ba96225c7bc21fcb3ce9be9044b1e682cf356a8d17c296e341a51192d9eda5da5f03e2ea0b17b665fc246f2ae5cbf026a4d090d8b7458c6bd537288ad15b531a76e76ca59f660459fe8d47d89475398a784a655949df02b02149699bcb6b3f0a744b93f85794b47a616f2c8a95546155087143005d13ad17cddef34a3b916aeb17c0a23aa63c50247b095083e73e891100f2b16b7642e7072b0cfd3fe025184f1ff324a670bbbda18fd630fd6d6fd190b0ca74351dce6c349c5caf17aa83d1e8e53ea3feaac0e2a015f4be19a4ddee482076c2a5d055cb29db9f48bf3b809d9ac1bdf3bfc917d6737ac9c7e346b1245fe8c56112c5e8e976c43f46894457825bd045c21d2ac6390384ed76bfe23a9e335282de3ae8ac7ced9ae975432be6c19a32a9cff62bd2bef4deb8a3f40a32973efc91d0d4ae7531e533679f8dedc9e03c19059caec4b45655f99e00aa25f503999e2bec64a107bcee7add494993767346273a849b3deb4a699b5f50a472e906ac0ac9791d311cedc451478527f698bf02e289434251ef16dc5efebabc162c80013b1732b54df2a374356575f598631120148c610ec09eba694d57de4026ecfbaccb79f2c8c65b52df3669a427c6f2ef20078fa675e1cbf2b0c281cca1bc5d1777f86cd9260e787243a705b1f801188cee00e40a3bb77f32383feb641c1fe571c322f41bcaf99f949fdf681456b0d20ffdcb1272d6e4d78bb59fd9d51a901543c9d8a6080bf03eb0c1e4aa70f7309ef53b54c20c0207e46fa243e03e27d5d35819b97b874cfdacb30e10f0e32b74e0855866cd82076ab791e62991bb89bfe9198483f92f93fd742cab6d9c786fca2a891c375e6e20fdc70f70b30b82607e1e0c456ef46241aee4e8a06ab1d0824ad4aaabb17dbb8874b511cdf2c4655b202398b85bb12d4de9a69dc49fc5c5046f6645ae19a17e336f0e497a13684bfe51846b6276c64f00b6bf30a0878422907298f32028e051faa9ab50d8d022170e5ebd1098130bc65cca2607f9f790cb9c71a5316f4be62f9f003ef7c6bf43fd3361334db3bf671892c8bf5832724023cddc569023d6ceb7a51f88f9aaead5f897d1e453565b38128d26397d52ce6582e2c1314aac671787d8f21eb3a06b3617e41d4870509a779d4afe466e9e5d93485b4603672d6ae6606e7652681c94db8b50b73c957dce7d12ae43add71a441f527a3c9978aef76e0c2c9f14bb1ba43a75b11734e47ed82615aa070482b65e27c02dba3dfb4f92c1716eb2f9f76646297f9c04107ff1b4863904dd7ff70ff349f4b56d32c84ae62a2ffbd0eaca0ae48ad6231a64d4ea5221cb9357f0a5dc21949e549389ee4749b5d754f108f2be9e85257e1ac2ba6b30be0cb9d2b394f360eeeb1131df1e439c6223bdfc779051241a73928ef1d417f88d6ef011350f7401947d2297c1f9a2f83ffad0fd072a21f4e03c6e701ade5fc52636989f370719b27ed29d13038d1d9a0259edc68f8ee38531b91c2a1b0a7b62ac1e868a20b8ac6a6bec14e3e47bc776db9ec86864d66676ac115ef71a0b7e088bad01001140b394ce7ba4e7af36c9cdb0b781f79cdf776021094b109098796ba1e0798014716c2e24a8c5e8ce396745653bd8ed19ff08a0d70d6082e011afe41a799945062bc016094ff7409f569e02f6ac6f8a022662fb216e02f833963643d181394a21f4038a34df4382192d9a45b4cf70cfc80bfd0e95cc1c40fc4154f8bc663da2fcb92dadf9dd94c97aecc9c9c584d40beb52a91fb589b7e9a7228eecc97e0b885bf314f047312825de627ca7d6da620f60e5a8e5deddeb38408cba07c7b99171a6a9f0959c406b6b84079cf94d4e7461a7b9fa4d802fa464f8f1d4218f51b67c6e4096fd58a5a43a1b130c10396ade1b58ef6acd32895c203a4e81ac06336a2348f4a9fd299491c0cb6c4a8de4dc467795a97aa381ba4209f43110df3e049e2be0c9d32976aa02b338adb6e992a784beb44ffb95533789cff16ce507e2f9ced3ca0f3c9fe464baf27b3012a95b0869acae0e6a5228e94841b6ae3df6ddd8e9f261898e2364d1b2ef535641f3ff93613fe5321a70f2b80a5b35969b0c598a4a05ce8cb32fdc4a932515119b6a344c26d384de7e93d6ca4ce7863ef67f96a2abe29a4af9af95f97f8d2d68f5e32c642609b0bf9461ac08a9ba6543e9ecac6f344b6d3e42225ef682310890dab64de16e03ea6f07854c8d33fb0c8b4e982e231d607f3cec640c5f0aa702deecb5176a747bf3e78156c136432b0a07895da5663e21bb7d16bf8ba1d36b4f933d0d6ea81210c612bc320e1782a96613ab1d049a8f9b08d064643a149158fe145d752d0a3adbea2e1a8940876274a1a6ff370b000bd32736bf5e2b4edb8a0da334e8ce98790ee12a9512e8cd37b156b1b0eb8f0bc899c57afb8eb9a879d893636ccaa2407183f2de12804b37cd1cdab72845a40804b362256e8a1fe308e1b88f51e8d8640660a283a7d47900eb5050fb9c052931b402a4a1101ac2210dbf29861eff1c1529627c52ce0dc8d9436b75f88534d234fc34d1c9a3b140afc336186d940ed6ed890a6739382f66ab1ec42c4fe23f766db41a6aa8a89b8c1e9a33420674cce0f1399c041316d1fa070b283dd7bb0dbd6d39a85858f3dd806223cb7b0e24cd15830c32d8a5b19f3287c7a735b74714942ac6b815359862122e5225e159e4e427c5105cdc13cb84d070e0205eeab1accb8c39c7d45dd3f56a1217ceb36053db514e922e4c603ff3a9982c5b8ac7b701c7922ceec01c555cbfca8e835470091e2f2f53777102e691896705976bc90ce21acd9ccb4afbf62809037d9385208a44730d970d6a21b036fdde91249a5e3f28eb5bdb31acbb36d786a15cf773d2f535cd5ba618b66044b51397df69e394cd24a5c15092c16db5577ec7e345f4d46374bc33852f59aa0c15350e53ca63838c0a4bb5d39a23abbf5db8a2750da7560e89c8af6aa46f8cd7a0806854ec1886015c4a1823c27aed35fade6085b30a1b23a0634e2c216f57a093f5a393c9fca56432f47a1ccb0aba3df69279939ed141011e1c91b16a1981788cad519ff292ec2af6614657b657b784809809f6f95fda0918d60115d996a8e730801885d355e57d139deef798cc3f427795fc0c8cc7a087e35efc8294c24da740f27a2dbe2e1f84634f3276d6ecfb71778d4036f56c72669b78b21d4dce34e04823c9381388b8b091d8476bdbe2ba67e822b9676d3ffee7a63ccc43d78f571587a22399416f7525da16b1ffb088cf37d86e97cc2c678b39b6ce0f93e3d6ac18b1766cc8e1c89e702bee6b3f02c72e05160fa02c0c502ab1f519c8fb356fb6b23e59bc37b2276a3f4d3bd537fbfdf153e8886c9497b969479fa372b87450b73adfe47e5bcaa57278a7dfa6c5497e5e762a83d8c51f3ad4b6b43efafba7a80d4b595657af9f6a090def650a946c43d45ddcaadee33216f3611ead09ddcf55a2265abb80d2bb334ddd0061515d04352bb0e1de89fff3b5baa653533d7abf99b1ded7bfd0b8d21549fe90022e49d84b22d799536869a056079dfbd46c33a55625c7a0590d6af628348efd8c8af5ab6b3d52fa7a32d01876154c5ad03c51b840f30ad798f8ef3ed47eb8a58f73fd536e09b370eddc132028c4c05d2afec79846d3b4aca766feba4587ec3b00ae2643829f30e214e398e8721c33a9ca145d3b4995b3af7675a6af0665b3b483eeb80a6fe45788e6793c689cfca69b08d01f00f9ba5845de354fce65606e0a7e148f87afebfc96061bc53453ed6f4eea561d31103c69d0df4a051aa867c2fe08e0e16604a91ebaaa7331061fe883814ee96c6463f57d6c260ad0dc3ce0b433fcddd325a2244048a22700cb09a8b870bb84a3595d7aa47afd7c9c4da90d43da57c7eefad75e4a814f078d790570b5f74f759d83cff9abaf19adfc622884679fccf4ce33f6d5760736ec26738f7b7d3805ca842cfe3fcda93e7e1addcd2bde828f151841fdbe13a6d015776a7fe03b7272594fcde523fcecdc1c2b33ec69649ed6443ebf96a9221d37fae6a9bfed6751797210113808fc1891884c88818175e220de486ce8dd9c5b5b85aab4a7a2600bc8bbe23cf239e1edccaf1753ac03627083f87da257dde8cc3fc66782a230aee71d9a605f7cc45e05035739405d63a21eb9eb0e3bad5c14286bcfaf96666187913b403a413516f03db5b7da49e35e12000cbdf3f9383a73e7ef31bcfe207228dbcc20be5b3a489b71c8214471901836d53911bf942c2685fdc +[FINAL_CB] = 3953 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0xa6 +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x041ed278c94ca5711ffad115fde7dda2 +[CIPHERTEXT] = 0x3d9cf57e30df71783f4c78efb27430dd +[TAG] = 0xe9c0a70fd041fb9374055e8562f32af89e770a0b2f70df3935ef78bbe9d60215 +[FINAL_CELL] = 0x01e9c0a70fd041fb9374055e8562f32af89e770a0b2f70df3935ef78bbe9d60215041ed278c94ca5711ffad115fde7dda23d9cf57e30df71783f4c78efb27430dd +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x01000000 +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x71553182350afb37c11ffea9a5d73f96 +[CIPHERTEXT] = 0xd161b728a267cae9d3e8863c45c3041b +[TAG] = 0x3a20332530c05222262009d8a43e89b7c058163e90f821024f184cf6b9554465 +[FINAL_CELL] = 0x013a20332530c05222262009d8a43e89b7c058163e90f821024f184cf6b955446571553182350afb37c11ffea9a5d73f96d161b728a267cae9d3e8863c45c3041b +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x0001020304050607 +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0xb3c47ee38b0d0f75fecdf3f67706cb6c +[CIPHERTEXT] = 0xc978d11ff64c25cc8dbf1d236d8f57da +[TAG] = 0x0a59653fb671dcddc3b15cd5dd0e53a5e9b36edc43449caf134fc77122e76a01 +[FINAL_CELL] = 0x010a59653fb671dcddc3b15cd5dd0e53a5e9b36edc43449caf134fc77122e76a01b3c47ee38b0d0f75fecdf3f67706cb6cc978d11ff64c25cc8dbf1d236d8f57da +[FINAL_CB] = 65 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0xf12364602d13d0cb8a9699789d64d72b +[CIPHERTEXT] = 0x2df3e70eb40936b2216ef11946f3b5b1c7f6b0dd40f300dc7bbc12f27388cd1e +[TAG] = 0x168f0b47e7b0663c0f58e4c3c712c7bc5e7fe5cf11830a3e7f1c3055cda79dad +[FINAL_CELL] = 0x01168f0b47e7b0663c0f58e4c3c712c7bc5e7fe5cf11830a3e7f1c3055cda79dadf12364602d13d0cb8a9699789d64d72b2df3e70eb40936b2216ef11946f3b5b1c7f6b0dd40f300dc7bbc12f27388cd1e +[FINAL_CB] = 81 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x82c9696610105b263abbf30f58034f05 +[CIPHERTEXT] = 0xda79b40c2d9db7899696f203bba9d9458db7ee17b784c788a8b0787dc9b6b6196f6ed3677b14b1bedad67220577057db +[TAG] = 0x3ae9e94c1cdece15c99894f64619b38bee3c882c4da4874a6e0fdea94f5108e6 +[FINAL_CELL] = 0x013ae9e94c1cdece15c99894f64619b38bee3c882c4da4874a6e0fdea94f5108e682c9696610105b263abbf30f58034f05da79b40c2d9db7899696f203bba9d9458db7ee17b784c788a8b0787dc9b6b6196f6ed3677b14b1bedad67220577057db +[FINAL_CB] = 97 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627 +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x853687d0cd278f108d0190d3858abd19 +[CIPHERTEXT] = 0xc6439420ee273d49101459d2f615929b0f89358b1fac7f2555b6345d6760219d7878534dc7019538bc9261dc68f4b797 +[TAG] = 0x0f81c22ce8f6d68c5708635e7337d5a7516aa208dfcc0b0bd8f3d7814a1c45ed +[FINAL_CELL] = 0x010f81c22ce8f6d68c5708635e7337d5a7516aa208dfcc0b0bd8f3d7814a1c45ed853687d0cd278f108d0190d3858abd19c6439420ee273d49101459d2f615929b0f89358b1fac7f2555b6345d6760219d7878534dc7019538bc9261dc68f4b797 +[FINAL_CB] = 97 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0xd636eacf3cf6d63760b26cec107b4a67 +[CIPHERTEXT] = 0xe37365293e4a896ccb9eb01aa4a4037031e0f4d204bc93de53a895c28b2d2ffa9616a021622cdb0ee440ff8528863e2669cc1d2ecd4379db15cea0fd1379c6fa8928f8ce36eec0742fe43bb2513632847fa6839025d9a8218554cde1e1807c5b02021e102fe52834e811a3ce810969b863308f6fbdf0bd38a8d2c456eb3b974d452da8b98e4150b2b59ba495d67cdc714eaf52ae5c723d61ed87e6be4d50a9eba03eb1a8c27a13b2160c1f91d43865a81c118b1f79c470f9242ee97751c0ea9b622214b5c8b0dd0fbbcb7e50153c0850d1ea18d36d7ee26d40b83a3326c68f0a6cf0fe91a90c4b89455b4d942cd1b6be9146bb9ff739fd1eb1df4f39bc5e65089304f2c83024ce954e844064592368081fef3f6825715bc275868c32fb0770703b4dfa2c287f9ccbb8ac20a19f456a9b6e506b3277bbba83781495d5e25c2ce5b9f4fa012c4c118ef11dac8bc6e53b9da986037d20d8e056f2a591468e0711998d4137e292c8dab512d3f50ce381fe507edff921f85949cec3003ce6f3f3f0c01023d404c3dbf36cf7451b407a78b1a797e4286963b6dea599940ca0b3fe9831bb94762f5d65c0ac95474b566562f17646c8e35115c300c624565d8b04d131f401629b5b2b0820f63c29c97cb30914437a824f36f50c1e1377c5a85f8331ea6b2cc4e7fd4ba882198285189efd77d7d2f6aa59e0d99d607916719217562a59876a19e7c94f5cac3a47843c27fa759531c3d52edcaa4493d780234d855f25c9d74eaa678160974334ccf99f18015ff54b2f0a6ed69fec589681f8c2cb464706ea70d403dd35f5e30b0bb1ded3376b8cee7480fbb0eb726343a665a4ac46e8f7f5cc272a901f38d648cb21c9ac4e04d36f764c3fb4a0966c0a28cde03a337469a4cc4e05a5c8874ea93b0196ceffb25c4ec37974ecda441bdc32d1570d585860dca71d9109853b1d707c0002e2981625d540f07a630777d140bdf55c098de5dd6a5cec0257bcc51a84b3755caede9c4eb6e18145b32d295805b0b2c4bf4206ef21994dfaaac8b90cb100ba1efc129de67d7387a3f05ed884f77389a29e0ae18b31bb591dee8bac619c0bc31c696f6837db6fc2d9b7cd24443adb33307c9312e49c2e78b84076d6eaca68f64d0de82df4551dd3dedd9725e8bc2b226d2328ffe8f5c424ba016659c2d3e8f81e247f3605fd510d73170fc3fffa50248cd02e737ca819b1f91b0375d4630ba70afef5112aab35b90f19db92efaba002e4802ce50f5e3f6a55c092e816e8ac7339fc1abe5f8ae2bb6674f59b3e193af9cf758bff8bbcf564301bfe0f5da374917f48f67121b5216c6a214ecd4874ef1540eecd6d141a11cf89cc7317f114a7b29a4fc614ed29c0a623d4d3759e04c571fe3870642d62fb4c0c3398b0c0fd2aa3e1d00bede0a3dd09a143cab48d617d404c047b759ddca2b4257dfb1e3b5e0a3774018fe1e488493d006549262a9f08d6c774e9eb59de24a5b02d01f283b8d6edc014ded8638de31fc9dbd51a0eabf8ab4f35998f1041e4fb7e0c14370359742e5f55b1a172c2851905d01cfd8830ec4f5e0ee53f8d8eab27409f7499a504ce9d9a7e124d026fc8b03a234d96e97add930d7089e3643cdb16d28a558e42242ebd2c5babe6b64ca600fa76ecef0841e733efdb0b1f9242c66d59bb6fd115d638868d6093129c225e6db4c4ae6eb49b0debf40cdce3368fed602aacde56dde78d21c3cc37a66f5fdb48f3b892e0f456a710568d2e3a301af8c77f7396cd0e5095b21e166b8dd1c85fab2c5f6d19fea7c857cd02ff40b8dcba3af5e1acd84b9de3d2b729bceebcbac2f355d66b9d50c5aeac4a49449150c92edd6a6fdd26c08d07428644cd16b01eea5077cda71ad08de5159de3b5416caf5fd9f9e7088d35e47d433cbe0c4df7a145db1c49020cef92ea46a2f99d6c6c8bbff552f35443cdeac903b75097de3487aa56d6caadaa9d7d60947aaac59d593b77045f7c18e97af683f1372ae4d40243aca626877d58f5a8934017e282c4c531a1f4910fd43161d8ca4e5d15f74a0bff8ef6bb8bb815326349baee407279bd8876f8b75ed9934c766a47b1805508c0a54c71eace72e8d88fea500a961e767f81e291bb620e0bfd62353d8b8f5b6ef450a53d0de3282fbf30848f46e4ad046722278be0ad747908e47bcf8c1eb91c939e78e4c60f1324c4d6d0384d3c8dc979f8f0e453bbcf8e2c9e2276085be236baac7cdf34ed5a7a31e761549243688be3701b79e964459df05a88116acb56311a2e73cef48ae148e2f06f3f9a2c24c5ee662d4eb31c291344ad39279f7831fa5b5c67b398c5bb71c8f73c7c4f169aac8b9e5d1b58898cf43fc8f84d303cccf4cca8854e39d497fc96e3ad5d2d47a774766134c69d16ce1a28301014ef5fea2bb7aafcc318596ca7262f9b5693682d90d39b5335c3a8160fcdc83f33174bcdd15a6b7ea17d19c9544b0c0e9268099e1d6a8b06709b392a3733eba071a24af04c871dc7c92544826aefc1c8cc8b8b97d505b166ba862d9b13ba8c8396b18534ff72c2b360461f3b747b7ee84816eb694b50532d65ef934c854e57b851ed5648a57b5167c6b83bb69571b414b5003e25bc6d25633d729acd25da79290228b84a870218190bd93e445f8af1729909261e85ccc197a5bb60ae9c1d7f10f991078fdc52eece57ed717cef4ce4e9d0a8ba68a7946905e66d3dffb4f3d12def449fca9b743a2bb25557ba922b14a9d87e1758ad9eca4e1a6496c63d6ebc3331fd03973531352858776a7db051d7f054d23b1f61354d1e16d3f433bb32759ff3521dae6917a06e6ebe40888d1bfa7bc61e993ee487aa92756abf7c1d7fad599ff2775e7517c3b8a354c2d2a9dbdcb9ab8d6863578e6cf0e38a25b75c5ec80e439d19c237fe2e +[TAG] = 0x8b5f9cfcf6e1f1271f44b74c197bca0693bef0638f7edd4696ed5960472f0b72 +[FINAL_CELL] = 0x018b5f9cfcf6e1f1271f44b74c197bca0693bef0638f7edd4696ed5960472f0b72d636eacf3cf6d63760b26cec107b4a67e37365293e4a896ccb9eb01aa4a4037031e0f4d204bc93de53a895c28b2d2ffa9616a021622cdb0ee440ff8528863e2669cc1d2ecd4379db15cea0fd1379c6fa8928f8ce36eec0742fe43bb2513632847fa6839025d9a8218554cde1e1807c5b02021e102fe52834e811a3ce810969b863308f6fbdf0bd38a8d2c456eb3b974d452da8b98e4150b2b59ba495d67cdc714eaf52ae5c723d61ed87e6be4d50a9eba03eb1a8c27a13b2160c1f91d43865a81c118b1f79c470f9242ee97751c0ea9b622214b5c8b0dd0fbbcb7e50153c0850d1ea18d36d7ee26d40b83a3326c68f0a6cf0fe91a90c4b89455b4d942cd1b6be9146bb9ff739fd1eb1df4f39bc5e65089304f2c83024ce954e844064592368081fef3f6825715bc275868c32fb0770703b4dfa2c287f9ccbb8ac20a19f456a9b6e506b3277bbba83781495d5e25c2ce5b9f4fa012c4c118ef11dac8bc6e53b9da986037d20d8e056f2a591468e0711998d4137e292c8dab512d3f50ce381fe507edff921f85949cec3003ce6f3f3f0c01023d404c3dbf36cf7451b407a78b1a797e4286963b6dea599940ca0b3fe9831bb94762f5d65c0ac95474b566562f17646c8e35115c300c624565d8b04d131f401629b5b2b0820f63c29c97cb30914437a824f36f50c1e1377c5a85f8331ea6b2cc4e7fd4ba882198285189efd77d7d2f6aa59e0d99d607916719217562a59876a19e7c94f5cac3a47843c27fa759531c3d52edcaa4493d780234d855f25c9d74eaa678160974334ccf99f18015ff54b2f0a6ed69fec589681f8c2cb464706ea70d403dd35f5e30b0bb1ded3376b8cee7480fbb0eb726343a665a4ac46e8f7f5cc272a901f38d648cb21c9ac4e04d36f764c3fb4a0966c0a28cde03a337469a4cc4e05a5c8874ea93b0196ceffb25c4ec37974ecda441bdc32d1570d585860dca71d9109853b1d707c0002e2981625d540f07a630777d140bdf55c098de5dd6a5cec0257bcc51a84b3755caede9c4eb6e18145b32d295805b0b2c4bf4206ef21994dfaaac8b90cb100ba1efc129de67d7387a3f05ed884f77389a29e0ae18b31bb591dee8bac619c0bc31c696f6837db6fc2d9b7cd24443adb33307c9312e49c2e78b84076d6eaca68f64d0de82df4551dd3dedd9725e8bc2b226d2328ffe8f5c424ba016659c2d3e8f81e247f3605fd510d73170fc3fffa50248cd02e737ca819b1f91b0375d4630ba70afef5112aab35b90f19db92efaba002e4802ce50f5e3f6a55c092e816e8ac7339fc1abe5f8ae2bb6674f59b3e193af9cf758bff8bbcf564301bfe0f5da374917f48f67121b5216c6a214ecd4874ef1540eecd6d141a11cf89cc7317f114a7b29a4fc614ed29c0a623d4d3759e04c571fe3870642d62fb4c0c3398b0c0fd2aa3e1d00bede0a3dd09a143cab48d617d404c047b759ddca2b4257dfb1e3b5e0a3774018fe1e488493d006549262a9f08d6c774e9eb59de24a5b02d01f283b8d6edc014ded8638de31fc9dbd51a0eabf8ab4f35998f1041e4fb7e0c14370359742e5f55b1a172c2851905d01cfd8830ec4f5e0ee53f8d8eab27409f7499a504ce9d9a7e124d026fc8b03a234d96e97add930d7089e3643cdb16d28a558e42242ebd2c5babe6b64ca600fa76ecef0841e733efdb0b1f9242c66d59bb6fd115d638868d6093129c225e6db4c4ae6eb49b0debf40cdce3368fed602aacde56dde78d21c3cc37a66f5fdb48f3b892e0f456a710568d2e3a301af8c77f7396cd0e5095b21e166b8dd1c85fab2c5f6d19fea7c857cd02ff40b8dcba3af5e1acd84b9de3d2b729bceebcbac2f355d66b9d50c5aeac4a49449150c92edd6a6fdd26c08d07428644cd16b01eea5077cda71ad08de5159de3b5416caf5fd9f9e7088d35e47d433cbe0c4df7a145db1c49020cef92ea46a2f99d6c6c8bbff552f35443cdeac903b75097de3487aa56d6caadaa9d7d60947aaac59d593b77045f7c18e97af683f1372ae4d40243aca626877d58f5a8934017e282c4c531a1f4910fd43161d8ca4e5d15f74a0bff8ef6bb8bb815326349baee407279bd8876f8b75ed9934c766a47b1805508c0a54c71eace72e8d88fea500a961e767f81e291bb620e0bfd62353d8b8f5b6ef450a53d0de3282fbf30848f46e4ad046722278be0ad747908e47bcf8c1eb91c939e78e4c60f1324c4d6d0384d3c8dc979f8f0e453bbcf8e2c9e2276085be236baac7cdf34ed5a7a31e761549243688be3701b79e964459df05a88116acb56311a2e73cef48ae148e2f06f3f9a2c24c5ee662d4eb31c291344ad39279f7831fa5b5c67b398c5bb71c8f73c7c4f169aac8b9e5d1b58898cf43fc8f84d303cccf4cca8854e39d497fc96e3ad5d2d47a774766134c69d16ce1a28301014ef5fea2bb7aafcc318596ca7262f9b5693682d90d39b5335c3a8160fcdc83f33174bcdd15a6b7ea17d19c9544b0c0e9268099e1d6a8b06709b392a3733eba071a24af04c871dc7c92544826aefc1c8cc8b8b97d505b166ba862d9b13ba8c8396b18534ff72c2b360461f3b747b7ee84816eb694b50532d65ef934c854e57b851ed5648a57b5167c6b83bb69571b414b5003e25bc6d25633d729acd25da79290228b84a870218190bd93e445f8af1729909261e85ccc197a5bb60ae9c1d7f10f991078fdc52eece57ed717cef4ce4e9d0a8ba68a7946905e66d3dffb4f3d12def449fca9b743a2bb25557ba922b14a9d87e1758ad9eca4e1a6496c63d6ebc3331fd03973531352858776a7db051d7f054d23b1f61354d1e16d3f433bb32759ff3521dae6917a06e6ebe40888d1bfa7bc61e993ee487aa92756abf7c1d7fad599ff2775e7517c3b8a354c2d2a9dbdcb9ab8d6863578e6cf0e38a25b75c5ec80e439d19c237fe2e +[FINAL_CB] = 2113 +---------------------------------------------------- +---------------------------------------------------- +[ROOTKEY] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[PLAINTEXT] = 0x6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a +[ENCKEY] = 0x7f13f178b161393d37169495d44af7d0d2e135708a0b9948d7bf7b8365d65e39 +[MACKEY] = 0xdbcb8aac9a994d7b075b0206a2f009d21683e425437e41b72ee8b60bf9c4608e +[IVTKEY] = NULL +[ENC_TYPE] = 2 +[IV] = 0x95c5cc808850337ac2bbf091cd9ef0e1 +[CIPHERTEXT] = 0xb3df64251b4d435bc93f48e567e943da43cfabf40c0531cb23f7fa4f51170de99dff316b76adc3e8becb7fc10ec1ed21c566662f6527c8f59b71895fafe09356678876c5657d12b3b4435ae87997d9d6f77e8d5ae23a23632931bbca7c0bd63c5ddf774a16c38469b09399c45d2d72eabd2c24422c380a67d8bda64fca1008471cb494a677058b8fc5c6c26e9e104bdd5675d956bb2969fafe2a1a0dc9853e04594f01c59edf0b5e1c45f4db1d494c7aa132b5a3349c593d8b1eb01b4eeba02da92b3afb2c6b8094ebb272e0d01010cf772e0cb09a0498c6f5d8a4a30cbc5333c75194b92080c474b7ce2ebce5652c287cca8538f978f176e92a10aa6b1b395a20e7e8160fcbfad8012e2c1f80902db60548504ba49cf22c37df6b432a8ddb1c267f351581f85764d6ad8af608ec874048d55e37a2abf7104bd8afe3447b71cea273e8e4899d7568f953c7f43eee5be5ccfc6089a6cd2c6ccd30d5ad2a515be081dff0ccc8217ceb68472b92d9ea14f5751a22e9b45e21a18620e9f85b949c9457bf7a3a1aef251637aa206ff6f4cc5e829249776cbb45ab094a850cf89173092d5d50de1387a7c040f3bb155c0f1574b3c65ebb9bf3fc9d6580c81530f0d9200c20467917b8f6dd598a1bdd92eb9126a35974c12e39124f0745d06a2f9aa325a3f9433f2bb448d2e0f7559aabaae741e70a62676d113fafe4efc0d74c0d111942a7f45f88ffe39f7941eb20c948db77fd61d2bd9e6dc854d9807d15a777e306cda8d71885ac3b1542f4f21fe4927775d7626f54aa168d2d817c940405b96fa6cdcdd6fa294a79cdeb29e34e037db330231669a6cc7c1de64d3c683fe6d7900cab477770893ad720b7a7d72f88dd964e1c113310ccb0698bc9c55b0734c2495fd8646fe6049b571b8b58fdf89fb5c1baafe88250028429ae17830e6dde4c74a4b6543b82956f1dc1045bdb1e2524704002e3895f8bb43cb4a7a1288358b0bc21316e336219f7efe997e77234ae6dc9a1b52b256b146419c0ebc326dde2cebb91e8779e7e1543dad5678f7c7a7dedf691372863dc4b58ec18a0d1a400f038c03ab6b7ebaf14b1f4408b75cb9aef975094e70d1052be92468f338539526d019987ecd69b1e39f43bc9c7d155deb2ea6d7a0eb76bd570f7edcb0a5d9cbebc2ba0c8cb3647c419d89ef2f0f0891e3194581d1609aa679b8dbb75e3c5ddda98650024d3c440bd2ffbe339e6031b61398e7c8c5dd5f0a8ed6ecda9c96c6c56329e227c598e77887464defaf0300e0db9d93649a2131bb9483e428d48299517859403170735bd2e4dd15777aca90ef2d6aaf8fe1778f3f71de774cfcef0a32914100acb269db21c25a1a7e9bc61bd1edf0e9cd530104b0a2d8095cf1305655f77a77ed74895bb6122ea7c90736afa0a4a660be88596be262ad2e397ad28730d1226ad59dfa2c07e7528f1934a70f63cecee8f76792c43f41c8c5d35ede02058369144a7436341fe07220f87472bb3b0f888f8088bdc979082f1381bbdf0444fcb1f16a45f6f93187ec35df4d7b0ecb114e3733aac8cea6fc63cac0bcafbe92218553e8ff98d97347a604fe6702aea7861f9949c27fd1b11d8193cb8229480e587a3488ee42d7d11ced94b1cf74b04d017824bd930a9da5f35ee3b0eb3deb42573651c551d277400af34964416f90802942b034af18082a1e4a1fa178566d925cbbd8bf8a1bba90ef0b7d62b570a47c1a77d2f00ce45ac89be9c9c39cfaac346ffa418025e70f1bfcbd6815589507649a940da826c2790bf91ff41e73cc42d42f2615c69b9217ceb0c4ccf1840adc9c1e39106ec69022d4bb154c6fcc6bfd51802f33468f9c692a9632a35f855393e198303f86df180590582050e69b72eb92563ff3cb4a49d6f452be7b01def04c33ab66da74ed7539df9b9f6e46ec7245eded43032470e0fa1525b77a5550528560d72d292318454f8114fa85c808efe5f63cfa276024a7d69288d60bbd1963145380537740ca557569d0a2bc3b2e0754f870dc13f948d65d73ad80db7aaf95de44cb1b64bfffd54273d5782be764ea662e451403ae84a1c428121f52be8b46e2dc2f15e1f978d59dc223189b77e5633c90814c799d917d164fd72c1b3262fa28cf1920b7c56e28ac98e6bf79c23a61afead457e9c2a16a408237b8866c695d9761f098808574221b43e6190d4af0c7b67d287e5fdbe53c237d435ea653d411577910d75414bd2c635272ac88643bf7eb8b2850b4a07a14a03560aa7bfdc3558185219e3e1eaacea5e9321114fba09a1537bd50aa91bc14b640c682d52390c32533fc6ed8040844718fc000cd81961da032d466110ccb14258cc681e9f8af694c34ac1298023c98f259db9c1f1c1cb8916cacddf40c9883c05e0c9ed00fb9ad0baedf40e54265e221b2044278e0867d536386391b43662dfe59e09139225cf5c6655320a81965c2308a003959142d7eeed1bbf6fb534d9bc203d44eb57c5f222cc7c103530001d0e52cb5e3b0b657cad235764f59d9cb90e0fe7cac64eef26f8de11db8ff9374471362d01b1855593b06414c5e15304ee5909f686e78d001752a1a782fdcdde2ad27b9b64882cd4fbec4e5f1a216d04a01af7c9c48d72dc0b45964338dc93410749f4bd96f2c74ee8edbdeca618326bb9271b9673920b8d1e07f9ae0d1fa4755a2418b1f072d356b0fddf4821642e27e01f9013be4e98b014a2b76bbf30b8e8191c504305d119e6206817dab95cc13e561e2e0f9e4f5f9208be199b9a66bb075a00bbd642b747b308b1a474aaf670077fcb9bb869321162131978477a93a05136b3d3c8c6b5427cfc48da094f86528778a7b1c5216d51851040b35c73da19267c0797e1c35c3f6f6682dd0812cd42fc3ebefaacd54db8d2e44bd5e5a126405016192993b3afa8247102c0c3e05ceb7bd5cf7bc61b8c86c6c520543a6379c2c02ef0691a1ada302ddbc5f019e4708c52666a2c6edaec4f95217ece40700e6d50b9c5f11339b9f3209346c0964382db0ce0b04d87691e882d8389d058acb2134d086d5edc5b5068bf4425a3d695c77cadee7c26667484394b8b280c264ead4181e852dc0967142c43e38b10973d698b8632a9344b1b14a8bccd54ba475fc3a506fc58c4e2a60c339d6b44dc6273bbc1d766f5762df4ef6c7e3b2dbf1006ebe43934062ba4bab6cb1a934af50e7d66c16ab96715cfcadb280070d3270964e58339e4902b7780c21edddd1cd34508d64faf0c9de3be9038d9c6ad4516e1221b2506b0960b94b38a213caf704204dba059491d1773b6e987ec378a6be169043a457c42245cb5179cdc611731ef6fdb49160879755592e69ebc25bb1d4b82e97f1d4e49c380fc8e76a0c8c33ce7a824b1abf03d47d0dd78bcc8a6fe535eb6c5de1a0f981781bfb593deaaa26cd77013f0a387771f7cd33e589c1cd1c58d6cdb8a88b52944777b8cb125c8da0a4877c3a29c7afcf0cc9004583a07173061b1bb7e723c38de10413bbd188cd0dc5d6254b96121a7843b2147b8229684043b191c40841ac10dbfed5847b001a3c7e2cb5f8936aecd5c5e6fa8d81b37803b490e2107bacb3a059ce51a2708971c31c2320416a330adb543028468c7f99cb9bc3095d6df17a256c67d5df72e5922f0bfe89fa8cd682f83733f22c1073a344ac3cf5bb81d8c61e206332b675a9bf24b08ec9b572ca6aaa205c4366f74aa1338168c9702518f2f5cee69fd5d1adb1727303d05e69248124f155d7c9afcf0102adb1d35332f47fe4b6a6213ed7f916cee52b81d05d9f45e5ce8a4f5571e1046483bd0481153e51b0452c48879386b0320cbcb096f9dcef3a62358b4e6d421d8a4a19be65e51dc4c2eb9d0cc711f55e19e47331939202d54016dbccd16f4107610554ef12914ae4e53104f8bad53c371cecf07c58ab94e1aed79c0447db4f6ec16076e38d0c9b07d88fbbf899f274635d100b9ed0c1e377590c4a4160e9c07a85f985b8f63166ca261cfd88c40699acadd0395e2315342c3e3e7e8510213522322df6dc16a08d4661a764f378bb341450272fa3d9b6fb96c60f922be5b8b267c48195a9058bc7f30116086f062242341b21fb3333daedb652bd2a9021fd6f93287242c6a7d44c53e2404fb5c47fcf3b58c5d05199858ea0c2238decbd45a331cd0a71d2a3e310515748269e5dcd2923011131d89390c7980a61d2ca17f14e304af9a5f299cdcbeb48646bc6e6f83a9eccdd4c14fff6f63a3f7fdd5b37295442748fcf6a12d4926c9c0a699d7c81d57044ee39d38a5ae20b5429eceb2cafd3459b113834b9630105cabb642c9f320e37a4fa2364820c1a5efc8b51661c563999b6d68a1a0217c8e4c58d9a7fe0ad07d7ee4aaff5383ddd8583fc48a07af4e00402de110bada8fee14c89bd6839b4923bbdcc1558938a454a3cd99873dd12648dd176a5a4dbe336fe793f9ef1d873b432b09f617860919d22ae6d897ebf632e2e1c05925452f4dad10af8bf8e9278b61d23078474d8c924dfeb00ddba93bc9f80a4f78360e4daee5eeb59b967e982da354af1542a10bb996d0b46f346943788b6020b5511cfd27e973c68e6cfe0a12badba1a0dae690b9677a774d8a1585a309a48d9ab151f237b7e9e52a53639845556bc61cd26ee53635501b4183b7002c5e0cedd741d3d7d8305aec07481fe37e1fa116c42ff3b58b09f194e975b2780a4ce699a68106abd5b47edaef95a1bd2156be06d9a65b24036aff54902c22899d30404bcc43e5a125b37b54965125a5dbc4b60023b21be526709c19a01035a1db92e85474d70463c9e00f672825eb02b49b6b1a44ac3c2cb5446951f144f1297dd40912cfba24b7e26eb2a8bc44826fc86fd5d255e0fd9adb1f1ac0f677accb71346a64f8148c34b81d16f1c9fef7d87b8940415ff6a225a8c55be6f5d126c65dc7dd706432fff539e6b1438181008e852cccd43dd1367083f067c822eb4cba70024ae1481c6f9b408dba413a475b9d1c029ca81e7e6cc9da3024e907701cb83f412d1dba62b1b5c51e9656552010c1e8156fe8aa1416bb28e4099accb501afbc870b187559233b3e0a1cab8bb9cc014e22c241da94b794fa3854dd6369909b8b71150d3b15677e93a97cacc44e9cc97a1cab8c2b567fdcc80993017ec4fba488eed07ea4067e0af26f29bf418f5c84f481d18e1aa444aee5fde3a83ffb4d10303bd5b9c101636d4a4465faaed1bf4f41127ca92ac1d5c75589f0b54e7e62a867a37ee0071687c1ad8661dd30b001b8cc8c69c7047238fcfb359459fd91e5c5369a7578602d3c6f63a65c211d90f76f2450afac59762f5535f978e525268e4e23e37e19c7b2039f2a44329127294428d7396b74ec5ec278287ba6115ba1c7ff310a272f4bcb9bac43cca24e6bcc8d1cb7c0887b7b6be4be14e4c507b697921718951b791d538df7819a01d801e11aed9d13f2c17a129a751b924aa7c50f72684870429305d63b67fb5237fdc439f06e1ee0c2c1910df5714e66 +[TAG] = 0x6f8730a32e8c8ef796105f4307b8fedf510cd85e7f04861084a5c0bf8aff341e +[FINAL_CELL] = 0x016f8730a32e8c8ef796105f4307b8fedf510cd85e7f04861084a5c0bf8aff341e95c5cc808850337ac2bbf091cd9ef0e1b3df64251b4d435bc93f48e567e943da43cfabf40c0531cb23f7fa4f51170de99dff316b76adc3e8becb7fc10ec1ed21c566662f6527c8f59b71895fafe09356678876c5657d12b3b4435ae87997d9d6f77e8d5ae23a23632931bbca7c0bd63c5ddf774a16c38469b09399c45d2d72eabd2c24422c380a67d8bda64fca1008471cb494a677058b8fc5c6c26e9e104bdd5675d956bb2969fafe2a1a0dc9853e04594f01c59edf0b5e1c45f4db1d494c7aa132b5a3349c593d8b1eb01b4eeba02da92b3afb2c6b8094ebb272e0d01010cf772e0cb09a0498c6f5d8a4a30cbc5333c75194b92080c474b7ce2ebce5652c287cca8538f978f176e92a10aa6b1b395a20e7e8160fcbfad8012e2c1f80902db60548504ba49cf22c37df6b432a8ddb1c267f351581f85764d6ad8af608ec874048d55e37a2abf7104bd8afe3447b71cea273e8e4899d7568f953c7f43eee5be5ccfc6089a6cd2c6ccd30d5ad2a515be081dff0ccc8217ceb68472b92d9ea14f5751a22e9b45e21a18620e9f85b949c9457bf7a3a1aef251637aa206ff6f4cc5e829249776cbb45ab094a850cf89173092d5d50de1387a7c040f3bb155c0f1574b3c65ebb9bf3fc9d6580c81530f0d9200c20467917b8f6dd598a1bdd92eb9126a35974c12e39124f0745d06a2f9aa325a3f9433f2bb448d2e0f7559aabaae741e70a62676d113fafe4efc0d74c0d111942a7f45f88ffe39f7941eb20c948db77fd61d2bd9e6dc854d9807d15a777e306cda8d71885ac3b1542f4f21fe4927775d7626f54aa168d2d817c940405b96fa6cdcdd6fa294a79cdeb29e34e037db330231669a6cc7c1de64d3c683fe6d7900cab477770893ad720b7a7d72f88dd964e1c113310ccb0698bc9c55b0734c2495fd8646fe6049b571b8b58fdf89fb5c1baafe88250028429ae17830e6dde4c74a4b6543b82956f1dc1045bdb1e2524704002e3895f8bb43cb4a7a1288358b0bc21316e336219f7efe997e77234ae6dc9a1b52b256b146419c0ebc326dde2cebb91e8779e7e1543dad5678f7c7a7dedf691372863dc4b58ec18a0d1a400f038c03ab6b7ebaf14b1f4408b75cb9aef975094e70d1052be92468f338539526d019987ecd69b1e39f43bc9c7d155deb2ea6d7a0eb76bd570f7edcb0a5d9cbebc2ba0c8cb3647c419d89ef2f0f0891e3194581d1609aa679b8dbb75e3c5ddda98650024d3c440bd2ffbe339e6031b61398e7c8c5dd5f0a8ed6ecda9c96c6c56329e227c598e77887464defaf0300e0db9d93649a2131bb9483e428d48299517859403170735bd2e4dd15777aca90ef2d6aaf8fe1778f3f71de774cfcef0a32914100acb269db21c25a1a7e9bc61bd1edf0e9cd530104b0a2d8095cf1305655f77a77ed74895bb6122ea7c90736afa0a4a660be88596be262ad2e397ad28730d1226ad59dfa2c07e7528f1934a70f63cecee8f76792c43f41c8c5d35ede02058369144a7436341fe07220f87472bb3b0f888f8088bdc979082f1381bbdf0444fcb1f16a45f6f93187ec35df4d7b0ecb114e3733aac8cea6fc63cac0bcafbe92218553e8ff98d97347a604fe6702aea7861f9949c27fd1b11d8193cb8229480e587a3488ee42d7d11ced94b1cf74b04d017824bd930a9da5f35ee3b0eb3deb42573651c551d277400af34964416f90802942b034af18082a1e4a1fa178566d925cbbd8bf8a1bba90ef0b7d62b570a47c1a77d2f00ce45ac89be9c9c39cfaac346ffa418025e70f1bfcbd6815589507649a940da826c2790bf91ff41e73cc42d42f2615c69b9217ceb0c4ccf1840adc9c1e39106ec69022d4bb154c6fcc6bfd51802f33468f9c692a9632a35f855393e198303f86df180590582050e69b72eb92563ff3cb4a49d6f452be7b01def04c33ab66da74ed7539df9b9f6e46ec7245eded43032470e0fa1525b77a5550528560d72d292318454f8114fa85c808efe5f63cfa276024a7d69288d60bbd1963145380537740ca557569d0a2bc3b2e0754f870dc13f948d65d73ad80db7aaf95de44cb1b64bfffd54273d5782be764ea662e451403ae84a1c428121f52be8b46e2dc2f15e1f978d59dc223189b77e5633c90814c799d917d164fd72c1b3262fa28cf1920b7c56e28ac98e6bf79c23a61afead457e9c2a16a408237b8866c695d9761f098808574221b43e6190d4af0c7b67d287e5fdbe53c237d435ea653d411577910d75414bd2c635272ac88643bf7eb8b2850b4a07a14a03560aa7bfdc3558185219e3e1eaacea5e9321114fba09a1537bd50aa91bc14b640c682d52390c32533fc6ed8040844718fc000cd81961da032d466110ccb14258cc681e9f8af694c34ac1298023c98f259db9c1f1c1cb8916cacddf40c9883c05e0c9ed00fb9ad0baedf40e54265e221b2044278e0867d536386391b43662dfe59e09139225cf5c6655320a81965c2308a003959142d7eeed1bbf6fb534d9bc203d44eb57c5f222cc7c103530001d0e52cb5e3b0b657cad235764f59d9cb90e0fe7cac64eef26f8de11db8ff9374471362d01b1855593b06414c5e15304ee5909f686e78d001752a1a782fdcdde2ad27b9b64882cd4fbec4e5f1a216d04a01af7c9c48d72dc0b45964338dc93410749f4bd96f2c74ee8edbdeca618326bb9271b9673920b8d1e07f9ae0d1fa4755a2418b1f072d356b0fddf4821642e27e01f9013be4e98b014a2b76bbf30b8e8191c504305d119e6206817dab95cc13e561e2e0f9e4f5f9208be199b9a66bb075a00bbd642b747b308b1a474aaf670077fcb9bb869321162131978477a93a05136b3d3c8c6b5427cfc48da094f86528778a7b1c5216d51851040b35c73da19267c0797e1c35c3f6f6682dd0812cd42fc3ebefaacd54db8d2e44bd5e5a126405016192993b3afa8247102c0c3e05ceb7bd5cf7bc61b8c86c6c520543a6379c2c02ef0691a1ada302ddbc5f019e4708c52666a2c6edaec4f95217ece40700e6d50b9c5f11339b9f3209346c0964382db0ce0b04d87691e882d8389d058acb2134d086d5edc5b5068bf4425a3d695c77cadee7c26667484394b8b280c264ead4181e852dc0967142c43e38b10973d698b8632a9344b1b14a8bccd54ba475fc3a506fc58c4e2a60c339d6b44dc6273bbc1d766f5762df4ef6c7e3b2dbf1006ebe43934062ba4bab6cb1a934af50e7d66c16ab96715cfcadb280070d3270964e58339e4902b7780c21edddd1cd34508d64faf0c9de3be9038d9c6ad4516e1221b2506b0960b94b38a213caf704204dba059491d1773b6e987ec378a6be169043a457c42245cb5179cdc611731ef6fdb49160879755592e69ebc25bb1d4b82e97f1d4e49c380fc8e76a0c8c33ce7a824b1abf03d47d0dd78bcc8a6fe535eb6c5de1a0f981781bfb593deaaa26cd77013f0a387771f7cd33e589c1cd1c58d6cdb8a88b52944777b8cb125c8da0a4877c3a29c7afcf0cc9004583a07173061b1bb7e723c38de10413bbd188cd0dc5d6254b96121a7843b2147b8229684043b191c40841ac10dbfed5847b001a3c7e2cb5f8936aecd5c5e6fa8d81b37803b490e2107bacb3a059ce51a2708971c31c2320416a330adb543028468c7f99cb9bc3095d6df17a256c67d5df72e5922f0bfe89fa8cd682f83733f22c1073a344ac3cf5bb81d8c61e206332b675a9bf24b08ec9b572ca6aaa205c4366f74aa1338168c9702518f2f5cee69fd5d1adb1727303d05e69248124f155d7c9afcf0102adb1d35332f47fe4b6a6213ed7f916cee52b81d05d9f45e5ce8a4f5571e1046483bd0481153e51b0452c48879386b0320cbcb096f9dcef3a62358b4e6d421d8a4a19be65e51dc4c2eb9d0cc711f55e19e47331939202d54016dbccd16f4107610554ef12914ae4e53104f8bad53c371cecf07c58ab94e1aed79c0447db4f6ec16076e38d0c9b07d88fbbf899f274635d100b9ed0c1e377590c4a4160e9c07a85f985b8f63166ca261cfd88c40699acadd0395e2315342c3e3e7e8510213522322df6dc16a08d4661a764f378bb341450272fa3d9b6fb96c60f922be5b8b267c48195a9058bc7f30116086f062242341b21fb3333daedb652bd2a9021fd6f93287242c6a7d44c53e2404fb5c47fcf3b58c5d05199858ea0c2238decbd45a331cd0a71d2a3e310515748269e5dcd2923011131d89390c7980a61d2ca17f14e304af9a5f299cdcbeb48646bc6e6f83a9eccdd4c14fff6f63a3f7fdd5b37295442748fcf6a12d4926c9c0a699d7c81d57044ee39d38a5ae20b5429eceb2cafd3459b113834b9630105cabb642c9f320e37a4fa2364820c1a5efc8b51661c563999b6d68a1a0217c8e4c58d9a7fe0ad07d7ee4aaff5383ddd8583fc48a07af4e00402de110bada8fee14c89bd6839b4923bbdcc1558938a454a3cd99873dd12648dd176a5a4dbe336fe793f9ef1d873b432b09f617860919d22ae6d897ebf632e2e1c05925452f4dad10af8bf8e9278b61d23078474d8c924dfeb00ddba93bc9f80a4f78360e4daee5eeb59b967e982da354af1542a10bb996d0b46f346943788b6020b5511cfd27e973c68e6cfe0a12badba1a0dae690b9677a774d8a1585a309a48d9ab151f237b7e9e52a53639845556bc61cd26ee53635501b4183b7002c5e0cedd741d3d7d8305aec07481fe37e1fa116c42ff3b58b09f194e975b2780a4ce699a68106abd5b47edaef95a1bd2156be06d9a65b24036aff54902c22899d30404bcc43e5a125b37b54965125a5dbc4b60023b21be526709c19a01035a1db92e85474d70463c9e00f672825eb02b49b6b1a44ac3c2cb5446951f144f1297dd40912cfba24b7e26eb2a8bc44826fc86fd5d255e0fd9adb1f1ac0f677accb71346a64f8148c34b81d16f1c9fef7d87b8940415ff6a225a8c55be6f5d126c65dc7dd706432fff539e6b1438181008e852cccd43dd1367083f067c822eb4cba70024ae1481c6f9b408dba413a475b9d1c029ca81e7e6cc9da3024e907701cb83f412d1dba62b1b5c51e9656552010c1e8156fe8aa1416bb28e4099accb501afbc870b187559233b3e0a1cab8bb9cc014e22c241da94b794fa3854dd6369909b8b71150d3b15677e93a97cacc44e9cc97a1cab8c2b567fdcc80993017ec4fba488eed07ea4067e0af26f29bf418f5c84f481d18e1aa444aee5fde3a83ffb4d10303bd5b9c101636d4a4465faaed1bf4f41127ca92ac1d5c75589f0b54e7e62a867a37ee0071687c1ad8661dd30b001b8cc8c69c7047238fcfb359459fd91e5c5369a7578602d3c6f63a65c211d90f76f2450afac59762f5535f978e525268e4e23e37e19c7b2039f2a44329127294428d7396b74ec5ec278287ba6115ba1c7ff310a272f4bcb9bac43cca24e6bcc8d1cb7c0887b7b6be4be14e4c507b697921718951b791d538df7819a01d801e11aed9d13f2c17a129a751b924aa7c50f72684870429305d63b67fb5237fdc439f06e1ee0c2c1910df5714e66 +[FINAL_CB] = 3953 +---------------------------------------------------- diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/TCECryptoNativeBaselineRsa.txt b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/TCECryptoNativeBaselineRsa.txt new file mode 100644 index 0000000000..0d672bf071 --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/TCECryptoNativeBaselineRsa.txt @@ -0,0 +1,37 @@ +---------------------------------------------------- +[KEYPAIR] = 0x0702000000a400005253413200080000010001007bb310e058ff6547a22364da38e00a449d67c117d04e4f9a595842c7da6915ddbf672b23607d2770bf7eca45425d9d200d931f381232ea1ed541d6f193e2a4379a4bd41b96551d044dd23e8c0e4098be7a930fe7c1796433445a5199df222e5891cee6c2dd395770c0e75bac2caf0cd0167f0fcc12f97bb4a89192394096476f41d6f770929073262a0bf89d912aaed3054984815da14f543bb4807d30de653df9346cc4b3518ae095aa92754d3f6477c07169899cf7b785970f3adbba73cf3a91c293ecc46c9102415e193d4835cc77fadd4629e872a0e829286035def299a1827813c8bdf6444f80fab9e6e26c2712ce1f444d489a5509b0ce4f3c79ec7dcc99e1b01dfa93b686cce5925a1a2fac1a32502db429fe29d0a77803e0333268043d27b9edcd711f0bc9ab17a055cf7e22e8489d835fa337bbdf3d4f49f43be23f8680c8fcb5274821fe24d8627b5345fea26bb4fa8ec9117deb445ae9318100d936a6d09bcc06f22ec3d579c1a45e35591d5aea38496de7b77328c6da17e3bddb33120f7e48879bfccf02989ad1479c3bd8ad1ad81848cf3a92549ead1781b56d4f5b4643210e844130c9f9c7db5147208388321044964f5cff096ac85fa272607fbd785cad072e97875a61b6b197fdc2376ef4f3bc6eabb5c3939b5c0f0ca6db09f0a5073b1bd0cc37fb32e7d3ca48e994caa483b500ea53fa32673708de3beef14745d4c7867a00eb0392052d28f7198431ee3791fb0097b5cba6f9c12d88a36a68a7a4c0a8b6139da54b623a8d669abe5ad55480a4c20df29429670c1faf0cbe1be57657029749b5114498157b36cd25458c88f48e0daef012b394118425414c29985d16fd52b69f3d8d3a7e5cad2f646a3635c6addf33afba9926aa9aed7f85c27fe8b2b1ac3411b30252924f6f286a472995309823a61b89e0b0cb00256b26fc5f059f3bab1163939b343fc7d01554eb3427573d6cde754a7de404e7fe4567c515502b049738e3575f3193f5a23473eb60672ceb76012529d6876c5e7fa64f9acb6a5a266a0f0583008fd3bc9d020ec0a503764098f54c4ec4c4e1d277cac0a83f48d3b73e7ab7e11d55a560031afab8cea0260ea390cb7c4942df995eb33cf1970d4f52d9fe4e7901ea839c3ecd1f25155c07b279e1f740447f9575adbe766c1a990adb447c208bc8687ad384e3069fdc6b876203e0dcd55ffdc06a4ea38d4235292d3a5e26022b51ee358b0ae6dc81cf593accb7687ef1de9b37abd32621f375f50091ac29eea4fc847cdef9a3ed1a64d1cd9c007890b6e12ba67e3d2ad7e2eb8265cb65658e1768dc431f806a822e28f5ba7f412547e578ea682a8c7c9ae2ea62e61c51326076082668f0ead4c70ad542697c55c1db17197058cf4773c3ecf3094c36582538d26274a7d6636a72044ee23613d7aa295cf11392398dd6300950642cd222eff7738f38d6f5302cb7168b6f5516b52c9ff1deaaaf99acfdc9ce04a2cbaf653e22057840cdc984814bcfcee1c280e3ddcd7b3b16c00a68b61186f51ef87979430953d0c88e8b81c30c75845038bbc15026efe0db7bfe3eb3ce24c96bb5a56a9a1e1e828022ad7362da651bea937817d63687b4acbc74f603 +[PFX] = 0x30820a6002010330820a2006092a864886f70d010701a0820a1104820a0d30820a09308205fa06092a864886f70d010701a08205eb048205e7308205e3308205df060b2a864886f70d010c0a0102a08204fe308204fa301c060a2a864886f70d010c0103300e04080982428c6d53f722020207d0048204d8ebdc4a59b0f04a951430d2453ddb13014cf35cf90d42e50e7942d2ef51e96da8fce5db32de6f2ae0c336f33ba897ec85d6f79918ffbe0878918fe4e27d3d1c14ab64fb8cabc6ffd587c6e41fa69f66b498b93ec471815fb576305ba13ae0f7781905149927d39786d2dbc52bea4f3ba2d95aeecc0730d55602de84efb1be6421556f86b1c22569ff412a7bf8752d73dbee7243494af24c622712e3eb751f782fc7225c1a36046cc2b7d5878c0408a7b8710301915525db614a348a0c0d53d2d6374fc238f8ca097a7fc3e82f56f2c66cc793514ad11bea43b0ef6f5194ec83884a0f3987d988868c7ff9e1370cebdabc15e2ee1f6b667f591362258226ea1f47979a0a5bf8f7dd8bfb96a8843460ff6f3d31465cc4329690bac4ba1252fd51376a348e4c071f4fbbab314449a5b5ebfa11582773c1dfd8c8164766be312609f85c9c8281c3a9071e51d169f1c9ce420f20601dc86a85c9588c8b8b93a486cf1e124bf0fa486a709089c259075a62672fa2154a22e5ddb12ed8301217e8c8174cc45eb0d8c001af0e472635badd51d3189e5d3770d2c304dbe205ef1ecf0a40069333c9da89b08ae71b2608825dd7fdd6c45583468982f0f19a2b89652dfd5d1a0783ac5c7d2d2c747bff7ed3dcfa4db43af4d7fb545717bcf93a8e048983202533735a880ce337d6b31a6f83cd2ee6d65932d5657abffc728ccbbd52a4f44309c7be004da39a85c94519c36966bc3a4689cd0ec1523550596e4771c17b1ab75df63cd6414ce2013933c74c1ab3e90ca0653569457de7e73ceafc039f3152a03c83aaac4aa9f8fb570ce0c3681d511b5b1f7b4e84d36662327c107ff2bb95afdfd9ae550821722a4550d696478c1d23c6f26ff95547d19c774b75085b0a912c285e323a52526945f0a773cc4f20079c8c36b3da9fd101cf81be2e8f7e6372b1d5a69ae391c68ec2f28c0887d5c52b26ecbbb4604641a676d790fa43599fc27d7fada6629c86f79aeb3e7e643f69977cedab40566f8f3e18b20390189c1d96ab75cd5e0a232f46e630069353214c10ba3a49455f24a5c48a7eabf7d430c6ca929ba590106b0bb8ed4e36374960a3d9051116edac5314af6053f0c7dd296b9ea0b792e0fc1bc310285a7e94777c6e173424f3b68d9ca7099e999f165bc966ddfccfbc8ca7e8d3e432e9293b9476457ea7dc812e126590cfe41d65173605538adc515777bcc72192d176241911cd9a639218f9e4a8f485d52cd9ded45b9be751597bc119043546d7579ae1109b682a31f07219b5c6a8a59df399857a51b22fa79bd37d5811a782f51969ca60cc2c77bd069b664623750b4f7d531bb5d0edc3f16e6ed54955c816211ae88082fd18ffabd8256e1512de133c83aba08f8e936ca3825f7c32dda7a58735da90c6ddce35742472f1ce6b088589ce3ad06906f755f59fabb215dd0f4e75326bb83c0bcec32f5e22c34af2e133f44e2656f0e25f504256340ddf6c12936c3fdcfbcb79bf5b85930ed8e8e6ca0b621549fed818fd0cd2aae43dd04b343dc2353a35d05169d29f8cbbac19b39f65b7c497d509ac9129aeaa24baa92d66d91d27bdc12d5525989b0f6fdd1f5bd5468e3911d4a8164b6e335debe4c0a53c71063fbf68b353de61fae671f501d3b9911fba0fb238357d1baed871942d7d0981db2be67f7f20cf32e6804d7639d2b6941a7621ccb7a048b2b632d74a1950f4f849657d714d7187725bc960fe7d63e4ce973c853181cd301306092a864886f70d0109153106040401000000305706092a864886f70d010914314a1e4800630034003600380062003400360036002d0065003400380033002d0034003000340035002d0062006400610064002d003500350032003000350066003300660031006500380061305d06092b060104018237110131501e4e004d006900630072006f0073006f006600740020005300740072006f006e0067002000430072007900700074006f0067007200610070006800690063002000500072006f007600690064006500723082040706092a864886f70d010706a08203f8308203f4020100308203ed06092a864886f70d010701301c060a2a864886f70d010c0106300e0408d8a4200bac30de55020207d0808203c0ad401a5ccf2be2dd8f5e37243499169d60c09a1f07d12cd19660b9600dd168fad04f012817bc2fe76d19c914b078782ca739191d77de9229550c25e926119c6f6379b6a27b1a720b0b74ffa25422afc08b230538a63bfc10bd398dcfd0185b4b1377e47637d0b37c3c63fe46073b5e3c39c4120a6b4907c77130ab8ec944e67e3b705060587f09cf53f9492f7bc21e28f520162a9e1056594b67c7268588a21138cb623c50952856d538ec43986a14ed9a602a0c31f104c0d16619e877239b5b34abbbeac49b4a61231483b8a6189f1ded4b3286df169ba1d24f95796eda79d66e3bc9e394dd057f0491e8c2112271b875e6f1e40e119bbd4c5577883449a9cf11112cff82ceb657f6a2b33cd154ea079ff696c735571f051b2dbd3442a70a3ffe2a92bb15f299b03cd3970635da334206bf4279f8357e0df95525fbbeec322e57066c84d89a51e7dd1ab5e118555a95de9e37487173a6e6df1c18e1c877db5d9f4a913f0cfdad7e360feb5f65177e50e9c565567632c388512650e63e29be1b69aa9480a19336e49b955d7acf0d6eec9e6781ac28b517199ea8f298bd7183817b8ca3bc50d2ee6d6de8cf8ee7e43529a31c534244b56456e392321bcc12eeb3f3d2f0b79a59343755be98e87c897a1b713386900248fe14a6376e37ee8c790d1c1d7eb12289bf94b65549d50822b8c5f90831aa4f8efd81a7b7c3976875208d2358642846472b1434b56ca0aeca7543d0513bd358ad152b2cdedc5d730fc15ea3cfff6254ab844c5e14c67756be04f1a5d4057d89020739895e260bf4d418482e395c871f6c441f0e6b594f51cc9074f3885600d7c60c5792ac3f4f2080ad0c58bba3d082609b19347b401c606c15504a9a0ff1c623cab6cd4c555cd3cc83c4207510aa83fcab9cd9d50a7b317acb3677d78d26a29c9fe0db0a3c3eee15c08eed730d577220d0cd6ef55db079ee19cd36acdac064465354401e78b55a1f4c073e01bd20329b1c84568626904d9bb1666797a5ac8a0e2a73ab3b4b32692efc58444233bc4f43a3ffd6149af4d1b8ba1967c1bf1eaa0d4203667666bbead138000f99ad4adb099228bde6e202835e78960af5b8e1e0eaeb22fc23b02c76ebf7de80897ac5dd143d7778ed6c2c678271073d455c8ef1ec9e0d7a4f1c8ad3d648faf28cd4ac1ca5e669344a8980865c80de70ba8685e12220b7106e5217e36ca563154250ee3c5a0d92037c98e6392489d986c494a074dcc197867d441e8e0b5c79a68b34161c0186cb889667150e9289029b80cca51a8ca9e4543972cd43d3c4ddf14ea82dc7507ff3873bcc8017cbc14911a7d7b660aebce59f11db38f49e6c123037301f300706052b0e03021a04143b5f8902210f1a1e2a4f28edaf2fb50274075fe0041489707bfb7ecb99e5707fb13eab8a38187b7fe2ae +---------------------------------------------------- +---------------------------------------------------- +[PLAINTEXT_CEK] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[CIPHERTEXT_CEK] = 0xb598e4e469ad5086e53c92a9af1daf1a223ee1a7155bb06afba8bc3f23421465182cc49780915a9a5e90fe670b3c409efa572567d9d6cfb0cd73095f7f596c5cbaf0c9d5e8cd67f057a70b196248801d1975f18dc882ed1e9fa31b47764df6395990817afb555de98f17e01bbfecb7e7948d8b1a686686b1542e9791d930ea462b5d217bd5ae580795a34952c96ee001af81baa2b41d86df2e963d41c8fb199d2fa18792226fa721472ba005d7092dbeb040bb0737b11506589c064d69f388b87c7323c53eed808af1922edd249eb1cd69264db00930703b64db06aceaab76c317c5786e7b9c8b57cb218374f64dc770908b933643cbac80306f1736bd869fce +[CIPHERTEXT_LEN] = 256 +[PATH_CEK] = CurrentUser/My/b3c66ffbe1db57419792e24aa970455bfac30757 +[PREFIX_LEN] = 371 +[PREFIX] = 0x016e000001430075007200720065006e00740055007300650072002f004d0079002f006200330063003600360066006600620065003100640062003500370034003100390037003900320065003200340061006100390037003000340035003500620066006100630033003000370035003700b598e4e469ad5086e53c92a9af1daf1a223ee1a7155bb06afba8bc3f23421465182cc49780915a9a5e90fe670b3c409efa572567d9d6cfb0cd73095f7f596c5cbaf0c9d5e8cd67f057a70b196248801d1975f18dc882ed1e9fa31b47764df6395990817afb555de98f17e01bbfecb7e7948d8b1a686686b1542e9791d930ea462b5d217bd5ae580795a34952c96ee001af81baa2b41d86df2e963d41c8fb199d2fa18792226fa721472ba005d7092dbeb040bb0737b11506589c064d69f388b87c7323c53eed808af1922edd249eb1cd69264db00930703b64db06aceaab76c317c5786e7b9c8b57cb218374f64dc770908b933643cbac80306f1736bd869fce +[HASHED_CEK] = 0xb139a2f10dd427f2e6629f67e5d50c5f97b5f98d046f118eccdb05a73de44ec2 +[SIGNED_CEK] = 0x1753d847891f4ad5b29a40db4728562c38ab34e9eeb41859654ec5a63307af765eb2102b6d17842303c1f474d5984002990614c548dfde82418d6212bf8953c8687de36088604cbb4df8927def794c1cb981e16ce1a663ec03bc745f762c74ebba734a9613e36d502882b3838ba0f15a0a6da9fd1580eba4ff3eaf6e290fc22b4447d03e19f4edee6bf3cf6716e0dea971713337f583fbed97a5027c38f6ab7e3f65f9bb2a0f094f665ede6cf0d59f6ba26da09dafff46400a397049a835b9ef8b063872caf42089aa9e9a80bf257b0b506ac13c5858741e7e01cb7c308c07a005e15d0530daeb639fa3c2885558949f4703df61b75e70b6b6f4fd5cb8c8551e +[FINALCELL_CEK] = 0x016e000001430075007200720065006e00740055007300650072002f004d0079002f006200330063003600360066006600620065003100640062003500370034003100390037003900320065003200340061006100390037003000340035003500620066006100630033003000370035003700b598e4e469ad5086e53c92a9af1daf1a223ee1a7155bb06afba8bc3f23421465182cc49780915a9a5e90fe670b3c409efa572567d9d6cfb0cd73095f7f596c5cbaf0c9d5e8cd67f057a70b196248801d1975f18dc882ed1e9fa31b47764df6395990817afb555de98f17e01bbfecb7e7948d8b1a686686b1542e9791d930ea462b5d217bd5ae580795a34952c96ee001af81baa2b41d86df2e963d41c8fb199d2fa18792226fa721472ba005d7092dbeb040bb0737b11506589c064d69f388b87c7323c53eed808af1922edd249eb1cd69264db00930703b64db06aceaab76c317c5786e7b9c8b57cb218374f64dc770908b933643cbac80306f1736bd869fce1753d847891f4ad5b29a40db4728562c38ab34e9eeb41859654ec5a63307af765eb2102b6d17842303c1f474d5984002990614c548dfde82418d6212bf8953c8687de36088604cbb4df8927def794c1cb981e16ce1a663ec03bc745f762c74ebba734a9613e36d502882b3838ba0f15a0a6da9fd1580eba4ff3eaf6e290fc22b4447d03e19f4edee6bf3cf6716e0dea971713337f583fbed97a5027c38f6ab7e3f65f9bb2a0f094f665ede6cf0d59f6ba26da09dafff46400a397049a835b9ef8b063872caf42089aa9e9a80bf257b0b506ac13c5858741e7e01cb7c308c07a005e15d0530daeb639fa3c2885558949f4703df61b75e70b6b6f4fd5cb8c8551e +---------------------------------------------------- +---------------------------------------------------- +[PLAINTEXT_CEK] = 0x7f9dbb9cad20a15491f688bb604f6ea185b6271f3858b8f2764574d7cd1f7e42 +[CIPHERTEXT_CEK] = 0x1ee7fdd428a1c866ba371abb16d8a94b10344afc13e25f0d1ff48a68eaccd077eef6a1f23c64044b0b9461bf45f64861c4fa4f343d14df14f0fed9e30051ffec9e44d17700839a7cbb70c77c7af86a35a6329da5a3477ca7b68a926ed8a8bb48580ad93a3a62c11bb362bd2f400a7817cbe64eb3185119be59d7878f72dc06c7d82b26649323867fd45603bd6841dcb15a98dd3e56edbc39ff2b2fa53b96af978c726f1abacf478b6bdfb27b51f7e8a751f1b8796f3e69f3409a532384a28d5f67ee0a05e68ebe849c37dd89b42e58c39bae49e1f1ada3b6e5ec60ad3c677cb22eaa3030e16c723b0e286581f4fa88c6163b73e78ac2b0b798a67b83f38181d2 +[CIPHERTEXT_LEN] = 256 +[PATH_CEK] = CurrentUser/My/b3c66ffbe1db57419792e24aa970455bfac30757 +[PREFIX_LEN] = 371 +[PREFIX] = 0x016e000001430075007200720065006e00740055007300650072002f004d0079002f0062003300630036003600660066006200650031006400620035003700340031003900370039003200650032003400610061003900370030003400350035006200660061006300330030003700350037001ee7fdd428a1c866ba371abb16d8a94b10344afc13e25f0d1ff48a68eaccd077eef6a1f23c64044b0b9461bf45f64861c4fa4f343d14df14f0fed9e30051ffec9e44d17700839a7cbb70c77c7af86a35a6329da5a3477ca7b68a926ed8a8bb48580ad93a3a62c11bb362bd2f400a7817cbe64eb3185119be59d7878f72dc06c7d82b26649323867fd45603bd6841dcb15a98dd3e56edbc39ff2b2fa53b96af978c726f1abacf478b6bdfb27b51f7e8a751f1b8796f3e69f3409a532384a28d5f67ee0a05e68ebe849c37dd89b42e58c39bae49e1f1ada3b6e5ec60ad3c677cb22eaa3030e16c723b0e286581f4fa88c6163b73e78ac2b0b798a67b83f38181d2 +[HASHED_CEK] = 0x8d1e75746b4b2606de067b18d478fa85f48623641f8d7e274154db947b7af473 +[SIGNED_CEK] = 0x35d0e5529ceb65840fddc745fd132afced5cf5fa75c5c4f5ca0da6882c15eb661680a450465f7062bb2c542632065cb64b07f96e33ebd53534cbfd6b37f8690f788fe2f0c577cff37da70934943b2a84284d425645313ff0f0773e591bced0c614048513ee804fd6d832dce330fc56c2efba9636113cacbadf8c3f4a90e2c4825643c1dfdf8bd37dc0803091e6cb8e8f533efd2aea26728bcfa20a5f27b3c150996c842b4cc10a9cc42e5250e2e058fb8834e1e80e219f8d2d143fee49735852e0d31f14308df36350c4e7105da40ee97168456155f5006cac835fe7d47e8d3a5a7bbed9c620fb0fd315414c9caeaa1b5138504fc099e9d1ff033855858b6b45 +[FINALCELL_CEK] = 0x016e000001430075007200720065006e00740055007300650072002f004d0079002f0062003300630036003600660066006200650031006400620035003700340031003900370039003200650032003400610061003900370030003400350035006200660061006300330030003700350037001ee7fdd428a1c866ba371abb16d8a94b10344afc13e25f0d1ff48a68eaccd077eef6a1f23c64044b0b9461bf45f64861c4fa4f343d14df14f0fed9e30051ffec9e44d17700839a7cbb70c77c7af86a35a6329da5a3477ca7b68a926ed8a8bb48580ad93a3a62c11bb362bd2f400a7817cbe64eb3185119be59d7878f72dc06c7d82b26649323867fd45603bd6841dcb15a98dd3e56edbc39ff2b2fa53b96af978c726f1abacf478b6bdfb27b51f7e8a751f1b8796f3e69f3409a532384a28d5f67ee0a05e68ebe849c37dd89b42e58c39bae49e1f1ada3b6e5ec60ad3c677cb22eaa3030e16c723b0e286581f4fa88c6163b73e78ac2b0b798a67b83f38181d235d0e5529ceb65840fddc745fd132afced5cf5fa75c5c4f5ca0da6882c15eb661680a450465f7062bb2c542632065cb64b07f96e33ebd53534cbfd6b37f8690f788fe2f0c577cff37da70934943b2a84284d425645313ff0f0773e591bced0c614048513ee804fd6d832dce330fc56c2efba9636113cacbadf8c3f4a90e2c4825643c1dfdf8bd37dc0803091e6cb8e8f533efd2aea26728bcfa20a5f27b3c150996c842b4cc10a9cc42e5250e2e058fb8834e1e80e219f8d2d143fee49735852e0d31f14308df36350c4e7105da40ee97168456155f5006cac835fe7d47e8d3a5a7bbed9c620fb0fd315414c9caeaa1b5138504fc099e9d1ff033855858b6b45 +---------------------------------------------------- +---------------------------------------------------- +[PLAINTEXT_CEK] = 0xa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6aa6a6a6a6a6a6a6a66a6a6a6a6a6a6a6a +[CIPHERTEXT_CEK] = 0xb1024329e17a82507a152ae5ffc255927bdb5e000fecba8e77525b2c30fc2a4a886d012770659fc150a0f4971435c716bb9f10da05606b48b6308e5efbb66389109a46031e92df2a1728ea9968188dd2b2339b2acc4b4e2ec6fb7dcfd3ba4c217ecf27bb8cdec470c2f5abb35d6b74ff32bd3023b072ec320d628ad297380d89f45f647117ed2ed99a2c29e9f46b6fb54593807d2dee77889922dd02cfd37996209158ba656e690ff4b9fb4c9370549660717bc2fe7d5d04987fb3fcb3d1f0b426a40b885c6164d24289447627215cc46ad51ee64fd3331a32cac418af18efbf5ebfa2033f6d62cfbd23481db9a5cf46375cd058fc3e42c5024953f92260b7f7 +[CIPHERTEXT_LEN] = 256 +[PATH_CEK] = CurrentUser/My/b3c66ffbe1db57419792e24aa970455bfac30757 +[PREFIX_LEN] = 371 +[PREFIX] = 0x016e000001430075007200720065006e00740055007300650072002f004d0079002f006200330063003600360066006600620065003100640062003500370034003100390037003900320065003200340061006100390037003000340035003500620066006100630033003000370035003700b1024329e17a82507a152ae5ffc255927bdb5e000fecba8e77525b2c30fc2a4a886d012770659fc150a0f4971435c716bb9f10da05606b48b6308e5efbb66389109a46031e92df2a1728ea9968188dd2b2339b2acc4b4e2ec6fb7dcfd3ba4c217ecf27bb8cdec470c2f5abb35d6b74ff32bd3023b072ec320d628ad297380d89f45f647117ed2ed99a2c29e9f46b6fb54593807d2dee77889922dd02cfd37996209158ba656e690ff4b9fb4c9370549660717bc2fe7d5d04987fb3fcb3d1f0b426a40b885c6164d24289447627215cc46ad51ee64fd3331a32cac418af18efbf5ebfa2033f6d62cfbd23481db9a5cf46375cd058fc3e42c5024953f92260b7f7 +[HASHED_CEK] = 0xf256613d131c96ab7b525c0d3d32605eb309db7ea6a239d0cdc3ef929dacff29 +[SIGNED_CEK] = 0x80b2d3b43fd897e77e20ae2805897ea3f20f852ff2e4f116cafd6ad694fa4377644b4d60f895e6b4d528009559a2bcbefa54ec9e9320e23938223fdddded2503fbf4d09348115cdfdc43446299d1ff64321d0a4ba229079a9150791312e55fbbcb7d272c01802fbc3ca1dd27fcae79de077edc480eb5b14ddc0719395e967689d0bbc3093f8931413af7a658a5fea31eb3f7ead8bd465399c72778cc1cb7fbd390c01434c64aa4555b033e1852f72938af7997247771868b95c0594c4821393b2b263d2c5da1ac70fced8e0cebb5766134378ca71e3a71ae2eeb4d743ddc8f901c27fe30dc5696b2151f788defdd7d8502dc3e5e7dbd13230f4dd3ea32ab8713 +[FINALCELL_CEK] = 0x016e000001430075007200720065006e00740055007300650072002f004d0079002f006200330063003600360066006600620065003100640062003500370034003100390037003900320065003200340061006100390037003000340035003500620066006100630033003000370035003700b1024329e17a82507a152ae5ffc255927bdb5e000fecba8e77525b2c30fc2a4a886d012770659fc150a0f4971435c716bb9f10da05606b48b6308e5efbb66389109a46031e92df2a1728ea9968188dd2b2339b2acc4b4e2ec6fb7dcfd3ba4c217ecf27bb8cdec470c2f5abb35d6b74ff32bd3023b072ec320d628ad297380d89f45f647117ed2ed99a2c29e9f46b6fb54593807d2dee77889922dd02cfd37996209158ba656e690ff4b9fb4c9370549660717bc2fe7d5d04987fb3fcb3d1f0b426a40b885c6164d24289447627215cc46ad51ee64fd3331a32cac418af18efbf5ebfa2033f6d62cfbd23481db9a5cf46375cd058fc3e42c5024953f92260b7f780b2d3b43fd897e77e20ae2805897ea3f20f852ff2e4f116cafd6ad694fa4377644b4d60f895e6b4d528009559a2bcbefa54ec9e9320e23938223fdddded2503fbf4d09348115cdfdc43446299d1ff64321d0a4ba229079a9150791312e55fbbcb7d272c01802fbc3ca1dd27fcae79de077edc480eb5b14ddc0719395e967689d0bbc3093f8931413af7a658a5fea31eb3f7ead8bd465399c72778cc1cb7fbd390c01434c64aa4555b033e1852f72938af7997247771868b95c0594c4821393b2b263d2c5da1ac70fced8e0cebb5766134378ca71e3a71ae2eeb4d743ddc8f901c27fe30dc5696b2151f788defdd7d8502dc3e5e7dbd13230f4dd3ea32ab8713 +---------------------------------------------------- diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj index a7f877b4dd..451a838768 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj @@ -17,12 +17,15 @@ + + + @@ -31,7 +34,7 @@ - + @@ -169,6 +172,14 @@ PreserveNewest SqlParameterTest_ReleaseMode.bsl + + PreserveNewest + TCECryptoNativeBaseline.txt + + + PreserveNewest + TCECryptoNativeBaselineRsa.txt + From b786812ff6e8bb641fdeacf7185c9729775af20b Mon Sep 17 00:00:00 2001 From: Gary Zhang Date: Mon, 9 Sep 2019 15:08:42 -0700 Subject: [PATCH 15/26] Mark CoreCryptoTests as Windows only. --- .../tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs index 020011941b..b093c68352 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CoreCryptoTests.cs @@ -12,6 +12,7 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests.AlwaysEncrypted public class CoreCryptoTests : IClassFixture { [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + [PlatformSpecific(TestPlatforms.Windows)] public void TestAeadCryptoWithNativeBaseline() { // Initialize the reader for resource text file which has the native code generated baseline. @@ -45,6 +46,7 @@ public void TestAeadCryptoWithNativeBaseline() } [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + [PlatformSpecific(TestPlatforms.Windows)] public void TestRsaCryptoWithNativeBaseline() { // Initialize the reader for resource text file which has the native code generated baseline. From e02c1ee86f15a16c6cb39736ea10cb96474ad6f9 Mon Sep 17 00:00:00 2001 From: Gary Zhang Date: Mon, 9 Sep 2019 15:23:14 -0700 Subject: [PATCH 16/26] Generate new certificates with makecert.exe and see if the new certs work on pipelines --- .../AlwaysEncryptedTests/ExceptionsCertStore.cs | 1 - .../tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/ExceptionsCertStore.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/ExceptionsCertStore.cs index 07e5620f18..74896f7f31 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/ExceptionsCertStore.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/ExceptionsCertStore.cs @@ -42,7 +42,6 @@ public void CertificateNotFound() #if NET46 [Fact] - [ActiveIssue(9657)] [SkipOnTargetFramework(TargetFrameworkMonikers.Netcoreapp)] public void CertificateWithNoPrivateKey() { diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs index 02e93f9639..9716bbaf9c 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs @@ -173,7 +173,7 @@ internal static byte[] GenerateInvalidEncryptedCek(byte[] encryptedCek, ECEKCorr internal static X509Certificate2 CreateCertificate() { - byte[] certificateRawBytes = new byte[] { 48, 130, 10, 36, 2, 1, 3, 48, 130, 9, 224, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 9, 209, 4, 130, 9, 205, 48, 130, 9, 201, 48, 130, 5, 250, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 5, 235, 4, 130, 5, 231, 48, 130, 5, 227, 48, 130, 5, 223, 6, 11, 42, 134, 72, 134, 247, 13, 1, 12, 10, 1, 2, 160, 130, 4, 254, 48, 130, 4, 250, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 146, 126, 191, 6, 130, 18, 111, 71, 2, 2, 7, 208, 4, 130, 4, 216, 55, 138, 10, 135, 82, 84, 240, 82, 107, 75, 21, 156, 54, 53, 188, 62, 36, 248, 59, 17, 18, 41, 206, 171, 226, 168, 175, 59, 48, 50, 36, 26, 58, 39, 118, 231, 200, 107, 86, 144, 200, 20, 135, 22, 105, 159, 229, 116, 123, 122, 194, 69, 172, 171, 128, 251, 129, 222, 113, 27, 253, 48, 164, 116, 72, 194, 123, 12, 247, 186, 162, 40, 39, 114, 22, 118, 91, 192, 73, 122, 235, 247, 40, 89, 3, 222, 64, 214, 184, 67, 204, 188, 197, 188, 107, 126, 225, 194, 161, 110, 156, 45, 70, 26, 86, 69, 63, 120, 153, 164, 136, 15, 220, 153, 104, 50, 121, 87, 10, 180, 149, 98, 220, 73, 175, 50, 146, 231, 112, 230, 204, 132, 76, 43, 142, 7, 104, 142, 146, 92, 21, 52, 38, 59, 154, 108, 159, 192, 93, 174, 39, 134, 96, 189, 150, 77, 90, 160, 43, 127, 173, 199, 189, 4, 69, 44, 104, 148, 225, 44, 149, 167, 149, 121, 220, 232, 98, 131, 212, 130, 35, 79, 10, 173, 177, 150, 161, 91, 26, 12, 221, 136, 230, 124, 73, 96, 126, 12, 241, 99, 60, 140, 126, 140, 0, 166, 47, 16, 87, 102, 138, 45, 97, 21, 31, 224, 126, 231, 102, 99, 35, 207, 75, 22, 249, 115, 51, 106, 79, 208, 21, 108, 124, 143, 108, 130, 6, 61, 215, 227, 7, 224, 174, 193, 97, 211, 241, 224, 90, 37, 101, 147, 149, 173, 239, 113, 214, 1, 41, 69, 158, 203, 3, 63, 101, 196, 134, 7, 127, 58, 113, 243, 228, 162, 99, 75, 207, 153, 19, 193, 187, 52, 124, 85, 234, 7, 249, 75, 65, 230, 107, 247, 145, 64, 94, 106, 50, 117, 83, 138, 49, 10, 22, 211, 115, 183, 20, 119, 18, 117, 166, 153, 30, 210, 248, 118, 200, 21, 180, 118, 208, 53, 90, 243, 74, 76, 109, 106, 46, 103, 112, 197, 89, 92, 178, 83, 48, 97, 162, 73, 78, 105, 145, 213, 230, 17, 211, 121, 200, 101, 179, 158, 85, 99, 211, 68, 122, 234, 176, 4, 33, 225, 120, 139, 163, 110, 35, 199, 23, 45, 126, 199, 80, 145, 14, 74, 217, 200, 172, 216, 159, 237, 241, 157, 85, 210, 141, 180, 150, 187, 82, 48, 245, 154, 125, 60, 223, 244, 21, 20, 39, 88, 8, 153, 185, 227, 76, 78, 137, 99, 98, 81, 141, 27, 197, 41, 39, 251, 80, 27, 85, 78, 65, 15, 216, 106, 106, 113, 33, 253, 210, 46, 214, 47, 49, 89, 170, 215, 207, 62, 182, 88, 25, 186, 166, 214, 172, 63, 94, 17, 123, 235, 226, 72, 73, 204, 18, 173, 134, 92, 66, 2, 213, 151, 251, 95, 175, 38, 56, 156, 138, 96, 123, 190, 107, 59, 230, 24, 210, 224, 206, 169, 159, 95, 180, 237, 34, 194, 62, 4, 213, 228, 85, 216, 138, 157, 50, 20, 101, 160, 195, 138, 207, 18, 17, 232, 6, 73, 82, 247, 173, 50, 180, 53, 58, 156, 97, 230, 112, 211, 251, 204, 120, 188, 34, 41, 67, 83, 197, 131, 251, 176, 20, 70, 169, 116, 237, 43, 117, 45, 31, 66, 74, 152, 216, 3, 108, 102, 99, 5, 127, 76, 129, 57, 180, 90, 218, 157, 108, 85, 4, 240, 101, 149, 154, 221, 208, 70, 152, 34, 128, 57, 135, 38, 17, 139, 142, 167, 109, 73, 129, 181, 105, 45, 151, 106, 171, 166, 0, 113, 147, 141, 19, 228, 196, 88, 175, 219, 18, 213, 54, 105, 179, 8, 249, 250, 164, 86, 28, 185, 19, 60, 50, 140, 73, 237, 148, 201, 33, 204, 189, 43, 83, 163, 138, 1, 10, 13, 240, 196, 211, 221, 169, 207, 100, 167, 203, 146, 115, 70, 118, 230, 4, 224, 192, 209, 242, 144, 150, 72, 170, 149, 255, 196, 7, 91, 55, 251, 57, 127, 103, 98, 113, 83, 224, 97, 118, 132, 81, 119, 8, 105, 250, 155, 107, 149, 28, 127, 66, 127, 224, 79, 96, 9, 168, 73, 84, 228, 123, 161, 222, 179, 115, 73, 184, 62, 24, 228, 44, 156, 42, 124, 209, 29, 81, 19, 169, 24, 212, 6, 238, 239, 221, 68, 220, 106, 0, 45, 201, 129, 3, 50, 150, 244, 32, 220, 237, 20, 39, 175, 249, 80, 189, 166, 68, 251, 102, 60, 137, 93, 209, 86, 194, 55, 164, 100, 76, 220, 249, 30, 233, 101, 177, 150, 71, 28, 227, 180, 44, 115, 83, 201, 129, 44, 128, 247, 68, 175, 97, 36, 170, 76, 236, 57, 119, 240, 0, 129, 185, 35, 160, 231, 183, 56, 162, 197, 237, 186, 109, 118, 232, 84, 108, 125, 93, 92, 101, 193, 180, 210, 192, 244, 47, 55, 56, 217, 178, 200, 168, 232, 80, 223, 209, 255, 234, 146, 46, 215, 170, 197, 94, 84, 213, 233, 140, 247, 69, 185, 103, 183, 91, 23, 232, 32, 246, 244, 30, 41, 156, 28, 72, 109, 90, 127, 135, 132, 19, 136, 233, 168, 29, 98, 17, 111, 5, 185, 234, 86, 234, 114, 47, 227, 81, 77, 108, 179, 184, 91, 31, 74, 23, 29, 248, 41, 207, 8, 23, 181, 33, 99, 217, 48, 145, 97, 126, 139, 133, 11, 100, 69, 151, 146, 38, 79, 231, 155, 92, 134, 139, 189, 237, 132, 196, 95, 45, 141, 15, 26, 37, 58, 219, 10, 0, 36, 221, 240, 82, 117, 163, 121, 141, 206, 21, 180, 195, 58, 109, 56, 123, 152, 206, 116, 161, 221, 125, 248, 23, 31, 240, 227, 186, 52, 171, 147, 51, 39, 203, 92, 205, 182, 146, 149, 111, 27, 59, 219, 234, 216, 52, 89, 22, 224, 76, 62, 94, 76, 131, 48, 162, 134, 161, 177, 44, 205, 101, 253, 13, 237, 40, 29, 72, 224, 121, 74, 189, 57, 81, 58, 169, 178, 173, 157, 182, 143, 205, 64, 225, 137, 188, 235, 43, 195, 3, 187, 105, 113, 72, 82, 153, 58, 97, 38, 251, 212, 149, 191, 11, 153, 157, 106, 16, 236, 237, 209, 210, 208, 19, 68, 92, 176, 65, 24, 115, 181, 94, 24, 126, 2, 216, 63, 200, 136, 178, 92, 248, 11, 128, 68, 122, 14, 46, 234, 48, 142, 219, 92, 29, 136, 70, 200, 52, 78, 70, 160, 215, 113, 102, 190, 66, 16, 69, 120, 25, 201, 23, 209, 41, 79, 25, 151, 38, 38, 82, 244, 143, 121, 216, 111, 91, 167, 232, 32, 234, 243, 195, 168, 240, 135, 188, 1, 92, 145, 77, 240, 107, 20, 82, 147, 168, 132, 78, 115, 206, 95, 47, 8, 80, 91, 255, 28, 38, 161, 52, 168, 211, 236, 143, 238, 146, 172, 104, 2, 254, 240, 229, 210, 225, 47, 41, 76, 134, 5, 20, 203, 188, 48, 195, 120, 103, 234, 94, 217, 142, 238, 254, 131, 146, 214, 106, 212, 229, 201, 79, 151, 198, 100, 132, 99, 228, 82, 182, 94, 216, 226, 163, 42, 113, 110, 201, 70, 221, 127, 242, 7, 176, 60, 121, 158, 37, 56, 6, 156, 191, 75, 94, 222, 10, 155, 39, 64, 172, 216, 106, 210, 202, 246, 66, 83, 107, 250, 17, 134, 222, 212, 71, 200, 215, 103, 35, 82, 225, 106, 17, 106, 74, 18, 130, 236, 175, 45, 145, 155, 169, 88, 72, 244, 3, 38, 245, 208, 49, 129, 205, 48, 19, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 21, 49, 6, 4, 4, 1, 0, 0, 0, 48, 87, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 20, 49, 74, 30, 72, 0, 100, 0, 99, 0, 99, 0, 52, 0, 51, 0, 48, 0, 56, 0, 56, 0, 45, 0, 50, 0, 57, 0, 54, 0, 53, 0, 45, 0, 52, 0, 57, 0, 97, 0, 48, 0, 45, 0, 56, 0, 51, 0, 54, 0, 53, 0, 45, 0, 50, 0, 52, 0, 101, 0, 52, 0, 97, 0, 52, 0, 49, 0, 100, 0, 55, 0, 50, 0, 52, 0, 48, 48, 93, 6, 9, 43, 6, 1, 4, 1, 130, 55, 17, 1, 49, 80, 30, 78, 0, 77, 0, 105, 0, 99, 0, 114, 0, 111, 0, 115, 0, 111, 0, 102, 0, 116, 0, 32, 0, 83, 0, 116, 0, 114, 0, 111, 0, 110, 0, 103, 0, 32, 0, 67, 0, 114, 0, 121, 0, 112, 0, 116, 0, 111, 0, 103, 0, 114, 0, 97, 0, 112, 0, 104, 0, 105, 0, 99, 0, 32, 0, 80, 0, 114, 0, 111, 0, 118, 0, 105, 0, 100, 0, 101, 0, 114, 48, 130, 3, 199, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 6, 160, 130, 3, 184, 48, 130, 3, 180, 2, 1, 0, 48, 130, 3, 173, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 206, 244, 28, 93, 203, 68, 165, 233, 2, 2, 7, 208, 128, 130, 3, 128, 74, 136, 80, 43, 195, 182, 181, 122, 132, 229, 10, 181, 229, 1, 78, 122, 145, 95, 16, 236, 242, 107, 9, 141, 186, 205, 32, 139, 154, 132, 184, 180, 80, 26, 3, 85, 196, 10, 33, 216, 101, 105, 172, 196, 77, 222, 232, 229, 37, 199, 6, 189, 152, 8, 203, 15, 231, 164, 140, 163, 120, 23, 137, 34, 16, 241, 186, 64, 11, 241, 210, 160, 186, 90, 55, 39, 21, 210, 145, 74, 151, 40, 122, 221, 240, 191, 185, 115, 85, 208, 125, 136, 51, 210, 137, 124, 155, 65, 135, 50, 35, 233, 223, 157, 131, 108, 11, 142, 152, 217, 162, 163, 218, 47, 89, 255, 229, 21, 224, 139, 187, 4, 175, 251, 248, 8, 18, 16, 112, 134, 75, 17, 90, 246, 62, 150, 31, 207, 95, 172, 5, 220, 135, 201, 179, 247, 193, 177, 23, 5, 170, 207, 66, 219, 145, 117, 99, 167, 238, 100, 158, 169, 44, 22, 199, 132, 38, 67, 203, 66, 187, 53, 216, 98, 113, 76, 142, 153, 36, 238, 110, 152, 251, 68, 6, 154, 255, 51, 65, 75, 91, 9, 121, 86, 116, 35, 224, 47, 220, 194, 17, 136, 175, 76, 165, 210, 153, 89, 104, 197, 133, 200, 49, 173, 1, 167, 5, 88, 183, 58, 193, 146, 30, 60, 129, 195, 3, 16, 78, 87, 167, 135, 182, 182, 150, 68, 116, 161, 116, 125, 180, 155, 103, 63, 0, 98, 27, 179, 142, 64, 73, 31, 35, 63, 138, 137, 30, 169, 149, 221, 104, 21, 182, 23, 67, 246, 2, 162, 217, 165, 238, 124, 229, 149, 84, 5, 203, 174, 149, 79, 153, 25, 153, 233, 213, 86, 250, 10, 42, 6, 226, 113, 123, 90, 76, 153, 39, 203, 237, 124, 36, 191, 232, 132, 127, 82, 163, 109, 100, 121, 54, 254, 116, 155, 26, 255, 50, 150, 140, 172, 240, 208, 245, 65, 72, 49, 183, 149, 220, 244, 120, 193, 37, 222, 144, 137, 82, 168, 233, 13, 179, 2, 217, 29, 177, 4, 136, 69, 192, 133, 249, 180, 9, 62, 162, 216, 251, 164, 188, 173, 143, 149, 32, 204, 255, 246, 249, 33, 216, 75, 23, 127, 215, 134, 69, 79, 112, 213, 198, 89, 44, 51, 19, 226, 16, 210, 125, 212, 232, 18, 252, 178, 93, 245, 33, 62, 81, 207, 78, 167, 144, 238, 251, 27, 194, 21, 53, 44, 63, 58, 26, 176, 75, 79, 164, 67, 59, 80, 17, 54, 209, 58, 184, 2, 36, 202, 135, 91, 35, 78, 55, 203, 134, 238, 79, 178, 84, 242, 46, 223, 131, 227, 87, 255, 182, 244, 117, 162, 60, 134, 161, 49, 59, 95, 64, 190, 30, 195, 100, 106, 7, 120, 181, 202, 122, 174, 234, 30, 11, 88, 65, 238, 53, 64, 243, 233, 185, 168, 34, 8, 58, 233, 171, 210, 104, 105, 93, 49, 206, 11, 40, 172, 248, 204, 80, 128, 53, 143, 54, 95, 92, 70, 152, 209, 193, 116, 252, 138, 19, 50, 249, 43, 14, 225, 167, 8, 205, 112, 103, 79, 223, 14, 141, 147, 70, 197, 91, 11, 117, 202, 19, 180, 240, 21, 118, 108, 25, 63, 54, 94, 156, 112, 109, 16, 216, 113, 192, 246, 207, 156, 203, 65, 75, 143, 157, 125, 158, 151, 167, 207, 96, 6, 162, 97, 66, 114, 95, 227, 52, 44, 98, 121, 139, 181, 240, 89, 27, 59, 156, 189, 93, 28, 48, 165, 11, 245, 102, 198, 29, 5, 6, 180, 147, 58, 130, 65, 201, 10, 164, 193, 93, 168, 96, 156, 89, 225, 139, 70, 245, 74, 128, 3, 141, 133, 137, 21, 163, 77, 3, 19, 226, 35, 248, 156, 56, 56, 37, 221, 69, 67, 214, 3, 152, 149, 224, 92, 72, 173, 39, 196, 229, 153, 67, 151, 190, 115, 20, 70, 126, 210, 140, 109, 186, 46, 82, 88, 185, 96, 1, 254, 161, 217, 130, 226, 133, 18, 103, 175, 132, 249, 102, 51, 229, 192, 94, 44, 10, 25, 197, 237, 77, 196, 1, 253, 153, 78, 237, 151, 136, 89, 203, 113, 244, 217, 235, 252, 31, 116, 139, 233, 40, 197, 22, 176, 157, 130, 109, 149, 215, 11, 20, 3, 156, 239, 29, 250, 95, 188, 241, 184, 117, 108, 216, 74, 91, 169, 186, 122, 175, 214, 36, 62, 240, 142, 107, 172, 7, 250, 31, 101, 75, 83, 255, 56, 8, 231, 200, 194, 154, 105, 202, 170, 207, 252, 128, 10, 249, 53, 41, 168, 94, 225, 163, 10, 251, 149, 64, 10, 144, 252, 44, 136, 149, 119, 183, 7, 230, 87, 160, 46, 62, 185, 82, 218, 213, 125, 62, 70, 43, 27, 5, 181, 50, 193, 11, 30, 0, 8, 81, 94, 169, 171, 143, 113, 235, 171, 38, 129, 116, 11, 191, 75, 235, 185, 184, 178, 36, 193, 174, 177, 51, 87, 163, 142, 52, 62, 161, 237, 139, 50, 51, 227, 188, 164, 106, 233, 209, 8, 237, 241, 92, 145, 51, 6, 36, 197, 24, 255, 143, 5, 144, 43, 87, 242, 208, 251, 79, 171, 90, 103, 219, 73, 242, 95, 36, 48, 95, 127, 40, 128, 201, 80, 79, 74, 226, 25, 43, 50, 56, 180, 59, 84, 148, 110, 151, 9, 45, 4, 212, 172, 31, 189, 44, 115, 59, 169, 48, 59, 48, 31, 48, 7, 6, 5, 43, 14, 3, 2, 26, 4, 20, 238, 91, 24, 104, 64, 45, 237, 63, 114, 36, 111, 106, 82, 43, 251, 110, 60, 159, 42, 178, 4, 20, 20, 49, 70, 55, 115, 247, 221, 156, 47, 189, 197, 19, 116, 77, 161, 163, 216, 77, 166, 144, 2, 2, 7, 208 }; + byte[] certificateRawBytes = new byte[] { 48, 130, 3, 52, 48, 130, 2, 28, 160, 3, 2, 1, 2, 2, 16, 55, 130, 235, 197, 31, 26, 120, 172, 77, 241, 92, 126, 16, 70, 52, 187, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48, 28, 49, 26, 48, 24, 6, 3, 85, 4, 3, 19, 17, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 48, 30, 23, 13, 49, 57, 48, 56, 50, 54, 50, 50, 52, 51, 48, 51, 90, 23, 13, 51, 57, 49, 50, 51, 49, 50, 51, 53, 57, 53, 57, 90, 48, 28, 49, 26, 48, 24, 6, 3, 85, 4, 3, 19, 17, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 155, 128, 78, 186, 240, 28, 129, 84, 13, 87, 243, 127, 162, 194, 20, 206, 218, 60, 189, 144, 81, 143, 208, 102, 174, 105, 218, 234, 76, 251, 160, 109, 113, 213, 219, 193, 7, 241, 63, 225, 10, 187, 252, 103, 51, 121, 1, 32, 235, 13, 54, 204, 252, 112, 142, 20, 146, 68, 176, 50, 242, 96, 22, 67, 85, 82, 247, 122, 184, 53, 233, 49, 223, 208, 239, 61, 95, 51, 241, 132, 197, 212, 130, 123, 117, 58, 97, 53, 141, 65, 32, 143, 148, 90, 116, 63, 236, 183, 99, 150, 48, 149, 62, 175, 253, 74, 116, 212, 27, 153, 92, 209, 64, 0, 82, 189, 223, 49, 216, 139, 7, 79, 86, 123, 147, 117, 131, 204, 195, 16, 221, 218, 30, 75, 17, 170, 209, 10, 193, 198, 146, 199, 196, 79, 2, 27, 63, 117, 218, 129, 45, 5, 35, 188, 36, 152, 248, 72, 250, 209, 255, 71, 43, 96, 253, 190, 90, 176, 236, 107, 248, 170, 120, 185, 83, 249, 241, 23, 205, 251, 101, 107, 140, 168, 23, 248, 238, 80, 23, 221, 224, 25, 71, 241, 16, 26, 189, 166, 49, 175, 127, 158, 123, 109, 131, 125, 241, 51, 55, 181, 183, 211, 88, 13, 211, 219, 68, 72, 237, 19, 170, 219, 248, 147, 168, 237, 73, 149, 62, 204, 152, 217, 48, 237, 15, 195, 7, 175, 34, 241, 175, 179, 19, 172, 147, 201, 105, 51, 218, 138, 235, 24, 41, 213, 84, 185, 2, 3, 1, 0, 1, 163, 114, 48, 112, 48, 31, 6, 3, 85, 29, 37, 4, 24, 48, 22, 6, 8, 43, 6, 1, 5, 5, 8, 2, 2, 6, 10, 43, 6, 1, 4, 1, 130, 55, 10, 3, 11, 48, 77, 6, 3, 85, 29, 1, 4, 70, 48, 68, 128, 16, 216, 253, 207, 70, 139, 39, 93, 135, 25, 98, 110, 197, 6, 196, 131, 50, 161, 30, 48, 28, 49, 26, 48, 24, 6, 3, 85, 4, 3, 19, 17, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 130, 16, 55, 130, 235, 197, 31, 26, 120, 172, 77, 241, 92, 126, 16, 70, 52, 187, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 130, 1, 1, 0, 150, 191, 139, 9, 124, 192, 185, 119, 117, 41, 35, 37, 117, 23, 143, 120, 206, 10, 116, 236, 243, 171, 49, 216, 42, 10, 172, 230, 187, 118, 201, 238, 9, 77, 49, 234, 169, 193, 163, 177, 120, 24, 148, 56, 47, 82, 197, 107, 72, 167, 220, 161, 84, 70, 242, 17, 54, 38, 235, 65, 217, 239, 22, 164, 82, 103, 167, 120, 252, 126, 158, 224, 68, 205, 210, 105, 239, 25, 170, 197, 113, 167, 152, 54, 8, 117, 224, 150, 205, 218, 42, 177, 191, 57, 52, 2, 25, 251, 246, 7, 202, 12, 112, 202, 161, 195, 218, 102, 54, 249, 156, 71, 11, 175, 132, 189, 54, 111, 226, 114, 15, 81, 205, 22, 71, 172, 44, 35, 48, 161, 54, 139, 155, 31, 205, 156, 134, 178, 61, 227, 205, 250, 134, 255, 113, 35, 96, 137, 200, 218, 50, 164, 148, 12, 68, 176, 227, 46, 219, 215, 108, 194, 62, 191, 191, 206, 181, 171, 224, 14, 11, 194, 122, 102, 183, 10, 79, 238, 48, 66, 134, 98, 21, 208, 30, 154, 187, 35, 116, 251, 20, 251, 175, 117, 93, 33, 202, 207, 104, 225, 41, 158, 255, 206, 45, 205, 66, 166, 5, 201, 225, 191, 19, 165, 131, 224, 7, 57, 113, 156, 37, 72, 149, 166, 180, 114, 250, 132, 218, 194, 53, 37, 21, 164, 163, 4, 74, 40, 165, 245, 211, 77, 185, 115, 203, 25, 136, 17, 110, 168, 65, 69, 193, 166, 252, 150 }; X509Certificate2 certificate = new X509Certificate2(certificateRawBytes, "", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet); X509Store certStore = null; try @@ -321,7 +321,7 @@ internal static byte[] DecryptDataUsingAED(byte[] encryptedCellBlob, byte[] key, /// internal static X509Certificate2 CreateCertificateWithNoPrivateKey() { - byte[] certificateRawBytes = new byte[] { 48, 130, 10, 36, 2, 1, 3, 48, 130, 9, 224, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 9, 209, 4, 130, 9, 205, 48, 130, 9, 201, 48, 130, 5, 250, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 5, 235, 4, 130, 5, 231, 48, 130, 5, 227, 48, 130, 5, 223, 6, 11, 42, 134, 72, 134, 247, 13, 1, 12, 10, 1, 2, 160, 130, 4, 254, 48, 130, 4, 250, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 95, 228, 98, 55, 21, 153, 43, 16, 2, 2, 7, 208, 4, 130, 4, 216, 210, 4, 83, 193, 62, 47, 171, 147, 165, 139, 74, 78, 118, 172, 54, 56, 118, 81, 203, 190, 58, 5, 220, 181, 64, 1, 213, 5, 156, 164, 86, 59, 63, 230, 250, 57, 26, 236, 10, 195, 200, 80, 217, 38, 214, 116, 250, 224, 236, 54, 59, 208, 206, 128, 167, 122, 89, 0, 195, 145, 41, 63, 122, 160, 157, 21, 226, 205, 179, 166, 243, 92, 94, 71, 61, 208, 183, 153, 105, 24, 232, 255, 139, 188, 32, 109, 120, 41, 18, 218, 212, 71, 219, 139, 182, 59, 78, 46, 97, 176, 67, 125, 239, 234, 107, 47, 202, 71, 81, 100, 243, 136, 162, 39, 197, 207, 4, 224, 52, 62, 104, 88, 44, 42, 234, 18, 70, 55, 248, 251, 121, 215, 162, 77, 109, 189, 135, 86, 219, 69, 208, 92, 147, 163, 21, 50, 0, 87, 166, 8, 39, 21, 72, 107, 75, 214, 165, 238, 50, 145, 2, 65, 138, 179, 21, 87, 149, 218, 163, 51, 214, 17, 93, 252, 224, 6, 245, 242, 132, 63, 100, 223, 136, 166, 89, 253, 171, 204, 215, 191, 170, 25, 40, 44, 14, 32, 25, 22, 149, 161, 62, 145, 61, 162, 32, 116, 7, 201, 33, 159, 128, 248, 172, 42, 33, 51, 248, 187, 135, 58, 107, 23, 7, 39, 21, 114, 186, 222, 132, 117, 193, 132, 94, 57, 213, 80, 9, 86, 186, 62, 201, 40, 12, 196, 207, 23, 182, 127, 245, 139, 18, 62, 107, 82, 58, 156, 156, 17, 29, 173, 60, 227, 180, 73, 245, 165, 16, 186, 246, 64, 178, 40, 66, 2, 119, 61, 78, 246, 214, 226, 89, 225, 85, 183, 163, 108, 82, 36, 109, 216, 195, 141, 174, 123, 162, 91, 128, 169, 37, 68, 121, 170, 80, 236, 27, 109, 173, 223, 6, 37, 37, 249, 166, 219, 226, 116, 236, 184, 212, 47, 70, 249, 89, 195, 216, 157, 227, 137, 247, 179, 148, 16, 40, 217, 220, 247, 97, 42, 120, 63, 3, 14, 104, 79, 111, 160, 245, 210, 33, 50, 6, 36, 90, 225, 206, 104, 70, 4, 191, 79, 16, 237, 200, 125, 92, 215, 175, 196, 143, 134, 95, 112, 251, 58, 68, 165, 157, 80, 82, 78, 203, 34, 131, 163, 136, 200, 4, 117, 174, 197, 159, 175, 14, 5, 110, 99, 70, 235, 91, 214, 136, 218, 14, 203, 28, 153, 48, 34, 60, 10, 202, 129, 212, 146, 83, 104, 236, 228, 248, 125, 120, 98, 174, 173, 216, 146, 254, 128, 0, 206, 64, 119, 56, 71, 153, 81, 155, 40, 195, 114, 41, 73, 108, 77, 229, 98, 15, 216, 164, 13, 139, 81, 9, 143, 137, 164, 122, 35, 192, 93, 87, 85, 88, 230, 168, 148, 233, 5, 76, 244, 116, 121, 157, 27, 174, 231, 58, 84, 159, 102, 149, 163, 142, 128, 195, 10, 214, 11, 164, 197, 182, 189, 33, 177, 232, 39, 44, 225, 74, 237, 197, 52, 82, 76, 105, 9, 221, 110, 251, 62, 255, 194, 24, 93, 184, 19, 220, 119, 127, 76, 198, 181, 14, 136, 106, 49, 241, 164, 18, 62, 80, 18, 88, 114, 167, 138, 183, 72, 160, 64, 27, 140, 160, 74, 113, 40, 212, 223, 128, 23, 113, 192, 162, 184, 234, 141, 207, 3, 246, 40, 2, 89, 184, 191, 67, 121, 16, 187, 117, 141, 163, 187, 170, 124, 169, 67, 148, 226, 202, 132, 61, 95, 7, 242, 116, 252, 228, 17, 102, 201, 178, 77, 215, 164, 204, 210, 31, 100, 243, 242, 190, 151, 96, 173, 74, 195, 214, 233, 78, 187, 73, 124, 183, 38, 124, 33, 108, 226, 113, 120, 25, 87, 201, 49, 134, 106, 127, 206, 234, 40, 37, 199, 56, 112, 0, 172, 136, 68, 8, 145, 225, 78, 186, 170, 121, 218, 37, 186, 80, 207, 29, 180, 129, 159, 178, 162, 152, 107, 39, 229, 192, 237, 226, 172, 88, 117, 144, 229, 124, 67, 74, 156, 81, 211, 118, 93, 188, 93, 209, 170, 240, 136, 37, 18, 181, 20, 48, 70, 79, 37, 169, 184, 240, 101, 153, 230, 10, 212, 36, 29, 201, 27, 39, 107, 221, 179, 226, 19, 199, 108, 158, 78, 217, 49, 255, 131, 36, 194, 37, 133, 47, 36, 207, 13, 16, 115, 179, 220, 57, 248, 194, 101, 181, 222, 170, 240, 120, 37, 50, 87, 198, 14, 251, 138, 115, 33, 231, 29, 240, 172, 130, 199, 77, 53, 245, 43, 178, 61, 103, 28, 33, 175, 247, 67, 232, 3, 139, 198, 115, 93, 146, 71, 154, 206, 118, 163, 99, 213, 241, 174, 20, 247, 181, 12, 112, 165, 116, 179, 220, 52, 200, 206, 162, 105, 12, 30, 212, 199, 179, 243, 176, 156, 113, 51, 142, 138, 70, 179, 130, 28, 118, 98, 7, 46, 26, 100, 200, 215, 16, 80, 138, 113, 160, 107, 209, 18, 85, 2, 69, 235, 2, 217, 80, 238, 212, 108, 18, 68, 63, 24, 174, 60, 253, 127, 94, 255, 249, 181, 98, 243, 240, 172, 109, 242, 155, 42, 70, 155, 38, 214, 231, 206, 60, 205, 46, 68, 77, 128, 192, 141, 4, 73, 54, 137, 32, 71, 20, 68, 11, 204, 124, 97, 205, 246, 80, 209, 175, 165, 121, 60, 195, 104, 104, 60, 2, 99, 142, 82, 121, 136, 118, 226, 178, 158, 80, 0, 159, 131, 208, 232, 46, 150, 196, 154, 196, 50, 183, 85, 170, 242, 218, 232, 236, 225, 52, 46, 109, 237, 127, 68, 251, 25, 105, 239, 32, 59, 205, 174, 131, 95, 75, 93, 218, 168, 173, 6, 152, 111, 251, 201, 146, 19, 230, 2, 32, 73, 32, 64, 101, 124, 96, 155, 101, 211, 232, 249, 143, 177, 147, 17, 187, 246, 46, 202, 155, 113, 236, 181, 70, 118, 220, 87, 20, 27, 17, 255, 223, 65, 217, 126, 5, 246, 161, 95, 186, 194, 77, 46, 26, 128, 253, 108, 178, 246, 121, 133, 172, 172, 75, 59, 12, 118, 7, 146, 154, 51, 94, 243, 112, 232, 103, 239, 159, 64, 183, 187, 79, 22, 43, 7, 250, 205, 183, 201, 178, 235, 80, 154, 233, 232, 125, 78, 62, 203, 132, 33, 4, 185, 234, 59, 190, 116, 133, 240, 41, 172, 207, 36, 177, 206, 49, 18, 40, 23, 177, 250, 36, 243, 59, 160, 24, 245, 218, 53, 234, 79, 17, 68, 19, 165, 156, 16, 250, 18, 111, 60, 179, 142, 168, 4, 67, 212, 11, 230, 113, 46, 105, 234, 98, 60, 36, 218, 202, 93, 54, 53, 160, 247, 144, 244, 225, 219, 101, 143, 239, 183, 75, 6, 144, 68, 10, 96, 98, 191, 251, 230, 243, 154, 236, 113, 164, 139, 155, 250, 133, 104, 45, 21, 106, 221, 20, 139, 191, 33, 38, 103, 135, 95, 5, 237, 173, 185, 173, 2, 40, 196, 114, 3, 174, 13, 201, 219, 150, 100, 30, 212, 38, 60, 106, 112, 244, 229, 34, 155, 169, 51, 62, 96, 154, 90, 225, 221, 103, 8, 201, 235, 189, 170, 42, 44, 255, 210, 69, 155, 119, 153, 8, 164, 171, 97, 173, 166, 68, 207, 170, 50, 92, 17, 2, 32, 182, 46, 136, 189, 187, 148, 206, 205, 127, 179, 32, 31, 77, 12, 141, 19, 126, 5, 82, 221, 47, 87, 206, 198, 146, 226, 128, 144, 64, 124, 49, 129, 205, 48, 19, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 21, 49, 6, 4, 4, 1, 0, 0, 0, 48, 87, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 20, 49, 74, 30, 72, 0, 98, 0, 53, 0, 55, 0, 56, 0, 48, 0, 53, 0, 52, 0, 52, 0, 45, 0, 52, 0, 56, 0, 99, 0, 48, 0, 45, 0, 52, 0, 55, 0, 56, 0, 52, 0, 45, 0, 57, 0, 50, 0, 98, 0, 52, 0, 45, 0, 56, 0, 99, 0, 49, 0, 101, 0, 102, 0, 56, 0, 54, 0, 101, 0, 54, 0, 100, 0, 54, 0, 54, 48, 93, 6, 9, 43, 6, 1, 4, 1, 130, 55, 17, 1, 49, 80, 30, 78, 0, 77, 0, 105, 0, 99, 0, 114, 0, 111, 0, 115, 0, 111, 0, 102, 0, 116, 0, 32, 0, 83, 0, 116, 0, 114, 0, 111, 0, 110, 0, 103, 0, 32, 0, 67, 0, 114, 0, 121, 0, 112, 0, 116, 0, 111, 0, 103, 0, 114, 0, 97, 0, 112, 0, 104, 0, 105, 0, 99, 0, 32, 0, 80, 0, 114, 0, 111, 0, 118, 0, 105, 0, 100, 0, 101, 0, 114, 48, 130, 3, 199, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 6, 160, 130, 3, 184, 48, 130, 3, 180, 2, 1, 0, 48, 130, 3, 173, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 109, 84, 234, 217, 158, 100, 175, 217, 2, 2, 7, 208, 128, 130, 3, 128, 90, 89, 57, 156, 113, 214, 108, 227, 208, 52, 188, 14, 47, 164, 163, 155, 102, 18, 248, 55, 200, 122, 232, 224, 246, 212, 57, 2, 121, 60, 244, 110, 223, 203, 184, 67, 115, 179, 191, 220, 45, 209, 143, 220, 17, 53, 61, 179, 105, 25, 150, 102, 108, 168, 140, 67, 141, 86, 165, 159, 139, 29, 23, 173, 40, 81, 79, 245, 12, 154, 11, 154, 208, 199, 34, 25, 46, 112, 30, 175, 71, 124, 20, 64, 128, 150, 156, 241, 198, 55, 103, 242, 169, 160, 232, 138, 160, 189, 30, 66, 73, 134, 28, 1, 32, 19, 151, 249, 75, 179, 252, 0, 244, 116, 209, 35, 116, 199, 171, 120, 18, 234, 17, 47, 70, 115, 154, 76, 170, 36, 166, 140, 190, 168, 99, 169, 130, 200, 220, 55, 38, 56, 145, 4, 119, 149, 184, 242, 214, 46, 181, 101, 25, 97, 102, 39, 240, 123, 83, 87, 69, 107, 159, 69, 136, 101, 88, 45, 2, 254, 111, 255, 202, 184, 213, 237, 98, 120, 235, 247, 134, 85, 155, 103, 232, 99, 218, 169, 219, 55, 232, 126, 133, 172, 179, 210, 82, 40, 42, 101, 157, 213, 42, 217, 88, 111, 101, 88, 202, 30, 212, 117, 225, 169, 164, 105, 225, 128, 251, 66, 148, 38, 7, 166, 125, 120, 135, 158, 139, 222, 245, 170, 5, 8, 102, 51, 193, 173, 136, 141, 183, 233, 168, 185, 208, 198, 238, 176, 63, 6, 167, 53, 27, 15, 226, 47, 37, 154, 1, 126, 252, 77, 83, 5, 21, 221, 166, 171, 9, 177, 181, 85, 83, 6, 154, 164, 24, 206, 48, 88, 243, 82, 103, 80, 9, 1, 169, 225, 255, 75, 10, 150, 17, 242, 49, 110, 194, 114, 9, 69, 15, 183, 20, 33, 43, 113, 79, 131, 115, 102, 230, 138, 139, 191, 29, 249, 175, 222, 231, 87, 98, 213, 108, 107, 30, 10, 126, 114, 3, 81, 67, 192, 26, 125, 31, 87, 83, 75, 113, 254, 122, 143, 227, 104, 67, 58, 155, 93, 177, 158, 84, 50, 50, 197, 125, 17, 252, 87, 194, 176, 160, 140, 220, 47, 209, 188, 158, 89, 167, 166, 241, 212, 44, 108, 208, 52, 39, 128, 198, 157, 93, 56, 154, 184, 136, 9, 48, 93, 239, 244, 140, 204, 139, 91, 181, 160, 117, 230, 142, 233, 205, 18, 178, 212, 103, 148, 188, 201, 106, 70, 172, 212, 215, 145, 62, 166, 139, 165, 241, 178, 100, 150, 119, 234, 44, 107, 123, 73, 105, 82, 222, 254, 40, 49, 198, 167, 88, 165, 176, 187, 124, 161, 97, 133, 188, 159, 234, 90, 110, 99, 121, 191, 123, 254, 86, 108, 164, 231, 225, 227, 209, 237, 155, 26, 148, 241, 91, 253, 18, 68, 137, 175, 184, 4, 160, 176, 109, 72, 177, 84, 229, 115, 95, 98, 155, 117, 96, 54, 226, 141, 163, 109, 58, 189, 67, 15, 246, 151, 136, 169, 88, 46, 160, 102, 113, 226, 92, 122, 209, 140, 52, 105, 235, 254, 127, 131, 235, 246, 146, 67, 24, 97, 196, 193, 248, 246, 214, 55, 52, 254, 214, 193, 77, 192, 91, 45, 17, 204, 77, 193, 211, 166, 152, 214, 79, 173, 167, 11, 49, 253, 9, 167, 249, 168, 228, 198, 164, 61, 209, 118, 5, 170, 128, 128, 217, 130, 90, 64, 13, 79, 191, 142, 29, 211, 101, 225, 173, 190, 124, 132, 149, 107, 178, 129, 102, 135, 23, 109, 5, 75, 207, 185, 21, 227, 184, 41, 92, 83, 180, 164, 77, 140, 184, 216, 66, 25, 104, 165, 158, 95, 234, 78, 153, 215, 26, 253, 100, 115, 101, 149, 58, 5, 49, 204, 213, 35, 188, 200, 201, 74, 248, 94, 143, 231, 215, 59, 145, 54, 28, 197, 156, 197, 131, 80, 114, 212, 236, 133, 25, 178, 57, 28, 241, 237, 56, 220, 195, 19, 234, 13, 122, 109, 81, 205, 163, 204, 122, 82, 10, 166, 44, 44, 74, 229, 251, 200, 42, 128, 223, 29, 182, 95, 180, 3, 100, 235, 56, 34, 157, 84, 23, 142, 6, 147, 187, 145, 97, 185, 6, 254, 48, 110, 125, 41, 239, 163, 169, 196, 145, 120, 115, 213, 57, 85, 118, 121, 211, 14, 56, 54, 34, 171, 101, 37, 190, 232, 55, 64, 238, 119, 150, 67, 136, 116, 193, 175, 100, 38, 2, 163, 28, 27, 250, 88, 46, 56, 18, 20, 68, 115, 111, 172, 112, 239, 55, 213, 5, 2, 91, 134, 98, 53, 99, 90, 6, 18, 199, 74, 241, 162, 85, 182, 134, 42, 233, 38, 192, 248, 200, 165, 194, 85, 232, 129, 170, 36, 155, 44, 14, 31, 234, 191, 172, 204, 146, 151, 24, 214, 14, 174, 163, 88, 15, 198, 119, 104, 198, 20, 139, 7, 199, 232, 144, 30, 129, 243, 234, 148, 231, 227, 87, 76, 81, 160, 149, 26, 233, 108, 133, 127, 193, 82, 233, 19, 179, 62, 210, 244, 118, 249, 202, 245, 5, 71, 37, 53, 249, 30, 0, 43, 190, 110, 96, 184, 239, 176, 52, 55, 109, 110, 111, 53, 193, 192, 200, 180, 5, 88, 32, 174, 106, 17, 23, 127, 190, 166, 34, 57, 161, 146, 255, 197, 222, 2, 107, 227, 61, 215, 36, 253, 1, 122, 234, 234, 156, 79, 48, 59, 48, 31, 48, 7, 6, 5, 43, 14, 3, 2, 26, 4, 20, 207, 75, 252, 75, 27, 80, 128, 157, 13, 40, 231, 80, 100, 232, 103, 176, 94, 95, 145, 147, 4, 20, 48, 158, 42, 31, 56, 126, 217, 230, 42, 16, 115, 84, 206, 98, 189, 26, 78, 38, 171, 12, 2, 2, 7, 208 }; + byte[] certificateRawBytes = new byte[] { 48, 130, 3, 47, 48, 130, 2, 27, 160, 3, 2, 1, 2, 2, 16, 137, 236, 21, 9, 59, 63, 234, 150, 65, 44, 54, 227, 174, 128, 125, 73, 48, 9, 6, 5, 43, 14, 3, 2, 29, 5, 0, 48, 29, 49, 27, 48, 25, 6, 3, 85, 4, 3, 19, 18, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 50, 48, 30, 23, 13, 49, 57, 48, 56, 50, 54, 50, 50, 52, 51, 48, 51, 90, 23, 13, 51, 57, 49, 50, 51, 49, 50, 51, 53, 57, 53, 57, 90, 48, 29, 49, 27, 48, 25, 6, 3, 85, 4, 3, 19, 18, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 50, 48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 168, 126, 35, 3, 254, 214, 118, 112, 89, 108, 47, 161, 99, 16, 109, 82, 58, 110, 202, 17, 23, 47, 225, 187, 54, 200, 104, 55, 135, 227, 105, 166, 93, 42, 224, 15, 117, 194, 113, 88, 150, 67, 136, 101, 135, 206, 238, 68, 202, 180, 116, 86, 46, 127, 204, 100, 60, 194, 23, 41, 115, 80, 218, 245, 129, 207, 211, 211, 226, 246, 231, 131, 112, 174, 22, 66, 26, 154, 233, 175, 238, 21, 206, 77, 225, 234, 250, 223, 183, 131, 139, 109, 177, 113, 153, 99, 89, 136, 105, 124, 185, 106, 37, 189, 175, 1, 95, 51, 151, 227, 49, 11, 42, 111, 7, 53, 95, 35, 17, 17, 89, 166, 98, 158, 235, 31, 207, 61, 79, 191, 249, 35, 27, 95, 148, 241, 104, 229, 254, 230, 6, 65, 151, 78, 0, 90, 196, 208, 123, 125, 161, 87, 39, 44, 96, 125, 146, 198, 248, 230, 233, 105, 212, 164, 7, 117, 118, 90, 80, 191, 251, 204, 20, 204, 137, 247, 45, 148, 235, 227, 205, 33, 157, 59, 75, 147, 84, 211, 97, 192, 174, 156, 85, 215, 101, 66, 212, 239, 210, 63, 249, 218, 225, 5, 15, 253, 202, 34, 152, 112, 36, 7, 8, 19, 189, 94, 230, 229, 68, 29, 92, 249, 116, 109, 115, 84, 56, 202, 113, 60, 101, 194, 163, 57, 126, 69, 56, 25, 95, 255, 115, 68, 247, 212, 140, 240, 39, 7, 110, 31, 12, 232, 42, 195, 202, 229, 2, 3, 1, 0, 1, 163, 115, 48, 113, 48, 31, 6, 3, 85, 29, 37, 4, 24, 48, 22, 6, 8, 43, 6, 1, 5, 5, 8, 2, 2, 6, 10, 43, 6, 1, 4, 1, 130, 55, 10, 3, 11, 48, 78, 6, 3, 85, 29, 1, 4, 71, 48, 69, 128, 16, 45, 160, 221, 99, 167, 248, 24, 224, 112, 188, 189, 109, 208, 234, 168, 124, 161, 31, 48, 29, 49, 27, 48, 25, 6, 3, 85, 4, 3, 19, 18, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 50, 130, 16, 137, 236, 21, 9, 59, 63, 234, 150, 65, 44, 54, 227, 174, 128, 125, 73, 48, 9, 6, 5, 43, 14, 3, 2, 29, 5, 0, 3, 130, 1, 1, 0, 140, 174, 149, 101, 176, 14, 63, 122, 20, 116, 15, 31, 194, 66, 233, 27, 84, 242, 107, 43, 109, 255, 226, 47, 246, 92, 18, 203, 211, 125, 104, 77, 69, 124, 77, 138, 82, 23, 216, 172, 81, 164, 213, 7, 113, 157, 175, 201, 180, 81, 6, 252, 88, 38, 148, 254, 231, 248, 42, 166, 184, 0, 172, 148, 25, 2, 143, 54, 96, 222, 204, 66, 101, 41, 246, 162, 76, 239, 9, 98, 20, 124, 197, 175, 202, 211, 10, 203, 103, 39, 31, 71, 37, 80, 55, 125, 15, 89, 147, 149, 102, 64, 85, 140, 121, 193, 61, 204, 188, 11, 210, 93, 18, 158, 106, 103, 96, 211, 42, 156, 204, 195, 214, 20, 48, 223, 32, 39, 94, 6, 28, 188, 162, 87, 140, 22, 168, 197, 36, 34, 65, 146, 219, 49, 245, 80, 12, 23, 134, 146, 9, 42, 208, 153, 146, 191, 240, 154, 103, 68, 34, 39, 228, 61, 21, 159, 24, 238, 193, 131, 160, 111, 15, 136, 66, 26, 230, 0, 118, 77, 118, 158, 160, 231, 36, 30, 192, 153, 53, 57, 72, 5, 66, 21, 241, 122, 9, 220, 34, 74, 168, 161, 144, 124, 234, 241, 98, 246, 201, 11, 62, 35, 70, 40, 124, 139, 139, 79, 254, 20, 169, 66, 245, 186, 49, 43, 46, 114, 132, 71, 248, 167, 246, 158, 33, 164, 91, 12, 237, 39, 59, 195, 227, 63, 23, 250, 92, 250, 17, 74, 240, 195, 6, 234, 238, 14 }; X509Certificate2 certificate = new X509Certificate2(certificateRawBytes, "", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet); X509Store certStore = null; try From 727b925e3427b73f769fc2e7ae9094c11073852f Mon Sep 17 00:00:00 2001 From: Erik Ejlskov Jensen Date: Tue, 10 Sep 2019 17:26:15 +0100 Subject: [PATCH 17/26] Enable build from source by adding missing feed in NuGet.config (#186) fixes #185 --- src/NuGet.config | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/NuGet.config diff --git a/src/NuGet.config b/src/NuGet.config new file mode 100644 index 0000000000..2ba88b8eb4 --- /dev/null +++ b/src/NuGet.config @@ -0,0 +1,8 @@ + + + + + + + + From 3733ee1554670151646b803875e54d163fdbe681 Mon Sep 17 00:00:00 2001 From: Gary Zhang Date: Tue, 10 Sep 2019 13:50:59 -0700 Subject: [PATCH 18/26] Fix format issues. --- .../TestFixtures/Setup/CertificateUtility.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs index 2377146caa..7d9c2163ba 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/CertificateUtility.cs @@ -17,9 +17,9 @@ private CertificateUtility() } /// - /// System.Data assembly. - /// - public static Assembly systemData = Assembly.GetAssembly(typeof(SqlConnection)); + /// System.Data assembly. + /// + public static Assembly systemData = Assembly.GetAssembly(typeof(SqlConnection)); public static Type sqlClientSymmetricKey = systemData.GetType("Microsoft.Data.SqlClient.SqlClientSymmetricKey"); public static ConstructorInfo sqlColumnEncryptionKeyConstructor = sqlClientSymmetricKey.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(byte[]) }, null); public static Type sqlAeadAes256CbcHmac256Factory = systemData.GetType("Microsoft.Data.SqlClient.SqlAeadAes256CbcHmac256Factory"); @@ -158,7 +158,6 @@ internal static bool VerifyRsaSignatureDirectly(byte[] hashedCek, byte[] signedC Object RsaVerifySignatureResult = SqlColumnEncryptionCertificateStoreProviderRSAVerifySignature.Invoke(rsaProvider, new object[] { hashedCek, signedCek, x509 }); return (bool)RsaVerifySignatureResult; - } /// From 0b91e952d840271d7cbf71b7e7219b810ef24e7a Mon Sep 17 00:00:00 2001 From: Gary Zhang Date: Tue, 10 Sep 2019 16:05:46 -0700 Subject: [PATCH 19/26] Regenerate certs with private keys. --- .../tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs index 9716bbaf9c..b8f966e239 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/AlwaysEncryptedTests/Utility.cs @@ -173,7 +173,7 @@ internal static byte[] GenerateInvalidEncryptedCek(byte[] encryptedCek, ECEKCorr internal static X509Certificate2 CreateCertificate() { - byte[] certificateRawBytes = new byte[] { 48, 130, 3, 52, 48, 130, 2, 28, 160, 3, 2, 1, 2, 2, 16, 55, 130, 235, 197, 31, 26, 120, 172, 77, 241, 92, 126, 16, 70, 52, 187, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48, 28, 49, 26, 48, 24, 6, 3, 85, 4, 3, 19, 17, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 48, 30, 23, 13, 49, 57, 48, 56, 50, 54, 50, 50, 52, 51, 48, 51, 90, 23, 13, 51, 57, 49, 50, 51, 49, 50, 51, 53, 57, 53, 57, 90, 48, 28, 49, 26, 48, 24, 6, 3, 85, 4, 3, 19, 17, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 155, 128, 78, 186, 240, 28, 129, 84, 13, 87, 243, 127, 162, 194, 20, 206, 218, 60, 189, 144, 81, 143, 208, 102, 174, 105, 218, 234, 76, 251, 160, 109, 113, 213, 219, 193, 7, 241, 63, 225, 10, 187, 252, 103, 51, 121, 1, 32, 235, 13, 54, 204, 252, 112, 142, 20, 146, 68, 176, 50, 242, 96, 22, 67, 85, 82, 247, 122, 184, 53, 233, 49, 223, 208, 239, 61, 95, 51, 241, 132, 197, 212, 130, 123, 117, 58, 97, 53, 141, 65, 32, 143, 148, 90, 116, 63, 236, 183, 99, 150, 48, 149, 62, 175, 253, 74, 116, 212, 27, 153, 92, 209, 64, 0, 82, 189, 223, 49, 216, 139, 7, 79, 86, 123, 147, 117, 131, 204, 195, 16, 221, 218, 30, 75, 17, 170, 209, 10, 193, 198, 146, 199, 196, 79, 2, 27, 63, 117, 218, 129, 45, 5, 35, 188, 36, 152, 248, 72, 250, 209, 255, 71, 43, 96, 253, 190, 90, 176, 236, 107, 248, 170, 120, 185, 83, 249, 241, 23, 205, 251, 101, 107, 140, 168, 23, 248, 238, 80, 23, 221, 224, 25, 71, 241, 16, 26, 189, 166, 49, 175, 127, 158, 123, 109, 131, 125, 241, 51, 55, 181, 183, 211, 88, 13, 211, 219, 68, 72, 237, 19, 170, 219, 248, 147, 168, 237, 73, 149, 62, 204, 152, 217, 48, 237, 15, 195, 7, 175, 34, 241, 175, 179, 19, 172, 147, 201, 105, 51, 218, 138, 235, 24, 41, 213, 84, 185, 2, 3, 1, 0, 1, 163, 114, 48, 112, 48, 31, 6, 3, 85, 29, 37, 4, 24, 48, 22, 6, 8, 43, 6, 1, 5, 5, 8, 2, 2, 6, 10, 43, 6, 1, 4, 1, 130, 55, 10, 3, 11, 48, 77, 6, 3, 85, 29, 1, 4, 70, 48, 68, 128, 16, 216, 253, 207, 70, 139, 39, 93, 135, 25, 98, 110, 197, 6, 196, 131, 50, 161, 30, 48, 28, 49, 26, 48, 24, 6, 3, 85, 4, 3, 19, 17, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 130, 16, 55, 130, 235, 197, 31, 26, 120, 172, 77, 241, 92, 126, 16, 70, 52, 187, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 130, 1, 1, 0, 150, 191, 139, 9, 124, 192, 185, 119, 117, 41, 35, 37, 117, 23, 143, 120, 206, 10, 116, 236, 243, 171, 49, 216, 42, 10, 172, 230, 187, 118, 201, 238, 9, 77, 49, 234, 169, 193, 163, 177, 120, 24, 148, 56, 47, 82, 197, 107, 72, 167, 220, 161, 84, 70, 242, 17, 54, 38, 235, 65, 217, 239, 22, 164, 82, 103, 167, 120, 252, 126, 158, 224, 68, 205, 210, 105, 239, 25, 170, 197, 113, 167, 152, 54, 8, 117, 224, 150, 205, 218, 42, 177, 191, 57, 52, 2, 25, 251, 246, 7, 202, 12, 112, 202, 161, 195, 218, 102, 54, 249, 156, 71, 11, 175, 132, 189, 54, 111, 226, 114, 15, 81, 205, 22, 71, 172, 44, 35, 48, 161, 54, 139, 155, 31, 205, 156, 134, 178, 61, 227, 205, 250, 134, 255, 113, 35, 96, 137, 200, 218, 50, 164, 148, 12, 68, 176, 227, 46, 219, 215, 108, 194, 62, 191, 191, 206, 181, 171, 224, 14, 11, 194, 122, 102, 183, 10, 79, 238, 48, 66, 134, 98, 21, 208, 30, 154, 187, 35, 116, 251, 20, 251, 175, 117, 93, 33, 202, 207, 104, 225, 41, 158, 255, 206, 45, 205, 66, 166, 5, 201, 225, 191, 19, 165, 131, 224, 7, 57, 113, 156, 37, 72, 149, 166, 180, 114, 250, 132, 218, 194, 53, 37, 21, 164, 163, 4, 74, 40, 165, 245, 211, 77, 185, 115, 203, 25, 136, 17, 110, 168, 65, 69, 193, 166, 252, 150 }; + byte[] certificateRawBytes = new byte[] { 48, 130, 10, 44, 2, 1, 3, 48, 130, 9, 232, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 9, 217, 4, 130, 9, 213, 48, 130, 9, 209, 48, 130, 5, 250, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 5, 235, 4, 130, 5, 231, 48, 130, 5, 227, 48, 130, 5, 223, 6, 11, 42, 134, 72, 134, 247, 13, 1, 12, 10, 1, 2, 160, 130, 4, 254, 48, 130, 4, 250, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 16, 138, 0, 169, 73, 31, 210, 173, 2, 2, 7, 208, 4, 130, 4, 216, 188, 205, 213, 250, 205, 254, 228, 160, 194, 177, 32, 195, 5, 154, 111, 7, 166, 229, 222, 46, 194, 101, 201, 219, 151, 206, 102, 223, 17, 34, 182, 108, 227, 197, 225, 244, 226, 110, 218, 105, 148, 127, 131, 47, 1, 248, 184, 57, 233, 144, 8, 209, 163, 228, 250, 131, 33, 99, 212, 251, 175, 116, 23, 185, 105, 134, 105, 133, 247, 194, 195, 32, 176, 171, 54, 9, 212, 143, 255, 82, 12, 134, 0, 193, 144, 160, 181, 185, 12, 153, 12, 240, 134, 1, 51, 64, 97, 16, 191, 173, 179, 231, 90, 199, 88, 228, 255, 244, 197, 84, 166, 146, 212, 230, 188, 167, 44, 165, 246, 112, 252, 1, 86, 204, 221, 151, 44, 128, 17, 243, 133, 75, 190, 254, 221, 85, 236, 174, 87, 250, 164, 4, 241, 198, 35, 120, 230, 127, 215, 93, 54, 40, 149, 88, 25, 64, 13, 34, 142, 193, 43, 76, 62, 73, 233, 216, 175, 253, 30, 179, 127, 164, 246, 30, 181, 10, 96, 95, 131, 170, 112, 111, 91, 61, 184, 1, 137, 249, 236, 41, 169, 120, 107, 172, 148, 122, 118, 15, 30, 198, 41, 130, 3, 175, 253, 197, 82, 218, 171, 26, 35, 129, 95, 202, 95, 144, 148, 40, 42, 120, 94, 111, 224, 51, 149, 95, 115, 29, 19, 223, 117, 123, 17, 66, 217, 112, 121, 167, 147, 250, 169, 25, 79, 145, 251, 187, 217, 38, 200, 86, 65, 181, 138, 22, 137, 42, 11, 141, 9, 169, 213, 177, 141, 86, 44, 193, 110, 143, 0, 46, 122, 198, 168, 75, 196, 85, 231, 95, 26, 242, 180, 162, 250, 69, 184, 95, 118, 210, 201, 31, 166, 166, 92, 106, 174, 246, 179, 180, 160, 251, 94, 101, 134, 18, 204, 120, 211, 38, 217, 44, 40, 176, 207, 229, 123, 68, 11, 159, 47, 129, 193, 37, 172, 107, 166, 27, 139, 49, 196, 89, 63, 210, 197, 186, 140, 94, 70, 180, 5, 174, 28, 51, 229, 10, 150, 161, 250, 137, 64, 205, 168, 1, 228, 198, 223, 200, 37, 169, 189, 189, 84, 187, 11, 103, 30, 245, 253, 101, 62, 98, 246, 127, 234, 24, 74, 217, 163, 88, 63, 165, 220, 208, 255, 127, 174, 173, 122, 202, 7, 50, 180, 120, 32, 112, 52, 165, 76, 142, 211, 248, 80, 91, 152, 92, 208, 100, 210, 156, 148, 150, 67, 203, 43, 136, 176, 89, 139, 143, 51, 30, 29, 57, 127, 242, 193, 187, 185, 80, 189, 228, 55, 144, 214, 194, 47, 49, 107, 222, 189, 242, 24, 125, 137, 159, 212, 127, 167, 104, 47, 141, 38, 196, 191, 190, 50, 65, 14, 140, 50, 254, 188, 33, 20, 202, 13, 0, 38, 130, 1, 80, 31, 48, 30, 190, 67, 84, 147, 133, 229, 137, 43, 147, 205, 254, 6, 187, 45, 11, 114, 77, 241, 108, 109, 112, 220, 200, 128, 76, 101, 201, 238, 19, 32, 210, 196, 61, 89, 133, 236, 175, 118, 214, 171, 240, 197, 92, 29, 81, 106, 36, 200, 131, 120, 114, 103, 24, 168, 206, 70, 165, 226, 237, 115, 27, 156, 94, 95, 74, 42, 43, 61, 139, 156, 165, 30, 197, 212, 187, 122, 60, 201, 221, 201, 32, 80, 64, 105, 29, 225, 126, 218, 179, 168, 82, 177, 226, 63, 244, 130, 106, 128, 50, 229, 187, 117, 83, 90, 157, 193, 163, 13, 230, 107, 142, 243, 33, 153, 142, 161, 81, 83, 137, 220, 191, 121, 222, 85, 254, 85, 247, 212, 98, 181, 255, 175, 228, 162, 235, 92, 70, 7, 253, 210, 84, 125, 229, 220, 19, 33, 120, 156, 160, 55, 144, 196, 109, 235, 166, 206, 99, 238, 97, 251, 163, 207, 81, 125, 161, 201, 150, 91, 227, 171, 247, 225, 93, 166, 105, 157, 145, 13, 244, 8, 214, 233, 193, 27, 108, 156, 206, 211, 28, 216, 13, 28, 42, 185, 251, 55, 156, 12, 67, 172, 195, 174, 96, 70, 127, 74, 236, 170, 146, 65, 44, 79, 219, 197, 166, 227, 101, 16, 160, 72, 43, 127, 106, 108, 13, 174, 138, 111, 67, 192, 185, 36, 82, 25, 253, 40, 211, 171, 246, 219, 14, 64, 125, 91, 150, 173, 114, 100, 210, 29, 202, 39, 102, 81, 0, 90, 176, 122, 149, 121, 254, 53, 130, 202, 107, 233, 131, 47, 216, 31, 66, 96, 55, 37, 164, 195, 217, 205, 153, 74, 83, 169, 167, 241, 51, 102, 140, 102, 202, 15, 57, 193, 172, 140, 114, 115, 218, 156, 111, 238, 162, 48, 44, 141, 156, 15, 65, 29, 242, 187, 73, 19, 192, 102, 69, 192, 172, 16, 197, 17, 104, 68, 69, 224, 180, 252, 227, 80, 43, 148, 126, 85, 12, 168, 85, 18, 146, 90, 37, 215, 123, 169, 117, 87, 125, 228, 235, 11, 163, 132, 239, 31, 163, 196, 121, 19, 217, 59, 35, 52, 125, 204, 246, 142, 176, 137, 170, 76, 50, 37, 29, 250, 82, 145, 113, 138, 161, 9, 186, 227, 151, 40, 57, 217, 78, 39, 154, 237, 20, 102, 184, 78, 141, 194, 196, 22, 171, 135, 7, 62, 236, 163, 34, 222, 172, 186, 230, 175, 36, 243, 249, 13, 95, 15, 77, 227, 222, 208, 12, 140, 103, 111, 26, 160, 237, 27, 158, 162, 189, 226, 155, 76, 135, 220, 56, 152, 230, 151, 73, 120, 68, 83, 140, 238, 6, 63, 130, 182, 12, 33, 181, 201, 242, 36, 236, 9, 160, 237, 144, 22, 228, 17, 201, 45, 25, 84, 96, 127, 51, 178, 181, 173, 59, 2, 219, 37, 244, 75, 16, 135, 51, 67, 69, 240, 191, 232, 122, 200, 191, 220, 111, 18, 163, 179, 201, 101, 246, 105, 175, 241, 47, 187, 156, 251, 173, 122, 116, 51, 100, 93, 219, 166, 160, 240, 181, 161, 220, 15, 218, 215, 46, 62, 81, 79, 238, 38, 51, 115, 69, 169, 32, 252, 118, 89, 25, 208, 126, 143, 6, 135, 122, 179, 25, 4, 183, 177, 61, 62, 160, 115, 38, 184, 109, 213, 185, 14, 177, 242, 23, 228, 4, 204, 7, 199, 62, 50, 18, 5, 124, 140, 105, 149, 63, 89, 37, 117, 145, 26, 105, 83, 13, 2, 113, 211, 171, 208, 10, 25, 177, 42, 220, 4, 153, 109, 106, 99, 75, 97, 14, 42, 168, 164, 130, 88, 228, 167, 129, 198, 121, 135, 103, 231, 101, 208, 35, 108, 249, 151, 187, 74, 31, 59, 68, 127, 34, 117, 150, 179, 229, 65, 236, 169, 16, 12, 170, 67, 61, 210, 228, 72, 121, 169, 206, 63, 71, 142, 47, 16, 117, 59, 205, 159, 50, 14, 19, 111, 171, 196, 117, 113, 200, 239, 112, 175, 147, 115, 203, 37, 241, 12, 145, 111, 160, 168, 234, 240, 108, 235, 136, 143, 179, 240, 57, 74, 49, 82, 171, 35, 157, 240, 125, 116, 238, 36, 65, 225, 197, 138, 53, 32, 85, 247, 115, 154, 193, 145, 153, 176, 232, 43, 89, 96, 221, 238, 105, 42, 205, 59, 52, 97, 199, 228, 207, 23, 55, 22, 44, 27, 112, 74, 230, 228, 228, 214, 106, 91, 42, 34, 239, 156, 103, 151, 106, 30, 2, 0, 103, 16, 130, 106, 128, 117, 120, 101, 107, 206, 52, 201, 116, 168, 27, 185, 6, 181, 161, 116, 108, 49, 129, 205, 48, 19, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 21, 49, 6, 4, 4, 1, 0, 0, 0, 48, 87, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 20, 49, 74, 30, 72, 0, 53, 0, 54, 0, 102, 0, 54, 0, 54, 0, 53, 0, 97, 0, 50, 0, 45, 0, 50, 0, 54, 0, 50, 0, 98, 0, 45, 0, 52, 0, 50, 0, 52, 0, 50, 0, 45, 0, 57, 0, 57, 0, 97, 0, 56, 0, 45, 0, 57, 0, 55, 0, 55, 0, 97, 0, 97, 0, 57, 0, 56, 0, 99, 0, 101, 0, 97, 0, 97, 0, 100, 48, 93, 6, 9, 43, 6, 1, 4, 1, 130, 55, 17, 1, 49, 80, 30, 78, 0, 77, 0, 105, 0, 99, 0, 114, 0, 111, 0, 115, 0, 111, 0, 102, 0, 116, 0, 32, 0, 83, 0, 116, 0, 114, 0, 111, 0, 110, 0, 103, 0, 32, 0, 67, 0, 114, 0, 121, 0, 112, 0, 116, 0, 111, 0, 103, 0, 114, 0, 97, 0, 112, 0, 104, 0, 105, 0, 99, 0, 32, 0, 80, 0, 114, 0, 111, 0, 118, 0, 105, 0, 100, 0, 101, 0, 114, 48, 130, 3, 207, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 6, 160, 130, 3, 192, 48, 130, 3, 188, 2, 1, 0, 48, 130, 3, 181, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 249, 68, 23, 15, 90, 178, 55, 11, 2, 2, 7, 208, 128, 130, 3, 136, 189, 232, 130, 97, 198, 137, 5, 230, 136, 106, 215, 76, 90, 0, 66, 64, 19, 132, 179, 239, 204, 147, 171, 145, 124, 195, 15, 246, 30, 203, 38, 201, 2, 161, 7, 62, 68, 229, 251, 178, 182, 14, 196, 8, 147, 127, 74, 211, 9, 178, 219, 14, 204, 237, 59, 181, 16, 54, 199, 106, 231, 162, 42, 124, 144, 191, 249, 104, 251, 199, 30, 96, 66, 145, 83, 140, 195, 197, 220, 166, 143, 255, 193, 218, 88, 87, 135, 11, 52, 156, 122, 252, 178, 19, 207, 151, 228, 191, 226, 81, 208, 208, 101, 148, 249, 166, 242, 70, 140, 39, 180, 152, 3, 29, 150, 23, 212, 89, 209, 32, 134, 105, 128, 10, 211, 220, 4, 161, 38, 185, 202, 109, 119, 177, 29, 133, 55, 7, 126, 40, 120, 195, 36, 134, 119, 242, 130, 142, 142, 112, 212, 116, 6, 91, 150, 197, 164, 1, 53, 172, 139, 47, 230, 29, 254, 53, 106, 18, 184, 87, 117, 249, 108, 226, 61, 27, 133, 37, 250, 48, 235, 194, 115, 71, 244, 92, 165, 61, 6, 101, 153, 239, 167, 74, 230, 159, 26, 66, 132, 89, 191, 44, 73, 144, 174, 48, 219, 61, 205, 131, 107, 90, 66, 157, 148, 22, 19, 47, 182, 10, 141, 113, 225, 201, 47, 31, 244, 253, 125, 128, 244, 70, 200, 38, 123, 146, 102, 94, 247, 15, 45, 62, 176, 2, 225, 70, 17, 193, 129, 133, 121, 6, 96, 135, 138, 68, 105, 108, 186, 126, 253, 210, 80, 228, 168, 234, 202, 40, 160, 246, 117, 60, 119, 54, 126, 166, 137, 237, 94, 228, 241, 167, 170, 19, 215, 36, 154, 215, 179, 44, 35, 223, 181, 13, 55, 251, 122, 176, 132, 72, 213, 253, 103, 16, 174, 213, 35, 217, 188, 214, 113, 114, 212, 70, 106, 124, 54, 233, 93, 156, 7, 135, 253, 183, 174, 165, 29, 170, 23, 186, 148, 232, 114, 226, 82, 139, 224, 78, 239, 179, 155, 70, 117, 39, 188, 242, 198, 93, 230, 209, 169, 8, 179, 100, 136, 100, 181, 217, 240, 173, 97, 92, 176, 135, 193, 149, 89, 85, 201, 206, 191, 173, 168, 48, 47, 224, 233, 145, 47, 213, 32, 76, 94, 230, 86, 63, 85, 170, 211, 107, 94, 133, 144, 35, 102, 49, 253, 150, 120, 163, 246, 13, 105, 76, 211, 215, 244, 8, 121, 108, 225, 54, 95, 229, 239, 32, 203, 145, 0, 242, 84, 176, 22, 61, 79, 71, 84, 46, 31, 135, 71, 15, 192, 52, 250, 54, 78, 98, 45, 173, 191, 101, 161, 49, 178, 136, 67, 40, 70, 24, 148, 96, 253, 160, 1, 185, 209, 37, 159, 102, 116, 11, 252, 74, 28, 173, 218, 80, 149, 33, 189, 214, 186, 251, 97, 179, 199, 151, 48, 78, 211, 58, 241, 1, 223, 118, 99, 57, 91, 15, 142, 0, 227, 16, 18, 170, 22, 45, 230, 13, 199, 39, 143, 231, 134, 33, 117, 229, 224, 133, 130, 135, 8, 48, 170, 137, 72, 216, 34, 249, 110, 33, 25, 12, 244, 204, 66, 218, 68, 92, 144, 149, 247, 186, 92, 131, 158, 42, 9, 253, 9, 198, 27, 158, 83, 18, 151, 107, 37, 77, 251, 61, 93, 101, 60, 76, 110, 84, 167, 16, 88, 26, 119, 196, 177, 185, 172, 87, 70, 207, 167, 32, 80, 80, 9, 3, 201, 195, 48, 39, 56, 240, 184, 229, 83, 12, 80, 145, 25, 205, 226, 173, 207, 198, 206, 40, 23, 224, 74, 139, 112, 90, 17, 247, 83, 11, 18, 145, 111, 115, 250, 168, 219, 194, 96, 145, 184, 8, 22, 169, 242, 64, 166, 25, 103, 197, 186, 28, 49, 170, 10, 113, 135, 21, 220, 172, 234, 126, 39, 233, 11, 119, 235, 184, 38, 47, 44, 101, 99, 86, 210, 205, 205, 104, 98, 165, 182, 126, 124, 109, 150, 211, 79, 242, 110, 96, 74, 96, 173, 249, 63, 245, 52, 180, 148, 152, 117, 241, 218, 220, 75, 43, 96, 218, 132, 199, 248, 60, 62, 15, 49, 75, 62, 128, 31, 69, 2, 124, 250, 164, 60, 65, 127, 112, 197, 53, 157, 120, 148, 100, 146, 245, 132, 192, 192, 188, 64, 1, 142, 206, 132, 241, 210, 161, 126, 56, 5, 95, 204, 89, 53, 143, 224, 137, 126, 182, 71, 12, 49, 39, 211, 33, 48, 177, 234, 136, 205, 169, 53, 209, 141, 89, 219, 83, 102, 12, 43, 94, 96, 66, 2, 232, 131, 85, 182, 130, 222, 71, 121, 228, 246, 9, 41, 141, 95, 73, 70, 51, 58, 86, 168, 193, 76, 25, 196, 40, 203, 62, 139, 217, 178, 187, 87, 171, 212, 85, 42, 136, 145, 174, 134, 171, 113, 188, 28, 31, 4, 77, 87, 237, 194, 98, 20, 111, 165, 95, 45, 204, 150, 176, 85, 128, 75, 131, 175, 45, 197, 209, 224, 176, 179, 39, 216, 114, 150, 202, 79, 153, 178, 197, 176, 237, 84, 123, 207, 52, 250, 56, 55, 191, 20, 249, 173, 204, 8, 59, 199, 237, 23, 234, 158, 246, 203, 222, 105, 163, 152, 99, 137, 47, 112, 98, 79, 161, 88, 198, 125, 106, 174, 85, 134, 216, 35, 80, 161, 140, 177, 161, 154, 169, 80, 193, 224, 238, 238, 31, 92, 124, 238, 147, 162, 209, 186, 50, 48, 59, 48, 31, 48, 7, 6, 5, 43, 14, 3, 2, 26, 4, 20, 249, 117, 64, 150, 197, 135, 218, 207, 32, 100, 203, 75, 240, 98, 164, 185, 50, 202, 93, 125, 4, 20, 180, 36, 134, 220, 75, 81, 26, 153, 143, 72, 201, 209, 29, 87, 166, 59, 206, 207, 221, 99, 2, 2, 7, 208 }; X509Certificate2 certificate = new X509Certificate2(certificateRawBytes, "", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet); X509Store certStore = null; try @@ -321,7 +321,7 @@ internal static byte[] DecryptDataUsingAED(byte[] encryptedCellBlob, byte[] key, /// internal static X509Certificate2 CreateCertificateWithNoPrivateKey() { - byte[] certificateRawBytes = new byte[] { 48, 130, 3, 47, 48, 130, 2, 27, 160, 3, 2, 1, 2, 2, 16, 137, 236, 21, 9, 59, 63, 234, 150, 65, 44, 54, 227, 174, 128, 125, 73, 48, 9, 6, 5, 43, 14, 3, 2, 29, 5, 0, 48, 29, 49, 27, 48, 25, 6, 3, 85, 4, 3, 19, 18, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 50, 48, 30, 23, 13, 49, 57, 48, 56, 50, 54, 50, 50, 52, 51, 48, 51, 90, 23, 13, 51, 57, 49, 50, 51, 49, 50, 51, 53, 57, 53, 57, 90, 48, 29, 49, 27, 48, 25, 6, 3, 85, 4, 3, 19, 18, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 50, 48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 168, 126, 35, 3, 254, 214, 118, 112, 89, 108, 47, 161, 99, 16, 109, 82, 58, 110, 202, 17, 23, 47, 225, 187, 54, 200, 104, 55, 135, 227, 105, 166, 93, 42, 224, 15, 117, 194, 113, 88, 150, 67, 136, 101, 135, 206, 238, 68, 202, 180, 116, 86, 46, 127, 204, 100, 60, 194, 23, 41, 115, 80, 218, 245, 129, 207, 211, 211, 226, 246, 231, 131, 112, 174, 22, 66, 26, 154, 233, 175, 238, 21, 206, 77, 225, 234, 250, 223, 183, 131, 139, 109, 177, 113, 153, 99, 89, 136, 105, 124, 185, 106, 37, 189, 175, 1, 95, 51, 151, 227, 49, 11, 42, 111, 7, 53, 95, 35, 17, 17, 89, 166, 98, 158, 235, 31, 207, 61, 79, 191, 249, 35, 27, 95, 148, 241, 104, 229, 254, 230, 6, 65, 151, 78, 0, 90, 196, 208, 123, 125, 161, 87, 39, 44, 96, 125, 146, 198, 248, 230, 233, 105, 212, 164, 7, 117, 118, 90, 80, 191, 251, 204, 20, 204, 137, 247, 45, 148, 235, 227, 205, 33, 157, 59, 75, 147, 84, 211, 97, 192, 174, 156, 85, 215, 101, 66, 212, 239, 210, 63, 249, 218, 225, 5, 15, 253, 202, 34, 152, 112, 36, 7, 8, 19, 189, 94, 230, 229, 68, 29, 92, 249, 116, 109, 115, 84, 56, 202, 113, 60, 101, 194, 163, 57, 126, 69, 56, 25, 95, 255, 115, 68, 247, 212, 140, 240, 39, 7, 110, 31, 12, 232, 42, 195, 202, 229, 2, 3, 1, 0, 1, 163, 115, 48, 113, 48, 31, 6, 3, 85, 29, 37, 4, 24, 48, 22, 6, 8, 43, 6, 1, 5, 5, 8, 2, 2, 6, 10, 43, 6, 1, 4, 1, 130, 55, 10, 3, 11, 48, 78, 6, 3, 85, 29, 1, 4, 71, 48, 69, 128, 16, 45, 160, 221, 99, 167, 248, 24, 224, 112, 188, 189, 109, 208, 234, 168, 124, 161, 31, 48, 29, 49, 27, 48, 25, 6, 3, 85, 4, 3, 19, 18, 77, 121, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 78, 97, 109, 101, 50, 130, 16, 137, 236, 21, 9, 59, 63, 234, 150, 65, 44, 54, 227, 174, 128, 125, 73, 48, 9, 6, 5, 43, 14, 3, 2, 29, 5, 0, 3, 130, 1, 1, 0, 140, 174, 149, 101, 176, 14, 63, 122, 20, 116, 15, 31, 194, 66, 233, 27, 84, 242, 107, 43, 109, 255, 226, 47, 246, 92, 18, 203, 211, 125, 104, 77, 69, 124, 77, 138, 82, 23, 216, 172, 81, 164, 213, 7, 113, 157, 175, 201, 180, 81, 6, 252, 88, 38, 148, 254, 231, 248, 42, 166, 184, 0, 172, 148, 25, 2, 143, 54, 96, 222, 204, 66, 101, 41, 246, 162, 76, 239, 9, 98, 20, 124, 197, 175, 202, 211, 10, 203, 103, 39, 31, 71, 37, 80, 55, 125, 15, 89, 147, 149, 102, 64, 85, 140, 121, 193, 61, 204, 188, 11, 210, 93, 18, 158, 106, 103, 96, 211, 42, 156, 204, 195, 214, 20, 48, 223, 32, 39, 94, 6, 28, 188, 162, 87, 140, 22, 168, 197, 36, 34, 65, 146, 219, 49, 245, 80, 12, 23, 134, 146, 9, 42, 208, 153, 146, 191, 240, 154, 103, 68, 34, 39, 228, 61, 21, 159, 24, 238, 193, 131, 160, 111, 15, 136, 66, 26, 230, 0, 118, 77, 118, 158, 160, 231, 36, 30, 192, 153, 53, 57, 72, 5, 66, 21, 241, 122, 9, 220, 34, 74, 168, 161, 144, 124, 234, 241, 98, 246, 201, 11, 62, 35, 70, 40, 124, 139, 139, 79, 254, 20, 169, 66, 245, 186, 49, 43, 46, 114, 132, 71, 248, 167, 246, 158, 33, 164, 91, 12, 237, 39, 59, 195, 227, 63, 23, 250, 92, 250, 17, 74, 240, 195, 6, 234, 238, 14 }; + byte[] certificateRawBytes = new byte[] { 48, 130, 10, 44, 2, 1, 3, 48, 130, 9, 232, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 9, 217, 4, 130, 9, 213, 48, 130, 9, 209, 48, 130, 5, 250, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 5, 235, 4, 130, 5, 231, 48, 130, 5, 227, 48, 130, 5, 223, 6, 11, 42, 134, 72, 134, 247, 13, 1, 12, 10, 1, 2, 160, 130, 4, 254, 48, 130, 4, 250, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 235, 104, 8, 192, 48, 172, 84, 29, 2, 2, 7, 208, 4, 130, 4, 216, 223, 187, 54, 199, 219, 97, 167, 152, 236, 137, 175, 54, 77, 8, 247, 205, 172, 76, 84, 103, 8, 28, 176, 175, 188, 108, 135, 239, 218, 134, 129, 181, 251, 107, 39, 184, 253, 101, 94, 26, 232, 8, 233, 161, 112, 129, 228, 7, 130, 121, 197, 85, 170, 39, 8, 195, 112, 127, 125, 148, 97, 162, 52, 74, 56, 187, 228, 232, 17, 145, 186, 138, 140, 245, 76, 203, 154, 41, 148, 15, 86, 152, 239, 221, 3, 64, 158, 137, 250, 33, 11, 23, 49, 250, 50, 116, 183, 138, 223, 230, 8, 210, 52, 95, 6, 238, 167, 153, 107, 99, 214, 58, 56, 70, 135, 6, 173, 190, 175, 116, 23, 53, 250, 166, 192, 128, 93, 243, 109, 60, 55, 10, 246, 188, 43, 56, 157, 116, 22, 105, 215, 194, 58, 229, 28, 93, 175, 65, 64, 162, 237, 182, 40, 159, 140, 24, 3, 226, 63, 246, 201, 144, 40, 128, 122, 15, 188, 130, 195, 120, 65, 191, 10, 164, 29, 119, 17, 60, 231, 63, 26, 172, 87, 191, 110, 233, 107, 44, 206, 197, 170, 176, 12, 6, 44, 181, 219, 56, 45, 10, 75, 145, 154, 148, 162, 169, 240, 109, 254, 115, 33, 81, 206, 88, 33, 91, 251, 235, 56, 56, 41, 75, 145, 36, 177, 104, 68, 7, 76, 150, 230, 182, 136, 239, 10, 21, 3, 10, 23, 217, 103, 148, 160, 114, 55, 122, 22, 165, 91, 37, 230, 23, 28, 182, 107, 31, 53, 78, 226, 125, 17, 81, 223, 48, 36, 51, 101, 19, 79, 202, 221, 197, 11, 152, 253, 155, 142, 63, 107, 51, 11, 197, 55, 18, 8, 109, 173, 83, 125, 201, 167, 170, 152, 152, 26, 142, 29, 77, 174, 189, 241, 185, 239, 56, 207, 128, 203, 136, 203, 226, 29, 88, 97, 230, 119, 161, 6, 15, 231, 9, 250, 96, 129, 40, 35, 201, 28, 220, 237, 24, 88, 88, 222, 239, 108, 39, 35, 147, 76, 242, 209, 122, 4, 165, 91, 18, 78, 74, 40, 131, 194, 1, 105, 104, 103, 207, 198, 222, 100, 2, 188, 130, 224, 187, 243, 170, 192, 0, 169, 69, 155, 32, 48, 159, 164, 254, 29, 255, 197, 250, 118, 69, 2, 11, 47, 232, 157, 151, 17, 106, 211, 82, 15, 246, 22, 117, 90, 220, 129, 228, 91, 249, 18, 147, 125, 13, 51, 98, 235, 213, 145, 81, 77, 139, 23, 50, 35, 165, 13, 117, 71, 82, 166, 120, 103, 121, 72, 229, 3, 116, 65, 90, 125, 224, 121, 19, 136, 215, 57, 73, 247, 249, 174, 197, 234, 13, 58, 182, 24, 46, 21, 122, 193, 111, 47, 40, 207, 75, 224, 155, 163, 138, 130, 38, 204, 211, 149, 132, 249, 37, 66, 194, 83, 147, 6, 187, 113, 60, 129, 139, 197, 84, 60, 179, 253, 192, 124, 67, 60, 29, 149, 244, 114, 238, 71, 144, 139, 0, 104, 29, 100, 90, 137, 151, 31, 138, 3, 35, 96, 243, 130, 203, 200, 191, 212, 247, 137, 194, 183, 150, 53, 213, 108, 9, 30, 18, 204, 248, 30, 60, 132, 25, 12, 186, 64, 179, 130, 165, 141, 77, 4, 244, 166, 0, 197, 145, 66, 51, 17, 198, 181, 54, 63, 112, 195, 70, 11, 93, 122, 175, 136, 8, 156, 136, 165, 228, 22, 105, 107, 87, 160, 1, 140, 134, 166, 151, 91, 76, 15, 187, 197, 131, 67, 5, 51, 191, 23, 4, 105, 219, 167, 45, 167, 3, 118, 161, 54, 187, 250, 136, 201, 233, 148, 234, 228, 65, 18, 105, 92, 201, 5, 100, 213, 59, 97, 29, 163, 42, 50, 5, 59, 178, 122, 190, 159, 218, 10, 239, 183, 20, 226, 197, 187, 190, 160, 5, 122, 45, 70, 111, 205, 232, 160, 115, 145, 173, 255, 60, 105, 204, 253, 18, 212, 167, 23, 95, 10, 146, 175, 0, 137, 166, 220, 51, 203, 244, 13, 27, 51, 121, 159, 178, 20, 178, 43, 133, 182, 169, 234, 56, 205, 153, 170, 26, 138, 48, 84, 2, 20, 11, 141, 41, 76, 178, 76, 10, 30, 9, 242, 158, 59, 9, 109, 240, 185, 30, 199, 136, 167, 146, 202, 239, 253, 95, 61, 56, 16, 166, 163, 78, 75, 241, 228, 98, 198, 59, 113, 214, 77, 58, 177, 251, 132, 167, 137, 82, 119, 216, 157, 8, 37, 95, 43, 106, 140, 117, 166, 0, 111, 84, 45, 43, 22, 220, 109, 219, 30, 165, 252, 91, 3, 203, 165, 91, 22, 202, 91, 223, 194, 122, 238, 159, 25, 1, 254, 183, 4, 7, 96, 150, 253, 199, 92, 250, 143, 107, 77, 112, 133, 202, 126, 117, 128, 59, 124, 111, 174, 41, 92, 184, 247, 248, 44, 43, 148, 37, 193, 30, 110, 34, 190, 210, 37, 230, 182, 113, 130, 3, 65, 85, 90, 60, 0, 177, 78, 95, 251, 111, 91, 12, 27, 111, 119, 74, 117, 81, 162, 174, 33, 110, 63, 242, 31, 24, 11, 186, 174, 80, 52, 76, 184, 42, 199, 203, 245, 75, 97, 104, 12, 206, 133, 206, 36, 30, 105, 254, 233, 145, 29, 224, 62, 139, 143, 168, 181, 142, 247, 139, 240, 2, 220, 57, 221, 62, 133, 90, 209, 106, 69, 82, 89, 172, 134, 230, 129, 154, 88, 35, 126, 16, 43, 107, 12, 76, 67, 116, 66, 181, 251, 73, 157, 31, 196, 240, 237, 184, 92, 126, 182, 46, 66, 91, 56, 37, 75, 235, 200, 90, 129, 103, 80, 73, 246, 156, 160, 169, 212, 3, 57, 238, 17, 6, 244, 219, 106, 112, 96, 80, 204, 181, 173, 82, 238, 24, 36, 232, 84, 158, 135, 211, 35, 133, 141, 46, 48, 179, 174, 127, 34, 44, 45, 193, 241, 222, 10, 175, 76, 64, 39, 191, 63, 182, 25, 39, 105, 61, 35, 162, 89, 253, 189, 59, 159, 225, 142, 174, 166, 5, 56, 253, 106, 170, 190, 136, 207, 37, 233, 54, 131, 111, 118, 198, 83, 52, 86, 102, 14, 38, 26, 181, 42, 175, 131, 116, 0, 82, 25, 96, 191, 188, 196, 158, 132, 25, 0, 160, 125, 188, 236, 71, 221, 58, 71, 247, 35, 85, 68, 183, 64, 119, 247, 159, 185, 240, 9, 230, 184, 43, 116, 163, 91, 67, 244, 33, 243, 210, 190, 86, 127, 14, 38, 60, 19, 211, 182, 96, 77, 86, 116, 159, 173, 134, 39, 217, 77, 131, 85, 126, 145, 224, 120, 94, 233, 103, 254, 14, 92, 242, 69, 17, 17, 63, 94, 251, 195, 199, 194, 175, 94, 137, 82, 25, 234, 253, 89, 225, 46, 103, 131, 109, 12, 204, 188, 141, 173, 146, 124, 221, 144, 235, 188, 165, 141, 95, 224, 56, 58, 53, 149, 94, 77, 204, 101, 195, 127, 8, 86, 122, 190, 7, 214, 60, 154, 222, 229, 101, 12, 73, 149, 216, 6, 124, 223, 165, 65, 197, 217, 61, 174, 172, 84, 179, 169, 153, 116, 47, 176, 76, 119, 232, 236, 44, 82, 146, 241, 136, 223, 251, 249, 12, 40, 216, 133, 54, 145, 43, 43, 135, 238, 2, 212, 216, 242, 118, 199, 195, 221, 16, 46, 29, 4, 95, 66, 58, 168, 47, 0, 11, 161, 15, 104, 189, 76, 245, 195, 254, 129, 123, 98, 1, 127, 230, 47, 171, 184, 87, 192, 241, 169, 219, 49, 129, 205, 48, 19, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 21, 49, 6, 4, 4, 1, 0, 0, 0, 48, 87, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 20, 49, 74, 30, 72, 0, 48, 0, 55, 0, 101, 0, 97, 0, 50, 0, 102, 0, 48, 0, 54, 0, 45, 0, 53, 0, 48, 0, 99, 0, 55, 0, 45, 0, 52, 0, 55, 0, 50, 0, 57, 0, 45, 0, 98, 0, 48, 0, 53, 0, 100, 0, 45, 0, 101, 0, 54, 0, 49, 0, 52, 0, 50, 0, 54, 0, 56, 0, 97, 0, 57, 0, 51, 0, 54, 0, 49, 48, 93, 6, 9, 43, 6, 1, 4, 1, 130, 55, 17, 1, 49, 80, 30, 78, 0, 77, 0, 105, 0, 99, 0, 114, 0, 111, 0, 115, 0, 111, 0, 102, 0, 116, 0, 32, 0, 83, 0, 116, 0, 114, 0, 111, 0, 110, 0, 103, 0, 32, 0, 67, 0, 114, 0, 121, 0, 112, 0, 116, 0, 111, 0, 103, 0, 114, 0, 97, 0, 112, 0, 104, 0, 105, 0, 99, 0, 32, 0, 80, 0, 114, 0, 111, 0, 118, 0, 105, 0, 100, 0, 101, 0, 114, 48, 130, 3, 207, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 6, 160, 130, 3, 192, 48, 130, 3, 188, 2, 1, 0, 48, 130, 3, 181, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 37, 194, 101, 21, 13, 36, 244, 253, 2, 2, 7, 208, 128, 130, 3, 136, 10, 38, 67, 113, 151, 160, 181, 156, 252, 50, 128, 39, 35, 98, 152, 133, 235, 238, 94, 73, 70, 252, 148, 94, 227, 150, 143, 176, 164, 232, 41, 137, 239, 196, 102, 6, 78, 134, 9, 254, 13, 200, 191, 171, 47, 166, 148, 30, 196, 230, 95, 126, 29, 42, 214, 201, 165, 49, 93, 149, 12, 7, 79, 167, 112, 237, 36, 142, 123, 246, 14, 212, 16, 78, 179, 106, 60, 251, 106, 13, 232, 222, 214, 255, 212, 48, 140, 91, 26, 201, 136, 119, 148, 0, 246, 63, 252, 9, 41, 63, 147, 198, 201, 26, 134, 126, 59, 103, 212, 103, 101, 47, 138, 137, 237, 190, 83, 123, 231, 194, 213, 147, 117, 116, 148, 170, 194, 12, 62, 100, 16, 254, 76, 65, 96, 126, 45, 221, 126, 161, 233, 194, 187, 117, 13, 201, 85, 26, 223, 13, 143, 147, 250, 64, 5, 85, 232, 165, 154, 77, 255, 192, 31, 166, 154, 251, 192, 199, 100, 220, 4, 79, 242, 191, 66, 134, 203, 50, 2, 105, 98, 247, 73, 66, 41, 179, 173, 177, 217, 196, 180, 48, 219, 79, 88, 154, 40, 249, 150, 169, 231, 215, 186, 61, 129, 223, 57, 84, 48, 245, 158, 161, 89, 204, 127, 155, 134, 155, 158, 208, 159, 245, 83, 5, 63, 188, 233, 164, 60, 38, 91, 255, 221, 6, 28, 107, 85, 188, 81, 114, 23, 143, 4, 78, 17, 178, 36, 44, 209, 7, 251, 78, 13, 35, 73, 243, 151, 150, 122, 161, 86, 52, 233, 148, 241, 144, 175, 230, 22, 97, 21, 229, 143, 172, 67, 12, 130, 254, 4, 144, 136, 20, 93, 161, 177, 249, 160, 58, 18, 135, 249, 107, 142, 116, 63, 228, 37, 105, 81, 121, 43, 107, 88, 166, 7, 59, 42, 139, 76, 71, 191, 137, 102, 185, 95, 166, 229, 23, 110, 123, 49, 239, 48, 183, 246, 102, 120, 28, 25, 39, 211, 183, 1, 201, 199, 158, 143, 25, 1, 165, 163, 99, 161, 237, 235, 148, 209, 180, 152, 111, 128, 40, 102, 90, 5, 228, 15, 244, 148, 33, 110, 153, 4, 159, 28, 241, 252, 117, 69, 165, 37, 129, 227, 151, 31, 191, 105, 106, 179, 87, 41, 37, 63, 18, 59, 198, 182, 91, 21, 41, 242, 237, 63, 240, 163, 110, 219, 94, 119, 28, 234, 70, 208, 56, 141, 163, 80, 4, 223, 110, 64, 161, 81, 82, 191, 67, 13, 95, 208, 122, 152, 8, 87, 197, 31, 141, 22, 161, 23, 211, 83, 222, 116, 234, 57, 228, 203, 122, 87, 146, 161, 167, 87, 126, 181, 34, 85, 90, 190, 30, 253, 188, 207, 205, 203, 11, 248, 56, 202, 107, 28, 106, 8, 247, 65, 91, 12, 123, 2, 252, 134, 153, 88, 146, 154, 99, 116, 103, 196, 40, 212, 197, 79, 63, 1, 241, 152, 35, 34, 84, 217, 128, 56, 0, 139, 218, 77, 22, 63, 120, 204, 192, 144, 152, 127, 60, 84, 143, 30, 203, 24, 78, 44, 24, 194, 71, 139, 34, 203, 212, 4, 216, 128, 29, 158, 142, 82, 147, 165, 250, 107, 222, 76, 152, 120, 21, 236, 240, 18, 167, 99, 97, 31, 104, 3, 134, 222, 185, 129, 130, 214, 90, 200, 254, 51, 86, 225, 209, 2, 224, 32, 38, 218, 77, 156, 102, 9, 158, 232, 155, 239, 33, 76, 222, 93, 105, 50, 72, 175, 220, 219, 17, 58, 147, 86, 107, 144, 35, 191, 186, 197, 218, 74, 71, 154, 117, 192, 247, 43, 176, 141, 82, 95, 21, 245, 199, 194, 20, 204, 111, 141, 183, 50, 22, 155, 54, 47, 164, 247, 33, 110, 208, 216, 123, 141, 209, 182, 101, 100, 140, 162, 83, 12, 12, 196, 113, 61, 119, 254, 184, 94, 78, 66, 72, 239, 124, 123, 48, 101, 162, 225, 175, 235, 100, 97, 71, 192, 254, 7, 234, 235, 94, 38, 241, 159, 96, 208, 128, 93, 68, 24, 69, 62, 236, 128, 155, 9, 56, 163, 236, 112, 90, 118, 11, 97, 33, 216, 89, 24, 127, 35, 5, 33, 103, 35, 27, 182, 249, 222, 74, 44, 243, 185, 177, 97, 145, 55, 113, 57, 186, 104, 128, 158, 1, 27, 182, 134, 158, 198, 228, 122, 149, 27, 185, 181, 248, 4, 98, 35, 113, 190, 228, 37, 84, 50, 250, 197, 180, 22, 103, 231, 136, 157, 96, 109, 205, 98, 195, 5, 146, 122, 238, 143, 155, 9, 245, 188, 30, 103, 55, 77, 1, 152, 207, 166, 218, 93, 237, 66, 182, 168, 31, 61, 111, 223, 189, 129, 118, 204, 121, 213, 212, 158, 159, 146, 227, 16, 63, 15, 25, 114, 72, 243, 3, 112, 217, 85, 194, 233, 211, 154, 178, 223, 170, 210, 215, 151, 146, 76, 212, 251, 234, 136, 23, 22, 156, 135, 40, 174, 163, 211, 154, 205, 237, 225, 86, 207, 195, 154, 170, 213, 33, 227, 75, 216, 234, 208, 159, 157, 48, 193, 243, 57, 79, 40, 187, 12, 147, 134, 150, 43, 169, 156, 208, 162, 94, 28, 192, 139, 133, 6, 112, 17, 245, 56, 161, 19, 254, 220, 63, 9, 58, 90, 144, 194, 186, 220, 166, 125, 179, 149, 46, 9, 18, 62, 244, 56, 232, 171, 16, 210, 106, 149, 170, 49, 173, 44, 50, 80, 108, 61, 151, 199, 86, 48, 59, 48, 31, 48, 7, 6, 5, 43, 14, 3, 2, 26, 4, 20, 171, 133, 31, 192, 88, 19, 36, 185, 245, 48, 81, 100, 39, 120, 104, 220, 55, 66, 79, 62, 4, 20, 87, 234, 127, 133, 228, 52, 169, 111, 27, 106, 183, 211, 251, 229, 188, 99, 150, 210, 181, 175, 2, 2, 7, 208 }; X509Certificate2 certificate = new X509Certificate2(certificateRawBytes, "", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet); X509Store certStore = null; try From 0b3b4e851d521eb40e0d3776a94f769eb9cca4f1 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Wed, 11 Sep 2019 16:16:45 -0700 Subject: [PATCH 20/26] GitHub Repository doc updates + NuGet.config uniformity (#188) --- CODE_OF_CONDUCT.md | 5 ++ CONTRIBUTING.md | 80 +++++++++++++++++ COPYRIGHT.md | 9 ++ README.md | 46 +++------- build.proj | 5 +- coding-style.md | 26 ++++++ contributing-workflow.md | 87 +++++++++++++++++++ roadmap.md | 37 ++++++++ .../tests/Nuget.Config | 19 ---- tools/vsconfig/VS19Components.vsconfig | 2 +- 10 files changed, 257 insertions(+), 59 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 COPYRIGHT.md create mode 100644 coding-style.md create mode 100644 contributing-workflow.md create mode 100644 roadmap.md delete mode 100644 src/Microsoft.Data.SqlClient/tests/Nuget.Config diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..0fd65e978f --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,5 @@ +# Code of Conduct + +This project has adopted the code of conduct defined by the Contributor Covenant +to clarify expected behavior in our community. +For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..23335e3152 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,80 @@ +# Contributing to Microsoft.Data.SqlClient + +General contribution guidance is included in this document. Additional guidance is defined in the documents linked below. + +- [Copyright](copyright.md) describes the licensing practices for the project. +- [Contribution Workflow](contributing-workflow.md) describes the workflow that the team uses for considering and accepting changes. + +## Up for Grabs + +The team marks the most straightforward issues as "up for grabs". This set of issues is the place to start if you are interested in contributing but new to the codebase. + +- [dotnet/sqlclient - "up for grabs"](https://github.com/dotnet/sqlclient/labels/Up-for-Grabs) + +## Contribution "Bar" + +Project maintainers will merge changes that improve the product significantly and broadly and that align with the [Microsoft.Data.SqlClient roadmap](https://github.com/dotnet/sqlclient/blob/master/roadmap.md). + +Contributions must also satisfy the other published guidelines defined in this document. + +## DOs and DON'Ts + +Please do: +- **DO** report each issue as a new issue (but check first if it's already been reported) +- **DO** respect Issue Templates and provide detailed information. It will make the process to reproduce the issue and provide a fix faster. +- **DO** provide a minimal repro app demonstrating the problem in isolation will greatly speed up the process of identifying and fixing problems. +- **DO** follow our [coding style](coding-style.md) (C# code-specific) when working on a Pull Request. +- **DO** give priority to the current style of the project or file you're changing even if it diverges from the general guidelines. +- **DO** consider cross-platform compatibility and supportability for all supported SQL and Azure Servers and client configurations. +- **DO** include tests when adding new features. When fixing bugs, start with adding a test that highlights how the current behavior is broken. +- **DO** consider concurrency when writing tests. Our pipelines run builds and tests in parallel using the same client and server configurations (in an isolated mode). E.g. Consider using dynamic table/database object names instead of hardcoded values (Use existing tests for reference). +- **DO** keep the discussions focused. When a new or related topic comes up it's often better to create new issue than to side track the discussion. +- **DO** blog and tweet (or whatever) about your contributions, frequently! + +Please do not: + +- **DON'T** make PRs for style changes. +- **DON'T** leave any artifacts on server in tests or leave open resources. Cleaning up all objects is highly appreciated to maintain test server health. +- **DON'T** skip tests or run them conditionally unless necessary. If conditions are not met, test coverage will not be 100%. Use only pre-defined conditions that are already being run in pipelines. +- **DON'T** surprise us with big pull requests. Instead, file an issue and start a discussion so we can agree on a direction before you invest a large amount of time. +- **DON'T** commit code that you didn't write. If you find code that you think is a good fit to add, file an issue and start a discussion before proceeding. +- **DON'T** submit PRs that alter licensing related files or headers. If you believe there's a problem with them, file an issue and we'll be happy to discuss it. + +## Using Labels + +We encourage adding appropriate labels to issues and pull requests to allow filtering and analysis effectively. The below variables are required for new Pull Requests if applicable: + +| Label | Description | +| ----- | ----------- | +| [Public API](https://github.com/dotnet/SqlClient/labels/Public%20API) | Use this variable if a new Public API is added to the Pull Request. +| [Breaking Change](https://github.com/dotnet/SqlClient/labels/Breaking%20Change) | Use this variable if the Pull Request breaks an existing API. | +| [Backport to CoreFx](https://github.com/dotnet/SqlClient/labels/Backport%20to%20CoreFx) | Use this variable if the Issue/Pull Request needs to be backported to System.Data.SqlClient in [dotnet/corefx](https://github.com/dotnet/corefx) | +| [Managed SNI](https://github.com/dotnet/SqlClient/labels/Managed%20SNI) | Use this label if the issue/PR relates to issues in Managed SNI | +| [Tests](https://github.com/dotnet/SqlClient/labels/Tests) | Use this label for pull requests that add only tests to the repository. | + +## Reporting security issues and security bugs + +Security issues and bugs should be reported privately, via email, to the Microsoft Security Response Center (MSRC) [secure@microsoft.com](mailto:secure@microsoft.com). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Further information, including the MSRC PGP key, can be found in the [Security TechCenter](https://technet.microsoft.com/en-us/security/ff852094.aspx). + +## File Headers + +The following file header is used for Microsoft.Data.SqlClient. Please use it for new files. + +```csharp +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +``` + +## Contributor License Agreement + +You must sign a [.NET Foundation Contribution License Agreement (CLA)](https://cla.dotnetfoundation.org) before your PR will be merged. This is a one-time requirement for projects in the .NET Foundation. You can read more about [Contribution License Agreements (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. + +The agreement: [net-foundation-contribution-license-agreement.pdf](https://github.com/dotnet/home/blob/master/guidance/net-foundation-contribution-license-agreement.pdf) + +You don't have to do this up-front. You can simply clone, fork, and submit your pull-request as usual. When your pull-request is created, it is classified by a CLA bot. If the change is trivial (for example, you just fixed a typo), then the PR is labelled with `cla-not-required`. Otherwise it's classified as `cla-required`. Once you signed a CLA, the current and all future pull-requests will be labelled as `cla-signed`. + +## Code Of Conduct + +This project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behavior in our community. +For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). diff --git a/COPYRIGHT.md b/COPYRIGHT.md new file mode 100644 index 0000000000..f9013b465f --- /dev/null +++ b/COPYRIGHT.md @@ -0,0 +1,9 @@ +# Copyright + +## Source License + +- The [MIT License](LICENSE) is used by this repository for [source code](https://github.com/dotnet/sqlclient/). + +## Binary License + +- **Microsoft.Data.SqlClient** binary distributions (nuget packages) are licensed as MIT (identical to the [Microsoft.Data.SqlClient source license](https://github.com/dotnet/sqlclient/blob/master/LICENSE)). diff --git a/README.md b/README.md index b56a5a4fd3..2b693ca438 100644 --- a/README.md +++ b/README.md @@ -26,46 +26,22 @@ For the .NET Framework driver on Windows, a package reference to [Microsoft.Data For the .NET Core driver on Windows, a package reference to [runtime.native.System.Data.SqlClient.sni](https://www.nuget.org/packages/runtime.native.System.Data.SqlClient.sni/) loads `arm64`, `x64` and `x86` platform specific `SNI.dll` libraries into the client's build directories. -## Building the Driver - -All necessary details and commands for building the driver and running tests are available in the [BUILDGUIDE](BUILDGUIDE.md). +## Helpful Links + +| Topic | Link to File | +| :---- | :------------- | +| Coding Style | [coding-style.md](coding-style.md) | +| Guidelines for building the driver | [BUILDGUIDE.md](BUILDGUIDE.md) | +| Guidelines for Contributors | [CONTRIBUTING.md](CONTRIBUTING.md) | +| Changelog for all driver releases | [CHANGELOG.md](CHANGELOG.md) | +| Code of Conduct | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) | +| Copyright Information | [COPYRIGHT.md](COPYRIGHT.md) | +| | | ## Release Notes All preview and stable driver release notes are available under [release-notes](release-notes). -## Guidelines for Creating Pull Requests - -We love contributions from the community. To help improve the quality of our code, we encourage you to follow these guidelines: - -- Code changes must adhere to the [C# Programming Guide](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/index). -- Driver code changes must be done considering cross-platform compatibility and supportability for all supported SQL and Azure Servers and client configurations. -- Tests must be added if non-existent to assure near to 100% code coverage for all future changes. -- Tests should be well structured and written well to be able to run in parallel using the same client and server configurations (in an isolated mode). E.g. Consider using dynamic table/database object names instead of hardcoded values (Use existing tests for reference). -- Tests should not leave any artifacts on the target server. Cleaning up all objects is highly appreciated to maintain test server health. -- Avoid skipping tests if possible or running them conditionally. If conditions are not met, test coverage will not be 100%. - -Thank you! - -## Guidelines for Reporting Issues - -We appreciate you taking the time to test the driver, provide feedback and report any issues. It would be extremely helpful if you: - -- Report each issue as a new issue (but check first if it's already been reported) -- Try to be detailed in your report. Useful information for good bug reports include: - * What you are seeing and what the expected behavior is - * The version of the driver in use. - * Environment details: e.g. .NET Framework / .NET Core version, client operating system - * Table schema (for some issues the data types make a big difference!) - * Any other relevant information you want to share -- Providing a minimal repro app demonstrating the problem in isolation will greatly speed up the process of identifying and fixing problems. - -Thank you! - -## Reporting security issues and security bugs - -Security issues and bugs should be reported privately, via email, to the Microsoft Security Response Center (MSRC) [secure@microsoft.com](mailto:secure@microsoft.com). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Further information, including the MSRC PGP key, can be found in the [Security TechCenter](https://technet.microsoft.com/en-us/security/ff852094.aspx). - ## Still have questions? Check out our [FAQ](https://github.com/dotnet/SqlClient/wiki/Frequently-Asked-Questions). Still not answered? Create an [issue](https://github.com/dotnet/SqlClient/issues/new/choose) to ask a question. diff --git a/build.proj b/build.proj index d3fcd41ffb..5bbcfffc58 100644 --- a/build.proj +++ b/build.proj @@ -4,6 +4,7 @@ + src\NuGet.config Debug AnyCPU @@ -33,10 +34,6 @@ - - - - diff --git a/coding-style.md b/coding-style.md new file mode 100644 index 0000000000..7f45a5ec49 --- /dev/null +++ b/coding-style.md @@ -0,0 +1,26 @@ +# C# Coding Style + +We follow a similar coding style as [dotnet/corefx](https://github.com/dotnet/corefx). + +For non code files (xml, etc), our current best guidance is consistency. When editing files, keep new code and changes consistent with the style in the files. For new files, it should conform to the style for that component. If there is a completely new component, anything that is reasonably broadly accepted is fine. + +The general rule we follow is "_use Visual Studio defaults_". + +1. We use [Allman style](http://en.wikipedia.org/wiki/Indent_style#Allman_style) braces, where each brace begins on a new line. A single line statement block can go without braces but the block must be properly indented on its own line and must not be nested in other statement blocks that use braces. One exception is that a `using` statement is permitted to be nested within another `using` statement by starting on the following line at the same indentation level, even if the nested `using` contains a controlled block. +2. We use four spaces of indentation (no tabs). +3. We use `_camelCase` for internal and private fields and use `readonly` where possible. Prefix internal and private instance fields with `_`, static fields with `s_` and thread static fields with `t_`. When used on static fields, `readonly` should come after `static` (e.g. `static readonly` not `readonly static`). Public fields should be used sparingly and should use PascalCasing with no prefix when used. +4. We avoid `this.` unless absolutely necessary. +5. We always specify the visibility, even if it's the default (e.g. `private string _foo` not `string _foo`). Visibility should be the first modifier (e.g. `public abstract` not `abstract public`). +6. Namespace imports should be specified at the top of the file, *outside* of `namespace` declarations, and should be sorted alphabetically, with the exception of `System.*` namespaces, which are to be placed on top of all others. +7. Avoid more than one empty line at any time. For example, do not have two blank lines between members of a type. +8. Avoid spurious free spaces. For example avoid `if (someVar == 0)...`, where the dots mark the spurious free spaces. Consider enabling "View White Space (Ctrl+E, S)" if using Visual Studio to aid detection. +9. If a file happens to differ in style from these guidelines (e.g. private members are named `m_member` rather than `_member`), the existing style in that file takes precedence. +10. We only use `var` when it's obvious what the variable type is (e.g. `var stream = new FileStream(...)` not `var stream = OpenStandardInput()`). +11. We use language keywords instead of BCL types (e.g. `int, string, float` instead of `Int32, String, Single`, etc) for both type references as well as method calls (e.g. `int.Parse` instead of `Int32.Parse`). +12. We use PascalCasing to name all our constant local variables and fields. The only exception is for interop code where the constant value should exactly match the name and value of the code you are calling via interop. +13. We use ```nameof(...)``` instead of ```"..."``` whenever possible and relevant. +14. Fields should be specified at the top within type declarations. +15. When including non-ASCII characters in the source code use Unicode escape sequences (\uXXXX) instead of literal characters. Literal non-ASCII characters occasionally get garbled by a tool or editor. +16. When using labels (for goto), indent the label one less than the current indentation. + +An [EditorConfig](https://editorconfig.org "EditorConfig homepage") file (`.editorconfig`) has been provided at the root of the sqlclient repository, enabling C# auto-formatting. diff --git a/contributing-workflow.md b/contributing-workflow.md new file mode 100644 index 0000000000..374e843ae1 --- /dev/null +++ b/contributing-workflow.md @@ -0,0 +1,87 @@ +# Contribution Workflow + +You can contribute to Microsoft.Data.SqlClient with issues and PRs. Simply filing issues for problems you encounter is a great way to contribute. Contributing implementations is greatly appreciated. + +## Suggested Workflow + +We use and recommend the following workflow: + +1. Create an issue for your work. + - You can skip this step for trivial changes. + - Reuse an existing issue on the topic, if there is one. + - Get agreement from the team and the community that your proposed change is a good one. + - If your requested change needs a new public API, add a Label "**Public API**" to your issue. + - If your requested change address performance improvement in the driver, add a Label "**Performance**" to your issue. + - For any other improvements in the driver, add a Label "**Enhancement**" to your issue. + - Clearly state that you are going to take on implementing it, if that's the case. You can request that the issue be assigned to you. Note: The issue filer and the implementer don't have to be the same person. +2. Create a personal fork of the repository on GitHub (if you don't already have one). +3. Create a branch off of master (`git checkout -b mybranch`). + - Name the branch so that it clearly communicates your intentions, such as issue-123 or githubhandle-issue. + - Branches are useful since they isolate your changes from incoming changes from upstream. They also enable you to create multiple PRs from the same fork. +4. Make and commit your changes. + - Please follow our [Commit Messages](contributing.md#commit-messages) guidance. +5. Add new tests corresponding to your change, if nor present and applicable. +6. Build the repository with your changes. + - Make sure that the builds are clean. + - Make sure that the tests are all passing, including your new tests. +7. Create a pull request (PR) against the upstream repository's **master** branch. + - Push your changes to your fork on GitHub (if you haven't already). + +> Note: It is OK for your PR to include a large number of commits. Once your change is accepted, you will be asked to squash your commits into one or some appropriately small number of commits before your PR is merged. + +> Note: It is OK to create your PR as "[WIP]" on the upstream repo before the implementation is done. This can be useful if you'd like to start the feedback process concurrent with your implementation. State that this is the case in the initial PR comment. + +## PR - CI Process + +_[Coming Soon - Currently under development]_ + +The [SqlClient Continuous Integration](https://dev.azure.com/sqlclientdrivers-ci/sqlclient/) (CI) system will automatically perform the required builds and run tests (including the ones you are expected to run) for PRs. Builds and test runs must be clean. + +If the CI build fails for any reason, the PR issue will be updated with a link that can be used to determine the cause of the failure. + +## PR Feedback + +Microsoft team and community members will provide feedback on your change. Community feedback is highly valued. You will often see the absence of team feedback if the community has already provided good review feedback. + +1 or more Microsoft team members will review every PR prior to merge. They will often reply with "LGTM, modulo comments". That means that the PR will be merged once the feedback is resolved. "LGTM" == "looks good to me". + +## Merging Pull Requests (for contributors with write access) + +Use ["Squash and Merge"](https://github.com/blog/2141-squash-your-commits) by default for individual contributions unless requested by the PR author. + +Do so, even if the PR contains only one commit. It creates a simpler history than "Create a Merge Commit". Reasons that PR authors may request "Merge and Commit" may include (but are not limited to): + - The change is easier to understand as a series of focused commits. Each commit in the series must be buildable so as not to break `git bisect`. + - Contributor is using an e-mail address other than the primary GitHub address and wants that preserved in the history. Contributor must be willing to squash the commits manually before acceptance. + +## PR Verification and Validation + +For testing PR changes and ensure they work fine, we maintain a public feed that lists NuGet Packages built with merged commits. + +**Link to Public Feed:** [Microsoft.Data.SqlClient.Commits](https://pkgs.dev.azure.com/sqlclientdrivers-ci/sqlclient/_packaging/Microsoft.Data.SqlClient.Commits/nuget/v3/index.json) + +**Add this feed to NuGet Sources** + +```cmd +nuget.exe sources Add -Name "Microsoft.Data.SqlClient.Commits" -Source "https://pkgs.dev.azure.com/sqlclientdrivers-ci/sqlclient/_packaging/Microsoft.Data.SqlClient.Commits/nuget/v3/index.json" +``` + +### Pushing to Public Feed + +Maintainers of [dotnet/sqlclient](https://github.com/dotnet/SqlClient) manually push NuGet Packages to this feed after the PR is merged to the `master` branch and a commit ID has been generated on `master`. + +Not every commit is built and published on the public CI feed, but only the commits that make considerable difference to the driver will be uploaded in this feed. + +The label **Push to Commit Feed** will be added to the Pull Request if it is pushed to the feed. + +### Downloading Packages + +The package naming conventions follow SemVer 2.0.0 and also provide changeset information to ensure the right PR changes are being downloaded for testing: + +Package names will be like: `Microsoft.Data.SqlClient.1.1.0-build.19250.1-c21aa7c.nupkg` + +Breaking down: +- `1.1.0-build` - Identitier for currently active driver version in Build. +- `19250.1` - Unique identifier to keep latest PRs on top of the feed. +- `c21aa7c` - Short Commit Id to identify merged commit in `master`. + +> Note: This public feed is only for testing and validating new PR changes. Packages from feed will be eventually removed when the maximum NuGet Package limit of **50** is reached. We do not recommend using packages from this feed in client applications. diff --git a/roadmap.md b/roadmap.md new file mode 100644 index 0000000000..57d9b81227 --- /dev/null +++ b/roadmap.md @@ -0,0 +1,37 @@ +# Microsoft.Data.SqlClient Roadmap + +The Microsoft.Data.SqlClient roadmap communicates project priorities for evolving and extending the scope of the product. We encourage the community to work with us to improve SqlClient driver for these scenarios and extend it for others. + +## Released Versions + +- [Release Notes](https://github.com/dotnet/sqlclient/blob/master/release-notes/README.md) - For detailed release notes summarizing of all changes/features released. +- [GitHub Releases](https://github.com/dotnet/sqlclient/releases) - For downloading NuGet Packages and identifying driver releases with changelog notes. + +## Upcoming Ship Dates + +| Milestone | Release Date | Project Board | +|---------------------------|--------------|---------------| +| Microsoft.Data.SqlClient 1.0 (servicing) | As needed (see also [releases](https://github.com/dotnet/sqlclient/blob/master/release-notes/1.0)) | [SqlClient 1.0.0](https://github.com/dotnet/SqlClient/projects/3)| +| Microsoft.Data.SqlClient 1.1 | GA (General Availability) scheduled for November 2019 | [SqlClient 1.1.0](https://github.com/dotnet/SqlClient/projects/4)| + +> Note: Dates are calendar year (as opposed to fiscal year). + +[SqlClient Projects](https://github.com/dotnet/SqlClient/projects) are used by our development team to define roadmap of prioritized work. SqlClient Boards contain issues, pull requests, and other features, development activities that are categorized as cards. Our goal is to be transparent over priorities, work in progress and deliverables. + +Milestone information is also available for GitHub Issues and Pull Requests [dotnet/sqlclient milestones](https://github.com/dotnet/sqlclient/milestones). + +## Feedback + +The best way to give feedback is to create issues in the [dotnet/sqlclient](https://github.com/dotnet/sqlclient) repo. + +Although mostly obvious, please give us feedback that will give us insight on the following points: + +* Existing features are missing some capability or otherwise don't work well enough. +* Missing features that should be added to the product. +* Design choices for a feature that is currently in-progress. + +Some important caveats / notes: + +* It is best to give design feedback quickly for improvements that are in-development. We're unlikely to hold a feature being part of a release on late feedback. +* We are most likely to include improvements that either have a positive impact on a broad scenario or have very significant positive impact on a niche scenario. This means that we are unlikely to prioritize modest improvements to niche scenarios. +* Compatibility will almost always be given a higher priority than improvements. diff --git a/src/Microsoft.Data.SqlClient/tests/Nuget.Config b/src/Microsoft.Data.SqlClient/tests/Nuget.Config deleted file mode 100644 index 36d77f092f..0000000000 --- a/src/Microsoft.Data.SqlClient/tests/Nuget.Config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tools/vsconfig/VS19Components.vsconfig b/tools/vsconfig/VS19Components.vsconfig index 5bd9ab617c..08a6a6ba82 100644 --- a/tools/vsconfig/VS19Components.vsconfig +++ b/tools/vsconfig/VS19Components.vsconfig @@ -23,7 +23,7 @@ "microsoft.visualstudio.component.aspnet45", "microsoft.visualstudio.component.webdeploy", "microsoft.visualstudio.component.azure.servicefabric.tools", - "microsoft.visualstudio.component.typescript.3.4", + "microsoft.visualstudio.component.typescript.3.5", "Microsoft.VisualStudio.Component.TestTools.CodedUITest", "microsoft.visualstudio.component.testtools.webloadtest" ] From a1575fb251ed8dc8abac1a98bc6c73395380ad67 Mon Sep 17 00:00:00 2001 From: Erik Ejlskov Jensen Date: Thu, 12 Sep 2019 18:48:33 +0100 Subject: [PATCH 21/26] Tests | Add some unit tests for SqlParameter (more to come) (#191) Relates to #56 --- .../tests/FunctionalTests/SqlParameterTest.cs | 228 +++++++++++++++++- 1 file changed, 226 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlParameterTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlParameterTest.cs index 8edbb5f8fc..5619fef06d 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlParameterTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlParameterTest.cs @@ -2,8 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; using System.Data; using System.Data.Common; +using System.Data.SqlTypes; using Xunit; namespace Microsoft.Data.SqlClient.Tests @@ -39,5 +41,227 @@ public void ParameterPrecisionOnBaseType() Assert.Equal(10, parameter.Precision); Assert.Equal(5, parameter.Scale); } - } -} + + [Fact] + public void Constructor1() + { + SqlParameter p = new SqlParameter(); + + Assert.Equal(DbType.String, p.DbType); + Assert.Equal(ParameterDirection.Input, p.Direction); + Assert.False(p.IsNullable); + Assert.Equal(0, p.LocaleId); + Assert.Equal(0, p.Offset); + Assert.Equal(string.Empty, p.ParameterName); + Assert.Equal(0, p.Precision); + Assert.Equal(0, p.Scale); + Assert.Equal(0, p.Size); + Assert.Equal(string.Empty, p.SourceColumn); + Assert.False(p.SourceColumnNullMapping); + Assert.Equal(DataRowVersion.Current, p.SourceVersion); + Assert.Equal(SqlDbType.NVarChar, p.SqlDbType); + Assert.Null(p.SqlValue); + Assert.Equal(string.Empty, p.TypeName); + Assert.Equal(string.Empty, p.UdtTypeName); + Assert.Null(p.Value); + Assert.Equal(string.Empty, p.XmlSchemaCollectionDatabase); + Assert.Equal(string.Empty, p.XmlSchemaCollectionName); + Assert.Equal(string.Empty, p.XmlSchemaCollectionOwningSchema); + } + + [Fact] + public void Constructor2_Value_DateTime() + { + DateTime value = new DateTime(2004, 8, 24); + SqlParameter p = new SqlParameter("address", value); + + Assert.Equal(DbType.DateTime, p.DbType); + Assert.Equal(ParameterDirection.Input, p.Direction); + Assert.False(p.IsNullable); + Assert.Equal(0, p.LocaleId); + Assert.Equal(0, p.Offset); + Assert.Equal("address", p.ParameterName); + Assert.Equal(0, p.Precision); + Assert.Equal(0, p.Scale); + Assert.Equal (0, p.Size); + Assert.Equal(string.Empty, p.SourceColumn); + Assert.False(p.SourceColumnNullMapping); + Assert.Equal(DataRowVersion.Current, p.SourceVersion); + Assert.Equal(SqlDbType.DateTime, p.SqlDbType); + Assert.Equal(new SqlDateTime(value), p.SqlValue); + Assert.Equal(string.Empty, p.TypeName); + Assert.Equal(string.Empty, p.UdtTypeName); + Assert.Equal(value, p.Value); + Assert.Equal(string.Empty, p.XmlSchemaCollectionDatabase); + Assert.Equal(string.Empty, p.XmlSchemaCollectionName); + Assert.Equal(string.Empty, p.XmlSchemaCollectionOwningSchema); + } + + [Fact] + public void Constructor2_Value_Null() + { + SqlParameter p = new SqlParameter("address", null); + + Assert.Equal(DbType.String, p.DbType); + Assert.Equal(ParameterDirection.Input, p.Direction); + Assert.False(p.IsNullable); + Assert.Equal(0, p.LocaleId); + Assert.Equal(0, p.Offset); + Assert.Equal("address", p.ParameterName); + Assert.Equal(0, p.Precision); + Assert.Equal(0, p.Scale); + Assert.Equal(0, p.Size); + Assert.Equal(string.Empty, p.SourceColumn); + Assert.False(p.SourceColumnNullMapping); + Assert.Equal(DataRowVersion.Current, p.SourceVersion); + Assert.Equal(SqlDbType.NVarChar, p.SqlDbType); + Assert.Null(p.SqlValue); + Assert.Equal(string.Empty, p.TypeName); + Assert.Equal(string.Empty, p.UdtTypeName); + Assert.Null(p.Value); + Assert.Equal(string.Empty, p.XmlSchemaCollectionDatabase); + Assert.Equal(string.Empty, p.XmlSchemaCollectionName); + Assert.Equal(string.Empty, p.XmlSchemaCollectionOwningSchema); + } + + [Fact] + public void Constructor2_Value_DBNull() + { + SqlParameter p = new SqlParameter("address", DBNull.Value); + + Assert.Equal(DbType.String, p.DbType); + Assert.Equal(ParameterDirection.Input, p.Direction); + Assert.False(p.IsNullable); + Assert.Equal(0, p.LocaleId); + Assert.Equal(0, p.Offset); + Assert.Equal("address", p.ParameterName); + Assert.Equal(0, p.Precision); + Assert.Equal(0, p.Scale); + Assert.Equal(0, p.Size); + Assert.Equal(string.Empty, p.SourceColumn); + Assert.False(p.SourceColumnNullMapping); + Assert.Equal(DataRowVersion.Current, p.SourceVersion); + Assert.Equal(SqlDbType.NVarChar, p.SqlDbType); + Assert.Equal(SqlString.Null, p.SqlValue); + Assert.Equal(string.Empty, p.TypeName); + Assert.Equal(string.Empty, p.UdtTypeName); + Assert.Equal(DBNull.Value, p.Value); + Assert.Equal(string.Empty, p.XmlSchemaCollectionDatabase); + Assert.Equal(string.Empty, p.XmlSchemaCollectionName); + Assert.Equal(string.Empty, p.XmlSchemaCollectionOwningSchema); + } + + [Fact] + public void Constructor2_Name_Null() + { + SqlParameter p = new SqlParameter(null, DBNull.Value); + Assert.Equal(string.Empty, p.ParameterName); + } + + [Theory] + [InlineData(SqlDbType.BigInt, DbType.Int64)] + [InlineData(SqlDbType.Binary, DbType.Binary)] + [InlineData(SqlDbType.Bit, DbType.Boolean)] + [InlineData(SqlDbType.Char, DbType.AnsiStringFixedLength)] + [InlineData(SqlDbType.Date, DbType.Date)] + [InlineData(SqlDbType.DateTime, DbType.DateTime)] + [InlineData(SqlDbType.DateTimeOffset, DbType.DateTimeOffset)] + [InlineData(SqlDbType.Decimal, DbType.Decimal)] + [InlineData(SqlDbType.Float, DbType.Double)] + [InlineData(SqlDbType.Image, DbType.Binary)] + [InlineData(SqlDbType.Int, DbType.Int32)] + [InlineData(SqlDbType.Money, DbType.Currency)] + [InlineData(SqlDbType.NChar, DbType.StringFixedLength)] + [InlineData(SqlDbType.NText, DbType.String)] + [InlineData(SqlDbType.NVarChar, DbType.String)] + [InlineData(SqlDbType.Real, DbType.Single)] + [InlineData(SqlDbType.SmallDateTime, DbType.DateTime)] + [InlineData(SqlDbType.SmallInt, DbType.Int16)] + [InlineData(SqlDbType.SmallMoney, DbType.Currency)] + [InlineData(SqlDbType.Structured, DbType.Object)] + [InlineData(SqlDbType.Text, DbType.AnsiString)] + [InlineData(SqlDbType.Time, DbType.Time)] + [InlineData(SqlDbType.Timestamp, DbType.Binary)] + [InlineData(SqlDbType.TinyInt, DbType.Byte)] + [InlineData(SqlDbType.Udt, DbType.Object)] + [InlineData(SqlDbType.UniqueIdentifier, DbType.Guid)] + [InlineData(SqlDbType.VarBinary, DbType.Binary)] + [InlineData(SqlDbType.VarChar, DbType.AnsiString)] + [InlineData(SqlDbType.Variant, DbType.Object)] + [InlineData(SqlDbType.Xml, DbType.Xml)] + public void Constructor3_Types(SqlDbType sqlDbType, DbType dbType) + { + SqlParameter p = new SqlParameter("types", sqlDbType); + + Assert.Equal(dbType, p.DbType); + Assert.Equal(sqlDbType, p.SqlDbType); + Assert.Null(p.Value); + } + + [Fact] + public void Constructor4() + { + SqlParameter p = new SqlParameter("", SqlDbType.Bit, 1001); + Assert.Equal(1001, p.Size); + } + + [Fact] + public void Constructor4_MaxSize() + { + SqlParameter p = new SqlParameter("", SqlDbType.Bit, int.MaxValue); + Assert.Equal(int.MaxValue, p.Size); + } + + [Fact] + public void Constructor4_MinSize() + { + Assert.Throws(() => new SqlParameter("", SqlDbType.Image, int.MinValue)); + } + + [Theory] + [InlineData(null, "")] + [InlineData("SourceColumn", "SourceColumn")] + [InlineData(" SourceColumn ", " SourceColumn ")] + public void Constructor5(string value, string expected) + { + SqlParameter p = new SqlParameter("", SqlDbType.Bit, int.MaxValue, value); + Assert.Equal(expected, p.SourceColumn); + } + + [Theory] + [InlineData(ParameterDirection.Input, true, 0, 0, "", "", DataRowVersion.Current)] + [InlineData(ParameterDirection.InputOutput, true, 0, 0, null, "", DataRowVersion.Default)] + [InlineData(ParameterDirection.Output, false, 0, 255, "Col", "Col", DataRowVersion.Original)] + [InlineData(ParameterDirection.ReturnValue, false, 99, 100, " Col ", " Col ", DataRowVersion.Proposed)] + public void Constructor6(ParameterDirection parameterDirection, bool isNullable, byte precision, byte scale, string sourceColumn, string expectedSourceColumn, DataRowVersion dataRowVersion) + { + SqlParameter p = new SqlParameter("", SqlDbType.Bit, int.MaxValue, parameterDirection, isNullable, precision, scale, sourceColumn, dataRowVersion, null); + + Assert.Equal(parameterDirection, p.Direction); + Assert.Equal(isNullable, p.IsNullable); + Assert.Equal(precision, p.Precision); + Assert.Equal(scale, p.Scale); + Assert.Equal(expectedSourceColumn, p.SourceColumn); + Assert.Equal(dataRowVersion, p.SourceVersion); + } + + [Theory] + [InlineData(ParameterDirection.Input, 0, 0, null, "", DataRowVersion.Current, false, null, "", null, "", null, "")] + [InlineData(ParameterDirection.InputOutput, 255, 255, "", "", DataRowVersion.Default, true, "", "", "", "", "", "")] + [InlineData(ParameterDirection.Output, 99, 100, "Source", "Source", DataRowVersion.Original, false, "aaa", "aaa", "bbb", "bbb", "ccc", "ccc")] + [InlineData(ParameterDirection.ReturnValue, 100, 99, " Source ", " Source ", DataRowVersion.Proposed, true, " aaa ", " aaa ", " bbb ", " bbb ", " ccc ", " ccc ")] + public void Constructor7(ParameterDirection parameterDirection, byte precision, byte scale, string sourceColumn, string expectedSourceColumn, DataRowVersion dataRowVersion, bool sourceColumnNullMapping, string xmlSchemaCollectionDatabase, string expectedXmlSchemaCollectionDatabase, string xmlSchemaCollectionOwningSchema, string expectedXmlSchemaCollectionOwningSchema, string xmlSchemaCollectionName, string expectedXmlSchemaCollectionName) + { + SqlParameter p = new SqlParameter("", SqlDbType.Bit, int.MaxValue, parameterDirection, precision, scale, sourceColumn, dataRowVersion, sourceColumnNullMapping, null, xmlSchemaCollectionDatabase, xmlSchemaCollectionOwningSchema, xmlSchemaCollectionName); + + Assert.Equal(parameterDirection, p.Direction); + Assert.Equal(precision, p.Precision); + Assert.Equal(scale, p.Scale); + Assert.Equal(expectedSourceColumn, p.SourceColumn); + Assert.Equal(dataRowVersion, p.SourceVersion); + Assert.Equal(expectedXmlSchemaCollectionDatabase, p.XmlSchemaCollectionDatabase); + Assert.Equal(expectedXmlSchemaCollectionName, p.XmlSchemaCollectionName); + Assert.Equal(expectedXmlSchemaCollectionOwningSchema, p.XmlSchemaCollectionOwningSchema); + } + } +} \ No newline at end of file From 53d21280c04f4597743e6d7f7e421c10c8968abe Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Thu, 12 Sep 2019 20:19:24 +0100 Subject: [PATCH 22/26] Synchronize ref definitions (#180) --- .../netcore/ref/Microsoft.Data.SqlClient.cs | 911 +++++++++++------- .../netfx/ref/Microsoft.Data.SqlClient.cs | 173 ++-- 2 files changed, 620 insertions(+), 464 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs index b171170802..6c216643a1 100644 --- a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs @@ -2,234 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -namespace Microsoft.Data.SqlClient.Server +namespace Microsoft.Data { - public sealed partial class InvalidUdtException : System.SystemException - { - internal InvalidUdtException() { } - } - public partial class SqlDataRecord : System.Data.IDataRecord - { - public SqlDataRecord(params Microsoft.Data.SqlClient.Server.SqlMetaData[] metaData) { } - public virtual int FieldCount { get { throw null; } } - public virtual object this[int ordinal] { get { throw null; } } - public virtual object this[string name] { get { throw null; } } - public virtual bool GetBoolean(int ordinal) { throw null; } - public virtual byte GetByte(int ordinal) { throw null; } - public virtual long GetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { throw null; } - public virtual char GetChar(int ordinal) { throw null; } - public virtual long GetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { throw null; } - System.Data.IDataReader System.Data.IDataRecord.GetData(int ordinal) { throw null; } - public virtual string GetDataTypeName(int ordinal) { throw null; } - public virtual System.DateTime GetDateTime(int ordinal) { throw null; } - public virtual System.DateTimeOffset GetDateTimeOffset(int ordinal) { throw null; } - public virtual decimal GetDecimal(int ordinal) { throw null; } - public virtual double GetDouble(int ordinal) { throw null; } - public virtual System.Type GetFieldType(int ordinal) { throw null; } - public virtual float GetFloat(int ordinal) { throw null; } - public virtual System.Guid GetGuid(int ordinal) { throw null; } - public virtual short GetInt16(int ordinal) { throw null; } - public virtual int GetInt32(int ordinal) { throw null; } - public virtual long GetInt64(int ordinal) { throw null; } - public virtual string GetName(int ordinal) { throw null; } - public virtual int GetOrdinal(string name) { throw null; } - public virtual System.Data.SqlTypes.SqlBinary GetSqlBinary(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlBoolean GetSqlBoolean(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlByte GetSqlByte(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlBytes GetSqlBytes(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlChars GetSqlChars(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlDateTime GetSqlDateTime(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlDecimal GetSqlDecimal(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlDouble GetSqlDouble(int ordinal) { throw null; } - public virtual System.Type GetSqlFieldType(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlGuid GetSqlGuid(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlInt16 GetSqlInt16(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlInt32 GetSqlInt32(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlInt64 GetSqlInt64(int ordinal) { throw null; } - public virtual Microsoft.Data.SqlClient.Server.SqlMetaData GetSqlMetaData(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlMoney GetSqlMoney(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlSingle GetSqlSingle(int ordinal) { throw null; } - public virtual System.Data.SqlTypes.SqlString GetSqlString(int ordinal) { throw null; } - public virtual object GetSqlValue(int ordinal) { throw null; } - public virtual int GetSqlValues(object[] values) { throw null; } - public virtual System.Data.SqlTypes.SqlXml GetSqlXml(int ordinal) { throw null; } - public virtual string GetString(int ordinal) { throw null; } - public virtual System.TimeSpan GetTimeSpan(int ordinal) { throw null; } - public virtual object GetValue(int ordinal) { throw null; } - public virtual int GetValues(object[] values) { throw null; } - public virtual bool IsDBNull(int ordinal) { throw null; } - public virtual void SetBoolean(int ordinal, bool value) { } - public virtual void SetByte(int ordinal, byte value) { } - public virtual void SetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { } - public virtual void SetChar(int ordinal, char value) { } - public virtual void SetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { } - public virtual void SetDateTime(int ordinal, System.DateTime value) { } - public virtual void SetDateTimeOffset(int ordinal, System.DateTimeOffset value) { } - public virtual void SetDBNull(int ordinal) { } - public virtual void SetDecimal(int ordinal, decimal value) { } - public virtual void SetDouble(int ordinal, double value) { } - public virtual void SetFloat(int ordinal, float value) { } - public virtual void SetGuid(int ordinal, System.Guid value) { } - public virtual void SetInt16(int ordinal, short value) { } - public virtual void SetInt32(int ordinal, int value) { } - public virtual void SetInt64(int ordinal, long value) { } - public virtual void SetSqlBinary(int ordinal, System.Data.SqlTypes.SqlBinary value) { } - public virtual void SetSqlBoolean(int ordinal, System.Data.SqlTypes.SqlBoolean value) { } - public virtual void SetSqlByte(int ordinal, System.Data.SqlTypes.SqlByte value) { } - public virtual void SetSqlBytes(int ordinal, System.Data.SqlTypes.SqlBytes value) { } - public virtual void SetSqlChars(int ordinal, System.Data.SqlTypes.SqlChars value) { } - public virtual void SetSqlDateTime(int ordinal, System.Data.SqlTypes.SqlDateTime value) { } - public virtual void SetSqlDecimal(int ordinal, System.Data.SqlTypes.SqlDecimal value) { } - public virtual void SetSqlDouble(int ordinal, System.Data.SqlTypes.SqlDouble value) { } - public virtual void SetSqlGuid(int ordinal, System.Data.SqlTypes.SqlGuid value) { } - public virtual void SetSqlInt16(int ordinal, System.Data.SqlTypes.SqlInt16 value) { } - public virtual void SetSqlInt32(int ordinal, System.Data.SqlTypes.SqlInt32 value) { } - public virtual void SetSqlInt64(int ordinal, System.Data.SqlTypes.SqlInt64 value) { } - public virtual void SetSqlMoney(int ordinal, System.Data.SqlTypes.SqlMoney value) { } - public virtual void SetSqlSingle(int ordinal, System.Data.SqlTypes.SqlSingle value) { } - public virtual void SetSqlString(int ordinal, System.Data.SqlTypes.SqlString value) { } - public virtual void SetSqlXml(int ordinal, System.Data.SqlTypes.SqlXml value) { } - public virtual void SetString(int ordinal, string value) { } - public virtual void SetTimeSpan(int ordinal, System.TimeSpan value) { } - public virtual void SetValue(int ordinal, object value) { } - public virtual int SetValues(params object[] values) { throw null; } - } - public enum DataAccessKind - { - None = 0, - Read = 1 - } - public enum SystemDataAccessKind - { - None = 0, - Read = 1 - } - [System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = false, Inherited = false), System.SerializableAttribute] - public partial class SqlFunctionAttribute : System.Attribute - { - public SqlFunctionAttribute() { } - public bool IsDeterministic { get { throw null; } set { } } - public DataAccessKind DataAccess { get { throw null; } set { } } - public SystemDataAccessKind SystemDataAccess { get { throw null; } set { } } - public bool IsPrecise { get { throw null; } set { } } - public string Name { get { throw null; } set { } } - public string TableDefinition { get { throw null; } set { } } - public string FillRowMethodName { get { throw null; } set { } } - } - - public sealed partial class SqlMetaData - { - public SqlMetaData(string name, System.Data.SqlDbType dbType) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, byte precision, byte scale) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, byte precision, byte scale, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, byte precision, byte scale, long locale, System.Data.SqlTypes.SqlCompareOptions compareOptions, System.Type userDefinedType) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, System.Data.SqlTypes.SqlCompareOptions compareOptions, System.Type userDefinedType, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, long locale, System.Data.SqlTypes.SqlCompareOptions compareOptions) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, long locale, System.Data.SqlTypes.SqlCompareOptions compareOptions, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, string database, string owningSchema, string objectName) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, string database, string owningSchema, string objectName, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, System.Type userDefinedType) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, System.Type userDefinedType, string serverTypeName) { } - public SqlMetaData(string name, System.Data.SqlDbType dbType, System.Type userDefinedType, string serverTypeName, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } - - public System.Data.SqlTypes.SqlCompareOptions CompareOptions { get { throw null; } } - public System.Data.DbType DbType { get { throw null; } } - public bool IsUniqueKey { get { throw null; } } - public long LocaleId { get { throw null; } } - public static long Max { get { throw null; } } - public long MaxLength { get { throw null; } } - public string Name { get { throw null; } } - public byte Precision { get { throw null; } } - public byte Scale { get { throw null; } } - public Microsoft.Data.SqlClient.SortOrder SortOrder { get { throw null; } } - public int SortOrdinal { get { throw null; } } - public System.Data.SqlDbType SqlDbType { get { throw null; } } - public System.Type Type{ get { throw null; } } - public string TypeName { get { throw null; } } - public bool UseServerDefault { get { throw null; } } - public string XmlSchemaCollectionDatabase { get { throw null; } } - public string XmlSchemaCollectionName { get { throw null; } } - public string XmlSchemaCollectionOwningSchema { get { throw null; } } - public bool Adjust(bool value) { throw null; } - public byte Adjust(byte value) { throw null; } - public byte[] Adjust(byte[] value) { throw null; } - public char Adjust(char value) { throw null; } - public char[] Adjust(char[] value) { throw null; } - public System.Data.SqlTypes.SqlBinary Adjust(System.Data.SqlTypes.SqlBinary value) { throw null; } - public System.Data.SqlTypes.SqlBoolean Adjust(System.Data.SqlTypes.SqlBoolean value) { throw null; } - public System.Data.SqlTypes.SqlByte Adjust(System.Data.SqlTypes.SqlByte value) { throw null; } - public System.Data.SqlTypes.SqlBytes Adjust(System.Data.SqlTypes.SqlBytes value) { throw null; } - public System.Data.SqlTypes.SqlChars Adjust(System.Data.SqlTypes.SqlChars value) { throw null; } - public System.Data.SqlTypes.SqlDateTime Adjust(System.Data.SqlTypes.SqlDateTime value) { throw null; } - public System.Data.SqlTypes.SqlDecimal Adjust(System.Data.SqlTypes.SqlDecimal value) { throw null; } - public System.Data.SqlTypes.SqlDouble Adjust(System.Data.SqlTypes.SqlDouble value) { throw null; } - public System.Data.SqlTypes.SqlGuid Adjust(System.Data.SqlTypes.SqlGuid value) { throw null; } - public System.Data.SqlTypes.SqlInt16 Adjust(System.Data.SqlTypes.SqlInt16 value) { throw null; } - public System.Data.SqlTypes.SqlInt32 Adjust(System.Data.SqlTypes.SqlInt32 value) { throw null; } - public System.Data.SqlTypes.SqlInt64 Adjust(System.Data.SqlTypes.SqlInt64 value) { throw null; } - public System.Data.SqlTypes.SqlMoney Adjust(System.Data.SqlTypes.SqlMoney value) { throw null; } - public System.Data.SqlTypes.SqlSingle Adjust(System.Data.SqlTypes.SqlSingle value) { throw null; } - public System.Data.SqlTypes.SqlString Adjust(System.Data.SqlTypes.SqlString value) { throw null; } - public System.Data.SqlTypes.SqlXml Adjust(System.Data.SqlTypes.SqlXml value) { throw null; } - public System.DateTime Adjust(System.DateTime value) { throw null; } - public System.DateTimeOffset Adjust(System.DateTimeOffset value) { throw null; } - public decimal Adjust(decimal value) { throw null; } - public double Adjust(double value) { throw null; } - public System.Guid Adjust(System.Guid value) { throw null; } - public short Adjust(short value) { throw null; } - public int Adjust(int value) { throw null; } - public long Adjust(long value) { throw null; } - public object Adjust(object value) { throw null; } - public float Adjust(float value) { throw null; } - public string Adjust(string value) { throw null; } - public System.TimeSpan Adjust(System.TimeSpan value) { throw null; } - public static Microsoft.Data.SqlClient.Server.SqlMetaData InferFromValue(object value, string name) { throw null; } - } - [System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = false, Inherited = false), System.SerializableAttribute] - public sealed partial class SqlMethodAttribute : SqlFunctionAttribute - { - public SqlMethodAttribute() { } - public bool OnNullCall { get { throw null; } set { } } - public bool IsMutator { get { throw null; } set { } } - public bool InvokeIfReceiverIsNull { get { throw null; } set { } } - } - public enum Format - { - Unknown = 0, - Native = 1, - UserDefined = 2 - } - [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple = false, Inherited = false)] - public sealed partial class SqlUserDefinedAggregateAttribute : System.Attribute - { - public const int MaxByteSizeValue = 8000; - public SqlUserDefinedAggregateAttribute(Format format) { } - public int MaxByteSize { get { throw null; } set { } } - public bool IsInvariantToDuplicates { get { throw null; } set { } } - public bool IsInvariantToNulls { get { throw null; } set { } } - public bool IsInvariantToOrder { get { throw null; } set { } } - public bool IsNullIfEmpty { get { throw null; } set { } } - public Format Format { get { throw null; } } - public string Name { get { throw null; } set { } } - } - [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple = false, Inherited = true)] - public sealed partial class SqlUserDefinedTypeAttribute : System.Attribute - { - public SqlUserDefinedTypeAttribute(Format format) { } - public int MaxByteSize { get { throw null; } set { } } - public bool IsFixedLength { get { throw null; } set { } } - public bool IsByteOrdered { get { throw null; } set { } } - public Format Format { get { throw null; } } - public string ValidationMethodName { get { throw null; } set { } } - public string Name { get { throw null; } set { } } - } - public interface IBinarySerialize + public sealed partial class OperationAbortedException : System.SystemException { - void Read(System.IO.BinaryReader r); - void Write(System.IO.BinaryWriter w); + internal OperationAbortedException() { } } } namespace Microsoft.Data.Sql @@ -248,13 +25,14 @@ namespace Microsoft.Data.SqlClient public enum ApplicationIntent { ReadOnly = 1, - ReadWrite = 0, + ReadWrite = 0 } + public delegate void OnChangeEventHandler(object sender, Microsoft.Data.SqlClient.SqlNotificationEventArgs e); public enum SortOrder { Ascending = 0, Descending = 1, - Unspecified = -1, + Unspecified = -1 } public abstract partial class SqlAuthenticationInitializer { @@ -267,7 +45,7 @@ public enum SqlAuthenticationMethod ActiveDirectoryInteractive = 4, ActiveDirectoryPassword = 2, NotSpecified = 0, - SqlPassword = 1, + SqlPassword = 1 } public partial class SqlAuthenticationParameters { @@ -313,20 +91,20 @@ public event Microsoft.Data.SqlClient.SqlRowsCopiedEventHandler SqlRowsCopied { public void Close() { } void System.IDisposable.Dispose() { } public void WriteToServer(System.Data.Common.DbDataReader reader) { } - public void WriteToServer(System.Data.IDataReader reader) { } public void WriteToServer(System.Data.DataTable table) { } public void WriteToServer(System.Data.DataTable table, System.Data.DataRowState rowState) { } public void WriteToServer(System.Data.DataRow[] rows) { } - public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataRow[] rows) { throw null; } - public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataRow[] rows, System.Threading.CancellationToken cancellationToken) { throw null; } - public System.Threading.Tasks.Task WriteToServerAsync(System.Data.IDataReader reader) { throw null; } - public System.Threading.Tasks.Task WriteToServerAsync(System.Data.IDataReader reader, System.Threading.CancellationToken cancellationToken) { throw null; } + public void WriteToServer(System.Data.IDataReader reader) { } public System.Threading.Tasks.Task WriteToServerAsync(System.Data.Common.DbDataReader reader) { throw null; } public System.Threading.Tasks.Task WriteToServerAsync(System.Data.Common.DbDataReader reader, System.Threading.CancellationToken cancellationToken) { throw null; } + public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataRow[] rows) { throw null; } + public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataRow[] rows, System.Threading.CancellationToken cancellationToken) { throw null; } public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataTable table) { throw null; } - public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataTable table, System.Threading.CancellationToken cancellationToken) { throw null; } public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataTable table, System.Data.DataRowState rowState) { throw null; } public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataTable table, System.Data.DataRowState rowState, System.Threading.CancellationToken cancellationToken) { throw null; } + public System.Threading.Tasks.Task WriteToServerAsync(System.Data.DataTable table, System.Threading.CancellationToken cancellationToken) { throw null; } + public System.Threading.Tasks.Task WriteToServerAsync(System.Data.IDataReader reader) { throw null; } + public System.Threading.Tasks.Task WriteToServerAsync(System.Data.IDataReader reader, System.Threading.CancellationToken cancellationToken) { throw null; } } public sealed partial class SqlBulkCopyColumnMapping { @@ -396,36 +174,61 @@ public static partial class SqlClientMetaDataCollectionNames public static readonly string ViewColumns; public static readonly string Views; } + [System.ComponentModel.DefaultEventAttribute("RecordsAffected")] + [System.ComponentModel.DesignerAttribute("Microsoft.VSDesigner.Data.VS.SqlCommandDesigner, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + [System.ComponentModel.ToolboxItemAttribute(true)] public sealed partial class SqlCommand : System.Data.Common.DbCommand, System.ICloneable { public SqlCommand() { } public SqlCommand(string cmdText) { } public SqlCommand(string cmdText, Microsoft.Data.SqlClient.SqlConnection connection) { } public SqlCommand(string cmdText, Microsoft.Data.SqlClient.SqlConnection connection, Microsoft.Data.SqlClient.SqlTransaction transaction) { } + [System.ComponentModel.DefaultValueAttribute("")] + [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.SQL.Design.SqlCommandTextEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public override string CommandText { get { throw null; } set { } } public override int CommandTimeout { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(1)] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public override System.Data.CommandType CommandType { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(null)] + [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.Design.DbConnectionEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public new Microsoft.Data.SqlClient.SqlConnection Connection { get { throw null; } set { } } protected override System.Data.Common.DbConnection DbConnection { get { throw null; } set { } } protected override System.Data.Common.DbParameterCollection DbParameterCollection { get { throw null; } } protected override System.Data.Common.DbTransaction DbTransaction { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DefaultValueAttribute(true)] + [System.ComponentModel.DesignOnlyAttribute(true)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override bool DesignTimeVisible { get { throw null; } set { } } public new Microsoft.Data.SqlClient.SqlParameterCollection Parameters { get { throw null; } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public new Microsoft.Data.SqlClient.SqlTransaction Transaction { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(3)] public override System.Data.UpdateRowSource UpdatedRowSource { get { throw null; } set { } } public event System.Data.StatementCompletedEventHandler StatementCompleted { add { } remove { } } + public System.IAsyncResult BeginExecuteNonQuery() { throw null; } + public System.IAsyncResult BeginExecuteNonQuery(System.AsyncCallback callback, object stateObject) { throw null; } + public System.IAsyncResult BeginExecuteReader() { throw null; } + public System.IAsyncResult BeginExecuteReader(System.AsyncCallback callback, object stateObject) { throw null; } + public System.IAsyncResult BeginExecuteReader(System.AsyncCallback callback, object stateObject, System.Data.CommandBehavior behavior) { throw null; } + public System.IAsyncResult BeginExecuteReader(System.Data.CommandBehavior behavior) { throw null; } + public System.IAsyncResult BeginExecuteXmlReader() { throw null; } + public System.IAsyncResult BeginExecuteXmlReader(System.AsyncCallback callback, object stateObject) { throw null; } public override void Cancel() { } object System.ICloneable.Clone() { throw null; } - public SqlCommand Clone() { throw null; } + public Microsoft.Data.SqlClient.SqlCommand Clone() { throw null; } protected override System.Data.Common.DbParameter CreateDbParameter() { throw null; } public new Microsoft.Data.SqlClient.SqlParameter CreateParameter() { throw null; } + public int EndExecuteNonQuery(System.IAsyncResult asyncResult) { throw null; } + public Microsoft.Data.SqlClient.SqlDataReader EndExecuteReader(System.IAsyncResult asyncResult) { throw null; } + public System.Xml.XmlReader EndExecuteXmlReader(System.IAsyncResult asyncResult) { throw null; } protected override System.Data.Common.DbDataReader ExecuteDbDataReader(System.Data.CommandBehavior behavior) { throw null; } protected override System.Threading.Tasks.Task ExecuteDbDataReaderAsync(System.Data.CommandBehavior behavior, System.Threading.CancellationToken cancellationToken) { throw null; } public override int ExecuteNonQuery() { throw null; } public override System.Threading.Tasks.Task ExecuteNonQueryAsync(System.Threading.CancellationToken cancellationToken) { throw null; } - public System.IAsyncResult BeginExecuteNonQuery() { throw null; } - public System.IAsyncResult BeginExecuteNonQuery(System.AsyncCallback callback, object stateObject) { throw null; } - public int EndExecuteNonQuery(System.IAsyncResult asyncResult) { throw null; } public new Microsoft.Data.SqlClient.SqlDataReader ExecuteReader() { throw null; } public new Microsoft.Data.SqlClient.SqlDataReader ExecuteReader(System.Data.CommandBehavior behavior) { throw null; } public new System.Threading.Tasks.Task ExecuteReaderAsync() { throw null; } @@ -437,73 +240,108 @@ public override void Cancel() { } public System.Xml.XmlReader ExecuteXmlReader() { throw null; } public System.Threading.Tasks.Task ExecuteXmlReaderAsync() { throw null; } public System.Threading.Tasks.Task ExecuteXmlReaderAsync(System.Threading.CancellationToken cancellationToken) { throw null; } - public System.IAsyncResult BeginExecuteXmlReader() { throw null; } - public System.IAsyncResult BeginExecuteXmlReader(System.AsyncCallback callback, object stateObject) { throw null; } - public System.Xml.XmlReader EndExecuteXmlReader(System.IAsyncResult asyncResult) { throw null; } - public System.IAsyncResult BeginExecuteReader() { throw null; } - public System.IAsyncResult BeginExecuteReader(System.AsyncCallback callback, object stateObject) { throw null; } - public System.IAsyncResult BeginExecuteReader(System.AsyncCallback callback, object stateObject, System.Data.CommandBehavior behavior) { throw null; } - public System.IAsyncResult BeginExecuteReader(System.Data.CommandBehavior behavior) { throw null; } - public Microsoft.Data.SqlClient.SqlDataReader EndExecuteReader(System.IAsyncResult asyncResult) { throw null; } public override void Prepare() { } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public Microsoft.Data.Sql.SqlNotificationRequest Notification { get { throw null; } set { } } + [System.ComponentModel.DesignerSerializationVisibilityAttribute(System.ComponentModel.DesignerSerializationVisibility.Content)] public void ResetCommandTimeout() { } } public sealed class SqlCommandBuilder : System.Data.Common.DbCommandBuilder { public SqlCommandBuilder() { } - public SqlCommandBuilder(SqlDataAdapter adapter) { } + public SqlCommandBuilder(Microsoft.Data.SqlClient.SqlDataAdapter adapter) { } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override System.Data.Common.CatalogLocation CatalogLocation { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override string CatalogSeparator { get { throw null; } set { } } - new public SqlDataAdapter DataAdapter { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(null)] + public new Microsoft.Data.SqlClient.SqlDataAdapter DataAdapter { get { throw null; } set { } } + public static void DeriveParameters(Microsoft.Data.SqlClient.SqlCommand command) { } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override string QuotePrefix { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override string QuoteSuffix { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override string SchemaSeparator { get { throw null; } set { } } - new public SqlCommand GetInsertCommand() { throw null; } - new public SqlCommand GetInsertCommand(bool useColumnsForParameterNames) { throw null; } - new public SqlCommand GetUpdateCommand() { throw null; } - new public SqlCommand GetUpdateCommand(bool useColumnsForParameterNames) { throw null; } - new public SqlCommand GetDeleteCommand() { throw null; } - new public SqlCommand GetDeleteCommand(bool useColumnsForParameterNames) { throw null; } protected override void ApplyParameterInfo(System.Data.Common.DbParameter parameter, System.Data.DataRow datarow, System.Data.StatementType statementType, bool whereClause) { } + public new Microsoft.Data.SqlClient.SqlCommand GetDeleteCommand() { throw null; } + public new Microsoft.Data.SqlClient.SqlCommand GetDeleteCommand(bool useColumnsForParameterNames) { throw null; } + public new Microsoft.Data.SqlClient.SqlCommand GetInsertCommand() { throw null; } + public new Microsoft.Data.SqlClient.SqlCommand GetInsertCommand(bool useColumnsForParameterNames) { throw null; } protected override string GetParameterName(int parameterOrdinal) { throw null; } protected override string GetParameterName(string parameterName) { throw null; } protected override string GetParameterPlaceholder(int parameterOrdinal) { throw null; } - public static void DeriveParameters(SqlCommand command) { } protected override System.Data.DataTable GetSchemaTable(System.Data.Common.DbCommand srcCommand) { throw null; } + public new Microsoft.Data.SqlClient.SqlCommand GetUpdateCommand() { throw null; } + public new Microsoft.Data.SqlClient.SqlCommand GetUpdateCommand(bool useColumnsForParameterNames) { throw null; } protected override System.Data.Common.DbCommand InitializeCommand(System.Data.Common.DbCommand command) { throw null; } public override string QuoteIdentifier(string unquotedIdentifier) { throw null; } protected override void SetRowUpdatingHandler(System.Data.Common.DbDataAdapter adapter) { } public override string UnquoteIdentifier(string quotedIdentifier) { throw null; } } + [System.ComponentModel.DefaultEventAttribute("InfoMessage")] public sealed partial class SqlConnection : System.Data.Common.DbConnection, System.ICloneable { public SqlConnection() { } public SqlConnection(string connectionString) { } public SqlConnection(string connectionString, Microsoft.Data.SqlClient.SqlCredential credential) { } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] + public string AccessToken { get { throw null; } set { } } + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public System.Guid ClientConnectionId { get { throw null; } } object System.ICloneable.Clone() { throw null; } + [System.ComponentModel.DefaultValueAttribute("")] + [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.SQL.Design.SqlConnectionStringEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] + [System.ComponentModel.SettingsBindableAttribute(true)] public override string ConnectionString { get { throw null; } set { } } + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public override int ConnectionTimeout { get { throw null; } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] + public Microsoft.Data.SqlClient.SqlCredential Credential { get { throw null; } set { } } + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public override string Database { get { throw null; } } + [System.ComponentModel.BrowsableAttribute(true)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public override string DataSource { get { throw null; } } public bool FireInfoMessageEventOnUserErrors { get { throw null; } set { } } + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public int PacketSize { get { throw null; } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public override string ServerVersion { get { throw null; } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public override System.Data.ConnectionState State { get { throw null; } } + [System.ComponentModel.DefaultValueAttribute(false)] public bool StatisticsEnabled { get { throw null; } set { } } + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public string WorkstationId { get { throw null; } } - public Microsoft.Data.SqlClient.SqlCredential Credential { get { throw null; } set { } } public event Microsoft.Data.SqlClient.SqlInfoMessageEventHandler InfoMessage { add { } remove { } } protected override System.Data.Common.DbTransaction BeginDbTransaction(System.Data.IsolationLevel isolationLevel) { throw null; } public new Microsoft.Data.SqlClient.SqlTransaction BeginTransaction() { throw null; } public new Microsoft.Data.SqlClient.SqlTransaction BeginTransaction(System.Data.IsolationLevel iso) { throw null; } public Microsoft.Data.SqlClient.SqlTransaction BeginTransaction(System.Data.IsolationLevel iso, string transactionName) { throw null; } public Microsoft.Data.SqlClient.SqlTransaction BeginTransaction(string transactionName) { throw null; } - public override void ChangeDatabase(string database) { } - public static void ClearAllPools() { } - public static void ClearPool(Microsoft.Data.SqlClient.SqlConnection connection) { } - public override void Close() { } + public override void ChangeDatabase(string database) { throw null; } + public static void ChangePassword(string connectionString, Microsoft.Data.SqlClient.SqlCredential credential, System.Security.SecureString newSecurePassword) { throw null; } + public static void ChangePassword(string connectionString, string newPassword) { throw null; } + public static void ClearAllPools() { throw null; } + public static void ClearPool(Microsoft.Data.SqlClient.SqlConnection connection) { throw null; } + public override void Close() { throw null; } public new Microsoft.Data.SqlClient.SqlCommand CreateCommand() { throw null; } protected override System.Data.Common.DbCommand CreateDbCommand() { throw null; } public override System.Data.DataTable GetSchema() { throw null; } @@ -513,46 +351,107 @@ public override void Open() { } public override System.Threading.Tasks.Task OpenAsync(System.Threading.CancellationToken cancellationToken) { throw null; } public void ResetStatistics() { } public System.Collections.IDictionary RetrieveStatistics() { throw null; } - public static void ChangePassword(string connectionString, string newPassword) { throw null; } - public static void ChangePassword(string connectionString, Microsoft.Data.SqlClient.SqlCredential credential, System.Security.SecureString newPassword) { throw null; } - public string AccessToken { get { throw null; } set { } } - } + [System.ComponentModel.DefaultPropertyAttribute("DataSource")] public sealed partial class SqlConnectionStringBuilder : System.Data.Common.DbConnectionStringBuilder { public SqlConnectionStringBuilder() { } public SqlConnectionStringBuilder(string connectionString) { } + [System.ComponentModel.DisplayNameAttribute("ApplicationIntent")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public Microsoft.Data.SqlClient.ApplicationIntent ApplicationIntent { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Application Name")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string ApplicationName { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("AttachDbFilename")] + [System.ComponentModel.EditorAttribute("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string AttachDBFilename { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Authentication")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] + public Microsoft.Data.SqlClient.SqlAuthenticationMethod Authentication { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("ConnectRetryCount")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public int ConnectRetryCount { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("ConnectRetryInterval")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public int ConnectRetryInterval { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Connect Timeout")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public int ConnectTimeout { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Current Language")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string CurrentLanguage { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Data Source")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string DataSource { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Encrypt")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool Encrypt { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Enlist")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool Enlist { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Failover Partner")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string FailoverPartner { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Initial Catalog")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string InitialCatalog { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Integrated Security")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool IntegratedSecurity { get { throw null; } set { } } + public override bool IsFixedSize { get { throw null; } } public override object this[string keyword] { get { throw null; } set { } } public override System.Collections.ICollection Keys { get { throw null; } } + [System.ComponentModel.DisplayNameAttribute("Load Balance Timeout")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public int LoadBalanceTimeout { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Max Pool Size")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public int MaxPoolSize { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Min Pool Size")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public int MinPoolSize { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("MultipleActiveResultSets")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool MultipleActiveResultSets { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("MultiSubnetFailover")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool MultiSubnetFailover { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Packet Size")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public int PacketSize { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Password")] + [System.ComponentModel.PasswordPropertyTextAttribute(true)] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string Password { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Persist Security Info")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool PersistSecurityInfo { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Pooling")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool Pooling { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Replication")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool Replication { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Transaction Binding")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string TransactionBinding { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("TrustServerCertificate")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool TrustServerCertificate { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("Type System Version")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string TypeSystemVersion { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("User ID")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string UserID { get { throw null; } set { } } + [System.ComponentModel.DisplayNameAttribute("User Instance")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public bool UserInstance { get { throw null; } set { } } public override System.Collections.ICollection Values { get { throw null; } } + [System.ComponentModel.DisplayNameAttribute("Workstation ID")] + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public string WorkstationID { get { throw null; } set { } } public override void Clear() { } public override bool ContainsKey(string keyword) { throw null; } @@ -560,109 +459,45 @@ public override void Clear() { } public override bool ShouldSerialize(string keyword) { throw null; } public override bool TryGetValue(string keyword, out object value) { throw null; } } - public sealed partial class SqlDataAdapter : System.Data.Common.DbDataAdapter, System.Data.IDbDataAdapter, System.ICloneable + public sealed class SqlCredential + { + public SqlCredential(string userId, System.Security.SecureString password) { } + public System.Security.SecureString Password { get { throw null; } } + public string UserId { get { throw null; } } + } + [System.ComponentModel.DefaultEventAttribute("RowUpdated")] + [System.ComponentModel.DesignerAttribute("Microsoft.VSDesigner.Data.VS.SqlDataAdapterDesigner, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + [System.ComponentModel.ToolboxItemAttribute("Microsoft.VSDesigner.Data.VS.SqlDataAdapterToolboxItem, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public sealed partial class SqlDataAdapter : System.Data.Common.DbDataAdapter, System.Data.IDataAdapter, System.Data.IDbDataAdapter, System.ICloneable { public SqlDataAdapter() { } - public SqlDataAdapter(SqlCommand selectCommand) { } + public SqlDataAdapter(Microsoft.Data.SqlClient.SqlCommand selectCommand) { } + public SqlDataAdapter(string selectCommandText, Microsoft.Data.SqlClient.SqlConnection selectConnection) { } public SqlDataAdapter(string selectCommandText, string selectConnectionString) { } - public SqlDataAdapter(string selectCommandText, SqlConnection selectConnection) { } - new public SqlCommand DeleteCommand { get { throw null; } set { } } - new public SqlCommand InsertCommand { get { throw null; } set { } } - new public SqlCommand SelectCommand { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(null)] + [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.Design.DBCommandEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public new Microsoft.Data.SqlClient.SqlCommand DeleteCommand { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(null)] + [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.Design.DBCommandEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public new Microsoft.Data.SqlClient.SqlCommand InsertCommand { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(null)] + [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.Design.DBCommandEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public new Microsoft.Data.SqlClient.SqlCommand SelectCommand { get { throw null; } set { } } System.Data.IDbCommand System.Data.IDbDataAdapter.DeleteCommand { get { throw null; } set { } } System.Data.IDbCommand System.Data.IDbDataAdapter.InsertCommand { get { throw null; } set { } } System.Data.IDbCommand System.Data.IDbDataAdapter.SelectCommand { get { throw null; } set { } } System.Data.IDbCommand System.Data.IDbDataAdapter.UpdateCommand { get { throw null; } set { } } - override public int UpdateBatchSize { get { throw null; } set { } } - new public SqlCommand UpdateCommand { get { throw null; } set { } } - public event SqlRowUpdatedEventHandler RowUpdated { add { } remove { } } - public event SqlRowUpdatingEventHandler RowUpdating { add { } remove { } } + public override int UpdateBatchSize { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(null)] + [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.Design.DBCommandEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public new Microsoft.Data.SqlClient.SqlCommand UpdateCommand { get { throw null; } set { } } + public event Microsoft.Data.SqlClient.SqlRowUpdatedEventHandler RowUpdated { add { } remove { } } + public event Microsoft.Data.SqlClient.SqlRowUpdatingEventHandler RowUpdating { add { } remove { } } protected override void OnRowUpdated(System.Data.Common.RowUpdatedEventArgs value) { } protected override void OnRowUpdating(System.Data.Common.RowUpdatingEventArgs value) { } object System.ICloneable.Clone() { throw null; } } - public sealed partial class SqlDependency - { - public SqlDependency() { } - public SqlDependency(SqlCommand command) { } - public SqlDependency(SqlCommand command, string options, int timeout) { } - public bool HasChanges { get { throw null; } } - public string Id { get { throw null; } } - public event OnChangeEventHandler OnChange { add { } remove { } } - public void AddCommandDependency(SqlCommand command) { } - public static bool Start(string connectionString) { throw null; } - public static bool Start(string connectionString, string queue) { throw null; } - public static bool Stop(string connectionString) { throw null; } - public static bool Stop(string connectionString, string queue) { throw null; } - } - public delegate void OnChangeEventHandler(object sender, SqlNotificationEventArgs e); - public partial class SqlNotificationEventArgs : System.EventArgs - { - public SqlNotificationEventArgs(SqlNotificationType type, SqlNotificationInfo info, SqlNotificationSource source) { } - public SqlNotificationType Type { get { throw null; } } - public SqlNotificationInfo Info { get { throw null; } } - public SqlNotificationSource Source { get { throw null; } } - } - public enum SqlNotificationInfo - { - Truncate = 0, - Insert = 1, - Update = 2, - Delete = 3, - Drop = 4, - Alter = 5, - Restart = 6, - Error = 7, - Query = 8, - Invalid = 9, - Options = 10, - Isolation = 11, - Expired = 12, - Resource = 13, - PreviousFire = 14, - TemplateLimit = 15, - Merge = 16, - Unknown = -1, - AlreadyChanged = -2 - } - public enum SqlNotificationSource - { - Data = 0, - Timeout = 1, - Object = 2, - Database = 3, - System = 4, - Statement = 5, - Environment = 6, - Execution = 7, - Owner = 8, - Unknown = -1, - Client = -2 - } - public enum SqlNotificationType - { - Change = 0, - Subscribe = 1, - Unknown = -1 - } - public sealed partial class SqlRowUpdatedEventArgs : System.Data.Common.RowUpdatedEventArgs - { - public SqlRowUpdatedEventArgs(System.Data.DataRow row, System.Data.IDbCommand command, System.Data.StatementType statementType, System.Data.Common.DataTableMapping tableMapping) - : base(row, command, statementType, tableMapping) { } - - new public SqlCommand Command { get { throw null; } } - } - public delegate void SqlRowUpdatedEventHandler(object sender, SqlRowUpdatedEventArgs e); - public sealed partial class SqlRowUpdatingEventArgs : System.Data.Common.RowUpdatingEventArgs - { - public SqlRowUpdatingEventArgs(System.Data.DataRow row, System.Data.IDbCommand command, System.Data.StatementType statementType, System.Data.Common.DataTableMapping tableMapping) - : base(row, command, statementType, tableMapping) { } - - new public SqlCommand Command { get { throw null; } set { } } - protected override System.Data.IDbCommand BaseCommand { get { throw null; } set { } } - } - public delegate void SqlRowUpdatingEventHandler(object sender, SqlRowUpdatingEventArgs e); - public partial class SqlDataReader : System.Data.Common.DbDataReader, System.IDisposable + public partial class SqlDataReader : System.Data.Common.DbDataReader, System.Data.IDataReader, System.IDisposable { internal SqlDataReader() { } protected Microsoft.Data.SqlClient.SqlConnection Connection { get { throw null; } } @@ -673,11 +508,13 @@ internal SqlDataReader() { } public override object this[int i] { get { throw null; } } public override object this[string name] { get { throw null; } } public override int RecordsAffected { get { throw null; } } - public Microsoft.Data.SqlClient.DataClassification.SensitivityClassification SensitivityClassification { get { throw null; } } + public Microsoft.Data.SqlClient.DataClassification.SensitivityClassification SensitivityClassification { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public override int VisibleFieldCount { get { throw null; } } + public override void Close() { } public override bool GetBoolean(int i) { throw null; } public override byte GetByte(int i) { throw null; } public override long GetBytes(int i, long dataIndex, byte[] buffer, int bufferIndex, int length) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override char GetChar(int i) { throw null; } public override long GetChars(int i, long dataIndex, char[] buffer, int bufferIndex, int length) { throw null; } public override string GetDataTypeName(int i) { throw null; } @@ -725,13 +562,29 @@ internal SqlDataReader() { } public override object GetValue(int i) { throw null; } public override int GetValues(object[] values) { throw null; } public virtual System.Xml.XmlReader GetXmlReader(int i) { throw null; } - public override bool IsDBNull(int i) { throw null; } protected internal bool IsCommandBehavior(System.Data.CommandBehavior condition) { throw null; } + public override bool IsDBNull(int i) { throw null; } public override System.Threading.Tasks.Task IsDBNullAsync(int i, System.Threading.CancellationToken cancellationToken) { throw null; } public override bool NextResult() { throw null; } public override System.Threading.Tasks.Task NextResultAsync(System.Threading.CancellationToken cancellationToken) { throw null; } public override bool Read() { throw null; } public override System.Threading.Tasks.Task ReadAsync(System.Threading.CancellationToken cancellationToken) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + System.Data.IDataReader System.Data.IDataRecord.GetData(int i) { throw null; } + } + public sealed partial class SqlDependency + { + public SqlDependency() { } + public SqlDependency(Microsoft.Data.SqlClient.SqlCommand command) { } + public SqlDependency(Microsoft.Data.SqlClient.SqlCommand command, string options, int timeout) { } + public bool HasChanges { get { throw null; } } + public string Id { get { throw null; } } + public event Microsoft.Data.SqlClient.OnChangeEventHandler OnChange { add { } remove { } } + public void AddCommandDependency(Microsoft.Data.SqlClient.SqlCommand command) { } + public static bool Start(string connectionString) { throw null; } + public static bool Start(string connectionString, string queue) { throw null; } + public static bool Stop(string connectionString) { throw null; } + public static bool Stop(string connectionString, string queue) { throw null; } } public sealed partial class SqlError { @@ -746,6 +599,7 @@ internal SqlError() { } public byte State { get { throw null; } } public override string ToString() { throw null; } } + [System.ComponentModel.ListBindableAttribute(false)] public sealed partial class SqlErrorCollection : System.Collections.ICollection, System.Collections.IEnumerable { internal SqlErrorCollection() { } @@ -762,6 +616,7 @@ public sealed partial class SqlException : System.Data.Common.DbException internal SqlException() { } public byte Class { get { throw null; } } public System.Guid ClientConnectionId { get { throw null; } } + [System.ComponentModel.DesignerSerializationVisibilityAttribute(System.ComponentModel.DesignerSerializationVisibility.Content)] public Microsoft.Data.SqlClient.SqlErrorCollection Errors { get { throw null; } } public int LineNumber { get { throw null; } } public int Number { get { throw null; } } @@ -769,6 +624,7 @@ internal SqlException() { } public string Server { get { throw null; } } public override string Source { get { throw null; } } public byte State { get { throw null; } } + [System.Security.Permissions.SecurityPermissionAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Flags = System.Security.Permissions.SecurityPermissionFlag.SerializationFormatter)] public override void GetObjectData(System.Runtime.Serialization.SerializationInfo si, System.Runtime.Serialization.StreamingContext context) { } public override string ToString() { throw null; } } @@ -781,33 +637,101 @@ internal SqlInfoMessageEventArgs() { } public override string ToString() { throw null; } } public delegate void SqlInfoMessageEventHandler(object sender, Microsoft.Data.SqlClient.SqlInfoMessageEventArgs e); - public sealed partial class SqlParameter : System.Data.Common.DbParameter, System.ICloneable, System.Data.IDataParameter, System.Data.IDbDataParameter + public partial class SqlNotificationEventArgs : System.EventArgs + { + public SqlNotificationEventArgs(Microsoft.Data.SqlClient.SqlNotificationType type, Microsoft.Data.SqlClient.SqlNotificationInfo info, Microsoft.Data.SqlClient.SqlNotificationSource source) { } + public Microsoft.Data.SqlClient.SqlNotificationInfo Info { get { throw null; } } + public Microsoft.Data.SqlClient.SqlNotificationSource Source { get { throw null; } } + public Microsoft.Data.SqlClient.SqlNotificationType Type { get { throw null; } } + } + public enum SqlNotificationInfo + { + AlreadyChanged = -2, + Alter = 5, + Delete = 3, + Drop = 4, + Error = 7, + Expired = 12, + Insert = 1, + Invalid = 9, + Isolation = 11, + Merge = 16, + Options = 10, + PreviousFire = 14, + Query = 8, + Resource = 13, + Restart = 6, + TemplateLimit = 15, + Truncate = 0, + Unknown = -1, + Update = 2 + } + public enum SqlNotificationSource + { + Client = -2, + Data = 0, + Database = 3, + Environment = 6, + Execution = 7, + Object = 2, + Owner = 8, + Statement = 5, + System = 4, + Timeout = 1, + Unknown = -1 + } + public enum SqlNotificationType + { + Change = 0, + Subscribe = 1, + Unknown = -1 + } + public sealed partial class SqlParameter : System.Data.Common.DbParameter, System.Data.IDataParameter, System.Data.IDbDataParameter, System.ICloneable { public SqlParameter() { } public SqlParameter(string parameterName, System.Data.SqlDbType dbType) { } public SqlParameter(string parameterName, System.Data.SqlDbType dbType, int size) { } - public SqlParameter(string parameterName, System.Data.SqlDbType dbType, int size, string sourceColumn) { } - public SqlParameter(string parameterName, object value) { } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] public SqlParameter(string parameterName, System.Data.SqlDbType dbType, int size, System.Data.ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, System.Data.DataRowVersion sourceVersion, object value) { } public SqlParameter(string parameterName, System.Data.SqlDbType dbType, int size, System.Data.ParameterDirection direction, byte precision, byte scale, string sourceColumn, System.Data.DataRowVersion sourceVersion, bool sourceColumnNullMapping, object value, string xmlSchemaCollectionDatabase, string xmlSchemaCollectionOwningSchema, string xmlSchemaCollectionName) { } + public SqlParameter(string parameterName, System.Data.SqlDbType dbType, int size, string sourceColumn) { } + public SqlParameter(string parameterName, object value) { } object System.ICloneable.Clone() { throw null; } + [System.ComponentModel.BrowsableAttribute(false)] public System.Data.SqlTypes.SqlCompareOptions CompareInfo { get { throw null; } set { } } public override System.Data.DbType DbType { get { throw null; } set { } } + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] public override System.Data.ParameterDirection Direction { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(false)] public override bool IsNullable { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] public int LocaleId { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] public int Offset { get { throw null; } set { } } public override string ParameterName { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute((byte)0)] public new byte Precision { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute((byte)0)] public new byte Scale { get { throw null; } set { } } public override int Size { get { throw null; } set { } } public override string SourceColumn { get { throw null; } set { } } public override bool SourceColumnNullMapping { get { throw null; } set { } } public override System.Data.DataRowVersion SourceVersion { get { throw null; } set { } } + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] + [System.Data.Common.DbProviderSpecificTypePropertyAttribute(true)] public System.Data.SqlDbType SqlDbType { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public object SqlValue { get { throw null; } set { } } - public string UdtTypeName { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] public string TypeName { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public string UdtTypeName { get { throw null; } set { } } + [System.ComponentModel.RefreshPropertiesAttribute(System.ComponentModel.RefreshProperties.All)] + [System.ComponentModel.TypeConverterAttribute(typeof(System.ComponentModel.StringConverter))] public override object Value { get { throw null; } set { } } public string XmlSchemaCollectionDatabase { get { throw null; } set { } } public string XmlSchemaCollectionName { get { throw null; } set { } } @@ -816,22 +740,29 @@ public override void ResetDbType() { } public void ResetSqlDbType() { } public override string ToString() { throw null; } } + [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.Design.DBParametersEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + [System.ComponentModel.ListBindableAttribute(false)] public sealed partial class SqlParameterCollection : System.Data.Common.DbParameterCollection { internal SqlParameterCollection() { } public override int Count { get { throw null; } } public override bool IsFixedSize { get { throw null; } } public override bool IsReadOnly { get { throw null; } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public new Microsoft.Data.SqlClient.SqlParameter this[int index] { get { throw null; } set { } } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public new Microsoft.Data.SqlClient.SqlParameter this[string parameterName] { get { throw null; } set { } } public override object SyncRoot { get { throw null; } } public Microsoft.Data.SqlClient.SqlParameter Add(Microsoft.Data.SqlClient.SqlParameter value) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override int Add(object value) { throw null; } public Microsoft.Data.SqlClient.SqlParameter Add(string parameterName, System.Data.SqlDbType sqlDbType) { throw null; } public Microsoft.Data.SqlClient.SqlParameter Add(string parameterName, System.Data.SqlDbType sqlDbType, int size) { throw null; } public Microsoft.Data.SqlClient.SqlParameter Add(string parameterName, System.Data.SqlDbType sqlDbType, int size, string sourceColumn) { throw null; } - public override void AddRange(System.Array values) { } public void AddRange(Microsoft.Data.SqlClient.SqlParameter[] values) { } + public override void AddRange(System.Array values) { } public Microsoft.Data.SqlClient.SqlParameter AddWithValue(string parameterName, object value) { throw null; } public override void Clear() { } public bool Contains(Microsoft.Data.SqlClient.SqlParameter value) { throw null; } @@ -861,6 +792,21 @@ public SqlRowsCopiedEventArgs(long rowsCopied) { } public long RowsCopied { get { throw null; } } } public delegate void SqlRowsCopiedEventHandler(object sender, Microsoft.Data.SqlClient.SqlRowsCopiedEventArgs e); + public sealed partial class SqlRowUpdatedEventArgs : System.Data.Common.RowUpdatedEventArgs + { + public SqlRowUpdatedEventArgs(System.Data.DataRow row, System.Data.IDbCommand command, System.Data.StatementType statementType, System.Data.Common.DataTableMapping tableMapping) + : base(row, command, statementType, tableMapping) { } + public new Microsoft.Data.SqlClient.SqlCommand Command { get { throw null; } } + } + public delegate void SqlRowUpdatedEventHandler(object sender, Microsoft.Data.SqlClient.SqlRowUpdatedEventArgs e); + public sealed partial class SqlRowUpdatingEventArgs : System.Data.Common.RowUpdatingEventArgs + { + public SqlRowUpdatingEventArgs(System.Data.DataRow row, System.Data.IDbCommand command, System.Data.StatementType statementType, System.Data.Common.DataTableMapping tableMapping) + : base(row, command, statementType, tableMapping) { } + protected override System.Data.IDbCommand BaseCommand { get { throw null; } set { } } + public new Microsoft.Data.SqlClient.SqlCommand Command { get { throw null; } set { } } + } + public delegate void SqlRowUpdatingEventHandler(object sender, Microsoft.Data.SqlClient.SqlRowUpdatingEventArgs e); public sealed partial class SqlTransaction : System.Data.Common.DbTransaction { internal SqlTransaction() { } @@ -873,12 +819,234 @@ public override void Rollback() { } public void Rollback(string transactionName) { } public void Save(string savePointName) { } } +} +namespace Microsoft.Data.SqlClient.Server +{ + public enum DataAccessKind + { + None = 0, + Read = 1 + } + public enum Format + { + Unknown = 0, + Native = 1, + UserDefined = 2 + } + public interface IBinarySerialize + { + void Read(System.IO.BinaryReader r); + void Write(System.IO.BinaryWriter w); + } + public sealed partial class InvalidUdtException : System.SystemException + { + internal InvalidUdtException() { } + } + public partial class SqlDataRecord : System.Data.IDataRecord + { + public SqlDataRecord(params Microsoft.Data.SqlClient.Server.SqlMetaData[] metaData) { } + public virtual int FieldCount { get { throw null; } } + public virtual object this[int ordinal] { get { throw null; } } + public virtual object this[string name] { get { throw null; } } + public virtual bool GetBoolean(int ordinal) { throw null; } + public virtual byte GetByte(int ordinal) { throw null; } + public virtual long GetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { throw null; } + public virtual char GetChar(int ordinal) { throw null; } + public virtual long GetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { throw null; } + System.Data.IDataReader System.Data.IDataRecord.GetData(int ordinal) { throw null; } + public virtual string GetDataTypeName(int ordinal) { throw null; } + public virtual System.DateTime GetDateTime(int ordinal) { throw null; } + public virtual System.DateTimeOffset GetDateTimeOffset(int ordinal) { throw null; } + public virtual decimal GetDecimal(int ordinal) { throw null; } + public virtual double GetDouble(int ordinal) { throw null; } + public virtual System.Type GetFieldType(int ordinal) { throw null; } + public virtual float GetFloat(int ordinal) { throw null; } + public virtual System.Guid GetGuid(int ordinal) { throw null; } + public virtual short GetInt16(int ordinal) { throw null; } + public virtual int GetInt32(int ordinal) { throw null; } + public virtual long GetInt64(int ordinal) { throw null; } + public virtual string GetName(int ordinal) { throw null; } + public virtual int GetOrdinal(string name) { throw null; } + public virtual System.Data.SqlTypes.SqlBinary GetSqlBinary(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlBoolean GetSqlBoolean(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlByte GetSqlByte(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlBytes GetSqlBytes(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlChars GetSqlChars(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlDateTime GetSqlDateTime(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlDecimal GetSqlDecimal(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlDouble GetSqlDouble(int ordinal) { throw null; } + public virtual System.Type GetSqlFieldType(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlGuid GetSqlGuid(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlInt16 GetSqlInt16(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlInt32 GetSqlInt32(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlInt64 GetSqlInt64(int ordinal) { throw null; } + public virtual Microsoft.Data.SqlClient.Server.SqlMetaData GetSqlMetaData(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlMoney GetSqlMoney(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlSingle GetSqlSingle(int ordinal) { throw null; } + public virtual System.Data.SqlTypes.SqlString GetSqlString(int ordinal) { throw null; } + public virtual object GetSqlValue(int ordinal) { throw null; } + public virtual int GetSqlValues(object[] values) { throw null; } + public virtual System.Data.SqlTypes.SqlXml GetSqlXml(int ordinal) { throw null; } + public virtual string GetString(int ordinal) { throw null; } + public virtual System.TimeSpan GetTimeSpan(int ordinal) { throw null; } + public virtual object GetValue(int ordinal) { throw null; } + public virtual int GetValues(object[] values) { throw null; } + public virtual bool IsDBNull(int ordinal) { throw null; } + public virtual void SetBoolean(int ordinal, bool value) { } + public virtual void SetByte(int ordinal, byte value) { } + public virtual void SetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length) { } + public virtual void SetChar(int ordinal, char value) { } + public virtual void SetChars(int ordinal, long fieldOffset, char[] buffer, int bufferOffset, int length) { } + public virtual void SetDateTime(int ordinal, System.DateTime value) { } + public virtual void SetDateTimeOffset(int ordinal, System.DateTimeOffset value) { } + public virtual void SetDBNull(int ordinal) { } + public virtual void SetDecimal(int ordinal, decimal value) { } + public virtual void SetDouble(int ordinal, double value) { } + public virtual void SetFloat(int ordinal, float value) { } + public virtual void SetGuid(int ordinal, System.Guid value) { } + public virtual void SetInt16(int ordinal, short value) { } + public virtual void SetInt32(int ordinal, int value) { } + public virtual void SetInt64(int ordinal, long value) { } + public virtual void SetSqlBinary(int ordinal, System.Data.SqlTypes.SqlBinary value) { } + public virtual void SetSqlBoolean(int ordinal, System.Data.SqlTypes.SqlBoolean value) { } + public virtual void SetSqlByte(int ordinal, System.Data.SqlTypes.SqlByte value) { } + public virtual void SetSqlBytes(int ordinal, System.Data.SqlTypes.SqlBytes value) { } + public virtual void SetSqlChars(int ordinal, System.Data.SqlTypes.SqlChars value) { } + public virtual void SetSqlDateTime(int ordinal, System.Data.SqlTypes.SqlDateTime value) { } + public virtual void SetSqlDecimal(int ordinal, System.Data.SqlTypes.SqlDecimal value) { } + public virtual void SetSqlDouble(int ordinal, System.Data.SqlTypes.SqlDouble value) { } + public virtual void SetSqlGuid(int ordinal, System.Data.SqlTypes.SqlGuid value) { } + public virtual void SetSqlInt16(int ordinal, System.Data.SqlTypes.SqlInt16 value) { } + public virtual void SetSqlInt32(int ordinal, System.Data.SqlTypes.SqlInt32 value) { } + public virtual void SetSqlInt64(int ordinal, System.Data.SqlTypes.SqlInt64 value) { } + public virtual void SetSqlMoney(int ordinal, System.Data.SqlTypes.SqlMoney value) { } + public virtual void SetSqlSingle(int ordinal, System.Data.SqlTypes.SqlSingle value) { } + public virtual void SetSqlString(int ordinal, System.Data.SqlTypes.SqlString value) { } + public virtual void SetSqlXml(int ordinal, System.Data.SqlTypes.SqlXml value) { } + public virtual void SetString(int ordinal, string value) { } + public virtual void SetTimeSpan(int ordinal, System.TimeSpan value) { } + public virtual void SetValue(int ordinal, object value) { } + public virtual int SetValues(params object[] values) { throw null; } + } + [System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = false, Inherited = false), System.SerializableAttribute] + public partial class SqlFunctionAttribute : System.Attribute + { + public SqlFunctionAttribute() { } + public bool IsDeterministic { get { throw null; } set { } } + public DataAccessKind DataAccess { get { throw null; } set { } } + public SystemDataAccessKind SystemDataAccess { get { throw null; } set { } } + public bool IsPrecise { get { throw null; } set { } } + public string Name { get { throw null; } set { } } + public string TableDefinition { get { throw null; } set { } } + public string FillRowMethodName { get { throw null; } set { } } + } + public sealed partial class SqlMetaData + { + public SqlMetaData(string name, System.Data.SqlDbType dbType) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, byte precision, byte scale) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, byte precision, byte scale, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, byte precision, byte scale, long locale, System.Data.SqlTypes.SqlCompareOptions compareOptions, System.Type userDefinedType) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, byte precision, byte scale, long localeId, System.Data.SqlTypes.SqlCompareOptions compareOptions, System.Type userDefinedType, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, long locale, System.Data.SqlTypes.SqlCompareOptions compareOptions) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, long maxLength, long locale, System.Data.SqlTypes.SqlCompareOptions compareOptions, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, string database, string owningSchema, string objectName) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, string database, string owningSchema, string objectName, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, System.Type userDefinedType) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, System.Type userDefinedType, string serverTypeName) { } + public SqlMetaData(string name, System.Data.SqlDbType dbType, System.Type userDefinedType, string serverTypeName, bool useServerDefault, bool isUniqueKey, Microsoft.Data.SqlClient.SortOrder columnSortOrder, int sortOrdinal) { } - public sealed class SqlCredential + public System.Data.SqlTypes.SqlCompareOptions CompareOptions { get { throw null; } } + public System.Data.DbType DbType { get { throw null; } } + public bool IsUniqueKey { get { throw null; } } + public long LocaleId { get { throw null; } } + public static long Max { get { throw null; } } + public long MaxLength { get { throw null; } } + public string Name { get { throw null; } } + public byte Precision { get { throw null; } } + public byte Scale { get { throw null; } } + public Microsoft.Data.SqlClient.SortOrder SortOrder { get { throw null; } } + public int SortOrdinal { get { throw null; } } + public System.Data.SqlDbType SqlDbType { get { throw null; } } + public System.Type Type { get { throw null; } } + public string TypeName { get { throw null; } } + public bool UseServerDefault { get { throw null; } } + public string XmlSchemaCollectionDatabase { get { throw null; } } + public string XmlSchemaCollectionName { get { throw null; } } + public string XmlSchemaCollectionOwningSchema { get { throw null; } } + public bool Adjust(bool value) { throw null; } + public byte Adjust(byte value) { throw null; } + public byte[] Adjust(byte[] value) { throw null; } + public char Adjust(char value) { throw null; } + public char[] Adjust(char[] value) { throw null; } + public System.Data.SqlTypes.SqlBinary Adjust(System.Data.SqlTypes.SqlBinary value) { throw null; } + public System.Data.SqlTypes.SqlBoolean Adjust(System.Data.SqlTypes.SqlBoolean value) { throw null; } + public System.Data.SqlTypes.SqlByte Adjust(System.Data.SqlTypes.SqlByte value) { throw null; } + public System.Data.SqlTypes.SqlBytes Adjust(System.Data.SqlTypes.SqlBytes value) { throw null; } + public System.Data.SqlTypes.SqlChars Adjust(System.Data.SqlTypes.SqlChars value) { throw null; } + public System.Data.SqlTypes.SqlDateTime Adjust(System.Data.SqlTypes.SqlDateTime value) { throw null; } + public System.Data.SqlTypes.SqlDecimal Adjust(System.Data.SqlTypes.SqlDecimal value) { throw null; } + public System.Data.SqlTypes.SqlDouble Adjust(System.Data.SqlTypes.SqlDouble value) { throw null; } + public System.Data.SqlTypes.SqlGuid Adjust(System.Data.SqlTypes.SqlGuid value) { throw null; } + public System.Data.SqlTypes.SqlInt16 Adjust(System.Data.SqlTypes.SqlInt16 value) { throw null; } + public System.Data.SqlTypes.SqlInt32 Adjust(System.Data.SqlTypes.SqlInt32 value) { throw null; } + public System.Data.SqlTypes.SqlInt64 Adjust(System.Data.SqlTypes.SqlInt64 value) { throw null; } + public System.Data.SqlTypes.SqlMoney Adjust(System.Data.SqlTypes.SqlMoney value) { throw null; } + public System.Data.SqlTypes.SqlSingle Adjust(System.Data.SqlTypes.SqlSingle value) { throw null; } + public System.Data.SqlTypes.SqlString Adjust(System.Data.SqlTypes.SqlString value) { throw null; } + public System.Data.SqlTypes.SqlXml Adjust(System.Data.SqlTypes.SqlXml value) { throw null; } + public System.DateTime Adjust(System.DateTime value) { throw null; } + public System.DateTimeOffset Adjust(System.DateTimeOffset value) { throw null; } + public decimal Adjust(decimal value) { throw null; } + public double Adjust(double value) { throw null; } + public System.Guid Adjust(System.Guid value) { throw null; } + public short Adjust(short value) { throw null; } + public int Adjust(int value) { throw null; } + public long Adjust(long value) { throw null; } + public object Adjust(object value) { throw null; } + public float Adjust(float value) { throw null; } + public string Adjust(string value) { throw null; } + public System.TimeSpan Adjust(System.TimeSpan value) { throw null; } + public static Microsoft.Data.SqlClient.Server.SqlMetaData InferFromValue(object value, string name) { throw null; } + } + [System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = false, Inherited = false), System.SerializableAttribute] + public sealed partial class SqlMethodAttribute : SqlFunctionAttribute { - public SqlCredential(string userId, System.Security.SecureString password) { } - public string UserId { get { throw null; } } - public System.Security.SecureString Password { get { throw null; } } + public SqlMethodAttribute() { } + public bool OnNullCall { get { throw null; } set { } } + public bool IsMutator { get { throw null; } set { } } + public bool InvokeIfReceiverIsNull { get { throw null; } set { } } + } + [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple = false, Inherited = false)] + public sealed partial class SqlUserDefinedAggregateAttribute : System.Attribute + { + public const int MaxByteSizeValue = 8000; + public SqlUserDefinedAggregateAttribute(Format format) { } + public int MaxByteSize { get { throw null; } set { } } + public bool IsInvariantToDuplicates { get { throw null; } set { } } + public bool IsInvariantToNulls { get { throw null; } set { } } + public bool IsInvariantToOrder { get { throw null; } set { } } + public bool IsNullIfEmpty { get { throw null; } set { } } + public Format Format { get { throw null; } } + public string Name { get { throw null; } set { } } + } + [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple = false, Inherited = true)] + public sealed partial class SqlUserDefinedTypeAttribute : System.Attribute + { + public SqlUserDefinedTypeAttribute(Format format) { } + public int MaxByteSize { get { throw null; } set { } } + public bool IsFixedLength { get { throw null; } set { } } + public bool IsByteOrdered { get { throw null; } set { } } + public Format Format { get { throw null; } } + public string ValidationMethodName { get { throw null; } set { } } + public string Name { get { throw null; } set { } } + } + public enum SystemDataAccessKind + { + None = 0, + Read = 1 } } namespace Microsoft.Data.SqlClient.DataClassification @@ -913,11 +1081,4 @@ public SensitivityProperty(Microsoft.Data.SqlClient.DataClassification.Label lab public Microsoft.Data.SqlClient.DataClassification.InformationType InformationType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public Microsoft.Data.SqlClient.DataClassification.Label Label { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } } -} -namespace Microsoft.Data -{ - public sealed partial class OperationAbortedException : System.SystemException - { - internal OperationAbortedException() { } - } } \ No newline at end of file diff --git a/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs index 2fed5a5fd6..89302df067 100644 --- a/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netfx/ref/Microsoft.Data.SqlClient.cs @@ -25,7 +25,7 @@ namespace Microsoft.Data.SqlClient public enum ApplicationIntent { ReadOnly = 1, - ReadWrite = 0, + ReadWrite = 0 } public delegate void OnChangeEventHandler(object sender, Microsoft.Data.SqlClient.SqlNotificationEventArgs e); public enum PoolBlockingPeriod @@ -38,7 +38,7 @@ public enum SortOrder { Ascending = 0, Descending = 1, - Unspecified = -1, + Unspecified = -1 } public abstract partial class SqlAuthenticationInitializer { @@ -51,7 +51,7 @@ public enum SqlAuthenticationMethod ActiveDirectoryInteractive = 4, ActiveDirectoryPassword = 2, NotSpecified = 0, - SqlPassword = 1, + SqlPassword = 1 } public partial class SqlAuthenticationParameters { @@ -97,9 +97,9 @@ public event Microsoft.Data.SqlClient.SqlRowsCopiedEventHandler SqlRowsCopied { public void Close() { } void System.IDisposable.Dispose() { } public void WriteToServer(System.Data.Common.DbDataReader reader) { } - public void WriteToServer(System.Data.DataRow[] rows) { } public void WriteToServer(System.Data.DataTable table) { } public void WriteToServer(System.Data.DataTable table, System.Data.DataRowState rowState) { } + public void WriteToServer(System.Data.DataRow[] rows) { } public void WriteToServer(System.Data.IDataReader reader) { } public System.Threading.Tasks.Task WriteToServerAsync(System.Data.Common.DbDataReader reader) { throw null; } public System.Threading.Tasks.Task WriteToServerAsync(System.Data.Common.DbDataReader reader, System.Threading.CancellationToken cancellationToken) { throw null; } @@ -283,12 +283,6 @@ public SqlCommand(string cmdText, Microsoft.Data.SqlClient.SqlConnection connect [System.ComponentModel.DesignOnlyAttribute(true)] [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override bool DesignTimeVisible { get { throw null; } set { } } - [System.ComponentModel.BrowsableAttribute(false)] - [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] - public Microsoft.Data.Sql.SqlNotificationRequest Notification { get { throw null; } set { } } - [System.ComponentModel.DefaultValueAttribute(true)] - public bool NotificationAutoEnlist { get { throw null; } set { } } - [System.ComponentModel.DesignerSerializationVisibilityAttribute(System.ComponentModel.DesignerSerializationVisibility.Content)] public new Microsoft.Data.SqlClient.SqlParameterCollection Parameters { get { throw null; } } [System.ComponentModel.BrowsableAttribute(false)] [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] @@ -313,6 +307,7 @@ public event System.Data.StatementCompletedEventHandler StatementCompleted { add [System.Security.Permissions.HostProtectionAttribute(System.Security.Permissions.SecurityAction.LinkDemand, ExternalThreading = true)] public System.IAsyncResult BeginExecuteXmlReader(System.AsyncCallback callback, object stateObject) { throw null; } public override void Cancel() { } + object System.ICloneable.Clone() { throw null; } public Microsoft.Data.SqlClient.SqlCommand Clone() { throw null; } protected override System.Data.Common.DbParameter CreateDbParameter() { throw null; } public new Microsoft.Data.SqlClient.SqlParameter CreateParameter() { throw null; } @@ -336,10 +331,15 @@ protected override void Dispose(bool disposing) { } public System.Threading.Tasks.Task ExecuteXmlReaderAsync() { throw null; } public System.Threading.Tasks.Task ExecuteXmlReaderAsync(System.Threading.CancellationToken cancellationToken) { throw null; } public override void Prepare() { } + [System.ComponentModel.BrowsableAttribute(false)] + [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] + public Microsoft.Data.Sql.SqlNotificationRequest Notification { get { throw null; } set { } } + [System.ComponentModel.DefaultValueAttribute(true)] + public bool NotificationAutoEnlist { get { throw null; } set { } } + [System.ComponentModel.DesignerSerializationVisibilityAttribute(System.ComponentModel.DesignerSerializationVisibility.Content)] public void ResetCommandTimeout() { } - object System.ICloneable.Clone() { throw null; } } - public sealed partial class SqlCommandBuilder : System.Data.Common.DbCommandBuilder + public sealed class SqlCommandBuilder : System.Data.Common.DbCommandBuilder { public SqlCommandBuilder() { } public SqlCommandBuilder(Microsoft.Data.SqlClient.SqlDataAdapter adapter) { } @@ -353,6 +353,7 @@ public SqlCommandBuilder(Microsoft.Data.SqlClient.SqlDataAdapter adapter) { } public override string CatalogSeparator { get { throw null; } set { } } [System.ComponentModel.DefaultValueAttribute(null)] public new Microsoft.Data.SqlClient.SqlDataAdapter DataAdapter { get { throw null; } set { } } + public static void DeriveParameters(Microsoft.Data.SqlClient.SqlCommand command) { } [System.ComponentModel.BrowsableAttribute(false)] [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] @@ -366,7 +367,6 @@ public SqlCommandBuilder(Microsoft.Data.SqlClient.SqlDataAdapter adapter) { } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override string SchemaSeparator { get { throw null; } set { } } protected override void ApplyParameterInfo(System.Data.Common.DbParameter parameter, System.Data.DataRow datarow, System.Data.StatementType statementType, bool whereClause) { } - public static void DeriveParameters(Microsoft.Data.SqlClient.SqlCommand command) { } public new Microsoft.Data.SqlClient.SqlCommand GetDeleteCommand() { throw null; } public new Microsoft.Data.SqlClient.SqlCommand GetDeleteCommand(bool useColumnsForParameterNames) { throw null; } public new Microsoft.Data.SqlClient.SqlCommand GetInsertCommand() { throw null; } @@ -400,6 +400,7 @@ public SqlConnection(string connectionString, Microsoft.Data.SqlClient.SqlCreden public string AccessToken { get { throw null; } set { } } [System.ComponentModel.DesignerSerializationVisibilityAttribute(0)] public System.Guid ClientConnectionId { get { throw null; } } + object System.ICloneable.Clone() { throw null; } [System.ComponentModel.DefaultValueAttribute(null)] public static System.TimeSpan ColumnEncryptionKeyCacheTtl { get { throw null; } set { } } [System.ComponentModel.DefaultValueAttribute(null)] @@ -460,7 +461,6 @@ public override void Open() { } public static void RegisterColumnEncryptionKeyStoreProviders(System.Collections.Generic.IDictionary customProviders) { } public void ResetStatistics() { } public System.Collections.IDictionary RetrieveStatistics() { throw null; } - object System.ICloneable.Clone() { throw null; } } public enum SqlConnectionColumnEncryptionSetting { @@ -600,7 +600,7 @@ public override void Clear() { } public override bool ShouldSerialize(string keyword) { throw null; } public override bool TryGetValue(string keyword, out object value) { throw null; } } - public sealed partial class SqlCredential + public sealed class SqlCredential { public SqlCredential(string userId, System.Security.SecureString password) { } public System.Security.SecureString Password { get { throw null; } } @@ -674,8 +674,8 @@ public override void Close() { } public override double GetDouble(int i) { throw null; } public override System.Collections.IEnumerator GetEnumerator() { throw null; } public override System.Type GetFieldType(int i) { throw null; } - public override System.Threading.Tasks.Task GetFieldValueAsync(int i, System.Threading.CancellationToken cancellationToken) { throw null; } public override T GetFieldValue(int i) { throw null; } + public override System.Threading.Tasks.Task GetFieldValueAsync(int i, System.Threading.CancellationToken cancellationToken) { throw null; } public override float GetFloat(int i) { throw null; } public override System.Guid GetGuid(int i) { throw null; } public override short GetInt16(int i) { throw null; } @@ -686,7 +686,6 @@ public override void Close() { } public override System.Type GetProviderSpecificFieldType(int i) { throw null; } public override object GetProviderSpecificValue(int i) { throw null; } public override int GetProviderSpecificValues(object[] values) { throw null; } - public override System.Data.DataTable GetSchemaTable() { throw null; } public virtual System.Data.SqlTypes.SqlBinary GetSqlBinary(int i) { throw null; } public virtual System.Data.SqlTypes.SqlBoolean GetSqlBoolean(int i) { throw null; } public virtual System.Data.SqlTypes.SqlByte GetSqlByte(int i) { throw null; } @@ -705,6 +704,7 @@ public override void Close() { } public virtual object GetSqlValue(int i) { throw null; } public virtual int GetSqlValues(object[] values) { throw null; } public virtual System.Data.SqlTypes.SqlXml GetSqlXml(int i) { throw null; } + public override System.Data.DataTable GetSchemaTable() { throw null; } public override System.IO.Stream GetStream(int i) { throw null; } public override string GetString(int i) { throw null; } public override System.IO.TextReader GetTextReader(int i) { throw null; } @@ -785,8 +785,8 @@ internal SqlErrorCollection() { } public Microsoft.Data.SqlClient.SqlError this[int index] { get { throw null; } } bool System.Collections.ICollection.IsSynchronized { get { throw null; } } object System.Collections.ICollection.SyncRoot { get { throw null; } } - public void CopyTo(Microsoft.Data.SqlClient.SqlError[] array, int index) { } public void CopyTo(System.Array array, int index) { } + public void CopyTo(Microsoft.Data.SqlClient.SqlError[] array, int index) { } public System.Collections.IEnumerator GetEnumerator() { throw null; } } public sealed partial class SqlException : System.Data.Common.DbException @@ -842,7 +842,7 @@ public enum SqlNotificationInfo TemplateLimit = 15, Truncate = 0, Unknown = -1, - Update = 2, + Update = 2 } public enum SqlNotificationSource { @@ -856,13 +856,13 @@ public enum SqlNotificationSource Statement = 5, System = 4, Timeout = 1, - Unknown = -1, + Unknown = -1 } public enum SqlNotificationType { Change = 0, Subscribe = 1, - Unknown = -1, + Unknown = -1 } public sealed partial class SqlParameter : System.Data.Common.DbParameter, System.Data.IDataParameter, System.Data.IDbDataParameter, System.ICloneable { @@ -874,6 +874,7 @@ public SqlParameter(string parameterName, System.Data.SqlDbType dbType, int size public SqlParameter(string parameterName, System.Data.SqlDbType dbType, int size, System.Data.ParameterDirection direction, byte precision, byte scale, string sourceColumn, System.Data.DataRowVersion sourceVersion, bool sourceColumnNullMapping, object value, string xmlSchemaCollectionDatabase, string xmlSchemaCollectionOwningSchema, string xmlSchemaCollectionName) { } public SqlParameter(string parameterName, System.Data.SqlDbType dbType, int size, string sourceColumn) { } public SqlParameter(string parameterName, object value) { } + object System.ICloneable.Clone() { throw null; } [System.ComponentModel.BrowsableAttribute(false)] public System.Data.SqlTypes.SqlCompareOptions CompareInfo { get { throw null; } set { } } public override System.Data.DbType DbType { get { throw null; } set { } } @@ -916,7 +917,6 @@ public SqlParameter(string parameterName, object value) { } public string XmlSchemaCollectionOwningSchema { get { throw null; } set { } } public override void ResetDbType() { } public void ResetSqlDbType() { } - object System.ICloneable.Clone() { throw null; } public override string ToString() { throw null; } } [System.ComponentModel.EditorAttribute("Microsoft.VSDesigner.Data.Design.DBParametersEditor, Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] @@ -951,8 +951,8 @@ public override void Clear() { } public bool Contains(Microsoft.Data.SqlClient.SqlParameter value) { throw null; } public override bool Contains(object value) { throw null; } public override bool Contains(string value) { throw null; } - public void CopyTo(Microsoft.Data.SqlClient.SqlParameter[] array, int index) { } public override void CopyTo(System.Array array, int index) { } + public void CopyTo(Microsoft.Data.SqlClient.SqlParameter[] array, int index) { } public override System.Collections.IEnumerator GetEnumerator() { throw null; } protected override System.Data.Common.DbParameter GetParameter(int index) { throw null; } protected override System.Data.Common.DbParameter GetParameter(string parameterName) { throw null; } @@ -984,7 +984,7 @@ public SqlRowUpdatedEventArgs(System.Data.DataRow row, System.Data.IDbCommand co public delegate void SqlRowUpdatedEventHandler(object sender, Microsoft.Data.SqlClient.SqlRowUpdatedEventArgs e); public sealed partial class SqlRowUpdatingEventArgs : System.Data.Common.RowUpdatingEventArgs { - public SqlRowUpdatingEventArgs(System.Data.DataRow row, System.Data.IDbCommand command, System.Data.StatementType statementType, System.Data.Common.DataTableMapping tableMapping) + public SqlRowUpdatingEventArgs(System.Data.DataRow row, System.Data.IDbCommand command, System.Data.StatementType statementType, System.Data.Common.DataTableMapping tableMapping) : base(row, command, statementType, tableMapping) { } protected override System.Data.IDbCommand BaseCommand { get { throw null; } set { } } public new Microsoft.Data.SqlClient.SqlCommand Command { get { throw null; } set { } } @@ -1003,71 +1003,28 @@ public void Rollback(string transactionName) { } public void Save(string savePointName) { } } } -namespace Microsoft.Data.SqlClient.DataClassification -{ - public partial class ColumnSensitivity - { - public ColumnSensitivity(System.Collections.Generic.IList sensitivityProperties) { } - public System.Collections.ObjectModel.ReadOnlyCollection SensitivityProperties { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - } - public partial class InformationType - { - public InformationType(string name, string id) { } - public string Id { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - public string Name { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - } - public partial class Label - { - public Label(string name, string id) { } - public string Id { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - public string Name { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - } - public partial class SensitivityClassification - { - public SensitivityClassification(System.Collections.Generic.IList labels, System.Collections.Generic.IList informationTypes, System.Collections.Generic.IList columnSensitivity) { } - public System.Collections.ObjectModel.ReadOnlyCollection ColumnSensitivities { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - public System.Collections.ObjectModel.ReadOnlyCollection InformationTypes { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - public System.Collections.ObjectModel.ReadOnlyCollection Labels { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - } - public partial class SensitivityProperty - { - public SensitivityProperty(Microsoft.Data.SqlClient.DataClassification.Label label, Microsoft.Data.SqlClient.DataClassification.InformationType informationType) { } - public Microsoft.Data.SqlClient.DataClassification.InformationType InformationType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - public Microsoft.Data.SqlClient.DataClassification.Label Label { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } - } -} - namespace Microsoft.Data.SqlClient.Server { - public sealed partial class InvalidUdtException : System.SystemException - { - internal InvalidUdtException() { } - } - public enum DataAccessKind { None = 0, Read = 1 } - public enum SystemDataAccessKind + public enum Format { - None = 0, - Read = 1 + Unknown = 0, + Native = 1, + UserDefined = 2 } - - [System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = false, Inherited = false), System.SerializableAttribute] - public partial class SqlFunctionAttribute : System.Attribute + public interface IBinarySerialize { - public SqlFunctionAttribute() { } - public bool IsDeterministic { get { throw null; } set { } } - public DataAccessKind DataAccess { get { throw null; } set { } } - public SystemDataAccessKind SystemDataAccess { get { throw null; } set { } } - public bool IsPrecise { get { throw null; } set { } } - public string Name { get { throw null; } set { } } - public string TableDefinition { get { throw null; } set { } } - public string FillRowMethodName { get { throw null; } set { } } + void Read(System.IO.BinaryReader r); + void Write(System.IO.BinaryWriter w); + } + public sealed partial class InvalidUdtException : System.SystemException + { + internal InvalidUdtException() { } } - public partial class SqlDataRecord : System.Data.IDataRecord { public SqlDataRecord(params Microsoft.Data.SqlClient.Server.SqlMetaData[] metaData) { } @@ -1154,7 +1111,18 @@ public virtual void SetTimeSpan(int ordinal, System.TimeSpan value) { } public virtual void SetValue(int ordinal, object value) { } public virtual int SetValues(params object[] values) { throw null; } } - + [System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = false, Inherited = false), System.SerializableAttribute] + public partial class SqlFunctionAttribute : System.Attribute + { + public SqlFunctionAttribute() { } + public bool IsDeterministic { get { throw null; } set { } } + public DataAccessKind DataAccess { get { throw null; } set { } } + public SystemDataAccessKind SystemDataAccess { get { throw null; } set { } } + public bool IsPrecise { get { throw null; } set { } } + public string Name { get { throw null; } set { } } + public string TableDefinition { get { throw null; } set { } } + public string FillRowMethodName { get { throw null; } set { } } + } public sealed partial class SqlMetaData { public SqlMetaData(string name, System.Data.SqlDbType dbType) { } @@ -1226,7 +1194,6 @@ public SqlMetaData(string name, System.Data.SqlDbType dbType, System.Type userDe public System.TimeSpan Adjust(System.TimeSpan value) { throw null; } public static Microsoft.Data.SqlClient.Server.SqlMetaData InferFromValue(object value, string name) { throw null; } } - [System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple = false, Inherited = false), System.SerializableAttribute] public sealed partial class SqlMethodAttribute : SqlFunctionAttribute { @@ -1235,12 +1202,6 @@ public SqlMethodAttribute() { } public bool IsMutator { get { throw null; } set { } } public bool InvokeIfReceiverIsNull { get { throw null; } set { } } } - public enum Format - { - Unknown = 0, - Native = 1, - UserDefined = 2 - } [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple = false, Inherited = false)] public sealed partial class SqlUserDefinedAggregateAttribute : System.Attribute { @@ -1265,9 +1226,43 @@ public SqlUserDefinedTypeAttribute(Format format) { } public string ValidationMethodName { get { throw null; } set { } } public string Name { get { throw null; } set { } } } - public interface IBinarySerialize + public enum SystemDataAccessKind { - void Read(System.IO.BinaryReader r); - void Write(System.IO.BinaryWriter w); + None = 0, + Read = 1 } + } +namespace Microsoft.Data.SqlClient.DataClassification +{ + public partial class ColumnSensitivity + { + public ColumnSensitivity(System.Collections.Generic.IList sensitivityProperties) { } + public System.Collections.ObjectModel.ReadOnlyCollection SensitivityProperties { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + } + public partial class InformationType + { + public InformationType(string name, string id) { } + public string Id { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public string Name { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + } + public partial class Label + { + public Label(string name, string id) { } + public string Id { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public string Name { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + } + public partial class SensitivityClassification + { + public SensitivityClassification(System.Collections.Generic.IList labels, System.Collections.Generic.IList informationTypes, System.Collections.Generic.IList columnSensitivity) { } + public System.Collections.ObjectModel.ReadOnlyCollection ColumnSensitivities { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public System.Collections.ObjectModel.ReadOnlyCollection InformationTypes { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public System.Collections.ObjectModel.ReadOnlyCollection Labels { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + } + public partial class SensitivityProperty + { + public SensitivityProperty(Microsoft.Data.SqlClient.DataClassification.Label label, Microsoft.Data.SqlClient.DataClassification.InformationType informationType) { } + public Microsoft.Data.SqlClient.DataClassification.InformationType InformationType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public Microsoft.Data.SqlClient.DataClassification.Label Label { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + } +} \ No newline at end of file From 654933a0811ab30b843a20aff051b8d585238505 Mon Sep 17 00:00:00 2001 From: David Engel Date: Thu, 12 Sep 2019 14:29:28 -0700 Subject: [PATCH 23/26] Added .editconfig and formatted all files. (#193) Sorted and removed unused usings. --- .editorconfig | 158 + .gitignore | 1 + src/Directory.Build.props | 4 +- .../ref/Microsoft.Data.SqlClient.Manual.cs | 2 +- .../Microsoft.Data.SqlClient.NetCoreApp.cs | 2 +- .../netcore/ref/Microsoft.Data.SqlClient.cs | 2 +- .../Windows/sspicli/NegotiationInfoClass.cs | 11 +- .../Interop/Windows/sspicli/SSPIAuthType.cs | 3 +- .../Windows/sspicli/SSPISecureChannelType.cs | 3 +- .../Interop/Windows/sspicli/SSPIWrapper.cs | 74 +- .../sspicli/SecurityPackageInfoClass.cs | 15 +- .../Windows/sspicli/SecuritySafeHandles.cs | 26 +- .../Data/Common/BasicFieldNameLookup.cs | 3 +- .../Data/Common/DbConnectionOptions.Common.cs | 71 +- .../Microsoft/Data/Common/NameValuePair.cs | 1 - .../Data/ProviderBase/DbConnectionInternal.cs | 2 +- .../DebugCriticalHandleMinusOneIsInvalid.cs | 6 +- ...ugCriticalHandleZeroOrMinusOneIsInvalid.cs | 6 +- .../Common/src/System/Net/DebugSafeHandle.cs | 3 +- .../System/Net/Logging/DebugThreadTracking.cs | 21 +- .../Net/Logging/NetEventSource.Common.cs | 108 +- .../Security/NegotiateStreamPal.Windows.cs | 3 +- .../src/System/PasteArguments.Windows.cs | 2 +- .../Interop/SNINativeMethodWrapper.Common.cs | 2 +- .../Data/Common/ActivityCorrelator.cs | 1 - .../Data/Common/AdapterUtil.SqlClient.cs | 2 +- .../Data/Common/DbConnectionOptions.cs | 4 +- .../DbConnectionStringCommon.NetCoreApp.cs | 2 +- .../Data/Common/DbConnectionStringCommon.cs | 7 +- .../src/Microsoft/Data/DataException.cs | 4 +- .../Data/OperationAbortedException.cs | 3 +- .../Data/ProviderBase/DbConnectionClosed.cs | 3 +- .../Data/ProviderBase/DbConnectionFactory.cs | 6 +- .../Data/ProviderBase/DbConnectionInternal.cs | 6 +- .../Data/ProviderBase/DbConnectionPool.cs | 17 +- .../DbConnectionPoolAuthenticationContext.cs | 2 +- ...bConnectionPoolAuthenticationContextKey.cs | 2 +- .../DbConnectionPoolGroupProviderInfo.cs | 1 - .../DbConnectionPoolIdentity.Windows.cs | 2 +- .../DbConnectionPoolProviderInfo.cs | 1 - .../Data/Sql/SqlNotificationRequest.cs | 2 +- ...rectoryAuthenticationTimeoutRetryHelper.cs | 62 +- ...veDirectoryNativeAuthenticationProvider.cs | 2 +- .../SqlClient/AlwaysEncryptedHelperClasses.cs | 4 +- .../Data/SqlClient/ApplicationIntent.cs | 3 - .../Data/SqlClient/ColumnEncryptionKeyInfo.cs | 24 +- .../SensitivityClassification.cs | 31 +- .../SqlClient/EnclaveDelegate.NetCoreApp.cs | 4 - .../SqlClient/EnclaveDelegate.NetStandard.cs | 4 - .../Data/SqlClient/EnclaveDelegate.cs | 21 +- .../Data/SqlClient/EnclavePackage.cs | 6 +- .../Data/SqlClient/LocalDBAPI.Common.cs | 5 +- .../Data/SqlClient/LocalDBAPI.Unix.cs | 3 +- .../Data/SqlClient/LocalDBAPI.Windows.cs | 3 +- .../Data/SqlClient/LocalDBAPI.uap.cs | 5 +- .../Data/SqlClient/OnChangedEventHandler.cs | 2 +- .../Data/SqlClient/PacketHandle.Unix.cs | 20 +- .../Data/SqlClient/ParameterPeekAheadValue.cs | 1 - .../Data/SqlClient/PoolBlockingPeriod.cs | 1 - .../Data/SqlClient/RowsCopiedEventHandler.cs | 1 - .../Data/SqlClient/SNI/LocalDB.Unix.cs | 1 - .../Data/SqlClient/SNI/LocalDB.Windows.cs | 12 +- .../Data/SqlClient/SNI/LocalDB.uap.cs | 2 +- .../Microsoft/Data/SqlClient/SNI/SNIError.cs | 1 - .../Microsoft/Data/SqlClient/SNI/SNIHandle.cs | 1 - .../Data/SqlClient/SNI/SNIMarsQueuedPacket.cs | 1 - .../Data/SqlClient/SNI/SNINpHandle.cs | 8 +- .../SqlClient/SNI/SNIPacket.NetCoreApp.cs | 3 +- .../SqlClient/SNI/SNIPacket.NetStandard.cs | 3 +- .../Microsoft/Data/SqlClient/SNI/SNIPacket.cs | 4 +- .../Microsoft/Data/SqlClient/SNI/SNIProxy.cs | 4 +- .../Data/SqlClient/SNI/SNITcpHandle.cs | 4 +- .../SqlClient/SNI/SspiClientContextStatus.cs | 2 - .../SqlClient/Server/ExtendedClrTypeCode.cs | 4 - .../Data/SqlClient/Server/ITypedGetters.cs | 1 - .../Data/SqlClient/Server/ITypedGettersV3.cs | 1 - .../Data/SqlClient/Server/ITypedSetters.cs | 1 - .../Data/SqlClient/Server/ITypedSettersV3.cs | 1 - .../SqlClient/Server/InvalidUdtException.cs | 4 +- .../SqlClient/Server/MemoryRecordBuffer.cs | 1 - .../Data/SqlClient/Server/MetadataUtilsSmi.cs | 3 +- .../Data/SqlClient/Server/SmiEventSink.cs | 5 - .../SqlClient/Server/SmiEventSink_Default.cs | 1 - .../Data/SqlClient/Server/SmiGettersStream.cs | 3 +- .../Data/SqlClient/Server/SmiMetaData.cs | 2 +- .../SqlClient/Server/SmiMetaDataProperty.cs | 4 +- .../Data/SqlClient/Server/SmiRecordBuffer.cs | 3 +- .../Data/SqlClient/Server/SmiSettersStream.cs | 4 +- .../SqlClient/Server/SmiTypedGetterSetter.cs | 4 +- .../SqlClient/Server/SmiXetterAccessMap.cs | 2 - .../SqlClient/Server/SmiXetterTypeCode.cs | 3 - .../Data/SqlClient/Server/SqlDataRecord.cs | 2 +- .../SqlClient/Server/SqlFunctionAttribute.cs | 2 +- .../Data/SqlClient/Server/SqlMetaData.cs | 147 +- .../Data/SqlClient/Server/SqlNorm.cs | 11 +- .../Data/SqlClient/Server/SqlRecordBuffer.cs | 48 +- .../Microsoft/Data/SqlClient/Server/SqlSer.cs | 4 +- .../SqlUserDefinedAggregateAttribute.cs | 4 +- .../Server/SqlUserDefinedTypeAttribute.cs | 2 +- .../Data/SqlClient/Server/ValueUtilsSmi.cs | 219 +- .../Data/SqlClient/SessionHandle.Unix.cs | 21 +- .../Data/SqlClient/SessionHandle.Windows.cs | 3 +- .../SqlClient/SignatureVerificationCache.cs | 2 +- .../src/Microsoft/Data/SqlClient/SortOrder.cs | 1 - .../SqlAeadAes256CbcHmac256Algorithm.cs | 4 +- .../SqlAeadAes256CbcHmac256EncryptionKey.cs | 3 +- .../SqlAeadAes256CbcHmac256Factory.cs | 2 +- .../Data/SqlClient/SqlAes256CbcAlgorithm.cs | 9 +- .../Data/SqlClient/SqlAes256CbcFactory.cs | 2 +- .../SqlClient/SqlAuthenticationParameters.cs | 34 +- .../SqlClient/SqlAuthenticationProvider.cs | 9 +- .../SqlAuthenticationProviderManager.cs | 95 +- .../Data/SqlClient/SqlAuthenticationToken.cs | 21 +- .../src/Microsoft/Data/SqlClient/SqlBuffer.cs | 214 +- .../Microsoft/Data/SqlClient/SqlBulkCopy.cs | 8 +- .../SqlClient/SqlBulkCopyColumnMapping.cs | 2 - .../Data/SqlClient/SqlBulkCopyOptions.cs | 1 - .../Data/SqlClient/SqlCachedBuffer.cs | 5 +- .../SqlClientDiagnosticListenerExtensions.cs | 3 +- .../SqlClient/SqlClientEncryptionAlgorithm.cs | 4 +- ...SqlClientEncryptionAlgorithmFactoryList.cs | 2 +- ...EncryptionCertificateStoreProvider.Unix.cs | 2 +- ...ryptionCertificateStoreProvider.Windows.cs | 2 +- .../SqlColumnEncryptionCngProvider.Unix.cs | 5 +- .../SqlColumnEncryptionCngProvider.Windows.cs | 2 +- .../SqlColumnEncryptionCspProvider.Unix.cs | 11 +- .../SqlColumnEncryptionCspProvider.Windows.cs | 4 +- ...tionEnclaveProviderConfigurationManager.cs | 3 +- .../SqlColumnEncryptionKeyStoreProvider.cs | 2 +- .../Microsoft/Data/SqlClient/SqlCommand.cs | 2 +- .../Data/SqlClient/SqlCommandBuilder.cs | 4 +- .../Microsoft/Data/SqlClient/SqlCommandSet.cs | 2 +- .../Microsoft/Data/SqlClient/SqlConnection.cs | 44 +- .../Data/SqlClient/SqlConnectionFactory.cs | 9 +- .../Data/SqlClient/SqlConnectionHelper.cs | 13 +- .../SqlConnectionPoolGroupProviderInfo.cs | 1 - .../Data/SqlClient/SqlConnectionPoolKey.cs | 2 +- .../SqlConnectionPoolProviderInfo.cs | 1 - .../SqlConnectionString.NetCoreApp.cs | 2 +- .../Data/SqlClient/SqlConnectionString.cs | 3 +- .../SqlConnectionStringBuilder.NetCoreApp.cs | 2 +- .../SqlClient/SqlConnectionStringBuilder.cs | 234 +- .../SqlConnectionTimeoutErrorInternal.cs | 1 - .../Microsoft/Data/SqlClient/SqlCredential.cs | 2 +- .../Data/SqlClient/SqlDataAdapter.cs | 2 +- .../Microsoft/Data/SqlClient/SqlDataReader.cs | 67 +- .../Microsoft/Data/SqlClient/SqlDbColumn.cs | 1 - .../SqlDelegatedTransaction.NetCoreApp.cs | 2 +- .../SqlDelegatedTransaction.NetStandard.cs | 2 +- .../Data/SqlClient/SqlDelegatedTransaction.cs | 2 +- .../Microsoft/Data/SqlClient/SqlDependency.cs | 6 +- .../Data/SqlClient/SqlDependencyListener.cs | 52 +- .../Data/SqlClient/SqlDependencyUtils.cs | 2 +- .../SqlEnclaveAttestationParameters.cs | 2 - .../Data/SqlClient/SqlEnclaveSession.cs | 11 +- .../src/Microsoft/Data/SqlClient/SqlEnums.cs | 337 +- .../src/Microsoft/Data/SqlClient/SqlError.cs | 1 - .../Microsoft/Data/SqlClient/SqlException.cs | 4 +- .../SqlClient/SqlFileStream.Unsupported.cs | 2 - .../Data/SqlClient/SqlFileStream.Windows.cs | 6 +- .../Data/SqlClient/SqlInfoMessageEvent.cs | 1 - .../Data/SqlClient/SqlInternalConnection.cs | 5 +- .../SqlClient/SqlInternalConnectionTds.cs | 81 +- .../Data/SqlClient/SqlInternalTransaction.cs | 4 +- .../Data/SqlClient/SqlMetadataFactory.cs | 6 +- .../SqlClient/SqlNotificationEventArgs.cs | 2 +- .../Data/SqlClient/SqlNotificationInfo.cs | 2 +- .../Data/SqlClient/SqlNotificationSource.cs | 2 +- .../Data/SqlClient/SqlNotificationType.cs | 2 +- .../Microsoft/Data/SqlClient/SqlParameter.cs | 18 +- .../Data/SqlClient/SqlParameterCollection.cs | 1 - .../SqlClient/SqlParameterCollectionHelper.cs | 7 +- .../Data/SqlClient/SqlParameterHelper.cs | 2 +- .../Data/SqlClient/SqlReferenceCollection.cs | 1 - .../Data/SqlClient/SqlRowUpdatingEvent.cs | 2 +- .../Data/SqlClient/SqlSequentialStream.cs | 2 +- .../Data/SqlClient/SqlSequentialTextReader.cs | 5 +- .../Microsoft/Data/SqlClient/SqlStatistics.cs | 7 +- .../src/Microsoft/Data/SqlClient/SqlStream.cs | 6 +- .../Data/SqlClient/SqlTransaction.cs | 3 +- .../src/Microsoft/Data/SqlClient/SqlUtil.cs | 24 +- .../src/Microsoft/Data/SqlClient/TdsEnums.cs | 4 +- .../Data/SqlClient/TdsParameterSetter.cs | 1 - .../Data/SqlClient/TdsParser.NetCoreApp.cs | 2 +- .../Data/SqlClient/TdsParser.NetStandard.cs | 5 +- .../SqlClient/TdsParser.RegisterEncoding.cs | 2 +- .../Data/SqlClient/TdsParser.Unix.cs | 5 +- .../Data/SqlClient/TdsParser.Windows.cs | 4 +- .../src/Microsoft/Data/SqlClient/TdsParser.cs | 241 +- .../Data/SqlClient/TdsParserHelperClasses.cs | 139 +- .../Data/SqlClient/TdsParserSafeHandles.cs | 2 +- .../Data/SqlClient/TdsParserSessionPool.cs | 2 +- .../Data/SqlClient/TdsParserStateObject.cs | 27 +- .../TdsParserStateObjectFactory.Managed.cs | 1 - .../TdsParserStateObjectFactory.Windows.cs | 2 +- .../SqlClient/TdsParserStateObjectManaged.cs | 8 +- .../SqlClient/TdsParserStateObjectNative.cs | 19 +- .../Data/SqlClient/TdsParserStaticMethods.cs | 2 +- .../Data/SqlClient/TdsRecordBufferSetter.cs | 7 +- .../Data/SqlClient/TdsValueSetter.cs | 8 +- .../Data/SqlTypes/SqlTypeWorkarounds.cs | 2 +- .../netcore/src/Resources/SRHelper.cs | 1 - .../netfx/src/BID/INC/CS/BidPrivateBase.cs | 439 +- .../Data/Common/MultipartIdentifier.cs | 370 +- .../Data/Common/NameValuePermission.cs | 168 +- .../Data/Common/ActivityCorrelator.cs | 9 +- .../src/Microsoft/Data/Common/AdapterUtil.cs | 17 +- .../Data/Common/DBConnectionString.cs | 349 +- .../Data/Common/DbConnectionOptions.cs | 754 +- .../Data/Common/DbConnectionStringCommon.cs | 462 +- .../src/Microsoft/Data/Common/GreenMethods.cs | 5 +- .../Microsoft/Data/Common/NameValuePair.cs | 42 +- .../Microsoft/Data/Common/NativeMethods.cs | 61 +- .../src/Microsoft/Data/Common/SQLResource.cs | 77 +- .../Data/Common/SafeNativeMethods.cs | 65 +- .../Microsoft/Data/Common/System.Data_BID.cs | 808 +- .../Data/Common/UnsafeNativeMethods.cs | 79 +- .../netfx/src/Microsoft/Data/DataException.cs | 903 +- .../Data/Interop/SNINativeMethodWrapper.cs | 88 +- .../Data/OperationAbortedException.cs | 26 +- .../Data/ProviderBase/DataReaderContainer.cs | 93 +- .../Microsoft/Data/ProviderBase/DbBuffer.cs | 460 +- .../Data/ProviderBase/DbConnectionClosed.cs | 107 +- .../Data/ProviderBase/DbConnectionFactory.cs | 344 +- .../Data/ProviderBase/DbConnectionInternal.cs | 446 +- .../Data/ProviderBase/DbConnectionPool.cs | 1091 ++- .../DbConnectionPoolAuthenticationContext.cs | 2 +- ...bConnectionPoolAuthenticationContextKey.cs | 2 +- .../ProviderBase/DbConnectionPoolCounters.cs | 139 +- .../ProviderBase/DbConnectionPoolGroup.cs | 180 +- .../DbConnectionPoolGroupProviderInfo.cs | 17 +- .../ProviderBase/DbConnectionPoolIdentity.cs | 166 +- .../ProviderBase/DbConnectionPoolOptions.cs | 62 +- .../DbConnectionPoolProviderInfo.cs | 10 +- .../Data/ProviderBase/DbMetaDataFactory.cs | 445 +- .../ProviderBase/DbReferenceCollection.cs | 167 +- .../Data/ProviderBase/FieldNameLookup.cs | 90 +- .../Data/ProviderBase/SqlConnectionHelper.cs | 226 +- .../SqlParameterCollectionHelper.cs | 204 +- .../Data/ProviderBase/SqlParameterHelper.cs | 221 +- .../Data/ProviderBase/TimeoutTimer.cs | 280 +- .../Data/ProviderBase/WrappedIUnknown.cs | 51 +- .../Microsoft/Data/RelationshipConverter.cs | 21 +- .../src/Microsoft/Data/Sql/SqlGenericUtil.cs | 15 +- .../Data/Sql/SqlNotificationRequest.cs | 62 +- ...rectoryAuthenticationTimeoutRetryHelper.cs | 67 +- ...veDirectoryNativeAuthenticationProvider.cs | 2 +- .../AppContextDefaultValues.Defaults.cs | 1 - .../Data/SqlClient/ApplicationIntent.cs | 10 +- .../Microsoft/Data/SqlClient/AssemblyRef.cs | 15 +- .../Data/SqlClient/ColumnEncryptionKeyInfo.cs | 59 +- .../SensitivityClassification.cs | 30 +- .../Data/SqlClient/EnclaveDelegate.cs | 155 +- .../Microsoft/Data/SqlClient/LocalDBAPI.cs | 101 +- .../Microsoft/Data/SqlClient/LocalDBConfig.cs | 8 +- .../Data/SqlClient/OnChangedEventHandler.cs | 6 +- .../Data/SqlClient/ParameterPeekAheadValue.cs | 8 +- .../Data/SqlClient/PoolBlockingPeriod.cs | 2 +- .../Data/SqlClient/RowsCopiedEventArgs.cs | 28 +- .../Data/SqlClient/RowsCopiedEventHandler.cs | 4 +- .../SqlClient/Server/ExtendedClrTypeCode.cs | 6 +- .../Data/SqlClient/Server/ITypedGetters.cs | 76 +- .../Data/SqlClient/Server/ITypedGettersV3.cs | 40 +- .../Data/SqlClient/Server/ITypedSetters.cs | 88 +- .../Data/SqlClient/Server/ITypedSettersV3.cs | 40 +- .../SqlClient/Server/InvalidUdtException.cs | 2 +- .../SqlClient/Server/MemoryRecordBuffer.cs | 128 +- .../Data/SqlClient/Server/MetadataUtilsSmi.cs | 564 +- .../Data/SqlClient/Server/SmiConnection.cs | 72 +- .../Data/SqlClient/Server/SmiContext.cs | 55 +- .../SqlClient/Server/SmiContextFactory.cs | 113 +- .../Data/SqlClient/Server/SmiEventSink.cs | 56 +- .../SqlClient/Server/SmiEventSink_Default.cs | 293 +- .../Server/SmiEventSink_DeferedProcessing.cs | 12 +- .../Data/SqlClient/Server/SmiEventStream.cs | 15 +- .../Data/SqlClient/Server/SmiExecuteType.cs | 6 +- .../Data/SqlClient/Server/SmiGettersStream.cs | 83 +- .../Data/SqlClient/Server/SmiLink.cs | 12 +- .../Data/SqlClient/Server/SmiMetaData.cs | 1492 ++-- .../SqlClient/Server/SmiMetaDataProperty.cs | 204 +- .../Data/SqlClient/Server/SmiRecordBuffer.cs | 402 +- .../SqlClient/Server/SmiRequestExecutor.cs | 458 +- .../Data/SqlClient/Server/SmiSettersStream.cs | 81 +- .../Data/SqlClient/Server/SmiStream.cs | 35 +- .../SqlClient/Server/SmiTypedGetterSetter.cs | 386 +- .../SqlClient/Server/SmiXetterAccessMap.cs | 18 +- .../SqlClient/Server/SmiXetterTypeCode.cs | 6 +- .../Data/SqlClient/Server/SqlDataRecord.cs | 3 +- .../SqlClient/Server/SqlFunctionAttribute.cs | 2 +- .../Data/SqlClient/Server/SqlMetaData.cs | 5 +- .../SqlClient/Server/SqlMethodAttribute.cs | 2 +- .../Data/SqlClient/Server/SqlRecordBuffer.cs | 382 +- .../SqlUserDefinedAggregateAttribute.cs | 2 +- .../Server/SqlUserDefinedTypeAttribute.cs | 88 +- .../Data/SqlClient/Server/TriggerAction.cs | 2 +- .../Data/SqlClient/Server/ValueUtilsSmi.cs | 3182 ++++--- .../Data/SqlClient/Server/sqlnorm.cs | 360 +- .../Microsoft/Data/SqlClient/Server/sqlser.cs | 158 +- .../SqlClient/SignatureVerificationCache.cs | 2 +- .../SqlAeadAes256CbcHmac256Algorithm.cs | 128 +- .../SqlAeadAes256CbcHmac256EncryptionKey.cs | 4 +- .../SqlAeadAes256CbcHmac256Factory.cs | 12 +- .../Data/SqlClient/SqlAes256CbcAlgorithm.cs | 2 +- .../SqlClient/SqlAuthenticationParameters.cs | 31 +- .../SqlClient/SqlAuthenticationProvider.cs | 12 +- .../SqlAuthenticationProviderManager.cs | 104 +- .../Data/SqlClient/SqlAuthenticationToken.cs | 21 +- .../src/Microsoft/Data/SqlClient/SqlBuffer.cs | 881 +- .../Microsoft/Data/SqlClient/SqlBulkCopy.cs | 1861 ++-- .../SqlClient/SqlBulkCopyColumnMapping.cs | 91 +- .../SqlBulkCopyColumnMappingCollection.cs | 125 +- .../Data/SqlClient/SqlBulkCopyOptions.cs | 18 +- .../Data/SqlClient/SqlCachedBuffer.cs | 107 +- .../Data/SqlClient/SqlCertificateCallbacks.cs | 4 +- ...SqlClientEncryptionAlgorithmFactoryList.cs | 40 +- .../Data/SqlClient/SqlClientFactory.cs | 45 +- .../Data/SqlClient/SqlClientLogger.cs | 2 +- .../SqlClientMetaDataCollectionNames.cs | 37 +- .../SqlClient/SqlClientOriginalAddressInfo.cs | 12 +- .../Data/SqlClient/SqlClientPermission.cs | 62 +- .../Data/SqlClient/SqlClientSymmetricKey.cs | 26 +- .../SqlClient/SqlClientWrapperSmiStream.cs | 82 +- .../SqlClientWrapperSmiStreamChars.cs | 109 +- ...olumnEncryptionCertificateStoreProvider.cs | 8 +- .../SqlColumnEncryptionCngProvider.cs | 4 +- .../SqlColumnEncryptionCspProvider.cs | 4 +- .../SqlColumnEncryptionEnclaveProvider.cs | 5 +- ...tionEnclaveProviderConfigurationManager.cs | 34 +- .../SqlColumnEncryptionKeyStoreProvider.cs | 2 +- .../Microsoft/Data/SqlClient/SqlCommand.cs | 3724 +++++--- .../Data/SqlClient/SqlCommandBuilder.cs | 275 +- .../Microsoft/Data/SqlClient/SqlCommandSet.cs | 211 +- .../Microsoft/Data/SqlClient/SqlConnection.cs | 1406 +-- .../Data/SqlClient/SqlConnectionFactory.cs | 217 +- .../SqlConnectionPoolGroupProviderInfo.cs | 79 +- .../Data/SqlClient/SqlConnectionPoolKey.cs | 27 +- .../SqlConnectionPoolProviderInfo.cs | 18 +- .../Data/SqlClient/SqlConnectionString.cs | 792 +- .../SqlClient/SqlConnectionStringBuilder.cs | 1547 ++-- .../SqlConnectionTimeoutErrorInternal.cs | 7 +- .../Data/SqlClient/SqlDataAdapter.cs | 163 +- .../Microsoft/Data/SqlClient/SqlDataReader.cs | 3001 ++++--- .../Data/SqlClient/SqlDataReaderSmi.cs | 1065 ++- .../Data/SqlClient/SqlDelegatedTransaction.cs | 226 +- .../Microsoft/Data/SqlClient/SqlDependency.cs | 961 ++- .../Data/SqlClient/SqlDependencyListener.cs | 1323 +-- .../Data/SqlClient/SqlDependencyUtils.cs | 397 +- .../SqlEnclaveAttestationParameters.cs | 32 +- .../Data/SqlClient/SqlEnclaveSession.cs | 28 +- .../src/Microsoft/Data/SqlClient/SqlEnums.cs | 853 +- .../src/Microsoft/Data/SqlClient/SqlError.cs | 75 +- .../Data/SqlClient/SqlErrorCollection.cs | 45 +- .../Microsoft/Data/SqlClient/SqlException.cs | 142 +- .../Data/SqlClient/SqlInfoMessageEvent.cs | 29 +- .../SqlClient/SqlInfoMessageEventHandler.cs | 4 +- .../Data/SqlClient/SqlInternalConnection.cs | 379 +- .../SqlClient/SqlInternalConnectionSmi.cs | 374 +- .../SqlClient/SqlInternalConnectionTds.cs | 2060 +++-- .../SqlClient/SqlNotificationEventArgs.cs | 27 +- .../Data/SqlClient/SqlNotificationInfo.cs | 41 +- .../Data/SqlClient/SqlNotificationSource.cs | 27 +- .../Data/SqlClient/SqlNotificationType.cs | 13 +- .../Microsoft/Data/SqlClient/SqlParameter.cs | 1360 +-- .../Data/SqlClient/SqlParameterCollection.cs | 96 +- .../Data/SqlClient/SqlQueryMetadataCache.cs | 5 +- .../Data/SqlClient/SqlReferenceCollection.cs | 50 +- .../Data/SqlClient/SqlRowUpdatedEvent.cs | 14 +- .../SqlClient/SqlRowUpdatedEventHandler.cs | 4 +- .../Data/SqlClient/SqlRowUpdatingEvent.cs | 17 +- .../SqlClient/SqlRowUpdatingEventHandler.cs | 4 +- .../Data/SqlClient/SqlSecurityUtility.cs | 165 +- .../Data/SqlClient/SqlSequentialStream.cs | 28 +- .../Data/SqlClient/SqlSequentialStreamSmi.cs | 4 +- .../Data/SqlClient/SqlSequentialTextReader.cs | 38 +- .../SqlClient/SqlSequentialTextReaderSmi.cs | 6 +- .../Microsoft/Data/SqlClient/SqlStatistics.cs | 101 +- .../src/Microsoft/Data/SqlClient/SqlStream.cs | 511 +- .../Data/SqlClient/SqlSymmetricKeyCache.cs | 46 +- .../Data/SqlClient/SqlTransaction.cs | 239 +- .../Microsoft/Data/SqlClient/SqlUdtInfo.cs | 32 +- .../src/Microsoft/Data/SqlClient/SqlUtil.cs | 1481 ++-- .../src/Microsoft/Data/SqlClient/TdsEnums.cs | 699 +- .../Data/SqlClient/TdsParameterSetter.cs | 32 +- .../src/Microsoft/Data/SqlClient/TdsParser.cs | 7502 ++++++++++------- .../Data/SqlClient/TdsParserHelperClasses.cs | 786 +- .../Data/SqlClient/TdsParserSafeHandles.cs | 237 +- .../Data/SqlClient/TdsParserSessionPool.cs | 171 +- .../Data/SqlClient/TdsParserStateObject.cs | 1984 +++-- .../Data/SqlClient/TdsParserStaticMethods.cs | 151 +- .../Data/SqlClient/TdsRecordBufferSetter.cs | 115 +- .../Data/SqlClient/TdsValueSetter.cs | 321 +- .../Microsoft/Data/SqlClient/assemblycache.cs | 24 +- .../Data/SqlClient/sqlinternaltransaction.cs | 363 +- .../Data/SqlClient/sqlmetadatafactory.cs | 200 +- .../src/Microsoft/Data/SqlEventSource.cs | 3 +- .../Data/SqlTypes/SqlTypeWorkarounds.cs | 2 +- .../netfx/src/Misc/AppContextDefaultValues.cs | 47 +- .../netfx/src/Misc/ExternDll.cs | 66 +- .../netfx/src/Misc/HResults.cs | 42 +- .../netfx/src/Misc/LocalAppContext.cs | 6 +- .../Misc/PrivilegedConfigurationManager.cs | 22 +- .../FunctionalTests/AADAccessTokenTest.cs | 4 +- .../ConnectionStringBuilderShould.cs | 6 +- .../DummyKeyStoreProvider.cs | 6 +- .../ExceptionRegisterKeyStoreProvider.cs | 7 +- .../ExceptionsAlgorithmErrors.cs | 7 +- .../ExceptionsCertStore.cs | 3 +- .../SqlColumnEncryptionCngProviderShould.cs | 2 +- .../AlwaysEncryptedTests/SqlCommandShould.cs | 3 - .../SqlConnectionShould.cs | 66 +- .../AlwaysEncryptedTests/Utility.cs | 15 +- .../BaseProviderAsyncTest.cs | 9 +- .../BaseProviderAsyncTest/MockCommand.cs | 9 +- .../BaseProviderAsyncTest/MockDataReader.cs | 9 +- .../tests/FunctionalTests/ExceptionTest.cs | 3 +- .../FakeDiagnosticListenerObserver.cs | 5 +- .../SqlConnectionBasicTests.cs | 5 +- .../SqlConnectionStringBuilderTest.cs | 2 +- .../FunctionalTests/SqlDataRecordTest.cs | 1 - .../FunctionalTests/SqlErrorCollectionTest.cs | 2 +- .../tests/FunctionalTests/SqlMetaDataTest.cs | 2 +- .../tests/FunctionalTests/TestTdsServer.cs | 5 +- .../ManualTests/AlwaysEncrypted/ApiShould.cs | 68 +- .../ManualTests/AlwaysEncrypted/BulkCopyAE.cs | 88 +- .../AlwaysEncrypted/CspProviderExt.cs | 6 +- .../AlwaysEncrypted/End2EndSmokeTests.cs | 40 +- .../TestFixtures/DatabaseHelper.cs | 7 +- .../TestFixtures/SQLSetupStrategy.cs | 6 +- .../TestFixtures/SQLSetupStrategyCspExt.cs | 4 +- .../TestFixtures/Setup/BulkCopyAETestTable.cs | 42 +- .../TestFixtures/Setup/CertificateUtility.cs | 1 - .../Setup/CertificateUtilityWin.cs | 2 +- .../DDBasics/DDAsyncTest/DDAsyncTest.cs | 2 +- .../CheckConnStrSetupFactAttribute.cs | 7 +- .../ManualTests/DataCommon/DataTestUtility.cs | 4 +- .../ManualTests/DataCommon/ProxyServer.cs | 2 +- .../DataCommon/SystemDataResourceManager.cs | 2 +- .../MultipleResultsTest.cs | 3 +- .../SQL/AdapterTest/AdapterTest.cs | 10 +- .../ManualTests/SQL/AsyncTest/AsyncTest.cs | 2 +- .../SQL/AsyncTest/BeginExecAsyncTest.cs | 2 +- .../SQL/AsyncTest/BeginExecReaderAsyncTest.cs | 4 +- .../SQL/AsyncTest/XmlReaderAsyncTest.cs | 7 +- .../CommandCancelTest/CommandCancelTest.cs | 4 +- .../ManualTests/SQL/Common/AsyncDebugScope.cs | 2 +- .../SQL/Common/InternalConnectionWrapper.cs | 7 +- .../SystemDataInternals/ConnectionHelper.cs | 4 +- .../ConnectionPoolTest/ConnectionPoolTest.cs | 10 +- .../PoolBlockPeriodTest.netcoreapp.cs | 1 - .../ConnectivityTests/AADConnectionTest.cs | 10 +- .../ConnectionBehaviorTest.cs | 7 +- .../SQL/ConnectivityTests/ConnectivityTest.cs | 4 +- .../ConnectionSchemaTest.cs | 4 +- .../SQL/DataReaderTest/DataReaderTest.cs | 2 +- .../SQL/DataStreamTest/DataStreamTest.cs | 146 +- .../SQL/DateTimeTest/DateTimeTest.cs | 2 +- .../SQL/ExceptionTest/ExceptionTest.cs | 6 +- .../SQL/InstanceNameTest/InstanceNameTest.cs | 2 +- .../IntegratedAuthenticationTest.cs | 2 +- .../MARSSessionPoolingTest.cs | 11 +- .../ManualTests/SQL/MARSTest/MARSTest.cs | 4 +- .../ParallelTransactionsTest.cs | 1 - .../SQL/ParameterTest/OutputParameter.cs | 2 +- .../SQL/ParameterTest/ParametersTest.cs | 4 +- .../ParameterTest/SqlAdapterUpdateBatch.cs | 1 - .../SQL/ParameterTest/SqlVariantParam.cs | 4 +- .../SQL/ParameterTest/SteAttribute.cs | 1 - .../SQL/ParameterTest/StePermutationSet.cs | 2 +- .../SQL/ParameterTest/SteTypeBoundaries.cs | 36 +- .../SQL/ParameterTest/StreamInputParam.cs | 4 +- .../ManualTests/SQL/ParameterTest/TvpTest.cs | 9 +- .../SQL/RandomStressTest/RandomStressTest.cs | 7 +- .../SQL/RandomStressTest/Randomizer.cs | 25 +- .../SQL/RandomStressTest/RandomizerPool.cs | 4 +- .../SQL/RandomStressTest/SqlRandomTable.cs | 8 +- .../SQL/RandomStressTest/SqlRandomTypeInfo.cs | 6 +- .../SqlRandomTypeInfoCollection.cs | 2 +- .../SQL/RandomStressTest/SqlRandomizer.cs | 4 +- .../SQL/SplitPacketTest/SplitPacketTest.cs | 2 +- .../AzureDistributedTransaction.cs | 9 +- .../SQL/SqlBulkCopyTest/Bug84548.cs | 3 +- .../SQL/SqlBulkCopyTest/Bug85007.cs | 3 +- .../SQL/SqlBulkCopyTest/Bug903514.cs | 1 + .../SQL/SqlBulkCopyTest/Bug98182.cs | 3 +- .../SQL/SqlBulkCopyTest/CheckConstraints.cs | 3 +- .../SQL/SqlBulkCopyTest/ColumnCollation.cs | 2 +- .../SQL/SqlBulkCopyTest/CopyAllFromReader.cs | 3 +- .../SQL/SqlBulkCopyTest/CopyAllFromReader1.cs | 3 +- .../SqlBulkCopyTest/CopyAllFromReaderAsync.cs | 5 +- .../CopyAllFromReaderCancelAsync.cs | 4 +- .../CopyAllFromReaderConnectionCloseAsync.cs | 5 +- ...llFromReaderConnectionCloseOnEventAsync.cs | 6 +- .../SqlBulkCopyTest/CopyMultipleReaders.cs | 3 +- .../SqlBulkCopyTest/CopySomeFromDatatable.cs | 2 +- .../CopySomeFromDatatableAsync.cs | 2 +- .../SQL/SqlBulkCopyTest/CopySomeFromReader.cs | 3 +- .../SqlBulkCopyTest/CopySomeFromRowArray.cs | 2 +- .../CopySomeFromRowArrayAsync.cs | 2 +- .../SQL/SqlBulkCopyTest/CopyVariants.cs | 3 +- .../CopyWidenNullInexactNumerics.cs | 1 + .../SQL/SqlBulkCopyTest/CopyWithEvent.cs | 2 +- .../SQL/SqlBulkCopyTest/CopyWithEvent1.cs | 3 +- .../SQL/SqlBulkCopyTest/CopyWithEventAsync.cs | 2 +- .../ErrorOnRowsMarkedAsDeleted.cs | 2 +- .../SQL/SqlBulkCopyTest/FireTrigger.cs | 3 +- .../SQL/SqlBulkCopyTest/Helpers.cs | 2 +- .../SqlBulkCopyTest/InvalidAccessFromEvent.cs | 1 + .../SqlBulkCopyTest/MissingTargetColumn.cs | 3 +- .../SQL/SqlBulkCopyTest/MissingTargetTable.cs | 2 +- .../SqlBulkCopyTest/SpecialCharacterNames.cs | 4 - .../SQL/SqlBulkCopyTest/SqlBulkCopyTest.cs | 1 + .../SQL/SqlBulkCopyTest/Transaction.cs | 2 +- .../SQL/SqlBulkCopyTest/Transaction1.cs | 2 +- .../SQL/SqlBulkCopyTest/Transaction2.cs | 3 +- .../SQL/SqlBulkCopyTest/Transaction3.cs | 2 +- .../SQL/SqlBulkCopyTest/Transaction4.cs | 2 +- .../SqlBulkCopyTest/TransactionTestAsync.cs | 3 +- .../SqlCredentialTest/SqlCredentialTest.cs | 5 - .../SqlFileStreamTest/SqlFileStreamTest.cs | 2 +- .../SqlNamedPipesTest/SqlNamedPipesTest.cs | 1 - .../SqlNotificationTest.cs | 4 +- .../SqlSchemaInfoTest/SqlSchemaInfoTest.cs | 10 +- .../TransactionEnlistmentTest.cs | 2 +- .../SQL/TransactionTest/TransactionTest.cs | 12 +- .../SQL/UdtTest/SqlServerTypesTest.cs | 18 +- .../SQL/UdtTest/UDTs/Address/Address.cs | 5 +- .../SQL/UdtTest/UDTs/Circle/Circle.cs | 2 +- .../SQL/UdtTest/UDTs/Circle/Point1.cs | 2 +- .../SQL/UdtTest/UDTs/Shapes/Line.cs | 5 +- .../SQL/UdtTest/UDTs/Shapes/Point.cs | 5 +- .../SQL/UdtTest/UDTs/Utf8String/Utf8String.cs | 2 +- .../tests/ManualTests/SQL/UdtTest/UdtTest.cs | 2 +- .../tests/ManualTests/SQL/UdtTest/UdtTest2.cs | 1 - .../ManualTests/SQL/UdtTest/UdtTestHelpers.cs | 2 - .../SQL/Utf8SupportTest/Utf8SupportTest.cs | 3 +- .../SQL/WeakRefTest/WeakRefTest.cs | 4 +- .../WeakRefTestYukonSpecific.cs | 4 +- .../ManualTests/XUnitAssemblyAttributes.cs | 2 +- .../System/AssertExtensions.cs | 4 +- .../Diagnostics/RemoteExecutorTestBase.cs | 7 +- .../System/IO/FileCleanupTestBase.cs | 3 +- .../System/PlatformDetection.NonNetFx.cs | 2 - .../System/PlatformDetection.Windows.cs | 16 +- .../System/PlatformDetection.cs | 5 +- .../System/TestEnvironment.cs | 3 - .../System/TheoryExtensions.cs | 1 - .../IFederatedAuthenticationTicket.cs | 5 - .../FederatedAuthentication/Rps.cs | 2 +- .../FederatedAuthentication/RpsTicket.cs | 5 - .../TDS/TDS.EndPoint/ITDSServerSession.cs | 1 - .../TDS/TDS.EndPoint/SSPI/SecurityWrapper.cs | 8 +- .../TDS/TDS.EndPoint/TDSClientEndPoint.cs | 2 +- .../TDS.Servers/AuthenticatingTDSServer.cs | 1 - ...ederatedAuthenticationNegativeTDSServer.cs | 2 +- .../tools/TDS/TDS.Servers/GenericTDSServer.cs | 7 +- .../TDS.Servers/GenericTDSServerSession.cs | 5 +- .../tools/TDS/TDS.Servers/QueryEngine.cs | 3 +- .../tools/TDS/TDS.Servers/RoutingTDSServer.cs | 5 +- .../TDS/TDS.Servers/TDSServerArguments.cs | 1 - .../tests/tools/TDS/TDS/AutoTDSStream.cs | 1 - ...tureExtAckFederatedAuthenticationOption.cs | 3 - .../TDSFeatureExtAckSessionStateOption.cs | 3 +- .../FeatureExtAck/TDSFeatureExtAckToken.cs | 2 +- .../TDS/TDS/FedAuthInfo/TDSFedAuthInfoId.cs | 3 - .../TDS/FedAuthInfo/TDSFedAuthInfoOption.cs | 4 +- .../FedAuthInfo/TDSFedAuthInfoOptionSPN.cs | 2 - .../FedAuthInfo/TDSFedAuthInfoOptionSTSURL.cs | 2 - .../TDS/FedAuthInfo/TDSFedAuthInfoToken.cs | 4 +- .../FedAuthMessage/TDSFedAuthMessageToken.cs | 3 +- .../TDS/Login7/TDSLogin7FeatureOptionToken.cs | 4 - .../Login7/TDSLogin7FeatureOptionsToken.cs | 5 +- .../TDS/Login7/TDSLogin7FedAuthOptionToken.cs | 5 +- .../TDS/Login7/TDSLogin7GenericOptionToken.cs | 3 - .../TDSLogin7SessionRecoveryOptionToken.cs | 2 - .../tools/TDS/TDS/Login7/TDSLogin7Token.cs | 1 - .../Login7/TDSLogin7TokenOffsetProperty.cs | 4 +- .../TDS/TDS/LoginAck/TDSLoginAckToken.cs | 1 - .../PreLogin/TDSPreLoginAuthenticationType.cs | 2 +- .../TDSPreLoginTokenEncryptionType.cs | 2 - .../tests/tools/TDS/TDS/Row/TDSNBCRowToken.cs | 3 - .../tests/tools/TDS/TDS/Row/TDSRowToken.cs | 4 - .../tools/TDS/TDS/Row/TDSRowTokenBase.cs | 1 - .../SessionState/TDSSessionRecoveryData.cs | 2 +- .../TDSSessionStateContextInfoOption.cs | 1 - .../TDSSessionStateDeadlockPriorityOption.cs | 1 - .../TDSSessionStateISOFipsOption.cs | 1 - .../TDS/SessionState/TDSSessionStateToken.cs | 2 +- .../tests/tools/TDS/TDS/TDSFeatureID.cs | 2 +- .../tests/tools/TDS/TDS/TDSMessage.cs | 2 +- .../tests/tools/TDS/TDS/TDSPacketToken.cs | 1 - .../tests/tools/TDS/TDS/TDSTokenFactory.cs | 7 +- .../tests/tools/TDS/TDS/TDSUtilities.cs | 3 - tools/specs/Microsoft.Data.SqlClient.nuspec | 6 +- tools/targets/GenerateNugetPackage.targets | 12 +- tools/targets/NotSupported.targets | 10 +- tools/targets/ResolveContract.targets | 4 +- 596 files changed, 39209 insertions(+), 24784 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..1483f4e861 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,158 @@ +# editorconfig.org + +# top-most EditorConfig file +root = true + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation +[*] +insert_final_newline = true +indent_style = space +indent_size = 4 + +[project.json] +indent_size = 2 + +# C# files +[*.cs] +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# only use var when it's obvious what the variable type is +csharp_style_var_for_built_in_types = false:none +csharp_style_var_when_type_is_apparent = false:none +csharp_style_var_elsewhere = false:suggestion + +# use language keywords instead of BCL types +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style + +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const + +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# static fields should have s_ prefix +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style + +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static + +dotnet_naming_style.static_prefix_style.required_prefix = s_ +dotnet_naming_style.static_prefix_style.capitalization = camel_case + +# internal and private fields should be _camelCase +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style + +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal + +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case + +# Code style defaults +dotnet_sort_system_directives_first = true +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = false:none +csharp_style_expression_bodied_constructors = false:none +csharp_style_expression_bodied_operators = false:none +csharp_style_expression_bodied_properties = true:none +csharp_style_expression_bodied_indexers = true:none +csharp_style_expression_bodied_accessors = true:none + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = do_not_ignore +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Xml project files +[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] +indent_size = 2 + +# Xml build files +[*.builds] +indent_size = 2 + +# Xml files +[*.{xml,stylecop,resx,ruleset}] +indent_size = 2 + +# Xml config files +[*.{props,targets,config,nuspec}] +indent_size = 2 + +# Shell scripts +[*.sh] +end_of_line = lf +[*.{cmd, bat}] +end_of_line = crlf + +# Analyzers +dotnet_code_quality.ca1802.api_surface = private, internal diff --git a/.gitignore b/.gitignore index 62e4e8f2e1..4794a6e136 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ +.nuget/ # Visual Studio 2015/2017 cache/options directory .vs/ diff --git a/src/Directory.Build.props b/src/Directory.Build.props index b8878c0503..da8678358f 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -11,7 +11,9 @@ true true - + + $(DefineConstants);DEBUG + $(MSBuildThisFileDirectory) $(ProjectDir)..\ diff --git a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.Manual.cs b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.Manual.cs index 79bf00c58a..0519992f61 100644 --- a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.Manual.cs +++ b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.Manual.cs @@ -19,4 +19,4 @@ public sealed partial class SqlParameter { internal class SqlParameterConverter { } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.NetCoreApp.cs b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.NetCoreApp.cs index d2329e7e10..eef032209c 100644 --- a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.NetCoreApp.cs +++ b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.NetCoreApp.cs @@ -143,4 +143,4 @@ public override void Flush() { } public override void SetLength(long value) { throw null; } public override void Write(byte[] buffer, int offset, int count) { throw null; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs index 6c216643a1..dbf0cfe197 100644 --- a/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netcore/ref/Microsoft.Data.SqlClient.cs @@ -1081,4 +1081,4 @@ public SensitivityProperty(Microsoft.Data.SqlClient.DataClassification.Label lab public Microsoft.Data.SqlClient.DataClassification.InformationType InformationType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public Microsoft.Data.SqlClient.DataClassification.Label Label { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/NegotiationInfoClass.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/NegotiationInfoClass.cs index ea6a7d6fb5..f5f7ab1b07 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/NegotiationInfoClass.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/NegotiationInfoClass.cs @@ -16,12 +16,14 @@ internal NegotiationInfoClass(SafeHandle safeHandle, int negotiationState) { if (safeHandle.IsInvalid) { - if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"Invalid handle:{safeHandle}"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, $"Invalid handle:{safeHandle}"); return; } IntPtr packageInfo = safeHandle.DangerousGetHandle(); - if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"packageInfo:{packageInfo} negotiationState:{negotiationState:x}"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, $"packageInfo:{packageInfo} negotiationState:{negotiationState:x}"); if (negotiationState == Interop.SspiCli.SECPKG_NEGOTIATION_COMPLETE || negotiationState == Interop.SspiCli.SECPKG_NEGOTIATION_OPTIMISTIC) @@ -30,14 +32,15 @@ internal NegotiationInfoClass(SafeHandle safeHandle, int negotiationState) unsafe { - IntPtr unmanagedString = ((SecurityPackageInfo *)packageInfo)->Name; + IntPtr unmanagedString = ((SecurityPackageInfo*)packageInfo)->Name; if (unmanagedString != IntPtr.Zero) { name = Marshal.PtrToStringUni(unmanagedString); } } - if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"packageInfo:{packageInfo} negotiationState:{negotiationState:x} name:{name}"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, $"packageInfo:{packageInfo} negotiationState:{negotiationState:x} name:{name}"); // An optimization for future string comparisons. if (string.Equals(name, Kerberos, StringComparison.OrdinalIgnoreCase)) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPIAuthType.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPIAuthType.cs index 20b7f6746a..8855379df7 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPIAuthType.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPIAuthType.cs @@ -27,7 +27,8 @@ public SecurityPackageInfoClass[] SecurityPackages public int EnumerateSecurityPackages(out int pkgnum, out SafeFreeContextBuffer pkgArray) { - if (NetEventSource.IsEnabled) NetEventSource.Info(this); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this); return SafeFreeContextBuffer.EnumeratePackages(out pkgnum, out pkgArray); } diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPISecureChannelType.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPISecureChannelType.cs index dc3cc16b1c..c46f602221 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPISecureChannelType.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPISecureChannelType.cs @@ -26,7 +26,8 @@ public SecurityPackageInfoClass[] SecurityPackages public int EnumerateSecurityPackages(out int pkgnum, out SafeFreeContextBuffer pkgArray) { - if (NetEventSource.IsEnabled) NetEventSource.Info(this); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this); return SafeFreeContextBuffer.EnumeratePackages(out pkgnum, out pkgArray); } diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPIWrapper.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPIWrapper.cs index c841556692..3e31c0c845 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPIWrapper.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SSPIWrapper.cs @@ -13,7 +13,8 @@ internal static class SSPIWrapper { internal static SecurityPackageInfoClass[] EnumerateSecurityPackages(SSPIInterface secModule) { - if (NetEventSource.IsEnabled) NetEventSource.Enter(null); + if (NetEventSource.IsEnabled) + NetEventSource.Enter(null); if (secModule.SecurityPackages == null) { @@ -26,7 +27,8 @@ internal static SecurityPackageInfoClass[] EnumerateSecurityPackages(SSPIInterfa try { int errorCode = secModule.EnumerateSecurityPackages(out moduleCount, out arrayBaseHandle); - if (NetEventSource.IsEnabled) NetEventSource.Info(null, $"arrayBase: {arrayBaseHandle}"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(null, $"arrayBase: {arrayBaseHandle}"); if (errorCode != 0) { throw new Win32Exception(errorCode); @@ -38,7 +40,8 @@ internal static SecurityPackageInfoClass[] EnumerateSecurityPackages(SSPIInterfa for (i = 0; i < moduleCount; i++) { securityPackages[i] = new SecurityPackageInfoClass(arrayBaseHandle, i); - if (NetEventSource.IsEnabled) NetEventSource.Log.EnumerateSecurityPackages(securityPackages[i].Name); + if (NetEventSource.IsEnabled) + NetEventSource.Log.EnumerateSecurityPackages(securityPackages[i].Name); } secModule.SecurityPackages = securityPackages; @@ -54,7 +57,8 @@ internal static SecurityPackageInfoClass[] EnumerateSecurityPackages(SSPIInterfa } } - if (NetEventSource.IsEnabled) NetEventSource.Exit(null); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null); return secModule.SecurityPackages; } @@ -72,7 +76,8 @@ internal static SecurityPackageInfoClass GetVerifyPackageInfo(SSPIInterface secM } } - if (NetEventSource.IsEnabled) NetEventSource.Log.SspiPackageNotFound(packageName); + if (NetEventSource.IsEnabled) + NetEventSource.Log.SspiPackageNotFound(packageName); if (throwIfMissing) { @@ -95,7 +100,8 @@ public static SafeFreeCredentials AcquireDefaultCredential(SSPIInterface secModu if (errorCode != 0) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, System.SRHelper.Format(SR.net_log_operation_failed_with_error, nameof(AcquireDefaultCredential), $"0x{errorCode:X}")); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, System.SRHelper.Format(SR.net_log_operation_failed_with_error, nameof(AcquireDefaultCredential), $"0x{errorCode:X}")); throw new Win32Exception(errorCode); } return outCredential; @@ -103,14 +109,16 @@ public static SafeFreeCredentials AcquireDefaultCredential(SSPIInterface secModu public static SafeFreeCredentials AcquireCredentialsHandle(SSPIInterface secModule, string package, Interop.SspiCli.CredentialUse intent, ref SafeSspiAuthDataHandle authdata) { - if (NetEventSource.IsEnabled) NetEventSource.Log.AcquireCredentialsHandle(package, intent, authdata); + if (NetEventSource.IsEnabled) + NetEventSource.Log.AcquireCredentialsHandle(package, intent, authdata); SafeFreeCredentials credentialsHandle = null; int errorCode = secModule.AcquireCredentialsHandle(package, intent, ref authdata, out credentialsHandle); if (errorCode != 0) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, System.SRHelper.Format(SR.net_log_operation_failed_with_error, nameof(AcquireCredentialsHandle), $"0x{errorCode:X}")); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, System.SRHelper.Format(SR.net_log_operation_failed_with_error, nameof(AcquireCredentialsHandle), $"0x{errorCode:X}")); throw new Win32Exception(errorCode); } @@ -134,43 +142,51 @@ public static SafeFreeCredentials AcquireCredentialsHandle(SSPIInterface secModu if (errorCode != 0) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, System.SRHelper.Format(SR.net_log_operation_failed_with_error, nameof(AcquireCredentialsHandle), $"0x{errorCode:X}")); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, System.SRHelper.Format(SR.net_log_operation_failed_with_error, nameof(AcquireCredentialsHandle), $"0x{errorCode:X}")); throw new Win32Exception(errorCode); } - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, outCredential); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, outCredential); return outCredential; } internal static int InitializeSecurityContext(SSPIInterface secModule, ref SafeFreeCredentials credential, ref SafeDeleteContext context, string targetName, Interop.SspiCli.ContextFlags inFlags, Interop.SspiCli.Endianness datarep, SecurityBuffer inputBuffer, SecurityBuffer outputBuffer, ref Interop.SspiCli.ContextFlags outFlags) { - if (NetEventSource.IsEnabled) NetEventSource.Log.InitializeSecurityContext(credential, context, targetName, inFlags); + if (NetEventSource.IsEnabled) + NetEventSource.Log.InitializeSecurityContext(credential, context, targetName, inFlags); int errorCode = secModule.InitializeSecurityContext(ref credential, ref context, targetName, inFlags, datarep, inputBuffer, outputBuffer, ref outFlags); - if (NetEventSource.IsEnabled) NetEventSource.Log.SecurityContextInputBuffer(nameof(InitializeSecurityContext), inputBuffer?.size ?? 0, outputBuffer.size, (Interop.SECURITY_STATUS)errorCode); + if (NetEventSource.IsEnabled) + NetEventSource.Log.SecurityContextInputBuffer(nameof(InitializeSecurityContext), inputBuffer?.size ?? 0, outputBuffer.size, (Interop.SECURITY_STATUS)errorCode); return errorCode; } internal static int InitializeSecurityContext(SSPIInterface secModule, SafeFreeCredentials credential, ref SafeDeleteContext context, string targetName, Interop.SspiCli.ContextFlags inFlags, Interop.SspiCli.Endianness datarep, SecurityBuffer[] inputBuffers, SecurityBuffer outputBuffer, ref Interop.SspiCli.ContextFlags outFlags) { - if (NetEventSource.IsEnabled) NetEventSource.Log.InitializeSecurityContext(credential, context, targetName, inFlags); + if (NetEventSource.IsEnabled) + NetEventSource.Log.InitializeSecurityContext(credential, context, targetName, inFlags); int errorCode = secModule.InitializeSecurityContext(credential, ref context, targetName, inFlags, datarep, inputBuffers, outputBuffer, ref outFlags); - if (NetEventSource.IsEnabled) NetEventSource.Log.SecurityContextInputBuffers(nameof(InitializeSecurityContext), inputBuffers?.Length ?? 0, outputBuffer.size, (Interop.SECURITY_STATUS)errorCode); + if (NetEventSource.IsEnabled) + NetEventSource.Log.SecurityContextInputBuffers(nameof(InitializeSecurityContext), inputBuffers?.Length ?? 0, outputBuffer.size, (Interop.SECURITY_STATUS)errorCode); return errorCode; } internal static int AcceptSecurityContext(SSPIInterface secModule, SafeFreeCredentials credential, ref SafeDeleteContext context, Interop.SspiCli.ContextFlags inFlags, Interop.SspiCli.Endianness datarep, SecurityBuffer[] inputBuffers, SecurityBuffer outputBuffer, ref Interop.SspiCli.ContextFlags outFlags) { - if (NetEventSource.IsEnabled) NetEventSource.Log.AcceptSecurityContext(credential, context, inFlags); + if (NetEventSource.IsEnabled) + NetEventSource.Log.AcceptSecurityContext(credential, context, inFlags); int errorCode = secModule.AcceptSecurityContext(credential, ref context, inputBuffers, inFlags, datarep, outputBuffer, ref outFlags); - if (NetEventSource.IsEnabled) NetEventSource.Log.SecurityContextInputBuffers(nameof(AcceptSecurityContext), inputBuffers?.Length ?? 0, outputBuffer.size, (Interop.SECURITY_STATUS)errorCode); + if (NetEventSource.IsEnabled) + NetEventSource.Log.SecurityContextInputBuffers(nameof(AcceptSecurityContext), inputBuffers?.Length ?? 0, outputBuffer.size, (Interop.SECURITY_STATUS)errorCode); return errorCode; } @@ -179,7 +195,8 @@ internal static int CompleteAuthToken(SSPIInterface secModule, ref SafeDeleteCon { int errorCode = secModule.CompleteAuthToken(ref context, inputBuffers); - if (NetEventSource.IsEnabled) NetEventSource.Log.OperationReturnedSomething(nameof(CompleteAuthToken), (Interop.SECURITY_STATUS)errorCode); + if (NetEventSource.IsEnabled) + NetEventSource.Log.OperationReturnedSomething(nameof(CompleteAuthToken), (Interop.SECURITY_STATUS)errorCode); return errorCode; } @@ -188,7 +205,8 @@ internal static int ApplyControlToken(SSPIInterface secModule, ref SafeDeleteCon { int errorCode = secModule.ApplyControlToken(ref context, inputBuffers); - if (NetEventSource.IsEnabled) NetEventSource.Log.OperationReturnedSomething(nameof(ApplyControlToken), (Interop.SECURITY_STATUS)errorCode); + if (NetEventSource.IsEnabled) + NetEventSource.Log.OperationReturnedSomething(nameof(ApplyControlToken), (Interop.SECURITY_STATUS)errorCode); return errorCode; } @@ -366,17 +384,20 @@ private static unsafe int EncryptDecryptHelper(OP op, SSPIInterface secModule, S public static SafeFreeContextBufferChannelBinding QueryContextChannelBinding(SSPIInterface secModule, SafeDeleteContext securityContext, Interop.SspiCli.ContextAttribute contextAttribute) { - if (NetEventSource.IsEnabled) NetEventSource.Enter(null, contextAttribute); + if (NetEventSource.IsEnabled) + NetEventSource.Enter(null, contextAttribute); SafeFreeContextBufferChannelBinding result; int errorCode = secModule.QueryContextChannelBinding(securityContext, contextAttribute, out result); if (errorCode != 0) { - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, $"ERROR = {ErrorDescription(errorCode)}"); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, $"ERROR = {ErrorDescription(errorCode)}"); return null; } - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, result); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, result); return result; } @@ -388,7 +409,8 @@ public static object QueryContextAttributes(SSPIInterface secModule, SafeDeleteC public static object QueryContextAttributes(SSPIInterface secModule, SafeDeleteContext securityContext, Interop.SspiCli.ContextAttribute contextAttribute, out int errorCode) { - if (NetEventSource.IsEnabled) NetEventSource.Enter(null, contextAttribute); + if (NetEventSource.IsEnabled) + NetEventSource.Enter(null, contextAttribute); int nativeBlockSize = IntPtr.Size; Type handleType = null; @@ -456,7 +478,8 @@ public static object QueryContextAttributes(SSPIInterface secModule, SafeDeleteC errorCode = secModule.QueryContextAttributes(securityContext, contextAttribute, nativeBuffer, handleType, out sspiHandle); if (errorCode != 0) { - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, $"ERROR = {ErrorDescription(errorCode)}"); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, $"ERROR = {ErrorDescription(errorCode)}"); return null; } @@ -511,7 +534,7 @@ public static object QueryContextAttributes(SSPIInterface secModule, SafeDeleteC case Interop.SspiCli.ContextAttribute.SECPKG_ATTR_APPLICATION_PROTOCOL: unsafe { - fixed (void *ptr = nativeBuffer) + fixed (void* ptr = nativeBuffer) { attribute = Marshal.PtrToStructure(new IntPtr(ptr)); } @@ -531,7 +554,8 @@ public static object QueryContextAttributes(SSPIInterface secModule, SafeDeleteC } } - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, attribute); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, attribute); return attribute; } diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SecurityPackageInfoClass.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SecurityPackageInfoClass.cs index cf10092e68..74fca62e89 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SecurityPackageInfoClass.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SecurityPackageInfoClass.cs @@ -27,12 +27,14 @@ internal unsafe SecurityPackageInfoClass(SafeHandle safeHandle, int index) { if (safeHandle.IsInvalid) { - if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"Invalid handle: {safeHandle}"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, $"Invalid handle: {safeHandle}"); return; } IntPtr unmanagedAddress = safeHandle.DangerousGetHandle() + (sizeof(SecurityPackageInfo) * index); - if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"unmanagedAddress: {unmanagedAddress}"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, $"unmanagedAddress: {unmanagedAddress}"); SecurityPackageInfo* pSecurityPackageInfo = (SecurityPackageInfo*)unmanagedAddress; @@ -47,17 +49,20 @@ internal unsafe SecurityPackageInfoClass(SafeHandle safeHandle, int index) if (unmanagedString != IntPtr.Zero) { Name = Marshal.PtrToStringUni(unmanagedString); - if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"Name: {Name}"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, $"Name: {Name}"); } unmanagedString = pSecurityPackageInfo->Comment; if (unmanagedString != IntPtr.Zero) { Comment = Marshal.PtrToStringUni(unmanagedString); - if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"Comment: {Comment}"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, $"Comment: {Comment}"); } - if (NetEventSource.IsEnabled) NetEventSource.Info(this, this.ToString()); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, this.ToString()); } public override string ToString() diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SecuritySafeHandles.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SecuritySafeHandles.cs index 9c1411434c..eddb15826b 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SecuritySafeHandles.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Windows/sspicli/SecuritySafeHandles.cs @@ -209,7 +209,8 @@ public static unsafe int AcquireDefaultCredential( Interop.SspiCli.CredentialUse intent, out SafeFreeCredentials outCredential) { - if (NetEventSource.IsEnabled) NetEventSource.Enter(null, package, intent); + if (NetEventSource.IsEnabled) + NetEventSource.Enter(null, package, intent); int errorCode = -1; long timeStamp; @@ -274,7 +275,8 @@ public static unsafe int AcquireCredentialsHandle( ref Interop.SspiCli.SCHANNEL_CRED authdata, out SafeFreeCredentials outCredential) { - if (NetEventSource.IsEnabled) NetEventSource.Enter(null, package, intent, authdata); + if (NetEventSource.IsEnabled) + NetEventSource.Enter(null, package, intent, authdata); int errorCode = -1; long timeStamp; @@ -513,7 +515,7 @@ internal static unsafe int InitializeSecurityContext( } Interop.SspiCli.SecBuffer outUnmanagedBuffer = default; - + // Fix Descriptor pointer that points to unmanaged SecurityBuffers. outSecurityBufferDescriptor.pBuffers = &outUnmanagedBuffer; outUnmanagedBuffer.cbBuffer = outSecBuffer.size; @@ -558,7 +560,8 @@ internal static unsafe int InitializeSecurityContext( outFreeContextBuffer); } - if (NetEventSource.IsEnabled) NetEventSource.Info(null, "Marshalling OUT buffer"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(null, "Marshalling OUT buffer"); // Get unmanaged buffer with index 0 as the only one passed into PInvoke. outSecBuffer.size = outUnmanagedBuffer.cbBuffer; @@ -597,7 +600,8 @@ internal static unsafe int InitializeSecurityContext( } } - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, $"errorCode:0x{errorCode:x8}, refContext:{refContext}"); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, $"errorCode:0x{errorCode:x8}, refContext:{refContext}"); return errorCode; } @@ -841,7 +845,8 @@ internal static unsafe int AcceptSecurityContext( ref outFlags, outFreeContextBuffer); - if (NetEventSource.IsEnabled) NetEventSource.Info(null, "Marshaling OUT buffer"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(null, "Marshaling OUT buffer"); // Get unmanaged buffer with index 0 as the only one passed into PInvoke. outSecBuffer.size = outUnmanagedBuffer[0].cbBuffer; @@ -882,7 +887,8 @@ internal static unsafe int AcceptSecurityContext( } } - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, $"errorCode:0x{errorCode:x8}, refContext:{refContext}"); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, $"errorCode:0x{errorCode:x8}, refContext:{refContext}"); return errorCode; } @@ -1065,7 +1071,8 @@ internal static unsafe int CompleteAuthToken( } } - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, $"unmanaged CompleteAuthToken() errorCode:0x{errorCode:x8} refContext:{refContext}"); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, $"unmanaged CompleteAuthToken() errorCode:0x{errorCode:x8} refContext:{refContext}"); return errorCode; } @@ -1168,7 +1175,8 @@ internal static unsafe int ApplyControlToken( } } - if (NetEventSource.IsEnabled) NetEventSource.Exit(null, $"unmanaged ApplyControlToken() errorCode:0x{errorCode:x8} refContext: {refContext}"); + if (NetEventSource.IsEnabled) + NetEventSource.Exit(null, $"unmanaged ApplyControlToken() errorCode:0x{errorCode:x8} refContext: {refContext}"); return errorCode; } } diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/BasicFieldNameLookup.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/BasicFieldNameLookup.cs index 6e427f771e..6d5b5b8891 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/BasicFieldNameLookup.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/BasicFieldNameLookup.cs @@ -2,11 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - -using Microsoft.Data.Common; using System.Collections.Generic; using System.Data; using System.Globalization; +using Microsoft.Data.Common; namespace Microsoft.Data.ProviderBase { diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/DbConnectionOptions.Common.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/DbConnectionOptions.Common.cs index e65b6380e3..2cab0ba6ed 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/DbConnectionOptions.Common.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/DbConnectionOptions.Common.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Data.Common; using System; using System.Collections.Generic; using System.Diagnostics; @@ -58,7 +57,7 @@ partial class DbConnectionOptions + "([^;\\s\\p{Cc}]|\\s+[^;\\s\\p{Cc}])*" // control characters must be quoted + ")" // although the spec does not allow {} - // embedded within a value, the retail code does. + // embedded within a value, the retail code does. + ")(\\s*)(;|[\u0000\\s]*$)" // whitespace after value up to semicolon or end-of-line + ")*" // repeat the key-value pair + "[\\s;]*[\u0000\\s]*" // traling whitespace/semicolons (DataSourceLocator), embedded nulls are allowed only in the end @@ -357,7 +356,7 @@ internal static int GetKeyValuePair(string connectionString, int currentPosition } buffer.Append(currentChar); } - ParserExit: + ParserExit: switch (parserState) { case ParserState.Key: @@ -483,7 +482,7 @@ private static Dictionary SplitConnectionString(string connectio string synonym; string realkeyname = null != synonyms ? (synonyms.TryGetValue(keyname, out synonym) ? synonym : null) : keyname; - + if (!IsKeyNameValid(realkeyname)) { throw ADP.KeywordNotSupported(keyname); @@ -558,47 +557,47 @@ private static NameValuePair ParseInternal(Dictionary parsetable try { #endif - int nextStartPosition = 0; - int endPosition = connectionString.Length; - while (nextStartPosition < endPosition) - { - int startPosition = nextStartPosition; - - string keyname, keyvalue; - nextStartPosition = GetKeyValuePair(connectionString, startPosition, buffer, firstKey, out keyname, out keyvalue); - if (string.IsNullOrEmpty(keyname)) + int nextStartPosition = 0; + int endPosition = connectionString.Length; + while (nextStartPosition < endPosition) { - // if (nextStartPosition != endPosition) { throw; } - break; - } + int startPosition = nextStartPosition; + + string keyname, keyvalue; + nextStartPosition = GetKeyValuePair(connectionString, startPosition, buffer, firstKey, out keyname, out keyvalue); + if (string.IsNullOrEmpty(keyname)) + { + // if (nextStartPosition != endPosition) { throw; } + break; + } #if DEBUG DebugTraceKeyValuePair(keyname, keyvalue, synonyms); Debug.Assert(IsKeyNameValid(keyname), "ParseFailure, invalid keyname"); Debug.Assert(IsValueValidInternal(keyvalue), "parse failure, invalid keyvalue"); #endif - string synonym; - string realkeyname = null != synonyms ? - (synonyms.TryGetValue(keyname, out synonym) ? synonym : null) : - keyname; - if (!IsKeyNameValid(realkeyname)) - { - throw ADP.KeywordNotSupported(keyname); - } - if (!firstKey || !parsetable.ContainsKey(realkeyname)) - { - parsetable[realkeyname] = keyvalue; // last key-value pair wins (or first) - } + string synonym; + string realkeyname = null != synonyms ? + (synonyms.TryGetValue(keyname, out synonym) ? synonym : null) : + keyname; + if (!IsKeyNameValid(realkeyname)) + { + throw ADP.KeywordNotSupported(keyname); + } + if (!firstKey || !parsetable.ContainsKey(realkeyname)) + { + parsetable[realkeyname] = keyvalue; // last key-value pair wins (or first) + } - if (null != localKeychain) - { - localKeychain = localKeychain.Next = new NameValuePair(realkeyname, keyvalue, nextStartPosition - startPosition); - } - else if (buildChain) - { // first time only - don't contain modified chain from UDL file - keychain = localKeychain = new NameValuePair(realkeyname, keyvalue, nextStartPosition - startPosition); + if (null != localKeychain) + { + localKeychain = localKeychain.Next = new NameValuePair(realkeyname, keyvalue, nextStartPosition - startPosition); + } + else if (buildChain) + { // first time only - don't contain modified chain from UDL file + keychain = localKeychain = new NameValuePair(realkeyname, keyvalue, nextStartPosition - startPosition); + } } - } #if DEBUG } catch (ArgumentException e) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/NameValuePair.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/NameValuePair.cs index 2cdd8cb6ce..abdbdfd28d 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/NameValuePair.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/Common/NameValuePair.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Data.Common; using System.Diagnostics; namespace Microsoft.Data.Common diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/ProviderBase/DbConnectionInternal.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/ProviderBase/DbConnectionInternal.cs index e96a6505d8..1ac82b68cc 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/ProviderBase/DbConnectionInternal.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Microsoft/Data/ProviderBase/DbConnectionInternal.cs @@ -31,7 +31,7 @@ internal abstract partial class DbConnectionInternal private bool _connectionIsDoomed; // true when the connection should no longer be used. private bool _cannotBePooled; // true when the connection should no longer be pooled. - + private DateTime _createTime; // when the connection was created. #if DEBUG diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugCriticalHandleMinusOneIsInvalid.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugCriticalHandleMinusOneIsInvalid.cs index 8ba682fa10..1949341de2 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugCriticalHandleMinusOneIsInvalid.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugCriticalHandleMinusOneIsInvalid.cs @@ -23,7 +23,8 @@ protected DebugCriticalHandleMinusOneIsInvalid() : base() private void Trace() { _trace = "WARNING! GC-ed >>" + this.GetType().FullName + "<< (should be explicitly closed) \r\n"; - if (NetEventSource.IsEnabled) NetEventSource.Info(this, "Creating SafeHandle"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, "Creating SafeHandle"); #if TRACE_VERBOSE string stacktrace = Environment.StackTrace; _trace += stacktrace; @@ -33,7 +34,8 @@ private void Trace() ~DebugCriticalHandleMinusOneIsInvalid() { DebugThreadTracking.SetThreadSource(ThreadKinds.Finalization); - if (NetEventSource.IsEnabled) NetEventSource.Info(this, _trace); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, _trace); } } #endif // DEBUG diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugCriticalHandleZeroOrMinusOneIsInvalid.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugCriticalHandleZeroOrMinusOneIsInvalid.cs index ff4ea687d2..c28a7107b1 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugCriticalHandleZeroOrMinusOneIsInvalid.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugCriticalHandleZeroOrMinusOneIsInvalid.cs @@ -23,7 +23,8 @@ protected DebugCriticalHandleZeroOrMinusOneIsInvalid() : base() private void Trace() { _trace = "WARNING! GC-ed >>" + this.GetType().FullName + "<< (should be explicitly closed) \r\n"; - if (NetEventSource.IsEnabled) NetEventSource.Info(this, "Creating SafeHandle"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, "Creating SafeHandle"); #if TRACE_VERBOSE string stacktrace = Environment.StackTrace; _trace += stacktrace; @@ -33,7 +34,8 @@ private void Trace() ~DebugCriticalHandleZeroOrMinusOneIsInvalid() { DebugThreadTracking.SetThreadSource(ThreadKinds.Finalization); - if (NetEventSource.IsEnabled) NetEventSource.Info(this, _trace); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, _trace); } } #endif // DEBUG diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugSafeHandle.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugSafeHandle.cs index e2e7c4629a..b0646f92e9 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugSafeHandle.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/DebugSafeHandle.cs @@ -43,7 +43,8 @@ private void Trace() ~DebugSafeHandle() { - if (NetEventSource.IsEnabled) NetEventSource.Info(this, _trace); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, _trace); } } #endif // DEBUG diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Logging/DebugThreadTracking.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Logging/DebugThreadTracking.cs index d10cf44d08..78d8d48ac6 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Logging/DebugThreadTracking.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Logging/DebugThreadTracking.cs @@ -34,16 +34,19 @@ internal static IDisposable SetThreadKind(ThreadKinds kind) // Special warnings when doing dangerous things on a thread. if ((threadKind & ThreadKinds.User) != 0 && (kind & ThreadKinds.System) != 0) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, "Thread changed from User to System; user's thread shouldn't be hijacked."); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, "Thread changed from User to System; user's thread shouldn't be hijacked."); } if ((threadKind & ThreadKinds.Async) != 0 && (kind & ThreadKinds.Sync) != 0) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, "Thread changed from Async to Sync, may block an Async thread."); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, "Thread changed from Async to Sync, may block an Async thread."); } else if ((threadKind & (ThreadKinds.Other | ThreadKinds.CompletionPort)) == 0 && (kind & ThreadKinds.Sync) != 0) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, "Thread from a limited resource changed to Sync, may deadlock or bottleneck."); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, "Thread from a limited resource changed to Sync, may deadlock or bottleneck."); } ThreadKindStack.Push( @@ -54,7 +57,8 @@ internal static IDisposable SetThreadKind(ThreadKinds kind) if (CurrentThreadKind != threadKind) { - if (NetEventSource.IsEnabled) NetEventSource.Info(null, $"Thread becomes:({CurrentThreadKind})"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(null, $"Thread becomes:({CurrentThreadKind})"); } return new ThreadKindFrame(); @@ -86,7 +90,8 @@ void IDisposable.Dispose() if (CurrentThreadKind != previous && NetEventSource.IsEnabled) { - if (NetEventSource.IsEnabled) NetEventSource.Info(this, $"Thread reverts:({CurrentThreadKind})"); + if (NetEventSource.IsEnabled) + NetEventSource.Info(this, $"Thread reverts:({CurrentThreadKind})"); } } } @@ -106,7 +111,8 @@ internal static void SetThreadSource(ThreadKinds source) if (ThreadKindStack.Count > 1) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, "SetThreadSource must be called at the base of the stack, or the stack has been corrupted."); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, "SetThreadSource must be called at the base of the stack, or the stack has been corrupted."); while (ThreadKindStack.Count > 1) { ThreadKindStack.Pop(); @@ -115,7 +121,8 @@ internal static void SetThreadSource(ThreadKinds source) if (ThreadKindStack.Peek() != source) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, "The stack has been corrupted."); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, "The stack has been corrupted."); ThreadKinds last = ThreadKindStack.Pop() & ThreadKinds.SourceMask; if (last != source && last != ThreadKinds.Other && NetEventSource.IsEnabled) { diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Logging/NetEventSource.Common.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Logging/NetEventSource.Common.cs index 6d3b94e120..4430445f30 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Logging/NetEventSource.Common.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Logging/NetEventSource.Common.cs @@ -45,7 +45,7 @@ namespace System.Net // method that takes an object and optionally provides a string representation of it, in case a particular library wants to customize further. /// Provides logging facilities for System.Net libraries. -#if NET46 +#if NET46 [SecuritySafeCritical] #endif internal sealed partial class NetEventSource : EventSource @@ -101,7 +101,8 @@ public static void Enter(object thisOrContextObject, FormattableString formattab { DebugValidateArg(thisOrContextObject); DebugValidateArg(formattableString); - if (IsEnabled) Log.Enter(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters); + if (IsEnabled) + Log.Enter(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters); } /// Logs entrance to a method. @@ -113,7 +114,8 @@ public static void Enter(object thisOrContextObject, object arg0, [CallerMemberN { DebugValidateArg(thisOrContextObject); DebugValidateArg(arg0); - if (IsEnabled) Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)})"); + if (IsEnabled) + Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)})"); } /// Logs entrance to a method. @@ -127,7 +129,8 @@ public static void Enter(object thisOrContextObject, object arg0, object arg1, [ DebugValidateArg(thisOrContextObject); DebugValidateArg(arg0); DebugValidateArg(arg1); - if (IsEnabled) Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)})"); + if (IsEnabled) + Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)})"); } /// Logs entrance to a method. @@ -143,7 +146,8 @@ public static void Enter(object thisOrContextObject, object arg0, object arg1, o DebugValidateArg(arg0); DebugValidateArg(arg1); DebugValidateArg(arg2); - if (IsEnabled) Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)}, {Format(arg2)})"); + if (IsEnabled) + Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)}, {Format(arg2)})"); } [Event(EnterEventId, Level = EventLevel.Informational, Keywords = Keywords.EnterExit)] @@ -161,7 +165,8 @@ public static void Exit(object thisOrContextObject, FormattableString formattabl { DebugValidateArg(thisOrContextObject); DebugValidateArg(formattableString); - if (IsEnabled) Log.Exit(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters); + if (IsEnabled) + Log.Exit(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters); } /// Logs exit from a method. @@ -173,7 +178,8 @@ public static void Exit(object thisOrContextObject, object arg0, [CallerMemberNa { DebugValidateArg(thisOrContextObject); DebugValidateArg(arg0); - if (IsEnabled) Log.Exit(IdOf(thisOrContextObject), memberName, Format(arg0).ToString()); + if (IsEnabled) + Log.Exit(IdOf(thisOrContextObject), memberName, Format(arg0).ToString()); } /// Logs exit from a method. @@ -187,7 +193,8 @@ public static void Exit(object thisOrContextObject, object arg0, object arg1, [C DebugValidateArg(thisOrContextObject); DebugValidateArg(arg0); DebugValidateArg(arg1); - if (IsEnabled) Log.Exit(IdOf(thisOrContextObject), memberName, $"{Format(arg0)}, {Format(arg1)}"); + if (IsEnabled) + Log.Exit(IdOf(thisOrContextObject), memberName, $"{Format(arg0)}, {Format(arg1)}"); } [Event(ExitEventId, Level = EventLevel.Informational, Keywords = Keywords.EnterExit)] @@ -205,7 +212,8 @@ public static void Info(object thisOrContextObject, FormattableString formattabl { DebugValidateArg(thisOrContextObject); DebugValidateArg(formattableString); - if (IsEnabled) Log.Info(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters); + if (IsEnabled) + Log.Info(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters); } /// Logs an information message. @@ -217,7 +225,8 @@ public static void Info(object thisOrContextObject, object message, [CallerMembe { DebugValidateArg(thisOrContextObject); DebugValidateArg(message); - if (IsEnabled) Log.Info(IdOf(thisOrContextObject), memberName, Format(message).ToString()); + if (IsEnabled) + Log.Info(IdOf(thisOrContextObject), memberName, Format(message).ToString()); } [Event(InfoEventId, Level = EventLevel.Informational, Keywords = Keywords.Default)] @@ -235,7 +244,8 @@ public static void Error(object thisOrContextObject, FormattableString formattab { DebugValidateArg(thisOrContextObject); DebugValidateArg(formattableString); - if (IsEnabled) Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(formattableString)); + if (IsEnabled) + Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(formattableString)); } /// Logs an error message. @@ -247,7 +257,8 @@ public static void Error(object thisOrContextObject, object message, [CallerMemb { DebugValidateArg(thisOrContextObject); DebugValidateArg(message); - if (IsEnabled) Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(message).ToString()); + if (IsEnabled) + Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(message).ToString()); } [Event(ErrorEventId, Level = EventLevel.Warning, Keywords = Keywords.Default)] @@ -266,7 +277,8 @@ public static void Fail(object thisOrContextObject, FormattableString formattabl // Don't call DebugValidateArg on args, as we expect Fail to be used in assert/failure situations // that should never happen in production, and thus we don't care about extra costs. - if (IsEnabled) Log.CriticalFailure(IdOf(thisOrContextObject), memberName, Format(formattableString)); + if (IsEnabled) + Log.CriticalFailure(IdOf(thisOrContextObject), memberName, Format(formattableString)); Debug.Fail(Format(formattableString), $"{IdOf(thisOrContextObject)}.{memberName}"); } @@ -280,7 +292,8 @@ public static void Fail(object thisOrContextObject, object message, [CallerMembe // Don't call DebugValidateArg on args, as we expect Fail to be used in assert/failure situations // that should never happen in production, and thus we don't care about extra costs. - if (IsEnabled) Log.CriticalFailure(IdOf(thisOrContextObject), memberName, Format(message).ToString()); + if (IsEnabled) + Log.CriticalFailure(IdOf(thisOrContextObject), memberName, Format(message).ToString()); Debug.Fail(Format(message).ToString(), $"{IdOf(thisOrContextObject)}.{memberName}"); } @@ -299,7 +312,7 @@ public static void DumpBuffer(object thisOrContextObject, byte[] buffer, [Caller { DumpBuffer(thisOrContextObject, buffer, 0, buffer.Length, memberName); } - + /// Logs the contents of a buffer. /// `this`, or another object that serves to provide context for the operation. /// The buffer to be logged. @@ -367,7 +380,8 @@ public static void Associate(object first, object second, [CallerMemberName] str { DebugValidateArg(first); DebugValidateArg(second); - if (IsEnabled) Log.Associate(IdOf(first), memberName, IdOf(first), IdOf(second)); + if (IsEnabled) + Log.Associate(IdOf(first), memberName, IdOf(first), IdOf(second)); } /// Logs a relationship between two objects. @@ -381,7 +395,8 @@ public static void Associate(object thisOrContextObject, object first, object se DebugValidateArg(thisOrContextObject); DebugValidateArg(first); DebugValidateArg(second); - if (IsEnabled) Log.Associate(IdOf(thisOrContextObject), memberName, IdOf(first), IdOf(second)); + if (IsEnabled) + Log.Associate(IdOf(thisOrContextObject), memberName, IdOf(first), IdOf(second)); } [Event(AssociateEventId, Level = EventLevel.Informational, Keywords = Keywords.Default, Message = "[{2}]<-->[{3}]")] @@ -409,7 +424,7 @@ private static void DebugValidateArg(FormattableString arg) public static new bool IsEnabled => Log.IsEnabled(); - //true; // uncomment for debugging only + //true; // uncomment for debugging only [NonEvent] public static string IdOf(object value) => value != null ? value.GetType().Name + "#" + GetHashCode(value) : NullInstance; @@ -478,10 +493,14 @@ private static string Format(FormattableString s) { switch (s.ArgumentCount) { - case 0: return s.Format; - case 1: return string.Format(s.Format, Format(s.GetArgument(0))); - case 2: return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1))); - case 3: return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1)), Format(s.GetArgument(2))); + case 0: + return s.Format; + case 1: + return string.Format(s.Format, Format(s.GetArgument(0))); + case 2: + return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1))); + case 3: + return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1)), Format(s.GetArgument(2))); default: object[] args = s.GetArguments(); object[] formattedArgs = new object[args.Length]; @@ -503,10 +522,14 @@ private unsafe void WriteEvent(int eventId, string arg1, string arg2, string arg { if (IsEnabled()) { - if (arg1 == null) arg1 = ""; - if (arg2 == null) arg2 = ""; - if (arg3 == null) arg3 = ""; - if (arg4 == null) arg4 = ""; + if (arg1 == null) + arg1 = ""; + if (arg2 == null) + arg2 = ""; + if (arg3 == null) + arg3 = ""; + if (arg4 == null) + arg4 = ""; fixed (char* string1Bytes = arg1) fixed (char* string2Bytes = arg2) @@ -547,9 +570,12 @@ private unsafe void WriteEvent(int eventId, string arg1, string arg2, byte[] arg { if (IsEnabled()) { - if (arg1 == null) arg1 = ""; - if (arg2 == null) arg2 = ""; - if (arg3 == null) arg3 = Array.Empty(); + if (arg1 == null) + arg1 = ""; + if (arg2 == null) + arg2 = ""; + if (arg3 == null) + arg3 = Array.Empty(); fixed (char* arg1Ptr = arg1) fixed (char* arg2Ptr = arg2) @@ -590,7 +616,8 @@ private unsafe void WriteEvent(int eventId, string arg1, int arg2, int arg3, int { if (IsEnabled()) { - if (arg1 == null) arg1 = ""; + if (arg1 == null) + arg1 = ""; fixed (char* arg1Ptr = arg1) { @@ -628,8 +655,10 @@ private unsafe void WriteEvent(int eventId, string arg1, int arg2, string arg3) { if (IsEnabled()) { - if (arg1 == null) arg1 = ""; - if (arg3 == null) arg3 = ""; + if (arg1 == null) + arg1 = ""; + if (arg3 == null) + arg3 = ""; fixed (char* arg1Ptr = arg1) fixed (char* arg3Ptr = arg3) @@ -663,8 +692,10 @@ private unsafe void WriteEvent(int eventId, string arg1, string arg2, int arg3) { if (IsEnabled()) { - if (arg1 == null) arg1 = ""; - if (arg2 == null) arg2 = ""; + if (arg1 == null) + arg1 = ""; + if (arg2 == null) + arg2 = ""; fixed (char* arg1Ptr = arg1) fixed (char* arg2Ptr = arg2) @@ -698,9 +729,12 @@ private unsafe void WriteEvent(int eventId, string arg1, string arg2, string arg { if (IsEnabled()) { - if (arg1 == null) arg1 = ""; - if (arg2 == null) arg2 = ""; - if (arg3 == null) arg3 = ""; + if (arg1 == null) + arg1 = ""; + if (arg2 == null) + arg2 = ""; + if (arg3 == null) + arg3 = ""; fixed (char* arg1Ptr = arg1) fixed (char* arg2Ptr = arg2) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Security/NegotiateStreamPal.Windows.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Security/NegotiateStreamPal.Windows.cs index 36b850af7b..961086a6fe 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Security/NegotiateStreamPal.Windows.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/Net/Security/NegotiateStreamPal.Windows.cs @@ -39,7 +39,8 @@ internal static unsafe SafeFreeCredentials AcquireCredentialsHandle(string packa if (result != Interop.SECURITY_STATUS.OK) { - if (NetEventSource.IsEnabled) NetEventSource.Error(null, System.SRHelper.Format(SR.net_log_operation_failed_with_error, nameof(Interop.SspiCli.SspiEncodeStringsAsAuthIdentity), $"0x{(int)result:X}")); + if (NetEventSource.IsEnabled) + NetEventSource.Error(null, System.SRHelper.Format(SR.net_log_operation_failed_with_error, nameof(Interop.SspiCli.SspiEncodeStringsAsAuthIdentity), $"0x{(int)result:X}")); throw new Win32Exception((int)result); } diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/PasteArguments.Windows.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/PasteArguments.Windows.cs index 7cdcbc4533..1e8cfdbaf7 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/PasteArguments.Windows.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/System/PasteArguments.Windows.cs @@ -10,7 +10,7 @@ namespace System { internal static partial class PasteArguments { - /// + /// /// Repastes a set of arguments into a linear string that parses back into the originals under pre- or post-2008 VC parsing rules. /// The rules for parsing the executable name (argv[0]) are special, so you must indicate whether the first argument actually is argv[0]. /// diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Interop/SNINativeMethodWrapper.Common.cs b/src/Microsoft.Data.SqlClient/netcore/src/Interop/SNINativeMethodWrapper.Common.cs index 6d63bc6633..ed33b6897a 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Interop/SNINativeMethodWrapper.Common.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Interop/SNINativeMethodWrapper.Common.cs @@ -21,4 +21,4 @@ internal enum SniSpecialErrors : uint MaxErrorValue = SNICommon.MaxErrorValue } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/ActivityCorrelator.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/ActivityCorrelator.cs index 5abd103464..d4f1c1ac6f 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/ActivityCorrelator.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/ActivityCorrelator.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - using System; using System.Globalization; diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/AdapterUtil.SqlClient.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/AdapterUtil.SqlClient.cs index f8ec10f703..27cba16b44 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/AdapterUtil.SqlClient.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/AdapterUtil.SqlClient.cs @@ -324,7 +324,7 @@ internal static Exception InvalidXmlInvalidValue(string collectionName, string c { return Argument(System.SRHelper.GetString(SR.MDF_InvalidXmlInvalidValue, collectionName, columnName)); } - + internal static Exception CollectionNameIsNotUnique(string collectionName) { return Argument(System.SRHelper.GetString(SR.MDF_CollectionNameISNotUnique, collectionName)); diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionOptions.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionOptions.cs index 02092e5f57..647a5aee94 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionOptions.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionOptions.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Globalization; - namespace Microsoft.Data.Common { internal partial class DbConnectionOptions @@ -21,7 +20,8 @@ public DbConnectionOptions(string connectionString, Dictionary s _usersConnectionString = ((null != connectionString) ? connectionString : ""); // first pass on parsing, initial syntax check - if (0 < _usersConnectionString.Length) { + if (0 < _usersConnectionString.Length) + { _keyChain = ParseInternal(_parsetable, _usersConnectionString, true, synonyms, false); HasPasswordKeyword = (_parsetable.ContainsKey(KEY.Password) || _parsetable.ContainsKey(SYNONYM.Pwd)); HasUserIdKeyword = (_parsetable.ContainsKey(KEY.User_ID) || _parsetable.ContainsKey(SYNONYM.UID)); diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionStringCommon.NetCoreApp.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionStringCommon.NetCoreApp.cs index bb5c8f07ba..a0ad228a3c 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionStringCommon.NetCoreApp.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionStringCommon.NetCoreApp.cs @@ -2,9 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Data.SqlClient; using System; using System.Diagnostics; +using Microsoft.Data.SqlClient; namespace Microsoft.Data.Common { diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionStringCommon.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionStringCommon.cs index a26639bb7a..34ed70bb42 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionStringCommon.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Common/DbConnectionStringCommon.cs @@ -2,12 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; using System.Diagnostics; +using System.Globalization; using System.Reflection; -using System; using Microsoft.Data.SqlClient; -using System.Globalization; -using Microsoft.Data.Common; namespace Microsoft.Data.Common { @@ -321,7 +320,7 @@ internal static bool IsValidAuthenticationTypeValue(SqlAuthenticationMethod valu return value == SqlAuthenticationMethod.SqlPassword || value == SqlAuthenticationMethod.ActiveDirectoryPassword || value == SqlAuthenticationMethod.ActiveDirectoryIntegrated - || value == SqlAuthenticationMethod.ActiveDirectoryInteractive + || value == SqlAuthenticationMethod.ActiveDirectoryInteractive || value == SqlAuthenticationMethod.NotSpecified; } diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/DataException.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/DataException.cs index 32f9b5280b..ad3840237b 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/DataException.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/DataException.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - using System; namespace Microsoft.Data @@ -12,8 +11,7 @@ namespace Microsoft.Data // The dangerous point there are the string arguments of the exported (internal) methods. // This string can be argument, table or constraint name but never text of exception itself. // Make an invariant that all texts of exceptions coming from resources only. - - + internal static class ExceptionBuilder { // The class defines the exceptions that are specific to the DataSet. diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/OperationAbortedException.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/OperationAbortedException.cs index a804341524..9dd6cbaa72 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/OperationAbortedException.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/OperationAbortedException.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. + using System; using System.Runtime.Serialization; @@ -16,7 +17,7 @@ private OperationAbortedException(string message, Exception innerException) : ba } private OperationAbortedException(SerializationInfo info, StreamingContext context) : base(info, context) - { + { } internal static OperationAbortedException Aborted(Exception inner) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionClosed.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionClosed.cs index 01e3c32497..89663d2f90 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionClosed.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionClosed.cs @@ -2,9 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Data.Common; -using System.Data.Common; using System.Transactions; +using Microsoft.Data.Common; namespace Microsoft.Data.ProviderBase { diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionFactory.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionFactory.cs index ab5d1de089..65c608d700 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionFactory.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionFactory.cs @@ -2,13 +2,13 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Diagnostics; +using System.Data; using System.Data.Common; +using System.Diagnostics; using System.Threading; using System.Threading.Tasks; -using Microsoft.Data.Common; using System.Transactions; -using System.Data; +using Microsoft.Data.Common; namespace Microsoft.Data.ProviderBase { diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionInternal.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionInternal.cs index 710503cc4b..39a6f0c3dd 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionInternal.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionInternal.cs @@ -2,14 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - -using Microsoft.Data.Common; using System; using System.Data.Common; using System.Diagnostics; using System.Threading; using System.Transactions; - +using Microsoft.Data.Common; namespace Microsoft.Data.ProviderBase { @@ -374,7 +372,7 @@ public virtual void Dispose() enlistedTransaction.Dispose(); } } - + abstract public void EnlistTransaction(Transaction transaction); // Cleanup connection's transaction-specific structures (currently used by Delegated transaction). diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPool.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPool.cs index 0406343c93..6a7231d0c8 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPool.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPool.cs @@ -2,14 +2,14 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Data.Common; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; -using System.Collections.Concurrent; using System.Transactions; -using System; using Microsoft.Data.Common; namespace Microsoft.Data.ProviderBase @@ -128,7 +128,7 @@ internal DbConnectionInternal GetTransactedObject(Transaction transaction) } } } - + return transactedObject; } @@ -622,7 +622,7 @@ private void CleanupCallback(object state) // new stack to old stack. if (_waitHandles.PoolSemaphore.WaitOne(0)) { - for (; ;) + for (; ; ) { DbConnectionInternal obj; @@ -750,7 +750,8 @@ private DbConnectionInternal CreateObject(DbConnection owningObject, DbConnectio Timer t = new Timer(new TimerCallback(this.ErrorCallback), null, Timeout.Infinite, Timeout.Infinite); bool timerIsNotDisposed; - try { } + try + { } finally { _waitHandles.ErrorEvent.Set(); @@ -969,7 +970,8 @@ private void WaitForPendingOpen() try { - try { } + try + { } finally { started = Interlocked.CompareExchange(ref _pendingOpensWaiting, 1, 0) == 0; @@ -1383,7 +1385,8 @@ private void PoolCreateRequest(object state) int waitResult = BOGUS_HANDLE; try { - try { } + try + { } finally { waitResult = WaitHandle.WaitAny(_waitHandles.GetHandles(withCreate: true), CreationTimeout); diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolAuthenticationContext.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolAuthenticationContext.cs index 51946630cd..6fc660b8b1 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolAuthenticationContext.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolAuthenticationContext.cs @@ -101,4 +101,4 @@ internal void ReleaseLockToUpdate() { Debug.Assert(oldValue == STATUS_LOCKED); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolAuthenticationContextKey.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolAuthenticationContextKey.cs index e6499a96bf..0f89649628 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolAuthenticationContextKey.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolAuthenticationContextKey.cs @@ -99,4 +99,4 @@ private int ComputeHashCode() { return hashCode; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolGroupProviderInfo.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolGroupProviderInfo.cs index 1723ea86be..3eceb6d3e3 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolGroupProviderInfo.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolGroupProviderInfo.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - namespace Microsoft.Data.ProviderBase { internal class DbConnectionPoolGroupProviderInfo diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolIdentity.Windows.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolIdentity.Windows.cs index 1b26771e3b..93d2b0f329 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolIdentity.Windows.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolIdentity.Windows.cs @@ -3,8 +3,8 @@ // See the LICENSE file in the project root for more information. using System; -using Microsoft.Data.SqlClient; using System.Security.Principal; +using Microsoft.Data.SqlClient; namespace Microsoft.Data.ProviderBase { diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolProviderInfo.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolProviderInfo.cs index 9eb0379ab0..5392795dff 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolProviderInfo.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/ProviderBase/DbConnectionPoolProviderInfo.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - namespace Microsoft.Data.ProviderBase { internal class DbConnectionPoolProviderInfo diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Sql/SqlNotificationRequest.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Sql/SqlNotificationRequest.cs index dcbedb6324..3337b576e5 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Sql/SqlNotificationRequest.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/Sql/SqlNotificationRequest.cs @@ -71,4 +71,4 @@ public string UserData } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationTimeoutRetryHelper.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationTimeoutRetryHelper.cs index 9679168b92..8e7fca8dcf 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationTimeoutRetryHelper.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationTimeoutRetryHelper.cs @@ -2,18 +2,19 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Security.Cryptography; +using System; using System.ComponentModel; +using System.Security.Cryptography; using System.Text; -using System; - -namespace Microsoft.Data.SqlClient { +namespace Microsoft.Data.SqlClient +{ /// /// AD auth retry states. /// - internal enum ActiveDirectoryAuthenticationTimeoutRetryState { + internal enum ActiveDirectoryAuthenticationTimeoutRetryState + { NotStarted = 0, Retrying, HasLoggedIn, @@ -22,7 +23,8 @@ internal enum ActiveDirectoryAuthenticationTimeoutRetryState { /// /// AD auth retry helper. /// - internal class ActiveDirectoryAuthenticationTimeoutRetryHelper { + internal class ActiveDirectoryAuthenticationTimeoutRetryHelper + { private ActiveDirectoryAuthenticationTimeoutRetryState _state = ActiveDirectoryAuthenticationTimeoutRetryState.NotStarted; private SqlFedAuthToken _token; private readonly string _typeName; @@ -30,25 +32,31 @@ internal class ActiveDirectoryAuthenticationTimeoutRetryHelper { /// /// Constructor. /// - public ActiveDirectoryAuthenticationTimeoutRetryHelper() { + public ActiveDirectoryAuthenticationTimeoutRetryHelper() + { _typeName = GetType().Name; } /// /// Retry state. /// - public ActiveDirectoryAuthenticationTimeoutRetryState State { + public ActiveDirectoryAuthenticationTimeoutRetryState State + { get { return _state; } - set { - switch (_state) { + set + { + switch (_state) + { case ActiveDirectoryAuthenticationTimeoutRetryState.NotStarted: if (value != ActiveDirectoryAuthenticationTimeoutRetryState.Retrying - && value != ActiveDirectoryAuthenticationTimeoutRetryState.HasLoggedIn) { + && value != ActiveDirectoryAuthenticationTimeoutRetryState.HasLoggedIn) + { throw new InvalidOperationException($"Cannot transit from {_state} to {value}."); } break; case ActiveDirectoryAuthenticationTimeoutRetryState.Retrying: - if (value != ActiveDirectoryAuthenticationTimeoutRetryState.HasLoggedIn) { + if (value != ActiveDirectoryAuthenticationTimeoutRetryState.HasLoggedIn) + { throw new InvalidOperationException($"Cannot transit from {_state} to {value}."); } break; @@ -64,11 +72,14 @@ public ActiveDirectoryAuthenticationTimeoutRetryState State { /// /// Cached token. /// - public SqlFedAuthToken CachedToken { - get { + public SqlFedAuthToken CachedToken + { + get + { return _token; } - set { + set + { _token = value; } } @@ -76,29 +87,36 @@ public SqlFedAuthToken CachedToken { /// /// Whether login can be retried after a client/server connection timeout due to a long-time token acquisition. /// - public bool CanRetryWithSqlException(SqlException sqlex) { + public bool CanRetryWithSqlException(SqlException sqlex) + { if (_state == ActiveDirectoryAuthenticationTimeoutRetryState.NotStarted && CachedToken != null - && IsConnectTimeoutError(sqlex)){ + && IsConnectTimeoutError(sqlex)) + { return true; } return false; } - private static bool IsConnectTimeoutError(SqlException sqlex) { + private static bool IsConnectTimeoutError(SqlException sqlex) + { var innerException = sqlex.InnerException as Win32Exception; - if (innerException == null) return false; + if (innerException == null) + return false; return innerException.NativeErrorCode == 10054 // Server timeout || innerException.NativeErrorCode == 258; // Client timeout } - private static string GetTokenHash(SqlFedAuthToken token) { - if (token == null) return "null"; + private static string GetTokenHash(SqlFedAuthToken token) + { + if (token == null) + return "null"; // Here we mimic how ADAL calculates hash for token. They use UTF8 instead of Unicode. var originalTokenString = SqlAuthenticationToken.AccessTokenStringFromBytes(token.accessToken); var bytesInUtf8 = Encoding.UTF8.GetBytes(originalTokenString); - using (var sha256 = SHA256.Create()) { + using (var sha256 = SHA256.Create()) + { var hash = sha256.ComputeHash(bytesInUtf8); return Convert.ToBase64String(hash); } diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ActiveDirectoryNativeAuthenticationProvider.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ActiveDirectoryNativeAuthenticationProvider.cs index 877c415902..5652d93f04 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ActiveDirectoryNativeAuthenticationProvider.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ActiveDirectoryNativeAuthenticationProvider.cs @@ -2,9 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Identity.Client; using System.Security; using System.Threading.Tasks; +using Microsoft.Identity.Client; namespace Microsoft.Data.SqlClient { diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/AlwaysEncryptedHelperClasses.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/AlwaysEncryptedHelperClasses.cs index cdeb388481..93eee05b61 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/AlwaysEncryptedHelperClasses.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/AlwaysEncryptedHelperClasses.cs @@ -2,10 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.Data.SqlClient.Server; using System; using System.Collections.Generic; using System.Diagnostics; +using Microsoft.Data.SqlClient.Server; namespace Microsoft.Data.SqlClient { @@ -239,7 +239,7 @@ internal _SqlMetaDataSet(int count, SqlTceCipherInfoTable? cipherTable) _metaDataArray = new _SqlMetaData[count]; for (int i = 0; i < _metaDataArray.Length; ++i) { - _metaDataArray[i] = new _SqlMetaData(i); + _metaDataArray[i] = new _SqlMetaData(i); } } } diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ApplicationIntent.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ApplicationIntent.cs index 4a1142bfd9..9e6af8cd0b 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ApplicationIntent.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ApplicationIntent.cs @@ -2,9 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - -//------------------------------------------------------------------------------ - namespace Microsoft.Data.SqlClient { /// diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ColumnEncryptionKeyInfo.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ColumnEncryptionKeyInfo.cs index c7a4394643..eaecec4f9d 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ColumnEncryptionKeyInfo.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/ColumnEncryptionKeyInfo.cs @@ -36,10 +36,14 @@ internal class ColumnEncryptionKeyInfo internal ColumnEncryptionKeyInfo(byte[] decryptedKey, int databaseId, byte[] keyMetadataVersion, int keyid) { - if (null == decryptedKey) { throw SQL.NullArgumentInConstructorInternal(_decryptedKeyName, _className); } - if (0 == decryptedKey.Length) { throw SQL.EmptyArgumentInConstructorInternal(_decryptedKeyName, _className); } - if (null == keyMetadataVersion) { throw SQL.NullArgumentInConstructorInternal(_keyMetadataVersionName, _className); } - if (0 == keyMetadataVersion.Length) { throw SQL.EmptyArgumentInConstructorInternal(_keyMetadataVersionName, _className); } + if (null == decryptedKey) + throw SQL.NullArgumentInConstructorInternal(_decryptedKeyName, _className); + if (0 == decryptedKey.Length) + throw SQL.EmptyArgumentInConstructorInternal(_decryptedKeyName, _className); + if (null == keyMetadataVersion) + throw SQL.NullArgumentInConstructorInternal(_keyMetadataVersionName, _className); + if (0 == keyMetadataVersion.Length) + throw SQL.EmptyArgumentInConstructorInternal(_keyMetadataVersionName, _className); KeyId = keyid; DatabaseId = databaseId; @@ -98,10 +102,14 @@ internal int GetLengthForSerialization() internal int SerializeToBuffer(byte[] bytePackage, int startOffset) { - if (null == bytePackage) { throw SQL.NullArgumentInternal(_bytePackageName, _className, _serializeToBufferMethodName); } - if (0 == bytePackage.Length) { throw SQL.EmptyArgumentInternal(_bytePackageName, _className, _serializeToBufferMethodName); } - if (!(startOffset < bytePackage.Length)) { throw SQL.OffsetOutOfBounds(_startOffsetName, _className, _serializeToBufferMethodName); } - if ((bytePackage.Length - startOffset) < GetLengthForSerialization()) { throw SQL.InsufficientBuffer(_bytePackageName, _className, _serializeToBufferMethodName); } + if (null == bytePackage) + throw SQL.NullArgumentInternal(_bytePackageName, _className, _serializeToBufferMethodName); + if (0 == bytePackage.Length) + throw SQL.EmptyArgumentInternal(_bytePackageName, _className, _serializeToBufferMethodName); + if (!(startOffset < bytePackage.Length)) + throw SQL.OffsetOutOfBounds(_startOffsetName, _className, _serializeToBufferMethodName); + if ((bytePackage.Length - startOffset) < GetLengthForSerialization()) + throw SQL.InsufficientBuffer(_bytePackageName, _className, _serializeToBufferMethodName); Buffer.BlockCopy(DatabaseIdBytes, 0, bytePackage, startOffset, DatabaseIdBytes.Length); startOffset += DatabaseIdBytes.Length; diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/DataClassification/SensitivityClassification.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/DataClassification/SensitivityClassification.cs index ca1344b559..845d139a77 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/DataClassification/SensitivityClassification.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/DataClassification/SensitivityClassification.cs @@ -4,21 +4,24 @@ using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Diagnostics; -namespace Microsoft.Data.SqlClient.DataClassification { +namespace Microsoft.Data.SqlClient.DataClassification +{ - public class Label { + public class Label + { public string Name { get; private set; } public string Id { get; private set; } - public Label(string name, string id) { + public Label(string name, string id) + { Name = name; Id = id; } } - public class InformationType { + public class InformationType + { public string Name { get; private set; } public string Id { get; private set; } @@ -29,30 +32,36 @@ public InformationType(string name, string id) } } - public class SensitivityProperty { + public class SensitivityProperty + { public Label Label { get; private set; } public InformationType InformationType { get; private set; } - public SensitivityProperty(Label label, InformationType informationType) { + public SensitivityProperty(Label label, InformationType informationType) + { Label = label; InformationType = informationType; } } - public class ColumnSensitivity { + public class ColumnSensitivity + { public ReadOnlyCollection SensitivityProperties { get; private set; } - public ColumnSensitivity(IList sensitivityProperties) { + public ColumnSensitivity(IList sensitivityProperties) + { SensitivityProperties = new ReadOnlyCollection(sensitivityProperties); } } - public class SensitivityClassification { + public class SensitivityClassification + { public ReadOnlyCollection