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