1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/crypto/signature_creator.h" 6 7 #include "base/logging.h" 8 #include "base/scoped_ptr.h" 9 10 namespace base { 11 12 // static 13 SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key) { 14 scoped_ptr<SignatureCreator> result(new SignatureCreator); 15 result->key_ = key; 16 17 if (!CryptCreateHash(key->provider(), CALG_SHA1, 0, 0, 18 &result->hash_object_)) { 19 NOTREACHED(); 20 return NULL; 21 } 22 23 return result.release(); 24 } 25 26 SignatureCreator::SignatureCreator() : hash_object_(0) {} 27 28 SignatureCreator::~SignatureCreator() { 29 if (hash_object_) { 30 if (!CryptDestroyHash(hash_object_)) 31 NOTREACHED(); 32 33 hash_object_ = 0; 34 } 35 } 36 37 bool SignatureCreator::Update(const uint8* data_part, int data_part_len) { 38 if (!CryptHashData(hash_object_, data_part, data_part_len, 0)) { 39 NOTREACHED(); 40 return false; 41 } 42 43 return true; 44 } 45 46 bool SignatureCreator::Final(std::vector<uint8>* signature) { 47 DWORD signature_length = 0; 48 if (!CryptSignHash(hash_object_, AT_SIGNATURE, NULL, 0, NULL, 49 &signature_length)) { 50 return false; 51 } 52 53 std::vector<uint8> temp; 54 temp.resize(signature_length); 55 if (!CryptSignHash(hash_object_, AT_SIGNATURE, NULL, 0, &temp.front(), 56 &signature_length)) { 57 return false; 58 } 59 60 temp.resize(signature_length); 61 for (size_t i = temp.size(); i > 0; --i) 62 signature->push_back(temp[i - 1]); 63 64 return true; 65 } 66 67 } // namespace base 68