Use ((x + 7) >> 3) instead of (x >> 3) when converting from bits to bytes.
commit7b2d10700fb0844fbe9aa7c030b09467cf173936
authorAlexander Færøy <ahf@torproject.org>
Sat, 16 May 2020 19:18:56 +0000 (16 19:18 +0000)
committerNick Mathewson <nickm@torproject.org>
Mon, 6 Jul 2020 20:19:16 +0000 (6 16:19 -0400)
tree34c83c54a3dfaffaafefd2c260bb040c1ec2426a
parent06f1e959c218bfbe0b85bbd0acc59b8f408fbc99
Use ((x + 7) >> 3) instead of (x >> 3) when converting from bits to bytes.

This patch changes our bits-to-bytes conversion logic in the NSS
implementation of `tor_tls_cert_matches_key()` from using (x >> 3) to
((x + 7) >> 3) since DER bit-strings are allowed to contain a number of
bits that is not a multiple of 8.

Additionally, we add a comment on why we cannot use the
`DER_ConvertBitString()` macro from NSS, as we would potentially apply
the bits-to-bytes conversion logic twice, which would lead to an
insignificant amount of bytes being compared in
`SECITEM_ItemsAreEqual()` and thus turn the logic into being a
prefix match instead of a full match.

The `DER_ConvertBitString()` macro is defined in NSS as:

    /*
    ** Macro to convert der decoded bit string into a decoded octet
    ** string. All it needs to do is fiddle with the length code.
    */
    #define DER_ConvertBitString(item)            \
        {                                         \
            (item)->len = ((item)->len + 7) >> 3; \
        }

Thanks to Taylor Yu for spotting this problem.

This patch is part of the fix for TROVE-2020-001.

See: https://bugs.torproject.org/33119
src/lib/tls/tortls_nss.c