// Copyright 2018 The Chromium OS 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 CRYPTOHOME_MOCK_SIGNATURE_SEALING_BACKEND_H_
#define CRYPTOHOME_MOCK_SIGNATURE_SEALING_BACKEND_H_

#include <cstdint>
#include <map>
#include <memory>
#include <vector>

#include <brillo/secure_blob.h>
#include <gmock/gmock.h>

#include "cryptohome/signature_sealing_backend.h"

namespace cryptohome {

class SignatureSealedData;

class MockSignatureSealingBackend : public SignatureSealingBackend {
 public:
  MockSignatureSealingBackend();
  ~MockSignatureSealingBackend() override;

  MOCK_METHOD6(CreateSealedSecret,
               bool(const brillo::Blob&,
                    const std::vector<Algorithm>&,
                    const std::map<uint32_t, brillo::Blob>&,
                    const brillo::Blob&,
                    const brillo::Blob&,
                    SignatureSealedData*));

  // Wrap a mockable method to workaround gmock's issue with noncopyable types.
  std::unique_ptr<UnsealingSession> CreateUnsealingSession(
      const SignatureSealedData& sealed_secret_data,
      const brillo::Blob& public_key_spki_der,
      const std::vector<Algorithm>& key_algorithms,
      const brillo::Blob& delegate_blob,
      const brillo::Blob& delegate_secret) override;
  // Equivalent of CreateUnsealingSession(), but returns result via a raw owned
  // pointer.
  MOCK_METHOD5(CreateUnsealingSessionImpl,
               UnsealingSession*(const SignatureSealedData&,
                                 const brillo::Blob&,
                                 const std::vector<Algorithm>&,
                                 const brillo::Blob&,
                                 const brillo::Blob&));
};

class MockUnsealingSession : public SignatureSealingBackend::UnsealingSession {
 public:
  MockUnsealingSession();
  ~MockUnsealingSession() override;

  MOCK_METHOD0(GetChallengeAlgorithm, Algorithm());
  MOCK_METHOD0(GetChallengeValue, brillo::Blob());
  MOCK_METHOD2(Unseal, bool(const brillo::Blob&, brillo::SecureBlob*));
};

}  // namespace cryptohome

#endif  // CRYPTOHOME_MOCK_SIGNATURE_SEALING_BACKEND_H_
