pkgsrc/databases/openldap/patches/patch-libraries_liblutil_sha1.c
adam e08d096a65 openldap: updated to 2.5.7
OpenLDAP 2.5.7 Release (2021/08/18)
	Fixed lloadd client state tracking
	Fixed slapd bconfig to canonicalize structuralObjectclass
	Fixed slapd-ldif duplicate controls response
	Fixed slapd-mdb multival crash when attribute is missing an equality matchingrule
	Fixed slapd-mdb compatibility with OpenLDAP 2.4 MDB databases
	Fixed slapd-mdb idlexp maximum size handling
	Fixed slapd-monitor number of ops executing with asynchronous backends
	Fixed slapd-sql to add support for ppolicy attributes
	Fixed slapd-sql to close transactions after bind and search
	Fixed slapo-accesslog to make reqMod optional
	Fixed slapo-ppolicy logging when pwdChangedTime attribute is not present
	Documentation
		slapd-mdb(5) note max idlexp size is 30, not 31
		slapo-accesslog(5) note that reqMod is optional
		Add ldapvc(1) man page
		Add guide section on load balancer
		Updated guide to document multiprovider as replacement for mirrormode
		Updated guide to clarify slapd-mdb upgrade requirements
		Updated guide to document removal of deprecated options from client tools


OpenLDAP 2.5.6 Release (2021/07/27)
	Fixed libldap buffer overflow
	Fixed libldap missing mutex unlock on connection alloc failure
	Fixed lloadd cn=config olcBkLloadClientMaxPending setting
	Fixed slapd multiple config defaults
	Fixed slapd ipv6 addresses to work with tcp wrappers
	Fixed slapo-syncprov delete of nonexistent sessionlog
	Build
		Fixed library symbol versioning on Solaris
		Fixed compile warning in libldap/tpool.c
		Fixed compile warning in libldap/tls_o.c
	Contrib
		Fixed ppm module for sysconfdir
	Documentation
		Updated guide to document multival, idlexp, and maxentrysize

OpenLDAP 2.5.5 Release (2021/06/03)
	Added libldap LDAP_OPT_TCP_USER_TIMEOUT support
	Added lloadd tcp-user-timeout support
	Added slapd-asyncmeta tcp-user-timeout support
	Added slapd-ldap tcp-user-timeout support
	Added slapd-meta tcp-user-timeout support
	Fixed incorrect control OIDs for AuthZ Identity
	Fixed libldap typo in util-int.c
	Fixed libldap double free of LDAP_OPT_DEFBASE
	Fixed libldap better TLS1.3 cipher suite handling
	Fixed lloadd multiple issues
	Fixed slapd slap_op_time to avoid duplicates across restarts
	Fixed slapd typo in daemon.c
	Fixed slapd slapi compilation
	Fixed slapd to handle empty DN in extended filters
	Fixed slapd syncrepl searches with empty base
	Fixed slapd syncrepl refresh on startup
	Fixed slapd abort due to typo
	Fixed slapd-asyncmeta quarantine handling
	Fixed slapd-asyncmeta to have a default operations timeout
	Fixed slapd-ldap quarantine handling
	Fixed slapd-mdb deletion of context entry
	Fixed slapd-mdb off-by-one affecting search scope
	Fixed slapd-meta quarantine handling
	Fixed slapo-accesslog to record reqNewDN for modRDN ops
	Fixed slapo-pcache locking during expiration
	Build
		Fixed slappw-argon2 module installation
	Contrib
		Update ldapc++/ldaptcl to use configure.ac
	Documentation
		ldap_first_attribute(3) - Document ldap_get_attribute_ber
        ldap_modify(3) - Delete non-existent mod_next parameter

OpenLDAP 2.5.4 Release (2021/04/29)
	Initial release for "general use".
2021-08-23 09:58:57 +00:00

156 lines
5.7 KiB
C

$NetBSD: patch-libraries_liblutil_sha1.c,v 1.1 2021/08/23 09:58:58 adam Exp $
--- libraries/liblutil/sha1.c.orig 2021-07-27 17:44:47.000000000 +0000
+++ libraries/liblutil/sha1.c
@@ -50,10 +50,16 @@
#define SHA1HANDSOFF /* Copies data before messing with it. */
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
+#if defined(__sparcv9) && \
+ ((__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 3))
+# define SPARC64_GCC_BUG
+#endif
+
/*
* blk0() and blk() perform the initial expand.
* I got the idea of expanding during the round function from SSLeay
*/
+#ifndef SPARC64_GCC_BUG
#if BYTE_ORDER == LITTLE_ENDIAN
# define blk0(i) (block[i] = (rol(block[i],24)&0xFF00FF00) \
|(rol(block[i],8)&0x00FF00FF))
@@ -62,6 +68,16 @@
#endif
#define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15] \
^block[(i+2)&15]^block[i&15],1))
+#else
+#if BYTE_ORDER == LITTLE_ENDIAN
+# define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \
+ |(rol(block->l[i],8)&0x00FF00FF))
+#else
+# define blk0(i) block->l[i]
+#endif
+#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
+ ^block->l[(i+2)&15]^block->l[i&15],1))
+#endif /* !SPARC64_GCC_BUG */
/*
* (R0+R1), R2, R3, R4 are the different operations (rounds) used in SHA1
@@ -72,6 +88,68 @@
#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
+#ifdef SPARC64_GCC_BUG
+typedef union {
+ u_char c[64];
+ uint32 l[16];
+} CHAR64LONG16;
+
+void do_R01(uint32 *a, uint32 *b, uint32 *c, uint32 *d, uint32 *e, CHAR64LONG16
+*);
+void do_R2(uint32 *a, uint32 *b, uint32 *c, uint32 *d, uint32 *e, CHAR64LONG16
+*);
+void do_R3(uint32 *a, uint32 *b, uint32 *c, uint32 *d, uint32 *e, CHAR64LONG16
+*);
+void do_R4(uint32 *a, uint32 *b, uint32 *c, uint32 *d, uint32 *e, CHAR64LONG16
+*);
+
+#define nR0(v,w,x,y,z,i) R0(*v,*w,*x,*y,*z,i)
+#define nR1(v,w,x,y,z,i) R1(*v,*w,*x,*y,*z,i)
+#define nR2(v,w,x,y,z,i) R2(*v,*w,*x,*y,*z,i)
+#define nR3(v,w,x,y,z,i) R3(*v,*w,*x,*y,*z,i)
+#define nR4(v,w,x,y,z,i) R4(*v,*w,*x,*y,*z,i)
+
+void
+do_R01(uint32 *a, uint32 *b, uint32 *c, uint32 *d, uint32 *e, CHAR64LONG16 *block)
+{
+ nR0(a,b,c,d,e, 0); nR0(e,a,b,c,d, 1); nR0(d,e,a,b,c, 2); nR0(c,d,e,a,b, 3);
+ nR0(b,c,d,e,a, 4); nR0(a,b,c,d,e, 5); nR0(e,a,b,c,d, 6); nR0(d,e,a,b,c, 7);
+ nR0(c,d,e,a,b, 8); nR0(b,c,d,e,a, 9); nR0(a,b,c,d,e,10); nR0(e,a,b,c,d,11);
+ nR0(d,e,a,b,c,12); nR0(c,d,e,a,b,13); nR0(b,c,d,e,a,14); nR0(a,b,c,d,e,15);
+ nR1(e,a,b,c,d,16); nR1(d,e,a,b,c,17); nR1(c,d,e,a,b,18); nR1(b,c,d,e,a,19);
+}
+
+void
+do_R2(uint32 *a, uint32 *b, uint32 *c, uint32 *d, uint32 *e, CHAR64LONG16 *block)
+{
+ nR2(a,b,c,d,e,20); nR2(e,a,b,c,d,21); nR2(d,e,a,b,c,22); nR2(c,d,e,a,b,23);
+ nR2(b,c,d,e,a,24); nR2(a,b,c,d,e,25); nR2(e,a,b,c,d,26); nR2(d,e,a,b,c,27);
+ nR2(c,d,e,a,b,28); nR2(b,c,d,e,a,29); nR2(a,b,c,d,e,30); nR2(e,a,b,c,d,31);
+ nR2(d,e,a,b,c,32); nR2(c,d,e,a,b,33); nR2(b,c,d,e,a,34); nR2(a,b,c,d,e,35);
+ nR2(e,a,b,c,d,36); nR2(d,e,a,b,c,37); nR2(c,d,e,a,b,38); nR2(b,c,d,e,a,39);
+}
+
+void
+do_R3(uint32 *a, uint32 *b, uint32 *c, uint32 *d, uint32 *e, CHAR64LONG16 *block)
+{
+ nR3(a,b,c,d,e,40); nR3(e,a,b,c,d,41); nR3(d,e,a,b,c,42); nR3(c,d,e,a,b,43);
+ nR3(b,c,d,e,a,44); nR3(a,b,c,d,e,45); nR3(e,a,b,c,d,46); nR3(d,e,a,b,c,47);
+ nR3(c,d,e,a,b,48); nR3(b,c,d,e,a,49); nR3(a,b,c,d,e,50); nR3(e,a,b,c,d,51);
+ nR3(d,e,a,b,c,52); nR3(c,d,e,a,b,53); nR3(b,c,d,e,a,54); nR3(a,b,c,d,e,55);
+ nR3(e,a,b,c,d,56); nR3(d,e,a,b,c,57); nR3(c,d,e,a,b,58); nR3(b,c,d,e,a,59);
+}
+
+void
+do_R4(uint32 *a, uint32 *b, uint32 *c, uint32 *d, uint32 *e, CHAR64LONG16 *block)
+{
+ nR4(a,b,c,d,e,60); nR4(e,a,b,c,d,61); nR4(d,e,a,b,c,62); nR4(c,d,e,a,b,63);
+ nR4(b,c,d,e,a,64); nR4(a,b,c,d,e,65); nR4(e,a,b,c,d,66); nR4(d,e,a,b,c,67);
+ nR4(c,d,e,a,b,68); nR4(b,c,d,e,a,69); nR4(a,b,c,d,e,70); nR4(e,a,b,c,d,71);
+ nR4(d,e,a,b,c,72); nR4(c,d,e,a,b,73); nR4(b,c,d,e,a,74); nR4(a,b,c,d,e,75);
+ nR4(e,a,b,c,d,76); nR4(d,e,a,b,c,77); nR4(c,d,e,a,b,78); nR4(b,c,d,e,a,79);
+}
+#endif /* SPARC64_GCC_BUG */
+
/*
* Hash a single 512-bit block. This is the core of the algorithm.
@@ -80,13 +158,26 @@ void
lutil_SHA1Transform( uint32 *state, const unsigned char *buffer )
{
uint32 a, b, c, d, e;
+#ifdef SPARC64_GCC_BUG
+ CHAR64LONG16 *block;
+#endif
+#ifndef SPARC64_GCC_BUG
#ifdef SHA1HANDSOFF
uint32 block[16];
(void)AC_MEMCPY(block, buffer, 64);
#else
uint32 *block = (u_int32 *) buffer;
#endif
+#else
+#ifdef SHA1HANDSOFF
+ CHAR64LONG16 workspace;
+ block = &workspace;
+ (void)AC_MEMCPY(block, buffer, 64);
+#else
+ block = (CHAR64LONG16 *) (void *) buffer;
+#endif
+#endif /* !SPARC64_GCC_BUG */
/* Copy context->state[] to working vars */
a = state[0];
@@ -95,6 +186,7 @@ lutil_SHA1Transform( uint32 *state, cons
d = state[3];
e = state[4];
+#ifndef SPARC64_GCC_BUG
/* 4 rounds of 20 operations each. Loop unrolled. */
R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
@@ -116,6 +208,13 @@ lutil_SHA1Transform( uint32 *state, cons
R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
+#else
+ do_R01(&a, &b, &c, &d, &e, block);
+ do_R2(&a, &b, &c, &d, &e, block);
+ do_R3(&a, &b, &c, &d, &e, block);
+ do_R4(&a, &b, &c, &d, &e, block);
+#endif /* !SPARC64_GCC_BUG */
+
/* Add the working vars back into context.state[] */
state[0] += a;