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