1*e7b1675dSTing-Kang Chang // Copyright 2022 Google LLC
2*e7b1675dSTing-Kang Chang //
3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang //
7*e7b1675dSTing-Kang Chang // http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang //
9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang // limitations under the License.
14*e7b1675dSTing-Kang Chang //
15*e7b1675dSTing-Kang Chang ///////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang #include "tink/prf/failing_prfset.h"
17*e7b1675dSTing-Kang Chang
18*e7b1675dSTing-Kang Chang #include <map>
19*e7b1675dSTing-Kang Chang #include <memory>
20*e7b1675dSTing-Kang Chang #include <string>
21*e7b1675dSTing-Kang Chang #include <utility>
22*e7b1675dSTing-Kang Chang
23*e7b1675dSTing-Kang Chang namespace crypto {
24*e7b1675dSTing-Kang Chang namespace tink {
25*e7b1675dSTing-Kang Chang namespace {
26*e7b1675dSTing-Kang Chang
27*e7b1675dSTing-Kang Chang // A Prf that always returns a kInternal status on API calls.
28*e7b1675dSTing-Kang Chang class AlwaysFailPrf : public Prf {
29*e7b1675dSTing-Kang Chang public:
AlwaysFailPrf(std::string message)30*e7b1675dSTing-Kang Chang explicit AlwaysFailPrf(std::string message) : message_(std::move(message)) {}
31*e7b1675dSTing-Kang Chang
Compute(absl::string_view,size_t) const32*e7b1675dSTing-Kang Chang util::StatusOr<std::string> Compute(absl::string_view /*input*/,
33*e7b1675dSTing-Kang Chang size_t /*output_length*/) const override {
34*e7b1675dSTing-Kang Chang return util::Status(
35*e7b1675dSTing-Kang Chang absl::StatusCode::kInternal,
36*e7b1675dSTing-Kang Chang absl::StrCat(
37*e7b1675dSTing-Kang Chang "AlwaysFailPrf will always fail on Compute (msg=", message_, ")"));
38*e7b1675dSTing-Kang Chang }
39*e7b1675dSTing-Kang Chang
40*e7b1675dSTing-Kang Chang private:
41*e7b1675dSTing-Kang Chang const std::string message_;
42*e7b1675dSTing-Kang Chang };
43*e7b1675dSTing-Kang Chang
44*e7b1675dSTing-Kang Chang // A PrfSet that always returns a kInternal status on API calls.
45*e7b1675dSTing-Kang Chang class AlwaysFailPrfSet : public PrfSet {
46*e7b1675dSTing-Kang Chang public:
AlwaysFailPrfSet(std::string message)47*e7b1675dSTing-Kang Chang explicit AlwaysFailPrfSet(std::string message)
48*e7b1675dSTing-Kang Chang : message_(std::move(message)),
49*e7b1675dSTing-Kang Chang always_fail_prf_0_(absl::make_unique<AlwaysFailPrf>(message_)),
50*e7b1675dSTing-Kang Chang always_fail_prf_1_(absl::make_unique<AlwaysFailPrf>(message_)),
51*e7b1675dSTing-Kang Chang always_fail_prf_2_(absl::make_unique<AlwaysFailPrf>(message_)),
52*e7b1675dSTing-Kang Chang prfs_({{0, always_fail_prf_0_.get()},
53*e7b1675dSTing-Kang Chang {1, always_fail_prf_1_.get()},
54*e7b1675dSTing-Kang Chang {2, always_fail_prf_2_.get()}}) {}
55*e7b1675dSTing-Kang Chang
GetPrimaryId() const56*e7b1675dSTing-Kang Chang uint32_t GetPrimaryId() const override { return 0; }
57*e7b1675dSTing-Kang Chang
58*e7b1675dSTing-Kang Chang // A map of the PRFs represented by the keys in this keyset.
59*e7b1675dSTing-Kang Chang // The map is guaranteed to contain getPrimaryId() as a key.
GetPrfs() const60*e7b1675dSTing-Kang Chang const std::map<uint32_t, Prf*>& GetPrfs() const override { return prfs_; };
61*e7b1675dSTing-Kang Chang
ComputePrimary(absl::string_view,size_t) const62*e7b1675dSTing-Kang Chang util::StatusOr<std::string> ComputePrimary(absl::string_view /*input*/,
63*e7b1675dSTing-Kang Chang size_t /*output_length*/) const {
64*e7b1675dSTing-Kang Chang return util::Status(
65*e7b1675dSTing-Kang Chang absl::StatusCode::kInternal,
66*e7b1675dSTing-Kang Chang absl::StrCat(
67*e7b1675dSTing-Kang Chang "AlwaysFailPrfSet will always fail on ComputePrimary (msg=",
68*e7b1675dSTing-Kang Chang message_, ")"));
69*e7b1675dSTing-Kang Chang }
70*e7b1675dSTing-Kang Chang
71*e7b1675dSTing-Kang Chang private:
72*e7b1675dSTing-Kang Chang const std::string message_;
73*e7b1675dSTing-Kang Chang std::unique_ptr<AlwaysFailPrf> always_fail_prf_0_;
74*e7b1675dSTing-Kang Chang std::unique_ptr<AlwaysFailPrf> always_fail_prf_1_;
75*e7b1675dSTing-Kang Chang std::unique_ptr<AlwaysFailPrf> always_fail_prf_2_;
76*e7b1675dSTing-Kang Chang std::map<uint32_t, Prf*> prfs_;
77*e7b1675dSTing-Kang Chang };
78*e7b1675dSTing-Kang Chang } // namespace
79*e7b1675dSTing-Kang Chang
CreateAlwaysFailingPrf(std::string message)80*e7b1675dSTing-Kang Chang std::unique_ptr<Prf> CreateAlwaysFailingPrf(std::string message) {
81*e7b1675dSTing-Kang Chang return absl::make_unique<AlwaysFailPrf>(std::move(message));
82*e7b1675dSTing-Kang Chang }
83*e7b1675dSTing-Kang Chang
CreateAlwaysFailingPrfSet(std::string message)84*e7b1675dSTing-Kang Chang std::unique_ptr<PrfSet> CreateAlwaysFailingPrfSet(std::string message) {
85*e7b1675dSTing-Kang Chang return absl::make_unique<AlwaysFailPrfSet>(std::move(message));
86*e7b1675dSTing-Kang Chang }
87*e7b1675dSTing-Kang Chang
88*e7b1675dSTing-Kang Chang } // namespace tink
89*e7b1675dSTing-Kang Chang } // namespace crypto
90