On 10/23/07 10:34, Jesse Keating wrote:
On Tue, 23 Oct 2007 16:23:24 +0200
Tomas Mraz <tmraz@xxxxxxxxxx> wrote:
Why remove? Just not use a built-in code but call NSS instead.
Call NSS, to make a sha1sum?
Please, let's not add an external dependency for something
as trivial as a SHA1.
See this thread on xorg-devel@ .
-------- Original Message --------
Subject: Re: glyph-pixmaps merged
Date: Sun, 21 Oct 2007 05:11:40 +0200
From: Edgar Toernig <froese@xxxxxx>
To: xorg@xxxxxxxxxxxxxxx
Keith Packard wrote:
We need a strong hash function as this replaces the previous weak hash +
memcmp when checking incoming glyphs for matches with the existing set
of server-resident glyphs. One could argue that this must be
cryptographically secure to avoid applications uploading misleading
glyph images.
Patches to use alternate SHA1 implementation would also be welcome, if
anyone has reason to choose other bits.
Below is a modified sha1 routine. The algorithm has been kept
but support for byte streams and byte-order independence has
been dropped. That simplifies the code and makes it faster.
Compiles to about 700 bytes on x86 and is public domain.
Ciao, ET.
----8<----
#include <sys/types.h>
#include <string.h>
typedef unsigned int u32;
#define f1(x,y,z) (z ^ (x & (y ^ z))) /* x ? y : z */
#define f2(x,y,z) (x ^ y ^ z) /* xor */
#define f3(x,y,z) ((x & y) + (z & (x ^ y))) /* majority */
#define K1 0x5A827999L /* Rounds 0-19: sqrt(2) * 2^30 */
#define K2 0x6ED9EBA1L /* Rounds 20-39: sqrt(3) * 2^30 */
#define K3 0x8F1BBCDCL /* Rounds 40-59: sqrt(5) * 2^30 */
#define K4 0xCA62C1D6L /* Rounds 60-79: sqrt(10) * 2^30 */
static inline u32
rol32(u32 val, int n)
{
return (val << n) | (val >> (32 - n));
}
static void
sha1(u32 digest[5], u32 *W)
{
u32 a, b, c, d, e, t;
int i;
for (i = 0; i < 64; i++)
W[i+16] = rol32(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i], 1);
a = digest[0];
b = digest[1];
c = digest[2];
d = digest[3];
e = digest[4];
for (i = 0; i < 20; i++)
{
t = f1(b, c, d) + K1 + rol32(a, 5) + e + W[i];
e = d; d = c; c = rol32(b, 30); b = a; a = t;
}
for (; i < 40; i++)
{
t = f2(b, c, d) + K2 + rol32(a, 5) + e + W[i];
e = d; d = c; c = rol32(b, 30); b = a; a = t;
}
for (; i < 60; i++)
{
t = f3(b, c, d) + K3 + rol32(a, 5) + e + W[i];
e = d; d = c; c = rol32(b, 30); b = a; a = t;
}
for (; i < 80; i++)
{
t = f2(b, c, d) + K4 + rol32(a, 5) + e + W[i];
e = d; d = c; c = rol32(b, 30); b = a; a = t;
}
digest[0] += a;
digest[1] += b;
digest[2] += c;
digest[3] += d;
digest[4] += e;
}
void
hash_buffer(u32 digest[5], char *buf, size_t n)
{
u32 W[80];
u32 size = n;
digest[0] = 0x67452301;
digest[1] = 0xefcdab89;
digest[2] = 0x98badcfe;
digest[3] = 0x10325476;
digest[4] = 0xc3d2e1f0;
if (n < 64)
memset((char *)W + n, 0, 64 - n);
while (n >= 64)
{
memcpy((char *)W, buf, 64);
sha1(digest, W);
buf += 64;
n -= 64;
}
if (n > 0)
memcpy((char *)W, buf, n);
if (n > 60)
sha1(digest, W);
W[15] = size;
sha1(digest, W);
}
_______________________________________________
xorg mailing list
xorg@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/xorg
--
\___/
|___| Bernardo Innocenti - http://www.codewiz.org/
\___\ One Laptop Per Child - http://www.laptop.org/
--
fedora-devel-list mailing list
fedora-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/fedora-devel-list