summaryrefslogtreecommitdiffstats
path: root/base/crypto/symmetric_key.h
diff options
context:
space:
mode:
authorwtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-09 18:40:50 +0000
committerwtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-09 18:40:50 +0000
commit692033a35dd662cd04b965cfa31581176ebdcfe6 (patch)
tree6224a1b37f7c1a0f6296490ba5e805e815b51247 /base/crypto/symmetric_key.h
parent256865a6ab0cf3affd171b2eb275bfa7bb8c964d (diff)
downloadchromium_src-692033a35dd662cd04b965cfa31581176ebdcfe6.zip
chromium_src-692033a35dd662cd04b965cfa31581176ebdcfe6.tar.gz
chromium_src-692033a35dd662cd04b965cfa31581176ebdcfe6.tar.bz2
Implement PBKDF2-based key derivation, random key generation,
and AES-CBC encryption/decryption using CryptoAPI. Contributed by Ryan Sleevi <ryan.sleevi@gmail.com>. Original review URL: http://codereview.chromium.org/1558018 R=wtc,albertb BUG=none TEST=SymmetricKeyTest.* and EncryptorTest.* Review URL: http://codereview.chromium.org/1528021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44106 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/crypto/symmetric_key.h')
-rw-r--r--base/crypto/symmetric_key.h30
1 files changed, 28 insertions, 2 deletions
diff --git a/base/crypto/symmetric_key.h b/base/crypto/symmetric_key.h
index f528213..48b3708 100644
--- a/base/crypto/symmetric_key.h
+++ b/base/crypto/symmetric_key.h
@@ -13,6 +13,8 @@
#include "base/crypto/scoped_nss_types.h"
#elif defined(OS_MACOSX)
#include <Security/cssmtype.h>
+#elif defined(OS_WIN)
+#include "base/crypto/scoped_capi_types.h"
#endif
namespace base {
@@ -26,7 +28,7 @@ class SymmetricKey {
HMAC_SHA1,
};
- virtual ~SymmetricKey() {}
+ virtual ~SymmetricKey();
// Generates a random key suitable to be used with |cipher| and of
// |key_size_in_bits| bits.
@@ -42,10 +44,20 @@ class SymmetricKey {
size_t iterations,
size_t key_size_in_bits);
+ // TODO(wtc): port this method to Mac and NSS.
+#if defined(OS_WIN)
+ // Imports a raw key. This method is only used by unit tests.
+ static SymmetricKey* Import(Algorithm algorithm,
+ const void* key_data,
+ size_t key_size_in_bytes);
+#endif
+
#if defined(USE_NSS)
PK11SymKey* key() const { return key_.get(); }
#elif defined(OS_MACOSX)
CSSM_DATA cssm_data() const;
+#elif defined(OS_WIN)
+ HCRYPTKEY key() const { return key_.get(); }
#endif
// Extracts the raw key from the platform specific data. This should only be
@@ -59,6 +71,20 @@ class SymmetricKey {
#elif defined(OS_MACOSX)
SymmetricKey(const void* key_data, size_t key_size_in_bits);
std::string key_;
+#elif defined(OS_WIN)
+ SymmetricKey(HCRYPTPROV provider, HCRYPTKEY key,
+ const void* key_data, size_t key_size_in_bytes);
+
+ ScopedHCRYPTPROV provider_;
+ ScopedHCRYPTKEY key_;
+
+ // Contains the raw key, if it is known during initialization and when it
+ // is likely that the associated |provider_| will be unable to export the
+ // |key_|. This is the case of HMAC keys when the key size exceeds 16 bytes
+ // when using the default RSA provider.
+ // TODO(rsleevi): See if KP_EFFECTIVE_KEYLEN is the reason why CryptExportKey
+ // fails with NTE_BAD_KEY/NTE_BAD_LEN
+ std::string raw_key_;
#endif
DISALLOW_COPY_AND_ASSIGN(SymmetricKey);
@@ -66,4 +92,4 @@ class SymmetricKey {
} // namespace base
-#endif // BASE_CRYPTO_SYMMETRIC_KEY_H_
+#endif // BASE_CRYPTO_SYMMETRIC_KEY_H_