xref: /aosp_15_r20/external/tink/cc/internal/serialization_test_util.h (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1 // Copyright 2023 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 ////////////////////////////////////////////////////////////////////////////////
16 
17 #ifndef TINK_INTERNAL_SERIALIZATION_TEST_UTIL_H_
18 #define TINK_INTERNAL_SERIALIZATION_TEST_UTIL_H_
19 
20 #include <string>
21 
22 #include "absl/strings/string_view.h"
23 #include "absl/types/optional.h"
24 #include "tink/internal/serialization.h"
25 #include "tink/key.h"
26 #include "tink/parameters.h"
27 #include "tink/secret_key_access_token.h"
28 #include "tink/util/statusor.h"
29 
30 namespace crypto {
31 namespace tink {
32 namespace internal {
33 
34 constexpr absl::string_view kNoIdTypeUrl = "NoIdTypeUrl";
35 constexpr absl::string_view kIdTypeUrl = "IdTypeUrl";
36 
37 // Generic serialization for keys or parameters.
38 class BaseSerialization : public Serialization {
39  public:
BaseSerialization(absl::string_view object_identifier)40   explicit BaseSerialization(absl::string_view object_identifier)
41       : object_identifier_(object_identifier) {}
42 
ObjectIdentifier()43   absl::string_view ObjectIdentifier() const override {
44     return object_identifier_;
45   }
46 
47   bool operator==(const BaseSerialization& other) const {
48     return object_identifier_ == other.object_identifier_;
49   }
50 
51  private:
52   std::string object_identifier_;
53 };
54 
55 // Serialization for keys or parameters without an ID requirement.
56 class NoIdSerialization : public BaseSerialization {
57  public:
NoIdSerialization()58   NoIdSerialization() : BaseSerialization(kNoIdTypeUrl) {}
59 };
60 
61 // Serialization for parameters with an ID requirement.
62 class IdParamsSerialization : public BaseSerialization {
63  public:
IdParamsSerialization()64   IdParamsSerialization() : BaseSerialization(kIdTypeUrl) {}
65 };
66 
67 // Serialization for keys with an ID requirement.
68 class IdKeySerialization : public BaseSerialization {
69  public:
IdKeySerialization(int id)70   explicit IdKeySerialization(int id)
71       : BaseSerialization(kIdTypeUrl), id_(id) {}
72 
GetKeyId()73   int GetKeyId() const { return id_; }
74 
75  private:
76   int id_;
77 };
78 
79 // Parameters without an ID requirement.
80 class NoIdParams : public Parameters {
81  public:
HasIdRequirement()82   bool HasIdRequirement() const override { return false; }
83 
84   bool operator==(const Parameters& other) const override {
85     return !other.HasIdRequirement();
86   }
87 };
88 
89 // Key without an ID requirement.
90 class NoIdKey : public Key {
91  public:
GetParameters()92   const Parameters& GetParameters() const override { return params_; }
93 
GetIdRequirement()94   absl::optional<int> GetIdRequirement() const override {
95     return absl::nullopt;
96   }
97 
98   bool operator==(const Key& other) const override {
99     return params_ == other.GetParameters() &&
100            absl::nullopt == other.GetIdRequirement();
101   }
102 
103  private:
104   NoIdParams params_;
105 };
106 
107 // Parameters with an ID requirement.
108 class IdParams : public Parameters {
109  public:
HasIdRequirement()110   bool HasIdRequirement() const override { return true; }
111 
112   bool operator==(const Parameters& other) const override {
113     return other.HasIdRequirement();
114   }
115 };
116 
117 // Key with an ID requirement.
118 class IdKey : public Key {
119  public:
IdKey(int id)120   explicit IdKey(int id) : id_(id) {}
121 
GetParameters()122   const Parameters& GetParameters() const override { return params_; }
123 
GetIdRequirement()124   absl::optional<int> GetIdRequirement() const override { return id_; }
125 
126   bool operator==(const Key& other) const override {
127     return params_ == other.GetParameters() && id_ == other.GetIdRequirement();
128   }
129 
130  private:
131   IdParams params_;
132   int id_;
133 };
134 
135 // Parse `serialization` into parameters without an ID requirement.
ParseNoIdParams(NoIdSerialization serialization)136 inline util::StatusOr<NoIdParams> ParseNoIdParams(
137     NoIdSerialization serialization) {
138   return NoIdParams();
139 }
140 
141 // Parse `serialization` into parameters with an ID requirement.
ParseIdParams(IdParamsSerialization serialization)142 inline util::StatusOr<IdParams> ParseIdParams(
143     IdParamsSerialization serialization) {
144   return IdParams();
145 }
146 
147 // Serialize `parameters` without an ID requirement.
SerializeNoIdParams(NoIdParams parameters)148 inline util::StatusOr<NoIdSerialization> SerializeNoIdParams(
149     NoIdParams parameters) {
150   return NoIdSerialization();
151 }
152 
153 // Serialize `parameters` with an ID requirement.
SerializeIdParams(IdParams parameters)154 inline util::StatusOr<IdParamsSerialization> SerializeIdParams(
155     IdParams parameters) {
156   return IdParamsSerialization();
157 }
158 
159 // Parse `serialization` into a key without an ID requirement.
ParseNoIdKey(NoIdSerialization serialization,absl::optional<SecretKeyAccessToken> token)160 inline util::StatusOr<NoIdKey> ParseNoIdKey(
161     NoIdSerialization serialization,
162     absl::optional<SecretKeyAccessToken> token) {
163   return NoIdKey();
164 }
165 
166 // Parse `serialization` into a key with an ID requirement.
ParseIdKey(IdKeySerialization serialization,absl::optional<SecretKeyAccessToken> token)167 inline util::StatusOr<IdKey> ParseIdKey(
168     IdKeySerialization serialization,
169     absl::optional<SecretKeyAccessToken> token) {
170   return IdKey(serialization.GetKeyId());
171 }
172 
173 // Serialize `key` without an ID requirement.
SerializeNoIdKey(NoIdKey key,absl::optional<SecretKeyAccessToken> token)174 inline util::StatusOr<NoIdSerialization> SerializeNoIdKey(
175     NoIdKey key, absl::optional<SecretKeyAccessToken> token) {
176   return NoIdSerialization();
177 }
178 
179 // Serialize `key` with an ID requirement.
SerializeIdKey(IdKey key,absl::optional<SecretKeyAccessToken> token)180 inline util::StatusOr<IdKeySerialization> SerializeIdKey(
181     IdKey key, absl::optional<SecretKeyAccessToken> token) {
182   return IdKeySerialization(key.GetIdRequirement().value());
183 }
184 
185 }  // namespace internal
186 }  // namespace tink
187 }  // namespace crypto
188 
189 #endif  // TINK_INTERNAL_SERIALIZATION_TEST_UTIL_H_
190