Limit OID text conversion to 64 bits per arc.
authorjsing <jsing@openbsd.org>
Sat, 12 Feb 2022 03:01:59 +0000 (03:01 +0000)
committerjsing <jsing@openbsd.org>
Sat, 12 Feb 2022 03:01:59 +0000 (03:01 +0000)
commite0f0c337b4a2134b520e66e1eed7b899d07ebae9
treea46ef348309313dd823432beec870acfc2032a4b
parentb92d1435fff2c7279bde78ccaab6581664ce630e
Limit OID text conversion to 64 bits per arc.

The current implementation uses an unsigned long, then switches to BN once
the arc exceeds its size. However, the complexity of BN_bn2dec() is
quadratic in the length of number being converted. This means that OIDs
with excessively large arcs take a lot of computation to convert to text.

While the X.660 specification states that arcs are unbounded, in reality
they are not overly large numbers - 640K^W64 bits ought to be enough for
any arc. Remove BN entirely, switch from unsigned long to uin64_t and fail
if an arc exceeds this size.

Identified via oss-fuzz timeouts - should fix #41028 and #44372.

ok tb@
lib/libcrypto/objects/obj_dat.c