1 // Copyright 2024 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 #include "crypto/aes_ctr.h"
6
7 #include <vector>
8
9 #include "base/containers/span.h"
10 #include "third_party/boringssl/src/include/openssl/aes.h"
11
12 namespace crypto::aes_ctr {
13
14 namespace {
15
DoCTR(base::span<const uint8_t> key,base::span<const uint8_t,kCounterSize> counter,base::span<const uint8_t> in,base::span<uint8_t> out)16 void DoCTR(base::span<const uint8_t> key,
17 base::span<const uint8_t, kCounterSize> counter,
18 base::span<const uint8_t> in,
19 base::span<uint8_t> out) {
20 AES_KEY aes_key;
21 CHECK_EQ(AES_set_encrypt_key(key.data(), key.size() * 8, &aes_key), 0);
22
23 std::array<uint8_t, kCounterSize> ignored_counter_copy;
24 std::array<uint8_t, AES_BLOCK_SIZE> ignored_out_ctr;
25 unsigned int ignored_offset = 0;
26
27 base::span(ignored_counter_copy).copy_from(counter);
28
29 AES_ctr128_encrypt(in.data(), out.data(), in.size(), &aes_key,
30 ignored_counter_copy.data(), ignored_out_ctr.data(),
31 &ignored_offset);
32 }
33
34 } // namespace
35
Encrypt(base::span<const uint8_t> key,base::span<const uint8_t,kCounterSize> counter,base::span<const uint8_t> in,base::span<uint8_t> out)36 void Encrypt(base::span<const uint8_t> key,
37 base::span<const uint8_t, kCounterSize> counter,
38 base::span<const uint8_t> in,
39 base::span<uint8_t> out) {
40 DoCTR(key, counter, in, out);
41 }
42
Decrypt(base::span<const uint8_t> key,base::span<const uint8_t,kCounterSize> counter,base::span<const uint8_t> in,base::span<uint8_t> out)43 void Decrypt(base::span<const uint8_t> key,
44 base::span<const uint8_t, kCounterSize> counter,
45 base::span<const uint8_t> in,
46 base::span<uint8_t> out) {
47 DoCTR(key, counter, in, out);
48 }
49
Encrypt(base::span<const uint8_t> key,base::span<const uint8_t,kCounterSize> counter,base::span<const uint8_t> in)50 std::vector<uint8_t> Encrypt(base::span<const uint8_t> key,
51 base::span<const uint8_t, kCounterSize> counter,
52 base::span<const uint8_t> in) {
53 std::vector<uint8_t> out(in.size());
54 Encrypt(key, counter, in, out);
55 return out;
56 }
57
Decrypt(base::span<const uint8_t> key,base::span<const uint8_t,kCounterSize> counter,base::span<const uint8_t> in)58 std::vector<uint8_t> Decrypt(base::span<const uint8_t> key,
59 base::span<const uint8_t, kCounterSize> counter,
60 base::span<const uint8_t> in) {
61 std::vector<uint8_t> out(in.size());
62 Decrypt(key, counter, in, out);
63 return out;
64 }
65
66 } // namespace crypto::aes_ctr
67