24 #include "../crypto/internal.h"
28 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
29 #define FUZZER_MODE true
31 #define FUZZER_MODE false
38 : cipher_(cipher_arg),
40 is_dtls_(is_dtls_arg),
41 variable_nonce_included_in_record_(
false),
42 random_variable_nonce_(
false),
43 xor_fixed_nonce_(
false),
44 omit_length_in_ad_(
false),
45 ad_is_header_(
false) {
52 return MakeUnique<SSLAEADContext>(0 , is_dtls,
62 size_t expected_mac_key_len, expected_fixed_iv_len;
65 &expected_fixed_iv_len,
cipher, protocol_version,
68 expected_fixed_iv_len != fixed_iv.
size() ||
69 expected_mac_key_len != mac_key.
size()) {
75 if (!mac_key.
empty()) {
91 UniquePtr<SSLAEADContext> aead_ctx =
98 assert(aead_ctx->ProtocolVersion() == protocol_version);
101 aead_ctx->ctx_.get(), aead, enc_key.
data(), enc_key.
size(),
108 "variable_nonce_len doesn't fit in uint8_t");
110 if (mac_key.
empty()) {
111 assert(fixed_iv.
size() <=
sizeof(aead_ctx->fixed_nonce_));
113 aead_ctx->fixed_nonce_len_ = fixed_iv.
size();
117 aead_ctx->xor_fixed_nonce_ =
true;
118 aead_ctx->variable_nonce_len_ = 8;
121 assert(fixed_iv.
size() <= aead_ctx->variable_nonce_len_);
122 aead_ctx->variable_nonce_len_ -= fixed_iv.
size();
127 aead_ctx->variable_nonce_included_in_record_ =
true;
133 aead_ctx->xor_fixed_nonce_ =
true;
134 aead_ctx->variable_nonce_len_ = 8;
135 aead_ctx->variable_nonce_included_in_record_ =
false;
136 aead_ctx->ad_is_header_ =
true;
137 assert(fixed_iv.
size() >= aead_ctx->variable_nonce_len_);
141 aead_ctx->variable_nonce_included_in_record_ =
true;
142 aead_ctx->random_variable_nonce_ =
true;
143 aead_ctx->omit_length_in_ad_ =
true;
166 return protocol_version;
190 const size_t extra_in_len)
const {
192 *out_suffix_len = extra_in_len;
200 const size_t extra_in_len)
const {
207 if (len < in_len || len >= 0xffff) {
252 size_t plaintext_len = 0;
265 seqnum, plaintext_len,
header);
269 size_t nonce_len = 0;
306 nonce_len,
in.data(),
in.size(), ad.
data(),
319 size_t in_len,
const uint8_t *extra_in,
320 size_t extra_in_len) {
323 if (!
SuffixLen(&suffix_len, in_len, extra_in_len)) {
347 size_t nonce_len = 0;
391 size_t written_suffix_len;
393 ctx_.get(),
out, out_suffix, &written_suffix_len, suffix_len, nonce,
394 nonce_len,
in, in_len, extra_in, extra_in_len, ad.
data(), ad.
size());
395 assert(!
result || written_suffix_len == suffix_len);
405 if (!
SuffixLen(&suffix_len, in_len, 0)) {
409 if (in_len + prefix_len < in_len ||
410 in_len + prefix_len + suffix_len < in_len + prefix_len) {
414 if (in_len + prefix_len + suffix_len > max_out_len) {
420 record_version, seqnum,
header,
in, in_len, 0, 0)) {
423 *out_len = prefix_len + in_len + suffix_len;