Merge pull request #747 from libtom/pr/wycheproof-padding_depad

padding_depad - reject zero-length input (except for LTC_PAD_ZERO)
This commit is contained in:
Steffen Jaeckel 2026-04-30 11:42:08 +02:00 committed by GitHub
commit 45f95768da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 31 additions and 0 deletions

View file

@ -27,6 +27,13 @@ int padding_depad(const unsigned char *data, unsigned long *length, unsigned lon
type = mode & LTC_PAD_MASK;
/* LTC_PAD_ZERO is the only mode where padding_pad() can produce a 0-byte output.
Every other mode always emits at least one padding byte, so a 0-byte buffer is malformed.
*/
if (padded_length == 0 && type != LTC_PAD_ZERO) {
return CRYPT_INVALID_PACKET;
}
if (type < LTC_PAD_ONE_AND_ZERO) {
pad = data[padded_length - 1];

View file

@ -215,6 +215,30 @@ int padding_test(void)
SHOULD_FAIL(padding_depad(data, &len, (LTC_PAD_PKCS7 | 16)));
}
/* zero-length input must be rejected for every mode except LTC_PAD_ZERO */
{
const unsigned long modes[] = {
LTC_PAD_PKCS7 | 16,
#ifdef LTC_RNG_GET_BYTES
LTC_PAD_ISO_10126 | 16,
#endif
LTC_PAD_ANSI_X923 | 16,
LTC_PAD_SSH | 16,
LTC_PAD_ONE_AND_ZERO | 16,
LTC_PAD_ZERO_ALWAYS | 16,
};
unsigned char dummy = 0;
unsigned long zlen, j;
for (j = 0; j < LTC_ARRAY_SIZE(modes); ++j) {
zlen = 0;
SHOULD_FAIL(padding_depad(&dummy, &zlen, modes[j]));
}
/* LTC_PAD_ZERO with len=0 must round-trip to len=0 (CRYPT_OK). */
zlen = 0;
DO(padding_depad(&dummy, &zlen, LTC_PAD_ZERO | 16));
DO(EQ(zlen, 0));
}
return CRYPT_OK;
}
#endif