1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/signature_creator.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdlib.h> 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/cssm_init.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace crypto { 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottSignatureCreator* SignatureCreator::Create(RSAPrivateKey* key) { 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_ptr<SignatureCreator> result(new SignatureCreator); 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott result->key_ = key; 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CSSM_RETURN crtn; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch crtn = CSSM_CSP_CreateSignatureContext(GetSharedCSPHandle(), 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CSSM_ALGID_SHA1WithRSA, 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NULL, 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott key->key(), 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott &result->sig_handle_); 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (crtn) { 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return NULL; 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott crtn = CSSM_SignDataInit(result->sig_handle_); 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (crtn) { 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return result.release(); 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSignatureCreator::SignatureCreator() : sig_handle_(0) { 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EnsureCSSMInit(); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottSignatureCreator::~SignatureCreator() { 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CSSM_RETURN crtn; 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sig_handle_) { 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott crtn = CSSM_DeleteContext(sig_handle_); 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DCHECK(crtn == CSSM_OK); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool SignatureCreator::Update(const uint8* data_part, int data_part_len) { 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CSSM_DATA data; 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott data.Data = const_cast<uint8*>(data_part); 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott data.Length = data_part_len; 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CSSM_RETURN crtn = CSSM_SignDataUpdate(sig_handle_, &data, 1); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DCHECK(crtn == CSSM_OK); 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool SignatureCreator::Final(std::vector<uint8>* signature) { 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ScopedCSSMData sig; 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CSSM_RETURN crtn = CSSM_SignDataFinal(sig_handle_, sig); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (crtn) { 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return false; 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen signature->assign(sig->Data, sig->Data + sig->Length); 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return true; 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace crypto 75