Index: base/hmac.cc |
=================================================================== |
--- base/hmac.cc (revision 1712) |
+++ base/hmac.cc (working copy) |
@@ -1,97 +0,0 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/hmac.h" |
-#include "base/logging.h" |
- |
-HMAC::HMAC(HashAlgorithm hash_alg, const unsigned char* key, int key_length) |
- : hash_alg_(hash_alg), |
- provider_(NULL), |
- hash_(NULL), |
- hkey_(NULL) { |
- if (!CryptAcquireContext(&provider_, NULL, NULL, |
- PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) |
- provider_ = NULL; |
- ImportKey(key, key_length); |
-} |
- |
-HMAC::~HMAC() { |
- if (hkey_) |
- CryptDestroyKey(hkey_); |
- if (hash_) |
- CryptDestroyHash(hash_); |
- if (provider_) |
- CryptReleaseContext(provider_, 0); |
-} |
- |
-bool HMAC::Sign(const std::string& data, |
- unsigned char* digest, |
- int digest_length) { |
- if (!provider_ || !hkey_) |
- return false; |
- |
- switch (hash_alg_) { |
- case SHA1: |
- return SignWithSHA1(data, digest, digest_length); |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-void HMAC::ImportKey(const unsigned char* key, int key_length) { |
- if (key_length > kMaxKeySize) { |
- NOTREACHED(); |
- return; |
- } |
- |
- struct { |
- BLOBHEADER header; |
- DWORD key_size; |
- BYTE key_data[kMaxKeySize]; |
- } key_blob; |
- key_blob.header.bType = PLAINTEXTKEYBLOB; |
- key_blob.header.bVersion = CUR_BLOB_VERSION; |
- key_blob.header.reserved = 0; |
- key_blob.header.aiKeyAlg = CALG_RC2; |
- key_blob.key_size = key_length; |
- memcpy(key_blob.key_data, key, key_length); |
- |
- if (!CryptImportKey(provider_, |
- reinterpret_cast<const BYTE *>(&key_blob), |
- sizeof(key_blob), 0, 0, &hkey_)) |
- hkey_ = NULL; |
- |
- // Destroy the copy of the key. |
- SecureZeroMemory(key_blob.key_data, key_length); |
-} |
- |
-bool HMAC::SignWithSHA1(const std::string& data, |
- unsigned char* digest, |
- int digest_length) { |
- DCHECK(provider_); |
- DCHECK(hkey_); |
- |
- if (!CryptCreateHash(provider_, CALG_HMAC, hkey_, 0, &hash_)) |
- return false; |
- |
- HMAC_INFO hmac_info; |
- memset(&hmac_info, 0, sizeof(hmac_info)); |
- hmac_info.HashAlgid = CALG_SHA1; |
- if (!CryptSetHashParam(hash_, HP_HMAC_INFO, |
- reinterpret_cast<BYTE*>(&hmac_info), 0)) |
- return false; |
- |
- if (!CryptHashData(hash_, |
- reinterpret_cast<const BYTE*>(data.data()), |
- static_cast<DWORD>(data.size()), 0)) |
- return false; |
- |
- DWORD sha1_size = digest_length; |
- if (!CryptGetHashParam(hash_, HP_HASHVAL, digest, &sha1_size, 0)) |
- return false; |
- |
- return true; |
-} |
- |