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"
9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "crypto/cssm_init.h"
12 #include "crypto/rsa_private_key.h"
17 SignatureCreator
* SignatureCreator::Create(RSAPrivateKey
* key
) {
18 scoped_ptr
<SignatureCreator
> result(new SignatureCreator
);
22 crtn
= CSSM_CSP_CreateSignatureContext(GetSharedCSPHandle(),
23 CSSM_ALGID_SHA1WithRSA
,
26 &result
->sig_handle_
);
32 crtn
= CSSM_SignDataInit(result
->sig_handle_
);
38 return result
.release();
41 SignatureCreator::SignatureCreator() : key_(NULL
), sig_handle_(0) {
45 SignatureCreator::~SignatureCreator() {
48 crtn
= CSSM_DeleteContext(sig_handle_
);
49 DCHECK_EQ(CSSM_OK
, crtn
);
53 bool SignatureCreator::Update(const uint8
* data_part
, int data_part_len
) {
55 data
.Data
= const_cast<uint8
*>(data_part
);
56 data
.Length
= data_part_len
;
57 CSSM_RETURN crtn
= CSSM_SignDataUpdate(sig_handle_
, &data
, 1);
58 DCHECK_EQ(CSSM_OK
, crtn
);
62 bool SignatureCreator::Final(std::vector
<uint8
>* signature
) {
64 CSSM_RETURN crtn
= CSSM_SignDataFinal(sig_handle_
, sig
);
71 signature
->assign(sig
->Data
, sig
->Data
+ sig
->Length
);