blob: f8f44c7695f9c9936d4edebc24e0da5c86ab94d5 [file] [log] [blame]
// 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_CHUNKED_MAC_H_
#define TINK_CHUNKED_MAC_H_
#include <memory>
#include <string>
#include "absl/strings/string_view.h"
#include "tink/util/status.h"
#include "tink/util/statusor.h"
namespace crypto {
namespace tink {
// Interface for a single Chunked MAC computation.
//
// WARNING: Although implementations of this interface are thread-compatible,
// they are not thread-safe. Thread-safety must be enforced by the caller.
class ChunkedMacComputation {
public:
// Incrementally processes input `data` to update the internal state of the
// MAC computation. Requires exclusive access.
//
// Note that the following two update sequences are equivalent (i.e.,
// arbitrary slicing of the input data is allowed):
// 1. Update("ab"), Update("cd"), Update("ef")
// 2. Update("abc"), Update("def")
virtual util::Status Update(absl::string_view data) = 0;
// Finalizes the MAC computation and returns the authentication tag.
// After this method has been called, this object can no longer be used.
// Requires exclusive access.
virtual util::StatusOr<std::string> ComputeMac() = 0;
virtual ~ChunkedMacComputation() = default;
};
// Interface for a single Chunked MAC verification.
//
// WARNING: Although implementations of this interface are thread-compatible,
// they are not thread-safe. Thread-safety must be enforced by the caller.
class ChunkedMacVerification {
public:
// Incrementally processes input `data` to update the internal state of the
// MAC verification. Requires exclusive access.
//
// Note that the following two update sequences are equivalent (i.e.,
// arbitrary slicing of the input data is allowed):
// 1. Update("ab"), Update("cd"), Update("ef")
// 2. Update("abc"), Update("def")
virtual util::Status Update(absl::string_view data) = 0;
// Finalizes the MAC computation and returns OK if the tag is successfully
// verified. Otherwise, returns an error status. After this method has been
// called, this object can no longer be used. Requires exclusive access.
virtual util::Status VerifyMac() = 0;
virtual ~ChunkedMacVerification() = default;
};
// Interface for Chunked MACs (Message Authentication Codes).
// This interface should only be used for authentication. It should NOT
// be used for other purposes (e.g., generating pseudorandom bytes).
class ChunkedMac {
public:
// Creates an instance of a single Chunked MAC computation. Note that a
// `ChunkedMac` object does not need to outlive the `ChunkedMacComputation`
// objects that it creates.
virtual util::StatusOr<std::unique_ptr<ChunkedMacComputation>>
CreateComputation() const = 0;
// Creates an instance of a single Chunked MAC verification. Note that a
// `ChunkedMac` object does not need to outlive the `ChunkedMacVerification`
// objects that it creates.
virtual util::StatusOr<std::unique_ptr<ChunkedMacVerification>>
CreateVerification(absl::string_view tag) const = 0;
virtual ~ChunkedMac() = default;
};
} // namespace tink
} // namespace crypto
#endif // TINK_CHUNKED_MAC_H_