// 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_

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:
  // 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); }

  virtual ~Parameters() = default;
};

}  // namespace tink
}  // namespace crypto

#endif  // TINK_PARAMETERS_H_
