Home | History | Annotate | Download | only in crypto
      1 // Copyright (c) 2009 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 "base/crypto/signature_creator.h"
      6 
      7 #include <stdlib.h>
      8 
      9 #include "base/crypto/cssm_init.h"
     10 #include "base/logging.h"
     11 #include "base/scoped_ptr.h"
     12 
     13 namespace base {
     14 
     15 // static
     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(result->csp_handle_,
     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 false;
     35   }
     36 
     37   return result.release();
     38 }
     39 
     40 SignatureCreator::SignatureCreator() : csp_handle_(0), sig_handle_(0) {
     41   EnsureCSSMInit();
     42 
     43   static CSSM_VERSION version = {2, 0};
     44   CSSM_RETURN crtn;
     45   crtn = CSSM_ModuleAttach(&gGuidAppleCSP, &version, &kCssmMemoryFunctions, 0,
     46                            CSSM_SERVICE_CSP, 0, CSSM_KEY_HIERARCHY_NONE,
     47                            NULL, 0, NULL, &csp_handle_);
     48   DCHECK(crtn == CSSM_OK);
     49 }
     50 
     51 SignatureCreator::~SignatureCreator() {
     52   CSSM_RETURN crtn;
     53   if (sig_handle_) {
     54     crtn = CSSM_DeleteContext(sig_handle_);
     55     DCHECK(crtn == CSSM_OK);
     56   }
     57 
     58   if (csp_handle_) {
     59     CSSM_RETURN crtn = CSSM_ModuleDetach(csp_handle_);
     60     DCHECK(crtn == CSSM_OK);
     61   }
     62 }
     63 
     64 bool SignatureCreator::Update(const uint8* data_part, int data_part_len) {
     65   CSSM_DATA data;
     66   data.Data = const_cast<uint8*>(data_part);
     67   data.Length = data_part_len;
     68   CSSM_RETURN crtn = CSSM_SignDataUpdate(sig_handle_, &data, 1);
     69   DCHECK(crtn == CSSM_OK);
     70   return true;
     71 }
     72 
     73 bool SignatureCreator::Final(std::vector<uint8>* signature) {
     74   CSSM_DATA sig;
     75   memset(&sig, 0, sizeof(CSSM_DATA)); // Allow CSSM allocate memory;
     76   CSSM_RETURN crtn = CSSM_SignDataFinal(sig_handle_, &sig);
     77 
     78   if (crtn) {
     79     NOTREACHED();
     80     return false;
     81   }
     82 
     83   signature->assign(sig.Data, sig.Data + sig.Length);
     84   kCssmMemoryFunctions.free_func(sig.Data, NULL); // Release data alloc'd
     85                                                   // by CSSM
     86 
     87   return true;
     88 }
     89 
     90 }  // namespace base
     91