des_setparity() cuts keysize to 48 bits; how much do we care?
Florian Weimer
fweimer@redhat.com
Sat May 19 21:16:00 GMT 2018
On 05/19/2018 10:56 PM, Zack Weinberg wrote:
> des_setparity() is documented to fix up a packed DES key so that each
> byte has odd parity, as required by the DES specification. The manual
> doesn't do a very good job explaining how it does that, and when I
> went to look at the source code to find out more details, I discovered
> this:
>
> /*
> * Table giving odd parity in the low bit for ASCII characters
> */
> static const char partab[128] =
> { 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x07, 0x07,
> ... };
>
> void
> des_setparity (char *p)
> {
> int i;
>
> for (i = 0; i < 8; i++)
> {
> *p = partab[*p & 0x7f];
> p++;
> }
> }
>
> So it overwrites the low bit of each byte as necessary to make each
> byte have odd parity, as documented, but it also forces the *high* bit
> of each byte to be zero, which cuts the keyspace down even further - a
> DES key that's passed through des_setparity() has only 48 bits of
> entropy.
I would have understood 40 bit, but 48 bit looks like a bug.
I found this:
Patch-ID# T104620-01 (Preliminary Patch - Not Yet Released)
Keywords: security des_setparity DES RPC
Synopsis: SunOS 5.4: POINT PATCH: 1149767 - des_setparity() fix
SunOS release: 5.4
Relevant Architectures: sparc
BugId's fixed with this patch: 1149767
Apparently, this was when des_setparity_g was introduced. des_setparity
was not changed. So I don't think there is anything left to do. I'm
not even sure if these functions should still be documented in the manual.
libtirpc supports RPCSEC_GSS, and I think that's the de-facto successor
for RPC with cryptography.
Thanks,
Florian
More information about the Libc-alpha
mailing list