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