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