//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// balnee
// krishnib
//------------------------------------------------------------------------------
namespace System.Data.SqlClient
{
using System;
using System.Data.SqlClient;
using System.Security.Cryptography;
///
/// Base class containing raw key bytes for symmetric key algorithms. Some encryption algorithms can use the key directly while others derive sub keys from this.
/// If an algorithm needs to derive more keys, have a derived class from this and use it in the corresponding encryption algorithm.
///
internal class SqlClientSymmetricKey
{
///
/// DPAPI protected key
///
protected readonly byte[] _rootKey;
///
/// Constructor that initializes the root key.
///
/// root key
internal SqlClientSymmetricKey(byte[] rootKey)
{
// Key validation
if (rootKey == null || rootKey.Length == 0) {
throw SQL.NullColumnEncryptionKeySysErr();
}
_rootKey = rootKey;
}
///
/// Returns a copy of the plain text key
/// This is needed for actual encryption/decryption.
///
internal virtual byte[] RootKey
{
get
{
return _rootKey;
}
}
///
/// Computes SHA256 value of the plain text key bytes
///
/// A string containing SHA256 hash of the root key
internal virtual string GetKeyHash()
{
return SqlSecurityUtility.GetSHA256Hash(RootKey);
}
///
/// Gets the length of the root key
///
///
/// Returns the length of the root key
///
internal virtual int Length()
{
// Note: DPAPI preserves the original byte length
// so for now, this is as same as returning the length of the raw key.
return _rootKey.Length;
}
}
}