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 #ifndef CRYPTO_AES_CTR_H_ 6 #define CRYPTO_AES_CTR_H_ 7 8 #include <vector> 9 10 #include "base/containers/span.h" 11 #include "crypto/crypto_export.h" 12 13 namespace crypto::aes_ctr { 14 15 inline constexpr size_t kCounterSize = 16; 16 17 // Single-shot encryption and decryption operations. These require that the 18 // output span be the same size as the input span, cannot fail, and do not 19 // handle incrementing the counter for you. These can either operate in-place 20 // (meaning in == out) or on entirely disjoint in and out buffers, but *not* on 21 // overlapping-but-unequal in and out buffers. 22 // 23 // Crypto note: It is VERY UNSAFE to encrypt two different messages using the 24 // same key and counter in this mode - you will leak the key stream and 25 // thereafter both plaintexts. 26 // 27 // Note: in theory it would be nicer to have a proper stateful API for this, but 28 // in practive every client of raw CTR encryption in Chromium does single-shot 29 // operations and throws away the counter value afterwards, so such complexity 30 // would be wasted. 31 32 CRYPTO_EXPORT void Encrypt(base::span<const uint8_t> key, 33 base::span<const uint8_t, kCounterSize> counter, 34 base::span<const uint8_t> in, 35 base::span<uint8_t> out); 36 37 CRYPTO_EXPORT void Decrypt(base::span<const uint8_t> key, 38 base::span<const uint8_t, kCounterSize> counter, 39 base::span<const uint8_t> in, 40 base::span<uint8_t> out); 41 42 // If it's more convenient, there are also wrappers that allocate a byte vector 43 // for the result for you: 44 45 CRYPTO_EXPORT std::vector<uint8_t> Encrypt( 46 base::span<const uint8_t> key, 47 base::span<const uint8_t, kCounterSize> iv, 48 base::span<const uint8_t> in); 49 50 CRYPTO_EXPORT std::vector<uint8_t> Decrypt( 51 base::span<const uint8_t> key, 52 base::span<const uint8_t, kCounterSize> iv, 53 base::span<const uint8_t> in); 54 55 } // namespace crypto::aes_ctr 56 57 #endif // CRYPTO_AES_CTR_H_ 58