1 // Copyright (c) 2011 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.
5 #include "crypto/signature_creator.h"
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
13 SignatureCreator
* SignatureCreator::Create(RSAPrivateKey
* key
) {
14 scoped_ptr
<SignatureCreator
> result(new SignatureCreator
);
17 if (!CryptCreateHash(key
->provider(), CALG_SHA1
, 0, 0,
18 result
->hash_object_
.receive())) {
23 return result
.release();
26 SignatureCreator::SignatureCreator() : hash_object_(0) {}
28 SignatureCreator::~SignatureCreator() {}
30 bool SignatureCreator::Update(const uint8
* data_part
, int data_part_len
) {
31 if (!CryptHashData(hash_object_
, data_part
, data_part_len
, 0)) {
39 bool SignatureCreator::Final(std::vector
<uint8
>* signature
) {
40 DWORD signature_length
= 0;
41 if (!CryptSignHash(hash_object_
, AT_SIGNATURE
, NULL
, 0, NULL
,
46 std::vector
<uint8
> temp
;
47 temp
.resize(signature_length
);
48 if (!CryptSignHash(hash_object_
, AT_SIGNATURE
, NULL
, 0, &temp
.front(),
53 temp
.resize(signature_length
);
54 for (size_t i
= temp
.size(); i
> 0; --i
)
55 signature
->push_back(temp
[i
- 1]);