1 // Copyright (c) 2012 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"
9 #include "crypto/rsa_private_key.h"
14 SignatureCreator
* SignatureCreator::Create(RSAPrivateKey
* key
) {
15 scoped_ptr
<SignatureCreator
> result(new SignatureCreator
);
18 if (!CryptCreateHash(key
->provider(), CALG_SHA1
, 0, 0,
19 result
->hash_object_
.receive())) {
24 return result
.release();
27 SignatureCreator::SignatureCreator() : key_(NULL
), hash_object_(0) {}
29 SignatureCreator::~SignatureCreator() {}
31 bool SignatureCreator::Update(const uint8
* data_part
, int data_part_len
) {
32 if (!CryptHashData(hash_object_
, data_part
, data_part_len
, 0)) {
40 bool SignatureCreator::Final(std::vector
<uint8
>* signature
) {
41 DWORD signature_length
= 0;
42 if (!CryptSignHash(hash_object_
, AT_SIGNATURE
, NULL
, 0, NULL
,
47 std::vector
<uint8
> temp
;
48 temp
.resize(signature_length
);
49 if (!CryptSignHash(hash_object_
, AT_SIGNATURE
, NULL
, 0, &temp
.front(),
54 temp
.resize(signature_length
);
55 for (size_t i
= temp
.size(); i
> 0; --i
)
56 signature
->push_back(temp
[i
- 1]);