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