1 /** 2 * \file ctr.h 3 * 4 * \brief This file contains common functionality for counter algorithms. 5 * 6 * Copyright The Mbed TLS Contributors 7 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 8 */ 9 10 #ifndef MBEDTLS_CTR_H 11 #define MBEDTLS_CTR_H 12 13 #include "common.h" 14 15 /** 16 * \brief Increment a big-endian 16-byte value. 17 * This is quite performance-sensitive for AES-CTR and CTR-DRBG. 18 * 19 * \param n A 16-byte value to be incremented. 20 */ mbedtls_ctr_increment_counter(uint8_t n[16])21static inline void mbedtls_ctr_increment_counter(uint8_t n[16]) 22 { 23 // The 32-bit version seems to perform about the same as a 64-bit version 24 // on 64-bit architectures, so no need to define a 64-bit version. 25 for (int i = 3;; i--) { 26 uint32_t x = MBEDTLS_GET_UINT32_BE(n, i << 2); 27 x += 1; 28 MBEDTLS_PUT_UINT32_BE(x, n, i << 2); 29 if (x != 0 || i == 0) { 30 break; 31 } 32 } 33 } 34 35 #endif /* MBEDTLS_CTR_H */ 36