[go: nahoru, domu]

blob: b5c25d4c9b13123a31874acdf47c1dc4d31a9337 [file] [log] [blame]
estark03206a12015-04-25 04:52:251// Copyright 2015 The Chromium Authors. All rights reserved.
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
avidd373b82015-12-21 21:34:438#include <stddef.h>
Adam Langleyf2149732019-08-09 22:23:339#include <stdint.h>
avidd373b82015-12-21 21:34:4310
davidben6004dc52017-02-03 04:15:2911#include <string>
Adam Langleyf2149732019-08-09 22:23:3312#include <vector>
davidben6004dc52017-02-03 04:15:2913
Adam Langleyf2149732019-08-09 22:23:3314#include "base/containers/span.h"
Keishi Hattori0e45c022021-11-27 09:25:5215#include "base/memory/raw_ptr.h"
estark03206a12015-04-25 04:52:2516#include "base/strings/string_piece.h"
17#include "crypto/crypto_export.h"
Anton Bikineeva3f961db2021-05-15 17:56:1218#include "third_party/abseil-cpp/absl/types/optional.h"
estark03206a12015-04-25 04:52:2519
20struct evp_aead_st;
21
22namespace crypto {
23
Adam Langleyf2149732019-08-09 22:23:3324// 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 |StringPiece| and a more modern version that takes |base::span|.
27// Prefer the latter in new code.
estark03206a12015-04-25 04:52:2528class CRYPTO_EXPORT Aead {
29 public:
Leonid Baraz07c05772020-08-18 19:55:0930 enum AeadAlgorithm {
31 AES_128_CTR_HMAC_SHA256,
32 AES_256_GCM,
33 AES_256_GCM_SIV,
34 CHACHA20_POLY1305
35 };
estark03206a12015-04-25 04:52:2536
37 explicit Aead(AeadAlgorithm algorithm);
Adam Langleyf2149732019-08-09 22:23:3338 Aead(const Aead&) = delete;
39 Aead& operator=(const Aead&) = delete;
estark03206a12015-04-25 04:52:2540 ~Aead();
41
Adam Langleyf2149732019-08-09 22:23:3342 // 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.
estark03206a12015-04-25 04:52:2548 void Init(const std::string* key);
49
Adam Langleyf2149732019-08-09 22:23:3350 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
David Benjamincda45eb2017-11-06 18:16:5254 bool Seal(base::StringPiece plaintext,
55 base::StringPiece nonce,
56 base::StringPiece additional_data,
estark03206a12015-04-25 04:52:2557 std::string* ciphertext) const;
58
Anton Bikineeva3f961db2021-05-15 17:56:1259 absl::optional<std::vector<uint8_t>> Open(
Adam Langleyf2149732019-08-09 22:23:3360 base::span<const uint8_t> ciphertext,
61 base::span<const uint8_t> nonce,
62 base::span<const uint8_t> additional_data) const;
63
David Benjamincda45eb2017-11-06 18:16:5264 bool Open(base::StringPiece ciphertext,
65 base::StringPiece nonce,
66 base::StringPiece additional_data,
estark03206a12015-04-25 04:52:2567 std::string* plaintext) const;
68
69 size_t KeyLength() const;
70
71 size_t NonceLength() const;
72
73 private:
Adam Langleyf2149732019-08-09 22:23:3374 bool Seal(base::span<const uint8_t> plaintext,
75 base::span<const uint8_t> nonce,
76 base::span<const uint8_t> additional_data,
77 uint8_t* out,
78 size_t* output_length,
79 size_t max_output_length) const;
80
81 bool Open(base::span<const uint8_t> ciphertext,
82 base::span<const uint8_t> nonce,
83 base::span<const uint8_t> additional_data,
84 uint8_t* out,
85 size_t* output_length,
86 size_t max_output_length) const;
87
Anton Bikineeva3f961db2021-05-15 17:56:1288 absl::optional<base::span<const uint8_t>> key_;
Keishi Hattori0e45c022021-11-27 09:25:5289 raw_ptr<const evp_aead_st> aead_;
estark03206a12015-04-25 04:52:2590};
91
92} // namespace crypto
93
davidben6004dc52017-02-03 04:15:2994#endif // CRYPTO_AEAD_H_