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 #ifndef CRYPTO_SIGNATURE_VERIFIER_H_
      6 #define CRYPTO_SIGNATURE_VERIFIER_H_
      7 #pragma once
      8 
      9 #include "build/build_config.h"
     10 
     11 #if defined(USE_NSS)
     12 #include <cryptoht.h>
     13 #elif defined(OS_MACOSX)
     14 #include <Security/cssm.h>
     15 #endif
     16 
     17 #include <vector>
     18 
     19 #include "base/basictypes.h"
     20 
     21 #if defined(OS_WIN)
     22 #include "crypto/scoped_capi_types.h"
     23 #endif
     24 
     25 namespace crypto {
     26 
     27 // The SignatureVerifier class verifies a signature using a bare public key
     28 // (as opposed to a certificate).
     29 class SignatureVerifier {
     30  public:
     31   SignatureVerifier();
     32   ~SignatureVerifier();
     33 
     34   // Streaming interface:
     35 
     36   // Initiates a signature verification operation.  This should be followed
     37   // by one or more VerifyUpdate calls and a VerifyFinal call.
     38   //
     39   // The signature algorithm is specified as a DER encoded ASN.1
     40   // AlgorithmIdentifier structure:
     41   //   AlgorithmIdentifier  ::=  SEQUENCE  {
     42   //       algorithm               OBJECT IDENTIFIER,
     43   //       parameters              ANY DEFINED BY algorithm OPTIONAL  }
     44   //
     45   // The signature is encoded according to the signature algorithm, but it
     46   // must not be further encoded in an ASN.1 BIT STRING.
     47   // Note: An RSA signatures is actually a big integer.  It must be in the
     48   // big-endian byte order.
     49   //
     50   // The public key is specified as a DER encoded ASN.1 SubjectPublicKeyInfo
     51   // structure, which contains not only the public key but also its type
     52   // (algorithm):
     53   //   SubjectPublicKeyInfo  ::=  SEQUENCE  {
     54   //       algorithm            AlgorithmIdentifier,
     55   //       subjectPublicKey     BIT STRING  }
     56   bool VerifyInit(const uint8* signature_algorithm,
     57                   int signature_algorithm_len,
     58                   const uint8* signature,
     59                   int signature_len,
     60                   const uint8* public_key_info,
     61                   int public_key_info_len);
     62 
     63   // Feeds a piece of the data to the signature verifier.
     64   void VerifyUpdate(const uint8* data_part, int data_part_len);
     65 
     66   // Concludes a signature verification operation.  Returns true if the
     67   // signature is valid.  Returns false if the signature is invalid or an
     68   // error occurred.
     69   bool VerifyFinal();
     70 
     71   // Note: we can provide a one-shot interface if there is interest:
     72   //   bool Verify(const uint8* data,
     73   //               int data_len,
     74   //               const uint8* signature_algorithm,
     75   //               int signature_algorithm_len,
     76   //               const uint8* signature,
     77   //               int signature_len,
     78   //               const uint8* public_key_info,
     79   //               int public_key_info_len);
     80 
     81  private:
     82   void Reset();
     83 
     84   std::vector<uint8> signature_;
     85 
     86 #if defined(USE_OPENSSL)
     87   struct VerifyContext;
     88   VerifyContext* verify_context_;
     89 #elif defined(USE_NSS)
     90   VFYContext* vfy_context_;
     91 #elif defined(OS_MACOSX)
     92   std::vector<uint8> public_key_info_;
     93 
     94   CSSM_CC_HANDLE sig_handle_;
     95 
     96   CSSM_KEY public_key_;
     97 #elif defined(OS_WIN)
     98   ScopedHCRYPTPROV provider_;
     99 
    100   ScopedHCRYPTHASH hash_object_;
    101 
    102   ScopedHCRYPTKEY public_key_;
    103 #endif
    104 };
    105 
    106 }  // namespace crypto
    107 
    108 #endif  // CRYPTO_SIGNATURE_VERIFIER_H_
    109