| Index: crypto/signature_verifier.h
|
| diff --git a/crypto/signature_verifier.h b/crypto/signature_verifier.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fbf87d4cc64d84d21c58816d1ac5731f1d84efe7
|
| --- /dev/null
|
| +++ b/crypto/signature_verifier.h
|
| @@ -0,0 +1,145 @@
|
| +// Copyright (c) 2012 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.
|
| +
|
| +#ifndef CRYPTO_SIGNATURE_VERIFIER_H_
|
| +#define CRYPTO_SIGNATURE_VERIFIER_H_
|
| +
|
| +#include <vector>
|
| +
|
| +#include "build/build_config.h"
|
| +#include "base/basictypes.h"
|
| +#include "crypto/crypto_export.h"
|
| +
|
| +#if defined(USE_OPENSSL)
|
| +typedef struct env_md_st EVP_MD;
|
| +typedef struct evp_pkey_ctx_st EVP_PKEY_CTX;
|
| +#else
|
| +typedef struct HASHContextStr HASHContext;
|
| +typedef struct SECKEYPublicKeyStr SECKEYPublicKey;
|
| +typedef struct VFYContextStr VFYContext;
|
| +#endif
|
| +
|
| +namespace crypto {
|
| +
|
| +// The SignatureVerifier class verifies a signature using a bare public key
|
| +// (as opposed to a certificate).
|
| +class CRYPTO_EXPORT SignatureVerifier {
|
| + public:
|
| + // The set of supported hash functions. Extend as required.
|
| + enum HashAlgorithm {
|
| + SHA1,
|
| + SHA256,
|
| + };
|
| +
|
| + SignatureVerifier();
|
| + ~SignatureVerifier();
|
| +
|
| + // Streaming interface:
|
| +
|
| + // Initiates a signature verification operation. This should be followed
|
| + // by one or more VerifyUpdate calls and a VerifyFinal call.
|
| + // NOTE: for RSA-PSS signatures, use VerifyInitRSAPSS instead.
|
| + //
|
| + // The signature algorithm is specified as a DER encoded ASN.1
|
| + // AlgorithmIdentifier structure:
|
| + // AlgorithmIdentifier ::= SEQUENCE {
|
| + // algorithm OBJECT IDENTIFIER,
|
| + // parameters ANY DEFINED BY algorithm OPTIONAL }
|
| + //
|
| + // The signature is encoded according to the signature algorithm, but it
|
| + // must not be further encoded in an ASN.1 BIT STRING.
|
| + // Note: An RSA signature is actually a big integer. It must be in
|
| + // big-endian byte order.
|
| + //
|
| + // The public key is specified as a DER encoded ASN.1 SubjectPublicKeyInfo
|
| + // structure, which contains not only the public key but also its type
|
| + // (algorithm):
|
| + // SubjectPublicKeyInfo ::= SEQUENCE {
|
| + // algorithm AlgorithmIdentifier,
|
| + // subjectPublicKey BIT STRING }
|
| + bool VerifyInit(const uint8* signature_algorithm,
|
| + int signature_algorithm_len,
|
| + const uint8* signature,
|
| + int signature_len,
|
| + const uint8* public_key_info,
|
| + int public_key_info_len);
|
| +
|
| + // Initiates a RSA-PSS signature verification operation. This should be
|
| + // followed by one or more VerifyUpdate calls and a VerifyFinal call.
|
| + //
|
| + // The RSA-PSS signature algorithm parameters are specified with the
|
| + // |hash_alg|, |mask_hash_alg|, and |salt_len| arguments.
|
| + //
|
| + // An RSA-PSS signature is a nonnegative integer encoded as a byte string
|
| + // (of the same length as the RSA modulus) in big-endian byte order. It
|
| + // must not be further encoded in an ASN.1 BIT STRING.
|
| + //
|
| + // The public key is specified as a DER encoded ASN.1 SubjectPublicKeyInfo
|
| + // structure, which contains not only the public key but also its type
|
| + // (algorithm):
|
| + // SubjectPublicKeyInfo ::= SEQUENCE {
|
| + // algorithm AlgorithmIdentifier,
|
| + // subjectPublicKey BIT STRING }
|
| + bool VerifyInitRSAPSS(HashAlgorithm hash_alg,
|
| + HashAlgorithm mask_hash_alg,
|
| + int salt_len,
|
| + const uint8* signature,
|
| + int signature_len,
|
| + const uint8* public_key_info,
|
| + int public_key_info_len);
|
| +
|
| + // Feeds a piece of the data to the signature verifier.
|
| + void VerifyUpdate(const uint8* data_part, int data_part_len);
|
| +
|
| + // Concludes a signature verification operation. Returns true if the
|
| + // signature is valid. Returns false if the signature is invalid or an
|
| + // error occurred.
|
| + bool VerifyFinal();
|
| +
|
| + // Note: we can provide a one-shot interface if there is interest:
|
| + // bool Verify(const uint8* data,
|
| + // int data_len,
|
| + // const uint8* signature_algorithm,
|
| + // int signature_algorithm_len,
|
| + // const uint8* signature,
|
| + // int signature_len,
|
| + // const uint8* public_key_info,
|
| + // int public_key_info_len);
|
| +
|
| + private:
|
| +#if defined(USE_OPENSSL)
|
| + bool CommonInit(const EVP_MD* digest,
|
| + const uint8* signature,
|
| + int signature_len,
|
| + const uint8* public_key_info,
|
| + int public_key_info_len,
|
| + EVP_PKEY_CTX** pkey_ctx);
|
| +#else
|
| + static SECKEYPublicKey* DecodePublicKeyInfo(const uint8* public_key_info,
|
| + int public_key_info_len);
|
| +#endif
|
| +
|
| + void Reset();
|
| +
|
| + std::vector<uint8> signature_;
|
| +
|
| +#if defined(USE_OPENSSL)
|
| + struct VerifyContext;
|
| + VerifyContext* verify_context_;
|
| +#else
|
| + // Used for all signature types except RSA-PSS.
|
| + VFYContext* vfy_context_;
|
| +
|
| + // Used for RSA-PSS signatures.
|
| + HashAlgorithm hash_alg_;
|
| + HashAlgorithm mask_hash_alg_;
|
| + unsigned int salt_len_;
|
| + SECKEYPublicKey* public_key_;
|
| + HASHContext* hash_context_;
|
| +#endif
|
| +};
|
| +
|
| +} // namespace crypto
|
| +
|
| +#endif // CRYPTO_SIGNATURE_VERIFIER_H_
|
|
|