xref: /aosp_15_r20/external/tink/cc/internal/serialization_test_util.h (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang // Copyright 2023 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 
17*e7b1675dSTing-Kang Chang #ifndef TINK_INTERNAL_SERIALIZATION_TEST_UTIL_H_
18*e7b1675dSTing-Kang Chang #define TINK_INTERNAL_SERIALIZATION_TEST_UTIL_H_
19*e7b1675dSTing-Kang Chang 
20*e7b1675dSTing-Kang Chang #include <string>
21*e7b1675dSTing-Kang Chang 
22*e7b1675dSTing-Kang Chang #include "absl/strings/string_view.h"
23*e7b1675dSTing-Kang Chang #include "absl/types/optional.h"
24*e7b1675dSTing-Kang Chang #include "tink/internal/serialization.h"
25*e7b1675dSTing-Kang Chang #include "tink/key.h"
26*e7b1675dSTing-Kang Chang #include "tink/parameters.h"
27*e7b1675dSTing-Kang Chang #include "tink/secret_key_access_token.h"
28*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h"
29*e7b1675dSTing-Kang Chang 
30*e7b1675dSTing-Kang Chang namespace crypto {
31*e7b1675dSTing-Kang Chang namespace tink {
32*e7b1675dSTing-Kang Chang namespace internal {
33*e7b1675dSTing-Kang Chang 
34*e7b1675dSTing-Kang Chang constexpr absl::string_view kNoIdTypeUrl = "NoIdTypeUrl";
35*e7b1675dSTing-Kang Chang constexpr absl::string_view kIdTypeUrl = "IdTypeUrl";
36*e7b1675dSTing-Kang Chang 
37*e7b1675dSTing-Kang Chang // Generic serialization for keys or parameters.
38*e7b1675dSTing-Kang Chang class BaseSerialization : public Serialization {
39*e7b1675dSTing-Kang Chang  public:
BaseSerialization(absl::string_view object_identifier)40*e7b1675dSTing-Kang Chang   explicit BaseSerialization(absl::string_view object_identifier)
41*e7b1675dSTing-Kang Chang       : object_identifier_(object_identifier) {}
42*e7b1675dSTing-Kang Chang 
ObjectIdentifier()43*e7b1675dSTing-Kang Chang   absl::string_view ObjectIdentifier() const override {
44*e7b1675dSTing-Kang Chang     return object_identifier_;
45*e7b1675dSTing-Kang Chang   }
46*e7b1675dSTing-Kang Chang 
47*e7b1675dSTing-Kang Chang   bool operator==(const BaseSerialization& other) const {
48*e7b1675dSTing-Kang Chang     return object_identifier_ == other.object_identifier_;
49*e7b1675dSTing-Kang Chang   }
50*e7b1675dSTing-Kang Chang 
51*e7b1675dSTing-Kang Chang  private:
52*e7b1675dSTing-Kang Chang   std::string object_identifier_;
53*e7b1675dSTing-Kang Chang };
54*e7b1675dSTing-Kang Chang 
55*e7b1675dSTing-Kang Chang // Serialization for keys or parameters without an ID requirement.
56*e7b1675dSTing-Kang Chang class NoIdSerialization : public BaseSerialization {
57*e7b1675dSTing-Kang Chang  public:
NoIdSerialization()58*e7b1675dSTing-Kang Chang   NoIdSerialization() : BaseSerialization(kNoIdTypeUrl) {}
59*e7b1675dSTing-Kang Chang };
60*e7b1675dSTing-Kang Chang 
61*e7b1675dSTing-Kang Chang // Serialization for parameters with an ID requirement.
62*e7b1675dSTing-Kang Chang class IdParamsSerialization : public BaseSerialization {
63*e7b1675dSTing-Kang Chang  public:
IdParamsSerialization()64*e7b1675dSTing-Kang Chang   IdParamsSerialization() : BaseSerialization(kIdTypeUrl) {}
65*e7b1675dSTing-Kang Chang };
66*e7b1675dSTing-Kang Chang 
67*e7b1675dSTing-Kang Chang // Serialization for keys with an ID requirement.
68*e7b1675dSTing-Kang Chang class IdKeySerialization : public BaseSerialization {
69*e7b1675dSTing-Kang Chang  public:
IdKeySerialization(int id)70*e7b1675dSTing-Kang Chang   explicit IdKeySerialization(int id)
71*e7b1675dSTing-Kang Chang       : BaseSerialization(kIdTypeUrl), id_(id) {}
72*e7b1675dSTing-Kang Chang 
GetKeyId()73*e7b1675dSTing-Kang Chang   int GetKeyId() const { return id_; }
74*e7b1675dSTing-Kang Chang 
75*e7b1675dSTing-Kang Chang  private:
76*e7b1675dSTing-Kang Chang   int id_;
77*e7b1675dSTing-Kang Chang };
78*e7b1675dSTing-Kang Chang 
79*e7b1675dSTing-Kang Chang // Parameters without an ID requirement.
80*e7b1675dSTing-Kang Chang class NoIdParams : public Parameters {
81*e7b1675dSTing-Kang Chang  public:
HasIdRequirement()82*e7b1675dSTing-Kang Chang   bool HasIdRequirement() const override { return false; }
83*e7b1675dSTing-Kang Chang 
84*e7b1675dSTing-Kang Chang   bool operator==(const Parameters& other) const override {
85*e7b1675dSTing-Kang Chang     return !other.HasIdRequirement();
86*e7b1675dSTing-Kang Chang   }
87*e7b1675dSTing-Kang Chang };
88*e7b1675dSTing-Kang Chang 
89*e7b1675dSTing-Kang Chang // Key without an ID requirement.
90*e7b1675dSTing-Kang Chang class NoIdKey : public Key {
91*e7b1675dSTing-Kang Chang  public:
GetParameters()92*e7b1675dSTing-Kang Chang   const Parameters& GetParameters() const override { return params_; }
93*e7b1675dSTing-Kang Chang 
GetIdRequirement()94*e7b1675dSTing-Kang Chang   absl::optional<int> GetIdRequirement() const override {
95*e7b1675dSTing-Kang Chang     return absl::nullopt;
96*e7b1675dSTing-Kang Chang   }
97*e7b1675dSTing-Kang Chang 
98*e7b1675dSTing-Kang Chang   bool operator==(const Key& other) const override {
99*e7b1675dSTing-Kang Chang     return params_ == other.GetParameters() &&
100*e7b1675dSTing-Kang Chang            absl::nullopt == other.GetIdRequirement();
101*e7b1675dSTing-Kang Chang   }
102*e7b1675dSTing-Kang Chang 
103*e7b1675dSTing-Kang Chang  private:
104*e7b1675dSTing-Kang Chang   NoIdParams params_;
105*e7b1675dSTing-Kang Chang };
106*e7b1675dSTing-Kang Chang 
107*e7b1675dSTing-Kang Chang // Parameters with an ID requirement.
108*e7b1675dSTing-Kang Chang class IdParams : public Parameters {
109*e7b1675dSTing-Kang Chang  public:
HasIdRequirement()110*e7b1675dSTing-Kang Chang   bool HasIdRequirement() const override { return true; }
111*e7b1675dSTing-Kang Chang 
112*e7b1675dSTing-Kang Chang   bool operator==(const Parameters& other) const override {
113*e7b1675dSTing-Kang Chang     return other.HasIdRequirement();
114*e7b1675dSTing-Kang Chang   }
115*e7b1675dSTing-Kang Chang };
116*e7b1675dSTing-Kang Chang 
117*e7b1675dSTing-Kang Chang // Key with an ID requirement.
118*e7b1675dSTing-Kang Chang class IdKey : public Key {
119*e7b1675dSTing-Kang Chang  public:
IdKey(int id)120*e7b1675dSTing-Kang Chang   explicit IdKey(int id) : id_(id) {}
121*e7b1675dSTing-Kang Chang 
GetParameters()122*e7b1675dSTing-Kang Chang   const Parameters& GetParameters() const override { return params_; }
123*e7b1675dSTing-Kang Chang 
GetIdRequirement()124*e7b1675dSTing-Kang Chang   absl::optional<int> GetIdRequirement() const override { return id_; }
125*e7b1675dSTing-Kang Chang 
126*e7b1675dSTing-Kang Chang   bool operator==(const Key& other) const override {
127*e7b1675dSTing-Kang Chang     return params_ == other.GetParameters() && id_ == other.GetIdRequirement();
128*e7b1675dSTing-Kang Chang   }
129*e7b1675dSTing-Kang Chang 
130*e7b1675dSTing-Kang Chang  private:
131*e7b1675dSTing-Kang Chang   IdParams params_;
132*e7b1675dSTing-Kang Chang   int id_;
133*e7b1675dSTing-Kang Chang };
134*e7b1675dSTing-Kang Chang 
135*e7b1675dSTing-Kang Chang // Parse `serialization` into parameters without an ID requirement.
ParseNoIdParams(NoIdSerialization serialization)136*e7b1675dSTing-Kang Chang inline util::StatusOr<NoIdParams> ParseNoIdParams(
137*e7b1675dSTing-Kang Chang     NoIdSerialization serialization) {
138*e7b1675dSTing-Kang Chang   return NoIdParams();
139*e7b1675dSTing-Kang Chang }
140*e7b1675dSTing-Kang Chang 
141*e7b1675dSTing-Kang Chang // Parse `serialization` into parameters with an ID requirement.
ParseIdParams(IdParamsSerialization serialization)142*e7b1675dSTing-Kang Chang inline util::StatusOr<IdParams> ParseIdParams(
143*e7b1675dSTing-Kang Chang     IdParamsSerialization serialization) {
144*e7b1675dSTing-Kang Chang   return IdParams();
145*e7b1675dSTing-Kang Chang }
146*e7b1675dSTing-Kang Chang 
147*e7b1675dSTing-Kang Chang // Serialize `parameters` without an ID requirement.
SerializeNoIdParams(NoIdParams parameters)148*e7b1675dSTing-Kang Chang inline util::StatusOr<NoIdSerialization> SerializeNoIdParams(
149*e7b1675dSTing-Kang Chang     NoIdParams parameters) {
150*e7b1675dSTing-Kang Chang   return NoIdSerialization();
151*e7b1675dSTing-Kang Chang }
152*e7b1675dSTing-Kang Chang 
153*e7b1675dSTing-Kang Chang // Serialize `parameters` with an ID requirement.
SerializeIdParams(IdParams parameters)154*e7b1675dSTing-Kang Chang inline util::StatusOr<IdParamsSerialization> SerializeIdParams(
155*e7b1675dSTing-Kang Chang     IdParams parameters) {
156*e7b1675dSTing-Kang Chang   return IdParamsSerialization();
157*e7b1675dSTing-Kang Chang }
158*e7b1675dSTing-Kang Chang 
159*e7b1675dSTing-Kang Chang // Parse `serialization` into a key without an ID requirement.
ParseNoIdKey(NoIdSerialization serialization,absl::optional<SecretKeyAccessToken> token)160*e7b1675dSTing-Kang Chang inline util::StatusOr<NoIdKey> ParseNoIdKey(
161*e7b1675dSTing-Kang Chang     NoIdSerialization serialization,
162*e7b1675dSTing-Kang Chang     absl::optional<SecretKeyAccessToken> token) {
163*e7b1675dSTing-Kang Chang   return NoIdKey();
164*e7b1675dSTing-Kang Chang }
165*e7b1675dSTing-Kang Chang 
166*e7b1675dSTing-Kang Chang // Parse `serialization` into a key with an ID requirement.
ParseIdKey(IdKeySerialization serialization,absl::optional<SecretKeyAccessToken> token)167*e7b1675dSTing-Kang Chang inline util::StatusOr<IdKey> ParseIdKey(
168*e7b1675dSTing-Kang Chang     IdKeySerialization serialization,
169*e7b1675dSTing-Kang Chang     absl::optional<SecretKeyAccessToken> token) {
170*e7b1675dSTing-Kang Chang   return IdKey(serialization.GetKeyId());
171*e7b1675dSTing-Kang Chang }
172*e7b1675dSTing-Kang Chang 
173*e7b1675dSTing-Kang Chang // Serialize `key` without an ID requirement.
SerializeNoIdKey(NoIdKey key,absl::optional<SecretKeyAccessToken> token)174*e7b1675dSTing-Kang Chang inline util::StatusOr<NoIdSerialization> SerializeNoIdKey(
175*e7b1675dSTing-Kang Chang     NoIdKey key, absl::optional<SecretKeyAccessToken> token) {
176*e7b1675dSTing-Kang Chang   return NoIdSerialization();
177*e7b1675dSTing-Kang Chang }
178*e7b1675dSTing-Kang Chang 
179*e7b1675dSTing-Kang Chang // Serialize `key` with an ID requirement.
SerializeIdKey(IdKey key,absl::optional<SecretKeyAccessToken> token)180*e7b1675dSTing-Kang Chang inline util::StatusOr<IdKeySerialization> SerializeIdKey(
181*e7b1675dSTing-Kang Chang     IdKey key, absl::optional<SecretKeyAccessToken> token) {
182*e7b1675dSTing-Kang Chang   return IdKeySerialization(key.GetIdRequirement().value());
183*e7b1675dSTing-Kang Chang }
184*e7b1675dSTing-Kang Chang 
185*e7b1675dSTing-Kang Chang }  // namespace internal
186*e7b1675dSTing-Kang Chang }  // namespace tink
187*e7b1675dSTing-Kang Chang }  // namespace crypto
188*e7b1675dSTing-Kang Chang 
189*e7b1675dSTing-Kang Chang #endif  // TINK_INTERNAL_SERIALIZATION_TEST_UTIL_H_
190