xref: /aosp_15_r20/external/cronet/crypto/aead.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef CRYPTO_AEAD_H_
6*6777b538SAndroid Build Coastguard Worker #define CRYPTO_AEAD_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <optional>
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker #include <string_view>
14*6777b538SAndroid Build Coastguard Worker #include <vector>
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
18*6777b538SAndroid Build Coastguard Worker #include "crypto/crypto_export.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker struct evp_aead_st;
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace crypto {
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker // This class exposes the AES-128-CTR-HMAC-SHA256 and AES_256_GCM AEAD. Note
25*6777b538SAndroid Build Coastguard Worker // that there are two versions of most methods: an historical version based
26*6777b538SAndroid Build Coastguard Worker // around |std::string_view| and a more modern version that takes |base::span|.
27*6777b538SAndroid Build Coastguard Worker // Prefer the latter in new code.
28*6777b538SAndroid Build Coastguard Worker class CRYPTO_EXPORT Aead {
29*6777b538SAndroid Build Coastguard Worker  public:
30*6777b538SAndroid Build Coastguard Worker   enum AeadAlgorithm {
31*6777b538SAndroid Build Coastguard Worker     AES_128_CTR_HMAC_SHA256,
32*6777b538SAndroid Build Coastguard Worker     AES_256_GCM,
33*6777b538SAndroid Build Coastguard Worker     AES_256_GCM_SIV,
34*6777b538SAndroid Build Coastguard Worker     CHACHA20_POLY1305
35*6777b538SAndroid Build Coastguard Worker   };
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker   explicit Aead(AeadAlgorithm algorithm);
38*6777b538SAndroid Build Coastguard Worker   Aead(const Aead&) = delete;
39*6777b538SAndroid Build Coastguard Worker   Aead& operator=(const Aead&) = delete;
40*6777b538SAndroid Build Coastguard Worker   ~Aead();
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   // Note that Init keeps a reference to the data pointed to by |key| thus that
43*6777b538SAndroid Build Coastguard Worker   // data must outlive this object.
44*6777b538SAndroid Build Coastguard Worker   void Init(base::span<const uint8_t> key);
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker   // Note that Init keeps a reference to the data pointed to by |key| thus that
47*6777b538SAndroid Build Coastguard Worker   // data must outlive this object.
48*6777b538SAndroid Build Coastguard Worker   void Init(const std::string* key);
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   std::vector<uint8_t> Seal(base::span<const uint8_t> plaintext,
51*6777b538SAndroid Build Coastguard Worker                             base::span<const uint8_t> nonce,
52*6777b538SAndroid Build Coastguard Worker                             base::span<const uint8_t> additional_data) const;
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   bool Seal(std::string_view plaintext,
55*6777b538SAndroid Build Coastguard Worker             std::string_view nonce,
56*6777b538SAndroid Build Coastguard Worker             std::string_view additional_data,
57*6777b538SAndroid Build Coastguard Worker             std::string* ciphertext) const;
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   std::optional<std::vector<uint8_t>> Open(
60*6777b538SAndroid Build Coastguard Worker       base::span<const uint8_t> ciphertext,
61*6777b538SAndroid Build Coastguard Worker       base::span<const uint8_t> nonce,
62*6777b538SAndroid Build Coastguard Worker       base::span<const uint8_t> additional_data) const;
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   bool Open(std::string_view ciphertext,
65*6777b538SAndroid Build Coastguard Worker             std::string_view nonce,
66*6777b538SAndroid Build Coastguard Worker             std::string_view additional_data,
67*6777b538SAndroid Build Coastguard Worker             std::string* plaintext) const;
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   size_t KeyLength() const;
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   size_t NonceLength() const;
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker  private:
74*6777b538SAndroid Build Coastguard Worker   std::optional<size_t> Seal(base::span<const uint8_t> plaintext,
75*6777b538SAndroid Build Coastguard Worker                              base::span<const uint8_t> nonce,
76*6777b538SAndroid Build Coastguard Worker                              base::span<const uint8_t> additional_data,
77*6777b538SAndroid Build Coastguard Worker                              base::span<uint8_t> out) const;
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker   std::optional<size_t> Open(base::span<const uint8_t> ciphertext,
80*6777b538SAndroid Build Coastguard Worker                              base::span<const uint8_t> nonce,
81*6777b538SAndroid Build Coastguard Worker                              base::span<const uint8_t> additional_data,
82*6777b538SAndroid Build Coastguard Worker                              base::span<uint8_t> out) const;
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   std::optional<base::span<const uint8_t>> key_;
85*6777b538SAndroid Build Coastguard Worker   raw_ptr<const evp_aead_st> aead_;
86*6777b538SAndroid Build Coastguard Worker };
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker }  // namespace crypto
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker #endif  // CRYPTO_AEAD_H_
91