Remove the ASN.1 decoder tag/length cache (TLC).
authorjsing <jsing@openbsd.org>
Wed, 27 Apr 2022 17:28:34 +0000 (17:28 +0000)
committerjsing <jsing@openbsd.org>
Wed, 27 Apr 2022 17:28:34 +0000 (17:28 +0000)
commitf7b0214c21e39d8dbbb49d8b1f8a189ed892ad93
tree5f734c7ff7d30c22bc5c678357b80883af75a971
parent1ad7d38c3c1822c1626f6692b9a1a73c452e29f4
Remove the ASN.1 decoder tag/length cache (TLC).

Currently, every time an ASN.1 identifier and length is decoded it is
stored in a tag/length cache for potential reuse. However, the only time
this is actually of benefit is when decoding CHOICE or SEQUENCE with
OPTIONAL fields (or MSTRING and ANY due to less than ideal
implementation). For CHOICE and SEQUENCE with OPTIONAL fields the
current code attempts to decode the first option and if that fails, it
moves onto the next option and attempts to decode it, repeating until
it succeeds (or runs out of options).

There are a number of problems with the cache. Firstly, it adds complexity
to the ASN.1 decoder since it has to be passed up and down through the
various layers. Secondly, there is nothing that keeps the cached data in
synchronisation with the input stream. This makes it fragile and a
potential security risk. Thirdly, the type is in the public headers and
API, meaning that we cannot readily change the types or fields to improve
the code.

Testing also suggests that in typical decoding cases we actually get a
small performance increase by removing the cache. There are also several
other options that would improve decoding performance, which we can visit
once we have simpler and more robust code.

ok beck@ inoguchi@ tb@
lib/libcrypto/asn1/tasn_dec.c