xref: /aosp_15_r20/external/tink/cc/monitoring/monitoring.h (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
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