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_MUTABLE_SERIALIZATION_REGISTRY_H_ 18*e7b1675dSTing-Kang Chang #define TINK_INTERNAL_MUTABLE_SERIALIZATION_REGISTRY_H_ 19*e7b1675dSTing-Kang Chang 20*e7b1675dSTing-Kang Chang #include <memory> 21*e7b1675dSTing-Kang Chang 22*e7b1675dSTing-Kang Chang #include "absl/base/thread_annotations.h" 23*e7b1675dSTing-Kang Chang #include "absl/synchronization/mutex.h" 24*e7b1675dSTing-Kang Chang #include "absl/types/optional.h" 25*e7b1675dSTing-Kang Chang #include "tink/internal/key_parser.h" 26*e7b1675dSTing-Kang Chang #include "tink/internal/key_serializer.h" 27*e7b1675dSTing-Kang Chang #include "tink/internal/parameters_parser.h" 28*e7b1675dSTing-Kang Chang #include "tink/internal/parameters_serializer.h" 29*e7b1675dSTing-Kang Chang #include "tink/internal/serialization.h" 30*e7b1675dSTing-Kang Chang #include "tink/internal/serialization_registry.h" 31*e7b1675dSTing-Kang Chang #include "tink/key.h" 32*e7b1675dSTing-Kang Chang #include "tink/parameters.h" 33*e7b1675dSTing-Kang Chang #include "tink/secret_key_access_token.h" 34*e7b1675dSTing-Kang Chang #include "tink/util/status.h" 35*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h" 36*e7b1675dSTing-Kang Chang 37*e7b1675dSTing-Kang Chang namespace crypto { 38*e7b1675dSTing-Kang Chang namespace tink { 39*e7b1675dSTing-Kang Chang namespace internal { 40*e7b1675dSTing-Kang Chang 41*e7b1675dSTing-Kang Chang // This class provides a global, mutable serialization registry by wrapping an 42*e7b1675dSTing-Kang Chang // instance of an immutable `SerializationRegistry`. This registry will enable 43*e7b1675dSTing-Kang Chang // the Tink 2.0 C++ Keyset API in the near term. 44*e7b1675dSTing-Kang Chang class MutableSerializationRegistry { 45*e7b1675dSTing-Kang Chang public: 46*e7b1675dSTing-Kang Chang // Returns the global serialization registry. 47*e7b1675dSTing-Kang Chang static MutableSerializationRegistry& GlobalInstance(); 48*e7b1675dSTing-Kang Chang 49*e7b1675dSTing-Kang Chang // Registers parameters `parser`. Returns an error if a different parameters 50*e7b1675dSTing-Kang Chang // parser with the same parser index has already been registered. 51*e7b1675dSTing-Kang Chang util::Status RegisterParametersParser(ParametersParser* parser) 52*e7b1675dSTing-Kang Chang ABSL_LOCKS_EXCLUDED(registry_mutex_); 53*e7b1675dSTing-Kang Chang 54*e7b1675dSTing-Kang Chang // Registers parameters `serializer`. Returns an error if a different 55*e7b1675dSTing-Kang Chang // parameters serializer with the same serializer index has already been 56*e7b1675dSTing-Kang Chang // registered. 57*e7b1675dSTing-Kang Chang util::Status RegisterParametersSerializer(ParametersSerializer* serializer) 58*e7b1675dSTing-Kang Chang ABSL_LOCKS_EXCLUDED(registry_mutex_); 59*e7b1675dSTing-Kang Chang 60*e7b1675dSTing-Kang Chang // Registers key `parser`. Returns an error if a different key parser with the 61*e7b1675dSTing-Kang Chang // same parser index has already been registered. 62*e7b1675dSTing-Kang Chang util::Status RegisterKeyParser(KeyParser* parser) 63*e7b1675dSTing-Kang Chang ABSL_LOCKS_EXCLUDED(registry_mutex_); 64*e7b1675dSTing-Kang Chang 65*e7b1675dSTing-Kang Chang // Registers key `serializer`. Returns an error if a different key serializer 66*e7b1675dSTing-Kang Chang // with the same serializer index has already been registered. 67*e7b1675dSTing-Kang Chang util::Status RegisterKeySerializer(KeySerializer* serializer) 68*e7b1675dSTing-Kang Chang ABSL_LOCKS_EXCLUDED(registry_mutex_); 69*e7b1675dSTing-Kang Chang 70*e7b1675dSTing-Kang Chang // Parses `serialization` into a `Parameters` instance. 71*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<Parameters>> ParseParameters( 72*e7b1675dSTing-Kang Chang const Serialization& serialization) ABSL_LOCKS_EXCLUDED(registry_mutex_); 73*e7b1675dSTing-Kang Chang 74*e7b1675dSTing-Kang Chang // Serializes `parameters` into a `Serialization` instance. 75*e7b1675dSTing-Kang Chang template <typename SerializationT> SerializeParameters(const Parameters & parameters)76*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<Serialization>> SerializeParameters( 77*e7b1675dSTing-Kang Chang const Parameters& parameters) ABSL_LOCKS_EXCLUDED(registry_mutex_) { 78*e7b1675dSTing-Kang Chang absl::ReaderMutexLock lock(®istry_mutex_); 79*e7b1675dSTing-Kang Chang return registry_.SerializeParameters<SerializationT>(parameters); 80*e7b1675dSTing-Kang Chang } 81*e7b1675dSTing-Kang Chang 82*e7b1675dSTing-Kang Chang // Parses `serialization` into a `Key` instance. 83*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<Key>> ParseKey( 84*e7b1675dSTing-Kang Chang const Serialization& serialization, 85*e7b1675dSTing-Kang Chang absl::optional<SecretKeyAccessToken> token) 86*e7b1675dSTing-Kang Chang ABSL_LOCKS_EXCLUDED(registry_mutex_); 87*e7b1675dSTing-Kang Chang 88*e7b1675dSTing-Kang Chang // Similar to `ParseKey` but falls back to legacy proto key serialization if 89*e7b1675dSTing-Kang Chang // the corresponding key parser is not found. 90*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<Key>> ParseKeyWithLegacyFallback( 91*e7b1675dSTing-Kang Chang const Serialization& serialization, SecretKeyAccessToken token); 92*e7b1675dSTing-Kang Chang 93*e7b1675dSTing-Kang Chang // Serializes `parameters` into a `Serialization` instance. 94*e7b1675dSTing-Kang Chang template <typename SerializationT> SerializeKey(const Key & key,absl::optional<SecretKeyAccessToken> token)95*e7b1675dSTing-Kang Chang util::StatusOr<std::unique_ptr<Serialization>> SerializeKey( 96*e7b1675dSTing-Kang Chang const Key& key, absl::optional<SecretKeyAccessToken> token) 97*e7b1675dSTing-Kang Chang ABSL_LOCKS_EXCLUDED(registry_mutex_) { 98*e7b1675dSTing-Kang Chang absl::ReaderMutexLock lock(®istry_mutex_); 99*e7b1675dSTing-Kang Chang return registry_.SerializeKey<SerializationT>(key, token); 100*e7b1675dSTing-Kang Chang } 101*e7b1675dSTing-Kang Chang 102*e7b1675dSTing-Kang Chang // Resets to a new empty registry. Reset()103*e7b1675dSTing-Kang Chang void Reset() ABSL_LOCKS_EXCLUDED(registry_mutex_) { 104*e7b1675dSTing-Kang Chang absl::WriterMutexLock lock(®istry_mutex_); 105*e7b1675dSTing-Kang Chang registry_ = SerializationRegistry(); 106*e7b1675dSTing-Kang Chang } 107*e7b1675dSTing-Kang Chang 108*e7b1675dSTing-Kang Chang private: 109*e7b1675dSTing-Kang Chang mutable absl::Mutex registry_mutex_; 110*e7b1675dSTing-Kang Chang // Simple wrappers around const methods of `registry_` may safely acquire a 111*e7b1675dSTing-Kang Chang // shared (reader) lock. Other calls require an exclusive (writer) lock. 112*e7b1675dSTing-Kang Chang SerializationRegistry registry_ ABSL_GUARDED_BY(registry_mutex_); 113*e7b1675dSTing-Kang Chang }; 114*e7b1675dSTing-Kang Chang 115*e7b1675dSTing-Kang Chang } // namespace internal 116*e7b1675dSTing-Kang Chang } // namespace tink 117*e7b1675dSTing-Kang Chang } // namespace crypto 118*e7b1675dSTing-Kang Chang 119*e7b1675dSTing-Kang Chang #endif // TINK_INTERNAL_MUTABLE_SERIALIZATION_REGISTRY_H_ 120