|
|
Message-ID: <20120613125839.GB163@brightrain.aerifal.cx>
Date: Wed, 13 Jun 2012 08:58:39 -0400
From: Rich Felker <dalias@...ifal.cx>
To: musl@...ts.openwall.com
Subject: Re: FreeSec crypt()
On Wed, Jun 13, 2012 at 08:10:32AM +0200, Szabolcs Nagy wrote:
> > char *
> > _crypt_extended_r(const char *key, const char *setting, char *output)
> > {
> ....
> > while (q - (u_char *) keybuf < sizeof(keybuf)) {
> > *q++ = *key << 1;
>
> implementation-defined signed shift
Undefined. Right shifts are implementation-defined. Left-shifts are
defined only for positive operands that don't overflow.
Note that even if the behavior were defined, this code seems to have
different behavior for high bytes depending on the signedness of char.
That looks like a major bug; I thought that bug in crypt
implementations was fixed years ago.
> > for (i = 1, count = 0; i < 5; i++) {
> > int value = ascii_to_bin(setting[i]);
> > if (ascii64[value] != setting[i])
> > return NULL;
> > count |= value << (i - 1) * 6;
> > }
>
> signed shift (harmless)
Yes this one seems to be harmless unless it can overflow, and from the
loop bounds it seems impossible to overflow.
> > while (q - (u_char *) keybuf < sizeof(keybuf) && *key)
> > *q++ ^= *key++ << 1;
>
> signed shift
This one looks like it has the same bug as the first.
Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.