summaryrefslogtreecommitdiff
path: root/src/libstdcrypto/sha1_transform.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstdcrypto/sha1_transform.c')
-rw-r--r--src/libstdcrypto/sha1_transform.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/libstdcrypto/sha1_transform.c b/src/libstdcrypto/sha1_transform.c
new file mode 100644
index 0000000..bd6e624
--- /dev/null
+++ b/src/libstdcrypto/sha1_transform.c
@@ -0,0 +1,42 @@
+/* ISC license. */
+
+#include <skalibs/uint32.h>
+#include "sha1-internal.h"
+
+#define F1(x, y, z) ((x & y) | ((~x) & z))
+#define F2(x, y, z) (x ^ y ^ z)
+#define F3(x, y, z) ((x & y) | (x & z) | (y & z))
+#define F4(x, y, z) (x ^ y ^ z)
+
+#define SHA1STEP(f, data) \
+{ \
+ register uint32 tmp = e + f(b, c, d) + data + ((a<<5) | (a>>27)); \
+ e = d ; \
+ d = c ; \
+ c = (b<<30) | (b>>2) ; \
+ b = a ; \
+ a = tmp ; \
+}
+
+void sha1_transform (uint32 *buf, uint32 const *in)
+{
+ register uint32 a = buf[0], b = buf[1], c = buf[2], d = buf[3], e = buf[4] ;
+ uint32 w[80] ;
+ register unsigned int i = 0 ;
+
+ for (; i < 16 ; i++) w[i] = in[i] ;
+ for (; i < 80 ; i++)
+ {
+ w[i] = w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16] ;
+ w[i] = (w[i]<<1) | (w[i]>>31) ;
+ }
+ for (i = 0 ; i < 20 ; i++)
+ SHA1STEP(F1, w[i] + 0x5a827999UL) ;
+ for (; i < 40 ; i++)
+ SHA1STEP(F2, w[i] + 0x6ed9eba1UL) ;
+ for (; i < 60 ; i++)
+ SHA1STEP(F3, w[i] + 0x8f1bbcdcUL) ;
+ for (; i < 80 ; i++)
+ SHA1STEP(F4, w[i] + 0xca62c1d6UL) ;
+ buf[0] += a ; buf[1] += b ; buf[2] += c ; buf[3] += d ; buf[4] += e ;
+}