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