Always set *error when CreateDirectoryAndGetError fails.
[chromium-blink-merge.git] / crypto / signature_creator_mac.cc
blobcdc34f885161978ef2ae7ffe151c39a1e07b2c1f
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"
7 #include <stdlib.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"
14 namespace crypto {
16 // static
17 SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key) {
18 scoped_ptr<SignatureCreator> result(new SignatureCreator);
19 result->key_ = key;
21 CSSM_RETURN crtn;
22 crtn = CSSM_CSP_CreateSignatureContext(GetSharedCSPHandle(),
23 CSSM_ALGID_SHA1WithRSA,
24 NULL,
25 key->key(),
26 &result->sig_handle_);
27 if (crtn) {
28 NOTREACHED();
29 return NULL;
32 crtn = CSSM_SignDataInit(result->sig_handle_);
33 if (crtn) {
34 NOTREACHED();
35 return NULL;
38 return result.release();
41 SignatureCreator::SignatureCreator() : key_(NULL), sig_handle_(0) {
42 EnsureCSSMInit();
45 SignatureCreator::~SignatureCreator() {
46 CSSM_RETURN crtn;
47 if (sig_handle_) {
48 crtn = CSSM_DeleteContext(sig_handle_);
49 DCHECK_EQ(CSSM_OK, crtn);
53 bool SignatureCreator::Update(const uint8* data_part, int data_part_len) {
54 CSSM_DATA data;
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);
59 return true;
62 bool SignatureCreator::Final(std::vector<uint8>* signature) {
63 ScopedCSSMData sig;
64 CSSM_RETURN crtn = CSSM_SignDataFinal(sig_handle_, sig);
66 if (crtn) {
67 NOTREACHED();
68 return false;
71 signature->assign(sig->Data, sig->Data + sig->Length);
72 return true;
75 } // namespace crypto