• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include "crypto/signature_creator.h"
6 
7 #include <stdlib.h>
8 
9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "crypto/cssm_init.h"
12 
13 namespace crypto {
14 
15 // static
Create(RSAPrivateKey * key)16 SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key) {
17   scoped_ptr<SignatureCreator> result(new SignatureCreator);
18   result->key_ = key;
19 
20   CSSM_RETURN crtn;
21   crtn = CSSM_CSP_CreateSignatureContext(GetSharedCSPHandle(),
22                                          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();
34     return NULL;
35   }
36 
37   return result.release();
38 }
39 
SignatureCreator()40 SignatureCreator::SignatureCreator() : sig_handle_(0) {
41   EnsureCSSMInit();
42 }
43 
~SignatureCreator()44 SignatureCreator::~SignatureCreator() {
45   CSSM_RETURN crtn;
46   if (sig_handle_) {
47     crtn = CSSM_DeleteContext(sig_handle_);
48     DCHECK(crtn == CSSM_OK);
49   }
50 }
51 
Update(const uint8 * data_part,int data_part_len)52 bool 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);
57   DCHECK(crtn == CSSM_OK);
58   return true;
59 }
60 
Final(std::vector<uint8> * signature)61 bool SignatureCreator::Final(std::vector<uint8>* signature) {
62   ScopedCSSMData sig;
63   CSSM_RETURN crtn = CSSM_SignDataFinal(sig_handle_, sig);
64 
65   if (crtn) {
66     NOTREACHED();
67     return false;
68   }
69 
70   signature->assign(sig->Data, sig->Data + sig->Length);
71   return true;
72 }
73 
74 }  // namespace crypto
75