/* * Message Processing Stack, Reader implementation * * Copyright The Mbed TLS Contributors * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ #include "common.h" #if defined(MBEDTLS_SSL_PROTO_TLS1_3) #include "mps_reader.h" #include "mps_common.h" #include "mps_trace.h" #include <string.h> #if defined(MBEDTLS_MPS_ENABLE_TRACE) static int mbedtls_mps_trace_id = MBEDTLS_MPS_TRACE_BIT_READER; #endif /* MBEDTLS_MPS_ENABLE_TRACE */ /* * GENERAL NOTE ON CODING STYLE * * The following code intentionally separates memory loads * and stores from other operations (arithmetic or branches). * This leads to the introduction of many local variables * and significantly increases the C-code line count, but * should not increase the size of generated assembly. * * The reason for this is twofold: * (1) It will ease verification efforts using the VST * (Verified Software Toolchain) * whose program logic cannot directly reason * about instructions containing a load or store in * addition to other operations (e.g. *p = *q or * tmp = *p + 42). * (2) Operating on local variables and writing the results * back to the target contexts on success only * allows to maintain structure invariants even * on failure - this in turn has two benefits: * (2.a) If for some reason an error code is not caught * and operation continues, functions are nonetheless * called with sane contexts, reducing the risk * of dangerous behavior. * (2.b) Randomized testing is easier if structures * remain intact even in the face of failing * and/or non-sensical calls. * Moreover, it might even reduce code-size because * the compiler need not write back temporary results * to memory in case of failure. * */ static inline int mps_reader_is_accumulating( mbedtls_mps_reader const *rd) { … } static inline int mps_reader_is_producing( mbedtls_mps_reader const *rd) { … } static inline int mps_reader_is_consuming( mbedtls_mps_reader const *rd) { … } static inline mbedtls_mps_size_t mps_reader_get_fragment_offset( mbedtls_mps_reader const *rd) { … } static inline mbedtls_mps_size_t mps_reader_serving_from_accumulator( mbedtls_mps_reader const *rd) { … } static inline void mps_reader_zero(mbedtls_mps_reader *rd) { … } int mbedtls_mps_reader_init(mbedtls_mps_reader *rd, unsigned char *acc, mbedtls_mps_size_t acc_len) { … } int mbedtls_mps_reader_free(mbedtls_mps_reader *rd) { … } int mbedtls_mps_reader_feed(mbedtls_mps_reader *rd, unsigned char *new_frag, mbedtls_mps_size_t new_frag_len) { … } int mbedtls_mps_reader_get(mbedtls_mps_reader *rd, mbedtls_mps_size_t desired, unsigned char **buffer, mbedtls_mps_size_t *buflen) { … } int mbedtls_mps_reader_commit(mbedtls_mps_reader *rd) { … } int mbedtls_mps_reader_reclaim(mbedtls_mps_reader *rd, int *paused) { … } #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */