Rework DSA_size() and ECDSA_size()
authortb <tb@openbsd.org>
Wed, 31 Aug 2022 13:01:01 +0000 (13:01 +0000)
committertb <tb@openbsd.org>
Wed, 31 Aug 2022 13:01:01 +0000 (13:01 +0000)
commit135ec00f7d18dc23768b653aa1275b39b2d030c5
tree55835014b4c2c57bf68139d2097cba4bb22ddcb7
parent9c9e7ec38962d0d6787239e41321829fe4a21056
Rework DSA_size() and ECDSA_size()

DSA_size() and ECDSA_size() have a very special hack. They fudge up an
ASN1_INTEGER with a size which is typically > 100 bytes, backed by a
buffer of size 4. This was "fine", however, since they set buf[0] = 0xff,
where the craziness that was i2c_ASN1_INTEGER() only looks at the first
octet (one may then ask why a buffer of size 4 was necessary...).

This changed with the rewrite of i2c_ASN1_INTEGER(), which doesn't
respect this particular hack and rightly assumes that it is fed an
actual ASN1_INTEGER...

Instead, create an appropriate signature and use i2d to determine its
size.

Fixes an out-of-bounds read flagged by ASAN and oss-fuzz.

ok jsing
lib/libcrypto/dsa/dsa_lib.c
lib/libcrypto/ecdsa/ecs_lib.c