| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "crypto/signature_creator.h" |
| |
| #include <stdlib.h> |
| |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "crypto/cssm_init.h" |
| |
| namespace crypto { |
| |
| // static |
| SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key) { |
| scoped_ptr<SignatureCreator> result(new SignatureCreator); |
| result->key_ = key; |
| |
| CSSM_RETURN crtn; |
| crtn = CSSM_CSP_CreateSignatureContext(GetSharedCSPHandle(), |
| CSSM_ALGID_SHA1WithRSA, |
| NULL, |
| key->key(), |
| &result->sig_handle_); |
| if (crtn) { |
| NOTREACHED(); |
| return NULL; |
| } |
| |
| crtn = CSSM_SignDataInit(result->sig_handle_); |
| if (crtn) { |
| NOTREACHED(); |
| return NULL; |
| } |
| |
| return result.release(); |
| } |
| |
| SignatureCreator::SignatureCreator() : sig_handle_(0) { |
| EnsureCSSMInit(); |
| } |
| |
| SignatureCreator::~SignatureCreator() { |
| CSSM_RETURN crtn; |
| if (sig_handle_) { |
| crtn = CSSM_DeleteContext(sig_handle_); |
| DCHECK(crtn == CSSM_OK); |
| } |
| } |
| |
| bool SignatureCreator::Update(const uint8* data_part, int data_part_len) { |
| CSSM_DATA data; |
| data.Data = const_cast<uint8*>(data_part); |
| data.Length = data_part_len; |
| CSSM_RETURN crtn = CSSM_SignDataUpdate(sig_handle_, &data, 1); |
| DCHECK(crtn == CSSM_OK); |
| return true; |
| } |
| |
| bool SignatureCreator::Final(std::vector<uint8>* signature) { |
| ScopedCSSMData sig; |
| CSSM_RETURN crtn = CSSM_SignDataFinal(sig_handle_, sig); |
| |
| if (crtn) { |
| NOTREACHED(); |
| return false; |
| } |
| |
| signature->assign(sig->Data, sig->Data + sig->Length); |
| return true; |
| } |
| |
| } // namespace crypto |