xref: /aosp_15_r20/external/tink/cc/hybrid/internal/hpke_context.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 
17*e7b1675dSTing-Kang Chang #ifndef TINK_HYBRID_INTERNAL_HPKE_CONTEXT_H_
18*e7b1675dSTing-Kang Chang #define TINK_HYBRID_INTERNAL_HPKE_CONTEXT_H_
19*e7b1675dSTing-Kang Chang 
20*e7b1675dSTing-Kang Chang #include <stddef.h>
21*e7b1675dSTing-Kang Chang 
22*e7b1675dSTing-Kang Chang #include <memory>
23*e7b1675dSTing-Kang Chang #include <string>
24*e7b1675dSTing-Kang Chang #include <utility>
25*e7b1675dSTing-Kang Chang 
26*e7b1675dSTing-Kang Chang #include "absl/strings/string_view.h"
27*e7b1675dSTing-Kang Chang #include "tink/hybrid/internal/hpke_context_boringssl.h"
28*e7b1675dSTing-Kang Chang #include "tink/hybrid/internal/hpke_util.h"
29*e7b1675dSTing-Kang Chang #include "tink/util/secret_data.h"
30*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h"
31*e7b1675dSTing-Kang Chang 
32*e7b1675dSTing-Kang Chang namespace crypto {
33*e7b1675dSTing-Kang Chang namespace tink {
34*e7b1675dSTing-Kang Chang namespace internal {
35*e7b1675dSTing-Kang Chang 
36*e7b1675dSTing-Kang Chang // Pair of string views for an HPKE payload (encapsulated key and ciphertext).
37*e7b1675dSTing-Kang Chang struct HpkePayloadView {
HpkePayloadViewHpkePayloadView38*e7b1675dSTing-Kang Chang   HpkePayloadView(absl::string_view encapsulated_key,
39*e7b1675dSTing-Kang Chang                   absl::string_view ciphertext)
40*e7b1675dSTing-Kang Chang       : encapsulated_key(encapsulated_key), ciphertext(ciphertext) {}
41*e7b1675dSTing-Kang Chang 
42*e7b1675dSTing-Kang Chang   absl::string_view encapsulated_key;
43*e7b1675dSTing-Kang Chang   absl::string_view ciphertext;
44*e7b1675dSTing-Kang Chang };
45*e7b1675dSTing-Kang Chang 
46*e7b1675dSTing-Kang Chang // Creates HPKE payload `encapsulated_key` || `ciphertext` (i.e., Tink hybrid
47*e7b1675dSTing-Kang Chang // encryption wire format described at
48*e7b1675dSTing-Kang Chang // https://developers.google.com/tink/wire-format#hybrid_encryption).
49*e7b1675dSTing-Kang Chang std::string ConcatenatePayload(absl::string_view encapsulated_key,
50*e7b1675dSTing-Kang Chang                                absl::string_view ciphertext);
51*e7b1675dSTing-Kang Chang 
52*e7b1675dSTing-Kang Chang // Splits `payload` into an `HpkePayloadView` struct.  The `kem` parameter is
53*e7b1675dSTing-Kang Chang // used to determine how to split the payload.
54*e7b1675dSTing-Kang Chang //
55*e7b1675dSTing-Kang Chang // WARNING: The string pointed to by `payload` must outlive the returned object.
56*e7b1675dSTing-Kang Chang crypto::tink::util::StatusOr<HpkePayloadView> SplitPayload(
57*e7b1675dSTing-Kang Chang     const HpkeKem& kem, absl::string_view payload);
58*e7b1675dSTing-Kang Chang 
59*e7b1675dSTing-Kang Chang // Represents an HPKE context for either a sender or a recipient.
60*e7b1675dSTing-Kang Chang class HpkeContext {
61*e7b1675dSTing-Kang Chang  public:
62*e7b1675dSTing-Kang Chang   // Sets up an HPKE sender context.  Returns an error if initialization
63*e7b1675dSTing-Kang Chang   // fails.  Otherwise, returns a unique pointer to the sender context.
64*e7b1675dSTing-Kang Chang   //
65*e7b1675dSTing-Kang Chang   //   `params`: HPKE parameters (KEM, KDF, and AEAD).
66*e7b1675dSTing-Kang Chang   //   `recipient_public_key`: KEM-encoding of recipient public key.
67*e7b1675dSTing-Kang Chang   //   `info`: Application-specific context for key derivation.
68*e7b1675dSTing-Kang Chang   static crypto::tink::util::StatusOr<std::unique_ptr<HpkeContext>> SetupSender(
69*e7b1675dSTing-Kang Chang       const HpkeParams& params, absl::string_view recipient_public_key,
70*e7b1675dSTing-Kang Chang       absl::string_view info);
71*e7b1675dSTing-Kang Chang 
72*e7b1675dSTing-Kang Chang   // Sets up an HPKE recipient context.  Returns an error if initialization
73*e7b1675dSTing-Kang Chang   // fails.  Otherwise, returns a unique pointer to the recipient context.
74*e7b1675dSTing-Kang Chang   //
75*e7b1675dSTing-Kang Chang   //   `params`: HPKE parameters (KEM, KDF, and AEAD).
76*e7b1675dSTing-Kang Chang   //   `recipient_private_key`: Recipient private key.
77*e7b1675dSTing-Kang Chang   //   `encapsulated_key`: Encapsulated key.
78*e7b1675dSTing-Kang Chang   //   `info`: Application-specific context for key derivation.
79*e7b1675dSTing-Kang Chang   static crypto::tink::util::StatusOr<std::unique_ptr<HpkeContext>>
80*e7b1675dSTing-Kang Chang   SetupRecipient(const HpkeParams& params,
81*e7b1675dSTing-Kang Chang                  const util::SecretData& recipient_private_key,
82*e7b1675dSTing-Kang Chang                  absl::string_view encapsulated_key, absl::string_view info);
83*e7b1675dSTing-Kang Chang 
EncapsulatedKey()84*e7b1675dSTing-Kang Chang   absl::string_view EncapsulatedKey() const {
85*e7b1675dSTing-Kang Chang     return encapsulated_key_;
86*e7b1675dSTing-Kang Chang   }
87*e7b1675dSTing-Kang Chang 
88*e7b1675dSTing-Kang Chang   // Performs an AEAD encryption of `plaintext` with `associated_data`. Returns
89*e7b1675dSTing-Kang Chang   // an error if encryption fails.  Otherwise, returns the ciphertext.
Seal(absl::string_view plaintext,absl::string_view associated_data)90*e7b1675dSTing-Kang Chang   crypto::tink::util::StatusOr<std::string> Seal(
91*e7b1675dSTing-Kang Chang       absl::string_view plaintext, absl::string_view associated_data) {
92*e7b1675dSTing-Kang Chang     return context_->Seal(plaintext, associated_data);
93*e7b1675dSTing-Kang Chang   }
94*e7b1675dSTing-Kang Chang 
95*e7b1675dSTing-Kang Chang   // Performs an AEAD decryption of `ciphertext` with `associated_data`. Returns
96*e7b1675dSTing-Kang Chang   // an error if decryption fails.  Otherwise, returns the plaintext.
Open(absl::string_view ciphertext,absl::string_view associated_data)97*e7b1675dSTing-Kang Chang   crypto::tink::util::StatusOr<std::string> Open(
98*e7b1675dSTing-Kang Chang       absl::string_view ciphertext, absl::string_view associated_data) {
99*e7b1675dSTing-Kang Chang     return context_->Open(ciphertext, associated_data);
100*e7b1675dSTing-Kang Chang   }
101*e7b1675dSTing-Kang Chang 
102*e7b1675dSTing-Kang Chang   // Exports `secret_length` bytes of secret material using `exporter_context`
103*e7b1675dSTing-Kang Chang   // for the input context.  Returns an error if export fails.  Otherwise,
104*e7b1675dSTing-Kang Chang   // returns a secret of the requested length.
Export(absl::string_view exporter_context,size_t secret_length)105*e7b1675dSTing-Kang Chang   crypto::tink::util::StatusOr<util::SecretData> Export(
106*e7b1675dSTing-Kang Chang       absl::string_view exporter_context, size_t secret_length) {
107*e7b1675dSTing-Kang Chang     return context_->Export(exporter_context, secret_length);
108*e7b1675dSTing-Kang Chang   }
109*e7b1675dSTing-Kang Chang 
110*e7b1675dSTing-Kang Chang  private:
HpkeContext(absl::string_view encapsulated_key,std::unique_ptr<HpkeContextBoringSsl> context)111*e7b1675dSTing-Kang Chang   explicit HpkeContext(absl::string_view encapsulated_key,
112*e7b1675dSTing-Kang Chang                        std::unique_ptr<HpkeContextBoringSsl> context)
113*e7b1675dSTing-Kang Chang       : encapsulated_key_(encapsulated_key), context_(std::move(context)) {}
114*e7b1675dSTing-Kang Chang 
115*e7b1675dSTing-Kang Chang   const std::string encapsulated_key_;
116*e7b1675dSTing-Kang Chang   const std::unique_ptr<HpkeContextBoringSsl> context_;
117*e7b1675dSTing-Kang Chang };
118*e7b1675dSTing-Kang Chang 
119*e7b1675dSTing-Kang Chang }  // namespace internal
120*e7b1675dSTing-Kang Chang }  // namespace tink
121*e7b1675dSTing-Kang Chang }  // namespace crypto
122*e7b1675dSTing-Kang Chang 
123*e7b1675dSTing-Kang Chang #endif  // TINK_HYBRID_INTERNAL_HPKE_CONTEXT_H_
124