From 0681744528f395b0263a8bd54ed146412d260a04 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Wed, 8 Apr 2026 23:12:07 +0200 Subject: [PATCH] Call sodium_misuse on ridiculously high base64 input lengths --- src/libsodium/include/sodium/utils.h | 17 ++++++++++++----- src/libsodium/sodium/codecs.c | 6 ++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/libsodium/include/sodium/utils.h b/src/libsodium/include/sodium/utils.h index e3c34800..626d4bd7 100644 --- a/src/libsodium/include/sodium/utils.h +++ b/src/libsodium/include/sodium/utils.h @@ -2,7 +2,9 @@ #ifndef sodium_utils_H #define sodium_utils_H +#include #include +#include #include "export.h" @@ -74,11 +76,16 @@ int sodium_hex2bin(unsigned char *const bin, const size_t bin_maxlen, const char * Computes the required length to encode BIN_LEN bytes as a base64 string * using the given variant. The computed length includes a trailing \0. */ -#define sodium_base64_ENCODED_LEN(BIN_LEN, VARIANT) \ - (((BIN_LEN) / 3U) * 4U + \ - ((((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) | (((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) >> 1)) & 1U) * \ - (4U - ((0U - (((VARIANT) & 2U) >> 1)) & (3U - ((BIN_LEN) - ((BIN_LEN) / 3U) * 3U)))) + \ - 1U) +#define sodium_base64_ENCODED_LEN(BIN_LEN, VARIANT) \ + ((BIN_LEN) / 3U > (SIZE_MAX - 5) / 4U \ + ? (size_t)SIZE_MAX \ + : (((BIN_LEN) / 3U) * 4U + \ + ((((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) | \ + (((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) >> 1)) & \ + 1U) * \ + (4U - ((0U - (((VARIANT) & 2U) >> 1)) & \ + (3U - ((BIN_LEN) - ((BIN_LEN) / 3U) * 3U)))) + \ + 1U)) SODIUM_EXPORT size_t sodium_base64_encoded_len(const size_t bin_len, const int variant); diff --git a/src/libsodium/sodium/codecs.c b/src/libsodium/sodium/codecs.c index f37f0e90..6a65244c 100644 --- a/src/libsodium/sodium/codecs.c +++ b/src/libsodium/sodium/codecs.c @@ -175,6 +175,9 @@ sodium_base64_encoded_len(const size_t bin_len, const int variant) { sodium_base64_check_variant(variant); + if (bin_len / 3 > (SIZE_MAX - 5) / 4) { + sodium_misuse(); /* LCOV_EXCL_LINE */ + } return sodium_base64_ENCODED_LEN(bin_len, variant); } @@ -193,6 +196,9 @@ sodium_bin2base64(char * const b64, const size_t b64_maxlen, sodium_base64_check_variant(variant); nibbles = bin_len / 3; + if (nibbles > (SIZE_MAX - 5) / 4) { + sodium_misuse(); /* LCOV_EXCL_LINE */ + } remainder = bin_len - 3 * nibbles; b64_len = nibbles * 4; if (remainder != 0) {