зеркало из https://github.com/mozilla/gecko-dev.git
89 строки
3.5 KiB
C++
89 строки
3.5 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef CTLogVerifier_h
|
|
#define CTLogVerifier_h
|
|
|
|
#include <memory>
|
|
|
|
#include "CTLog.h"
|
|
#include "CTUtils.h"
|
|
#include "SignedCertificateTimestamp.h"
|
|
#include "mozpkix/Input.h"
|
|
#include "mozpkix/Result.h"
|
|
#include "mozpkix/pkix.h"
|
|
|
|
namespace mozilla {
|
|
namespace ct {
|
|
|
|
// Verifies Signed Certificate Timestamps (SCTs) provided by a specific log
|
|
// using the public key of that log. Assumes the SCT being verified
|
|
// matches the log by log key ID and signature parameters (an error is returned
|
|
// otherwise).
|
|
// The verification functions return Success if the provided SCT has passed
|
|
// verification, ERROR_BAD_SIGNATURE if failed verification, or other result
|
|
// on error.
|
|
class CTLogVerifier {
|
|
public:
|
|
CTLogVerifier();
|
|
|
|
// Initializes the verifier with log-specific information. Only the public
|
|
// key is used for verification, other parameters are purely informational.
|
|
// |subjectPublicKeyInfo| is a DER-encoded SubjectPublicKeyInfo.
|
|
// |operatorId| The numeric ID of the log operator as assigned at
|
|
// https://www.certificate-transparency.org/known-logs .
|
|
// |logStatus| Either "Included" or "Disqualified".
|
|
// |disqualificationTime| Disqualification timestamp (for disqualified logs).
|
|
// An error is returned if |subjectPublicKeyInfo| refers to an unsupported
|
|
// public key.
|
|
pkix::Result Init(pkix::Input subjectPublicKeyInfo,
|
|
CTLogOperatorId operatorId, CTLogStatus logStatus,
|
|
uint64_t disqualificationTime);
|
|
|
|
// Returns the log's key ID, which is a SHA256 hash of its public key.
|
|
// See RFC 6962, Section 3.2.
|
|
const Buffer& keyId() const { return mKeyId; }
|
|
|
|
CTLogOperatorId operatorId() const { return mOperatorId; }
|
|
bool isDisqualified() const { return mDisqualified; }
|
|
uint64_t disqualificationTime() const { return mDisqualificationTime; }
|
|
|
|
// Verifies that |sct| contains a valid signature for |entry|.
|
|
// |sct| must be signed by the verifier's log.
|
|
pkix::Result Verify(const LogEntry& entry,
|
|
const SignedCertificateTimestamp& sct);
|
|
|
|
// Returns true if the signature and hash algorithms in |signature|
|
|
// match those of the log.
|
|
bool SignatureParametersMatch(const DigitallySigned& signature);
|
|
|
|
private:
|
|
// Performs the underlying verification using the log's public key. Note
|
|
// that |signature| contains the raw signature data (i.e. without any
|
|
// DigitallySigned struct encoding).
|
|
// Returns Success if passed verification, ERROR_BAD_SIGNATURE if failed
|
|
// verification, or other result on error.
|
|
pkix::Result VerifySignature(pkix::Input data, pkix::Input signature);
|
|
pkix::Result VerifySignature(const Buffer& data, const Buffer& signature);
|
|
|
|
// mPublicECKey works around an architectural deficiency in NSS. In the case
|
|
// of EC, if we don't create, import, and cache this key, NSS will import and
|
|
// verify it every signature verification, which is slow. For RSA, this is
|
|
// unused and will be null.
|
|
UniqueSECKEYPublicKey mPublicECKey;
|
|
Buffer mSubjectPublicKeyInfo;
|
|
Buffer mKeyId;
|
|
DigitallySigned::SignatureAlgorithm mSignatureAlgorithm;
|
|
CTLogOperatorId mOperatorId;
|
|
bool mDisqualified;
|
|
uint64_t mDisqualificationTime;
|
|
};
|
|
|
|
} // namespace ct
|
|
} // namespace mozilla
|
|
|
|
#endif // CTLogVerifier_h
|