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