• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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