Blame security/certverifier/CTLogVerifier.h

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