// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////

#ifndef TINK_PARAMETERS_H_
#define TINK_PARAMETERS_H_

#include <memory>

namespace crypto {
namespace tink {

// Represents a cryptographic function without the actual key material.
//
// In Tink, a `Key` represents a set of cryptographic functions. A `Parameters`
// object contains all the information about the function that is not randomly
// chosen with each instance.
class Parameters {
 public:
  Parameters() = default;

  // Copyable and movable.
  Parameters(const Parameters& other) = default;
  Parameters& operator=(const Parameters& other) = default;
  Parameters(Parameters&& other) = default;
  Parameters& operator=(Parameters&& other) = default;

  // Returns true if a key created with these parameters has to have a
  // particular id when it is in a keyset.  Otherwise, returns false.
  //
  // In Tink, certain keys change their behavior depending on the key id (e.g.,
  // an `Aead` object may add a prefix containing the big endian encoding of the
  // key id to the ciphertext). In this case, such a key should require a unique
  // id in `Key::GetIdRequirement()` and return true.
  virtual bool HasIdRequirement() const = 0;

  // Returns true if all `Parameters` fields have identical values.  Otherwise,
  // returns false.
  virtual bool operator==(const Parameters& other) const = 0;
  bool operator!=(const Parameters& other) const { return !(*this == other); }

  // Creates a deep copy of the `Parameters` object.
  virtual std::unique_ptr<Parameters> Clone() const = 0;

  virtual ~Parameters() = default;
};

}  // namespace tink
}  // namespace crypto

#endif  // TINK_PARAMETERS_H_
