| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| #ifndef OPENTITAN_SW_DEVICE_LIB_BASE_HARDENED_MEMORY_H_ | |
| #define OPENTITAN_SW_DEVICE_LIB_BASE_HARDENED_MEMORY_H_ | |
| /** | |
| * @file | |
| * @brief Hardened memory operations for constant power buffer manipulation. | |
| */ | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| #include "sw/device/lib/base/hardened.h" | |
| #include "sw/device/lib/base/macros.h" | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif // __cplusplus | |
| /** | |
| * Copies 32-bit words between non-overlapping regions. | |
| * | |
| * Unlike `memcpy()`, this function has important differences: | |
| * - It is significantly slower, since it mitigates power-analysis attacks. | |
| * - It performs operations on 32-bit words, rather than bytes. | |
| * - It returns void. | |
| * | |
| * Input pointers *MUST* be 32-bit aligned, although they do not need to | |
| * actually point to memory declared as `uint32_t` per the C aliasing rules. | |
| * Internally, this function is careful to not dereference its operands | |
| * directly, and instead uses dedicated load/store intrinsics. | |
| * | |
| * @param dest The destination of the copy. | |
| * @param src The source of the copy. | |
| * @param word_len The number of words to copy. | |
| */ | |
| void hardened_memcpy(uint32_t *OT_RESTRICT dest, | |
| const uint32_t *OT_RESTRICT src, size_t word_len); | |
| /** | |
| * Fills a 32-bit aligned region of memory with random data. | |
| * | |
| * Unlike `memset()`, this function has important differences: | |
| * - It is significantly slower, since it mitigates power-analysis attacks. | |
| * - It performs operations on 32-bit words, rather than bytes. | |
| * - A fill value cannot be specified. | |
| * - It returns void. | |
| * | |
| * Input pointers *MUST* be 32-bit aligned, although they do not need to | |
| * actually point to memory declared as `uint32_t` per the C aliasing rules. | |
| * Internally, this function is careful to not dereference its operands | |
| * directly, and instead uses dedicated load/store intrinsics. | |
| * | |
| * @param dest The destination of the set. | |
| * @param word_len The number of words to write. | |
| */ | |
| void hardened_memshred(uint32_t *dest, size_t word_len); | |
| /** | |
| * Compare two potentially-overlapping 32-bit aligned regions of memory for | |
| * equality. | |
| * | |
| * Unlike `memcmp()`, this function has important differences: | |
| * - It is significantly slower, since it mitigates power-analysis attacks. | |
| * - It performs operations on 32-bit words, rather than bytes. | |
| * - It only computes equality, not lexicographic ordering, which would be even | |
| * slower. | |
| * - It returns a `hardened_bool_t`. | |
| * - It is constant-time. | |
| * | |
| * Input pointers *MUST* be 32-bit aligned, although they do not need to | |
| * actually point to memory declared as `uint32_t` per the C aliasing rules. | |
| * Internally, this function is careful to not dereference its operands | |
| * directly, and instead uses dedicated load/store intrinsics. | |
| * | |
| * @param lhs The first buffer to compare. | |
| * @param rhs The second buffer to compare. | |
| * @param word_len The number of words to write. | |
| */ | |
| hardened_bool_t hardened_memeq(const uint32_t *lhs, const uint32_t *rhs, | |
| size_t word_len); | |
| #ifdef __cplusplus | |
| } // extern "C" | |
| #endif // __cplusplus | |
| #endif // OPENTITAN_SW_DEVICE_LIB_BASE_HARDENED_MEMORY_H_ |