Home | History | Annotate | Download | only in crypto
      1 // Copyright (c) 2011 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 "crypto/signature_creator.h"
      6 
      7 #include <openssl/evp.h>
      8 
      9 #include "base/logging.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/stl_util-inl.h"
     12 #include "crypto/openssl_util.h"
     13 
     14 namespace crypto {
     15 
     16 // static
     17 SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key) {
     18   OpenSSLErrStackTracer err_tracer(FROM_HERE);
     19   scoped_ptr<SignatureCreator> result(new SignatureCreator);
     20   result->key_ = key;
     21   if (!EVP_SignInit_ex(result->sign_context_, EVP_sha1(), NULL))
     22     return NULL;
     23   return result.release();
     24 }
     25 
     26 SignatureCreator::SignatureCreator()
     27     : sign_context_(EVP_MD_CTX_create()) {
     28 }
     29 
     30 SignatureCreator::~SignatureCreator() {
     31   EVP_MD_CTX_destroy(sign_context_);
     32 }
     33 
     34 bool SignatureCreator::Update(const uint8* data_part, int data_part_len) {
     35   OpenSSLErrStackTracer err_tracer(FROM_HERE);
     36   return EVP_SignUpdate(sign_context_, data_part, data_part_len) == 1;
     37 }
     38 
     39 bool SignatureCreator::Final(std::vector<uint8>* signature) {
     40   OpenSSLErrStackTracer err_tracer(FROM_HERE);
     41   EVP_PKEY* key = key_->key();
     42   signature->resize(EVP_PKEY_size(key));
     43 
     44   unsigned int len = 0;
     45   int rv = EVP_SignFinal(sign_context_, vector_as_array(signature), &len, key);
     46   if (!rv) {
     47     signature->clear();
     48     return false;
     49   }
     50   signature->resize(len);
     51   return true;
     52 }
     53 
     54 }  // namespace crypto
     55