xref: /aosp_15_r20/external/tink/cc/prf/failing_prfset.cc (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
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