Fix overread when decoding X509KeyUsage extension on Windows
authorJeremy Barton <jbarton@microsoft.com>
Mon, 24 Jun 2019 17:44:37 +0000 (10:44 -0700)
committerGitHub <noreply@github.com>
Mon, 24 Jun 2019 17:44:37 +0000 (10:44 -0700)
commit2ce1f9b33c1476ed9e76f98c1f8ff5570d90f7db
treefab7d683538ddc8f3aeb88ca10934de6e17a6aa3
parent0d25902aa678c10fa735d149e9edf9fd461f594d
Fix overread when decoding X509KeyUsage extension on Windows

CryptDecodeObject on X509_KEY_USAGE always sets cbStructInfo to 32 (or 20 on x86),
reporting 8 bytes (both architectures) more than needed for the CRYPT_BIT_BLOB
structure (0 bytes more than the structure when transporting pbData=NULL).

However, that value is over-representative of the number of bytes actually
written (modified) in this case.  The CRYPT_BIT_BLOB contains a cbData saying
how long the actual payload is (0 (pbData==NULL), 1, or 2 bytes), but
DecodeX509KeyUsageExtension didn't read it, just blindly read the value as a DWORD,
implicitly counting on the zero-init of arrays (and Win32's choice of values
combined with Little Endian layout).

By respecting the decoded cbData value (and not over-reading) the helper no
longer needs to manually clear the stackalloc.

Commit migrated from https://github.com/dotnet/corefx/commit/0a05173f98493547d40b1865808481e76ede1212
src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/Native/Helpers.cs
src/libraries/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Windows/X509Pal.CustomExtensions.cs
src/libraries/System.Security.Cryptography.X509Certificates/tests/ExtensionsTests.cs