1*e7b1675dSTing-Kang Chang // Copyright 2022 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 #ifndef TINK_MONITORING_MONITORING_H_ 17*e7b1675dSTing-Kang Chang #define TINK_MONITORING_MONITORING_H_ 18*e7b1675dSTing-Kang Chang 19*e7b1675dSTing-Kang Chang #include <cstdint> 20*e7b1675dSTing-Kang Chang #include <memory> 21*e7b1675dSTing-Kang Chang #include <string> 22*e7b1675dSTing-Kang Chang #include <vector> 23*e7b1675dSTing-Kang Chang 24*e7b1675dSTing-Kang Chang #include "absl/container/flat_hash_map.h" 25*e7b1675dSTing-Kang Chang #include "tink/internal/key_status_util.h" 26*e7b1675dSTing-Kang Chang #include "tink/key_status.h" 27*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h" 28*e7b1675dSTing-Kang Chang 29*e7b1675dSTing-Kang Chang namespace crypto { 30*e7b1675dSTing-Kang Chang namespace tink { 31*e7b1675dSTing-Kang Chang 32*e7b1675dSTing-Kang Chang // Immutable representation of a KeySet in a certain point in time for the 33*e7b1675dSTing-Kang Chang // purpose of monitoring operations involving cryptographic keys. 34*e7b1675dSTing-Kang Chang class MonitoringKeySetInfo { 35*e7b1675dSTing-Kang Chang public: 36*e7b1675dSTing-Kang Chang // Description about each entry of the KeySet. 37*e7b1675dSTing-Kang Chang class Entry { 38*e7b1675dSTing-Kang Chang public: 39*e7b1675dSTing-Kang Chang // Constructs a new KeySet entry with a given `status`, `key_id`, 40*e7b1675dSTing-Kang Chang // `key_type`, and `key_prefix`. Entry(KeyStatus status,uint32_t key_id,absl::string_view key_type,absl::string_view key_prefix)41*e7b1675dSTing-Kang Chang Entry(KeyStatus status, uint32_t key_id, absl::string_view key_type, 42*e7b1675dSTing-Kang Chang absl::string_view key_prefix) 43*e7b1675dSTing-Kang Chang : status_(status), 44*e7b1675dSTing-Kang Chang key_id_(key_id), 45*e7b1675dSTing-Kang Chang key_type_(key_type), 46*e7b1675dSTing-Kang Chang key_prefix_(key_prefix) {} 47*e7b1675dSTing-Kang Chang 48*e7b1675dSTing-Kang Chang // Returns the status of this entry. GetStatus()49*e7b1675dSTing-Kang Chang std::string GetStatus() const { return internal::ToKeyStatusName(status_); } 50*e7b1675dSTing-Kang Chang // Returns the ID of the entry within the keyset. GetKeyId()51*e7b1675dSTing-Kang Chang uint32_t GetKeyId() const { return key_id_; } 52*e7b1675dSTing-Kang Chang // Returns the key type. GetKeyType()53*e7b1675dSTing-Kang Chang std::string GetKeyType() const { return key_type_; } 54*e7b1675dSTing-Kang Chang // Returns the key prefix. GetKeyPrefix()55*e7b1675dSTing-Kang Chang std::string GetKeyPrefix() const { return key_prefix_; } 56*e7b1675dSTing-Kang Chang 57*e7b1675dSTing-Kang Chang private: 58*e7b1675dSTing-Kang Chang const KeyStatus status_; 59*e7b1675dSTing-Kang Chang // Identifies a key within a keyset. 60*e7b1675dSTing-Kang Chang const uint32_t key_id_; 61*e7b1675dSTing-Kang Chang // This field stores the key type. 62*e7b1675dSTing-Kang Chang const std::string key_type_; 63*e7b1675dSTing-Kang Chang // Stores the key output prefix. 64*e7b1675dSTing-Kang Chang const std::string key_prefix_; 65*e7b1675dSTing-Kang Chang }; 66*e7b1675dSTing-Kang Chang 67*e7b1675dSTing-Kang Chang // Constructs a MonitoringKeySetInfo object with the given 68*e7b1675dSTing-Kang Chang // `keyset_annotations`, `keyset_entries` and primary key ID `primary_key_id`. MonitoringKeySetInfo(const absl::flat_hash_map<std::string,std::string> & keyset_annotations,const std::vector<Entry> & keyset_entries,uint32_t primary_key_id)69*e7b1675dSTing-Kang Chang MonitoringKeySetInfo( 70*e7b1675dSTing-Kang Chang const absl::flat_hash_map<std::string, std::string>& keyset_annotations, 71*e7b1675dSTing-Kang Chang const std::vector<Entry>& keyset_entries, uint32_t primary_key_id) 72*e7b1675dSTing-Kang Chang : keyset_annotations_(keyset_annotations), 73*e7b1675dSTing-Kang Chang keyset_entries_(keyset_entries), 74*e7b1675dSTing-Kang Chang primary_key_id_(primary_key_id) {} 75*e7b1675dSTing-Kang Chang 76*e7b1675dSTing-Kang Chang // Returns a const reference to the annotations of this keyset. GetAnnotations()77*e7b1675dSTing-Kang Chang const absl::flat_hash_map<std::string, std::string>& GetAnnotations() const { 78*e7b1675dSTing-Kang Chang return keyset_annotations_; 79*e7b1675dSTing-Kang Chang } 80*e7b1675dSTing-Kang Chang // Returns a const reference to the array of entries for this keyset. GetEntries()81*e7b1675dSTing-Kang Chang const std::vector<Entry>& GetEntries() const { return keyset_entries_; } 82*e7b1675dSTing-Kang Chang // Returns the ID of the primary key in this keyset. GetPrimaryKeyId()83*e7b1675dSTing-Kang Chang uint32_t GetPrimaryKeyId() const { return primary_key_id_; } 84*e7b1675dSTing-Kang Chang 85*e7b1675dSTing-Kang Chang private: 86*e7b1675dSTing-Kang Chang // Annotations of this keyset in the form 'key' -> 'value'. 87*e7b1675dSTing-Kang Chang const absl::flat_hash_map<std::string, std::string> keyset_annotations_; 88*e7b1675dSTing-Kang Chang const std::vector<Entry> keyset_entries_; 89*e7b1675dSTing-Kang Chang const uint32_t primary_key_id_; 90*e7b1675dSTing-Kang Chang }; 91*e7b1675dSTing-Kang Chang 92*e7b1675dSTing-Kang Chang // Defines a context for monitoring events, wich includes the primitive and API 93*e7b1675dSTing-Kang Chang // used, and info on the keyset. 94*e7b1675dSTing-Kang Chang class MonitoringContext { 95*e7b1675dSTing-Kang Chang public: 96*e7b1675dSTing-Kang Chang // Construct a new context for the given `primitive`, `api_function` and 97*e7b1675dSTing-Kang Chang // `keyset_info`. MonitoringContext(absl::string_view primitive,absl::string_view api_function,const MonitoringKeySetInfo & keyset_info)98*e7b1675dSTing-Kang Chang MonitoringContext(absl::string_view primitive, absl::string_view api_function, 99*e7b1675dSTing-Kang Chang const MonitoringKeySetInfo& keyset_info) 100*e7b1675dSTing-Kang Chang : primitive_(primitive), 101*e7b1675dSTing-Kang Chang api_function_(api_function), 102*e7b1675dSTing-Kang Chang keyset_info_(keyset_info) {} 103*e7b1675dSTing-Kang Chang 104*e7b1675dSTing-Kang Chang // Returns the primitive. GetPrimitive()105*e7b1675dSTing-Kang Chang std::string GetPrimitive() const { return primitive_; } 106*e7b1675dSTing-Kang Chang // Returns the API function. GetApi()107*e7b1675dSTing-Kang Chang std::string GetApi() const { return api_function_; } 108*e7b1675dSTing-Kang Chang // Returns a constant reference to the keyset info. GetKeySetInfo()109*e7b1675dSTing-Kang Chang const MonitoringKeySetInfo& GetKeySetInfo() const { return keyset_info_; } 110*e7b1675dSTing-Kang Chang 111*e7b1675dSTing-Kang Chang private: 112*e7b1675dSTing-Kang Chang const std::string primitive_; 113*e7b1675dSTing-Kang Chang const std::string api_function_; 114*e7b1675dSTing-Kang Chang const MonitoringKeySetInfo keyset_info_; 115*e7b1675dSTing-Kang Chang }; 116*e7b1675dSTing-Kang Chang 117*e7b1675dSTing-Kang Chang // Interface for a monitoring client which can be registered with Tink. A 118*e7b1675dSTing-Kang Chang // monitoring client getis informed by Tink about certain events happening 119*e7b1675dSTing-Kang Chang // during cryptographic operations. 120*e7b1675dSTing-Kang Chang class MonitoringClient { 121*e7b1675dSTing-Kang Chang public: 122*e7b1675dSTing-Kang Chang virtual ~MonitoringClient() = default; 123*e7b1675dSTing-Kang Chang // Logs a successful use of `key_id` on an input of `num_bytes_as_input`. Tink 124*e7b1675dSTing-Kang Chang // primitive wrappers call this method when they successfully used a key to 125*e7b1675dSTing-Kang Chang // carry out a primitive method, e.g. Aead::Encrypt(). As a consequence, 126*e7b1675dSTing-Kang Chang // subclasses of MonitoringClient should be mindful on the amount of work 127*e7b1675dSTing-Kang Chang // performed by this method, as this will be called on each cryptographic 128*e7b1675dSTing-Kang Chang // operation. Implementations of MonitoringClient are responsible to add 129*e7b1675dSTing-Kang Chang // context to identify, e.g., the primitive and the API function. 130*e7b1675dSTing-Kang Chang virtual void Log(uint32_t key_id, int64_t num_bytes_as_input) = 0; 131*e7b1675dSTing-Kang Chang 132*e7b1675dSTing-Kang Chang // Logs a failure. Tink calls this method when a cryptographic operation 133*e7b1675dSTing-Kang Chang // failed, e.g. no key could be found to decrypt a ciphertext. In this 134*e7b1675dSTing-Kang Chang // case the failure is not associated with a specific key, therefore this 135*e7b1675dSTing-Kang Chang // method has no arguments. The MonitoringClient implementation is responsible 136*e7b1675dSTing-Kang Chang // to add context to identify where the failure comes from. 137*e7b1675dSTing-Kang Chang virtual void LogFailure() = 0; 138*e7b1675dSTing-Kang Chang }; 139*e7b1675dSTing-Kang Chang 140*e7b1675dSTing-Kang Chang // Interface for a factory class that creates monitoring clients. 141*e7b1675dSTing-Kang Chang class MonitoringClientFactory { 142*e7b1675dSTing-Kang Chang public: 143*e7b1675dSTing-Kang Chang virtual ~MonitoringClientFactory() = default; 144*e7b1675dSTing-Kang Chang // Create a new monitoring client that logs events related to the given 145*e7b1675dSTing-Kang Chang // `context`. 146*e7b1675dSTing-Kang Chang virtual crypto::tink::util::StatusOr<std::unique_ptr<MonitoringClient>> New( 147*e7b1675dSTing-Kang Chang const MonitoringContext& context) = 0; 148*e7b1675dSTing-Kang Chang }; 149*e7b1675dSTing-Kang Chang 150*e7b1675dSTing-Kang Chang } // namespace tink 151*e7b1675dSTing-Kang Chang } // namespace crypto 152*e7b1675dSTing-Kang Chang 153*e7b1675dSTing-Kang Chang #endif // TINK_MONITORING_MONITORING_H_ 154