blob: c31459fbbbcea47afb30bca42dac05d551d21f46 [file] [log] [blame]
[email protected]3b63f8f42011-03-28 01:54:151// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]e90ed8a2009-10-06 18:55:352// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]4b559b4d2011-04-14 17:37:145#include "crypto/signature_creator.h"
[email protected]e90ed8a2009-10-06 18:55:356
7#include <stdlib.h>
8
[email protected]e90ed8a2009-10-06 18:55:359#include "base/logging.h"
[email protected]3b63f8f42011-03-28 01:54:1510#include "base/memory/scoped_ptr.h"
[email protected]4b559b4d2011-04-14 17:37:1411#include "crypto/cssm_init.h"
[email protected]e90ed8a2009-10-06 18:55:3512
[email protected]4b559b4d2011-04-14 17:37:1413namespace crypto {
[email protected]e90ed8a2009-10-06 18:55:3514
15// static
16SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key) {
17 scoped_ptr<SignatureCreator> result(new SignatureCreator);
18 result->key_ = key;
19
20 CSSM_RETURN crtn;
[email protected]108118232010-03-29 18:22:2421 crtn = CSSM_CSP_CreateSignatureContext(GetSharedCSPHandle(),
[email protected]e90ed8a2009-10-06 18:55:3522 CSSM_ALGID_SHA1WithRSA,
23 NULL,
24 key->key(),
25 &result->sig_handle_);
26 if (crtn) {
27 NOTREACHED();
28 return NULL;
29 }
30
31 crtn = CSSM_SignDataInit(result->sig_handle_);
32 if (crtn) {
33 NOTREACHED();
[email protected]227fcee2010-06-11 19:19:3734 return NULL;
[email protected]e90ed8a2009-10-06 18:55:3535 }
36
37 return result.release();
38}
39
[email protected]41eee1e2011-06-22 20:18:4740SignatureCreator::SignatureCreator() : key_(NULL), sig_handle_(0) {
[email protected]e90ed8a2009-10-06 18:55:3541 EnsureCSSMInit();
[email protected]e90ed8a2009-10-06 18:55:3542}
43
44SignatureCreator::~SignatureCreator() {
45 CSSM_RETURN crtn;
46 if (sig_handle_) {
47 crtn = CSSM_DeleteContext(sig_handle_);
[email protected]5e0be642011-04-28 18:20:0948 DCHECK_EQ(CSSM_OK, crtn);
[email protected]e90ed8a2009-10-06 18:55:3549 }
[email protected]e90ed8a2009-10-06 18:55:3550}
51
52bool SignatureCreator::Update(const uint8* data_part, int data_part_len) {
53 CSSM_DATA data;
54 data.Data = const_cast<uint8*>(data_part);
55 data.Length = data_part_len;
56 CSSM_RETURN crtn = CSSM_SignDataUpdate(sig_handle_, &data, 1);
[email protected]5e0be642011-04-28 18:20:0957 DCHECK_EQ(CSSM_OK, crtn);
[email protected]e90ed8a2009-10-06 18:55:3558 return true;
59}
60
61bool SignatureCreator::Final(std::vector<uint8>* signature) {
[email protected]eed00112011-02-08 14:28:2962 ScopedCSSMData sig;
63 CSSM_RETURN crtn = CSSM_SignDataFinal(sig_handle_, sig);
[email protected]e90ed8a2009-10-06 18:55:3564
65 if (crtn) {
66 NOTREACHED();
67 return false;
68 }
69
[email protected]eed00112011-02-08 14:28:2970 signature->assign(sig->Data, sig->Data + sig->Length);
[email protected]e90ed8a2009-10-06 18:55:3571 return true;
72}
73
[email protected]4b559b4d2011-04-14 17:37:1474} // namespace crypto