164921Smarcel/*	$OpenBSD: rmd160.c,v 1.3 2001/09/26 21:40:13 markus Exp $	*/
264921Smarcel/*-
364921Smarcel * Copyright (c) 2001 Markus Friedl.  All rights reserved.
464921Smarcel *
564921Smarcel * Redistribution and use in source and binary forms, with or without
664921Smarcel * modification, are permitted provided that the following conditions
764921Smarcel * are met:
864921Smarcel * 1. Redistributions of source code must retain the above copyright
9111798Sdes *    notice, this list of conditions and the following disclaimer.
1064921Smarcel * 2. Redistributions in binary form must reproduce the above copyright
1164921Smarcel *    notice, this list of conditions and the following disclaimer in the
1264921Smarcel *    documentation and/or other materials provided with the distribution.
1364921Smarcel *
1464921Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1565067Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1664921Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1764921Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1864921Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1964921Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2064921Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2164921Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2264921Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2364921Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2464921Smarcel */
2564921Smarcel
2664921Smarcel/*
2764921Smarcel * Preneel, Bosselaers, Dobbertin, "The Cryptographic Hash Function RIPEMD-160",
2864921Smarcel * RSA Laboratories, CryptoBytes, Volume 3, Number 2, Autumn 1997,
29115705Sobrien * ftp://ftp.rsasecurity.com/pub/cryptobytes/crypto3n2.pdf
30115705Sobrien */
31115705Sobrien
3264921Smarcel#include <sys/cdefs.h>
3376166Smarkm__FBSDID("$FreeBSD$");
34162472Snetchild
35162472Snetchild#include <sys/param.h>
36140992Ssobomax#include <sys/systm.h>
3784811Sjhb#include <sys/endian.h>
38140992Ssobomax#include <opencrypto/rmd160.h>
3964921Smarcel
4076166Smarkm#define PUT_64BIT_LE(cp, value) do { \
41161310Snetchild	(cp)[7] = (value) >> 56; \
42164033Srwatson	(cp)[6] = (value) >> 48; \
4364921Smarcel	(cp)[5] = (value) >> 40; \
44161310Snetchild	(cp)[4] = (value) >> 32; \
4576166Smarkm	(cp)[3] = (value) >> 24; \
4676166Smarkm	(cp)[2] = (value) >> 16; \
47134838Sdfr	(cp)[1] = (value) >> 8; \
48102814Siedowse	(cp)[0] = (value); } while (0)
4964921Smarcel
5064921Smarcel#define PUT_32BIT_LE(cp, value) do { \
51161310Snetchild	(cp)[3] = (value) >> 24; \
52166188Sjeff	(cp)[2] = (value) >> 16; \
5364921Smarcel	(cp)[1] = (value) >> 8; \
5464921Smarcel	(cp)[0] = (value); } while (0)
5564921Smarcel
5664921Smarcel#define	H0	0x67452301U
5764921Smarcel#define	H1	0xEFCDAB89U
5864921Smarcel#define	H2	0x98BADCFEU
5967238Sgallatin#define	H3	0x10325476U
6067238Sgallatin#define	H4	0xC3D2E1F0U
6167238Sgallatin
6267238Sgallatin#define	K0	0x00000000U
6364921Smarcel#define	K1	0x5A827999U
6468583Smarcel#define	K2	0x6ED9EBA1U
6564921Smarcel#define	K3	0x8F1BBCDCU
6664921Smarcel#define	K4	0xA953FD4EU
6764921Smarcel
68161310Snetchild#define	KK0	0x50A28BE6U
6964921Smarcel#define	KK1	0x5C4DD124U
70161310Snetchild#define	KK2	0x6D703EF3U
71161310Snetchild#define	KK3	0x7A6D76E9U
72161310Snetchild#define	KK4	0x00000000U
73161310Snetchild
74161310Snetchild/* rotate x left n bits.  */
75161310Snetchild#define ROL(n, x) (((x) << (n)) | ((x) >> (32-(n))))
7683221Smarcel
7783221Smarcel#define F0(x, y, z) ((x) ^ (y) ^ (z))
7883221Smarcel#define F1(x, y, z) (((x) & (y)) | ((~x) & (z)))
7983221Smarcel#define F2(x, y, z) (((x) | (~y)) ^ (z))
8083221Smarcel#define F3(x, y, z) (((x) & (z)) | ((y) & (~z)))
8183221Smarcel#define F4(x, y, z) ((x) ^ ((y) | (~z)))
8283221Smarcel
8383221Smarcel#define R(a, b, c, d, e, Fj, Kj, sj, rj) \
8483221Smarcel	do { \
8583221Smarcel		a = ROL(sj, a + Fj(b,c,d) + X(rj) + Kj) + e; \
8664921Smarcel		c = ROL(10, c); \
8764921Smarcel	} while(0)
8883221Smarcel
8983221Smarcel#define X(i)	x[i]
9083221Smarcel
9183221Smarcelstatic u_char PADDING[64] = {
9283221Smarcel	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9383221Smarcel	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9464921Smarcel	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
9564921Smarcel};
9664921Smarcel
9767051Sgallatinvoid
9867051SgallatinRMD160Init(RMD160_CTX *ctx)
9967051Sgallatin{
10067051Sgallatin	ctx->count = 0;
10167051Sgallatin	ctx->state[0] = H0;
10267051Sgallatin	ctx->state[1] = H1;
10367051Sgallatin	ctx->state[2] = H2;
10467051Sgallatin	ctx->state[3] = H3;
10567051Sgallatin	ctx->state[4] = H4;
10667051Sgallatin}
10767051Sgallatin
10867051Sgallatinvoid
10967051SgallatinRMD160Update(RMD160_CTX *ctx, const u_char *input, u_int32_t len)
11067051Sgallatin{
11167051Sgallatin	u_int32_t have, off, need;
11267051Sgallatin
11367051Sgallatin	have = (ctx->count/8) % 64;
11467051Sgallatin	need = 64 - have;
11567051Sgallatin	ctx->count += 8 * len;
11667051Sgallatin	off = 0;
11767051Sgallatin
11867051Sgallatin	if (len >= need) {
11967051Sgallatin		if (have) {
12067051Sgallatin			memcpy(ctx->buffer + have, input, need);
12183366Sjulian			RMD160Transform(ctx->state, ctx->buffer);
12264921Smarcel			off = need;
123140992Ssobomax			have = 0;
124140992Ssobomax		}
125140992Ssobomax		/* now the buffer is empty */
12664921Smarcel		while (off + 64 <= len) {
127141468Sjhb			RMD160Transform(ctx->state, input+off);
12864921Smarcel			off += 64;
12964921Smarcel		}
13072543Sjlemon	}
131140992Ssobomax	if (off < len)
13264921Smarcel		memcpy(ctx->buffer + have, input+off, len-off);
13364921Smarcel}
134140992Ssobomax
135140992Ssobomaxvoid
136140992SsobomaxRMD160Final(u_char digest[20], RMD160_CTX *ctx)
137140992Ssobomax{
138148623Ssobomax	int i;
139161310Snetchild	u_char size[8];
140161310Snetchild	u_int32_t padlen;
141161310Snetchild
142161310Snetchild	PUT_64BIT_LE(size, ctx->count);
143161310Snetchild
144161310Snetchild	/*
145161310Snetchild	 * pad to 64 byte blocks, at least one byte from PADDING plus 8 bytes
146161310Snetchild	 * for the size
147140992Ssobomax	 */
14864921Smarcel	padlen = 64 - ((ctx->count/8) % 64);
14964921Smarcel	if (padlen < 1 + 8)
15083221Smarcel		padlen += 64;
15183221Smarcel	RMD160Update(ctx, PADDING, padlen - 8);		/* padlen - 8 <= 64 */
15283221Smarcel	RMD160Update(ctx, size, 8);
15383221Smarcel
15483221Smarcel	if (digest != NULL)
15564921Smarcel		for (i = 0; i < 5; i++)
15683366Sjulian			PUT_32BIT_LE(digest + i*4, ctx->state[i]);
15764921Smarcel
15883221Smarcel	memset(ctx, 0, sizeof (*ctx));
15983221Smarcel}
16083221Smarcel
16183221Smarcelvoid
16283221SmarcelRMD160Transform(u_int32_t state[5], const u_char block[64])
16383221Smarcel{
16483221Smarcel	u_int32_t a, b, c, d, e, aa, bb, cc, dd, ee, t, x[16];
16583221Smarcel
16683366Sjulian#if BYTE_ORDER == LITTLE_ENDIAN
16764921Smarcel	memcpy(x, block, 64);
16883221Smarcel#else
16983221Smarcel	int i;
17064921Smarcel
17183221Smarcel	for (i = 0; i < 16; i++)
17283221Smarcel		x[i] = bswap32(*(const u_int32_t*)(block+i*4));
17383221Smarcel#endif
17483366Sjulian
17583221Smarcel	a = state[0];
17683221Smarcel	b = state[1];
17783221Smarcel	c = state[2];
17883221Smarcel	d = state[3];
17983221Smarcel	e = state[4];
18083221Smarcel
18183221Smarcel	/* Round 1 */
18283221Smarcel	R(a, b, c, d, e, F0, K0, 11,  0);
183111797Sdes	R(e, a, b, c, d, F0, K0, 14,  1);
18483221Smarcel	R(d, e, a, b, c, F0, K0, 15,  2);
18583221Smarcel	R(c, d, e, a, b, F0, K0, 12,  3);
18683366Sjulian	R(b, c, d, e, a, F0, K0,  5,  4);
18783221Smarcel	R(a, b, c, d, e, F0, K0,  8,  5);
18883221Smarcel	R(e, a, b, c, d, F0, K0,  7,  6);
18983221Smarcel	R(d, e, a, b, c, F0, K0,  9,  7);
19083221Smarcel	R(c, d, e, a, b, F0, K0, 11,  8);
19183221Smarcel	R(b, c, d, e, a, F0, K0, 13,  9);
19283221Smarcel	R(a, b, c, d, e, F0, K0, 14, 10);
19383221Smarcel	R(e, a, b, c, d, F0, K0, 15, 11);
19483221Smarcel	R(d, e, a, b, c, F0, K0,  6, 12);
19583366Sjulian	R(c, d, e, a, b, F0, K0,  7, 13);
19683221Smarcel	R(b, c, d, e, a, F0, K0,  9, 14);
19783221Smarcel	R(a, b, c, d, e, F0, K0,  8, 15); /* #15 */
19883221Smarcel	/* Round 2 */
19983221Smarcel	R(e, a, b, c, d, F1, K1,  7,  7);
20083221Smarcel	R(d, e, a, b, c, F1, K1,  6,  4);
20183221Smarcel	R(c, d, e, a, b, F1, K1,  8, 13);
20283221Smarcel	R(b, c, d, e, a, F1, K1, 13,  1);
20383221Smarcel	R(a, b, c, d, e, F1, K1, 11, 10);
20483221Smarcel	R(e, a, b, c, d, F1, K1,  9,  6);
20583221Smarcel	R(d, e, a, b, c, F1, K1,  7, 15);
20683221Smarcel	R(c, d, e, a, b, F1, K1, 15,  3);
20783221Smarcel	R(b, c, d, e, a, F1, K1,  7, 12);
20883221Smarcel	R(a, b, c, d, e, F1, K1, 12,  0);
209111797Sdes	R(e, a, b, c, d, F1, K1, 15,  9);
21083221Smarcel	R(d, e, a, b, c, F1, K1,  9,  5);
21183221Smarcel	R(c, d, e, a, b, F1, K1, 11,  2);
21283221Smarcel	R(b, c, d, e, a, F1, K1,  7, 14);
21383221Smarcel	R(a, b, c, d, e, F1, K1, 13, 11);
21483221Smarcel	R(e, a, b, c, d, F1, K1, 12,  8); /* #31 */
21583221Smarcel	/* Round 3 */
21683221Smarcel	R(d, e, a, b, c, F2, K2, 11,  3);
21783221Smarcel	R(c, d, e, a, b, F2, K2, 13, 10);
21883366Sjulian	R(b, c, d, e, a, F2, K2,  6, 14);
21983221Smarcel	R(a, b, c, d, e, F2, K2,  7,  4);
22083221Smarcel	R(e, a, b, c, d, F2, K2, 14,  9);
22183221Smarcel	R(d, e, a, b, c, F2, K2,  9, 15);
22283221Smarcel	R(c, d, e, a, b, F2, K2, 13,  8);
22383221Smarcel	R(b, c, d, e, a, F2, K2, 15,  1);
22483221Smarcel	R(a, b, c, d, e, F2, K2, 14,  2);
22583366Sjulian	R(e, a, b, c, d, F2, K2,  8,  7);
22683221Smarcel	R(d, e, a, b, c, F2, K2, 13,  0);
22783221Smarcel	R(c, d, e, a, b, F2, K2,  6,  6);
22883221Smarcel	R(b, c, d, e, a, F2, K2,  5, 13);
22983221Smarcel	R(a, b, c, d, e, F2, K2, 12, 11);
23083221Smarcel	R(e, a, b, c, d, F2, K2,  7,  5);
23183221Smarcel	R(d, e, a, b, c, F2, K2,  5, 12); /* #47 */
23283221Smarcel	/* Round 4 */
23383366Sjulian	R(c, d, e, a, b, F3, K3, 11,  1);
23483221Smarcel	R(b, c, d, e, a, F3, K3, 12,  9);
23583221Smarcel	R(a, b, c, d, e, F3, K3, 14, 11);
23683221Smarcel	R(e, a, b, c, d, F3, K3, 15, 10);
23783221Smarcel	R(d, e, a, b, c, F3, K3, 14,  0);
23883221Smarcel	R(c, d, e, a, b, F3, K3, 15,  8);
23983221Smarcel	R(b, c, d, e, a, F3, K3,  9, 12);
24083221Smarcel	R(a, b, c, d, e, F3, K3,  8,  4);
24183221Smarcel	R(e, a, b, c, d, F3, K3,  9, 13);
24283366Sjulian	R(d, e, a, b, c, F3, K3, 14,  3);
24383221Smarcel	R(c, d, e, a, b, F3, K3,  5,  7);
24483221Smarcel	R(b, c, d, e, a, F3, K3,  6, 15);
24583221Smarcel	R(a, b, c, d, e, F3, K3,  8, 14);
24683221Smarcel	R(e, a, b, c, d, F3, K3,  6,  5);
24783221Smarcel	R(d, e, a, b, c, F3, K3,  5,  6);
24883366Sjulian	R(c, d, e, a, b, F3, K3, 12,  2); /* #63 */
24983221Smarcel	/* Round 5 */
25083221Smarcel	R(b, c, d, e, a, F4, K4,  9,  4);
25183221Smarcel	R(a, b, c, d, e, F4, K4, 15,  0);
25283221Smarcel	R(e, a, b, c, d, F4, K4,  5,  5);
25383221Smarcel	R(d, e, a, b, c, F4, K4, 11,  9);
25483221Smarcel	R(c, d, e, a, b, F4, K4,  6,  7);
25583221Smarcel	R(b, c, d, e, a, F4, K4,  8, 12);
25683366Sjulian	R(a, b, c, d, e, F4, K4, 13,  2);
25783221Smarcel	R(e, a, b, c, d, F4, K4, 12, 10);
25883221Smarcel	R(d, e, a, b, c, F4, K4,  5, 14);
25983221Smarcel	R(c, d, e, a, b, F4, K4, 12,  1);
26083221Smarcel	R(b, c, d, e, a, F4, K4, 13,  3);
26183221Smarcel	R(a, b, c, d, e, F4, K4, 14,  8);
26283221Smarcel	R(e, a, b, c, d, F4, K4, 11, 11);
26383221Smarcel	R(d, e, a, b, c, F4, K4,  8,  6);
26483366Sjulian	R(c, d, e, a, b, F4, K4,  5, 15);
26583221Smarcel	R(b, c, d, e, a, F4, K4,  6, 13); /* #79 */
26683221Smarcel
26783221Smarcel	aa = a ; bb = b; cc = c; dd = d; ee = e;
26883221Smarcel
26983221Smarcel	a = state[0];
27083221Smarcel	b = state[1];
27164921Smarcel	c = state[2];
27264921Smarcel	d = state[3];
27364921Smarcel	e = state[4];
27483366Sjulian
27564921Smarcel	/* Parallel round 1 */
27683221Smarcel	R(a, b, c, d, e, F4, KK0,  8,  5);
27783221Smarcel	R(e, a, b, c, d, F4, KK0,  9, 14);
27864921Smarcel	R(d, e, a, b, c, F4, KK0,  9,  7);
27964921Smarcel	R(c, d, e, a, b, F4, KK0, 11,  0);
28083221Smarcel	R(b, c, d, e, a, F4, KK0, 13,  9);
28183221Smarcel	R(a, b, c, d, e, F4, KK0, 15,  2);
28291437Speter	R(e, a, b, c, d, F4, KK0, 15, 11);
28364921Smarcel	R(d, e, a, b, c, F4, KK0,  5,  4);
28464921Smarcel	R(c, d, e, a, b, F4, KK0,  7, 13);
285111797Sdes	R(b, c, d, e, a, F4, KK0,  7,  6);
28664921Smarcel	R(a, b, c, d, e, F4, KK0,  8, 15);
28764921Smarcel	R(e, a, b, c, d, F4, KK0, 11,  8);
28864921Smarcel	R(d, e, a, b, c, F4, KK0, 14,  1);
28964921Smarcel	R(c, d, e, a, b, F4, KK0, 14, 10);
29064921Smarcel	R(b, c, d, e, a, F4, KK0, 12,  3);
29164921Smarcel	R(a, b, c, d, e, F4, KK0,  6, 12); /* #15 */
29264921Smarcel	/* Parallel round 2 */
29364921Smarcel	R(e, a, b, c, d, F3, KK1,  9,  6);
29483366Sjulian	R(d, e, a, b, c, F3, KK1, 13, 11);
29564921Smarcel	R(c, d, e, a, b, F3, KK1, 15,  3);
29664921Smarcel	R(b, c, d, e, a, F3, KK1,  7,  7);
29764921Smarcel	R(a, b, c, d, e, F3, KK1, 12,  0);
29883366Sjulian	R(e, a, b, c, d, F3, KK1,  8, 13);
29964921Smarcel	R(d, e, a, b, c, F3, KK1,  9,  5);
30064921Smarcel	R(c, d, e, a, b, F3, KK1, 11, 10);
301166150Snetchild	R(b, c, d, e, a, F3, KK1,  7, 14);
302166150Snetchild	R(a, b, c, d, e, F3, KK1,  7, 15);
30364921Smarcel	R(e, a, b, c, d, F3, KK1, 12,  8);
30464921Smarcel	R(d, e, a, b, c, F3, KK1,  7, 12);
30572543Sjlemon	R(c, d, e, a, b, F3, KK1,  6,  4);
30672543Sjlemon	R(b, c, d, e, a, F3, KK1, 15,  9);
30764921Smarcel	R(a, b, c, d, e, F3, KK1, 13,  1);
30864921Smarcel	R(e, a, b, c, d, F3, KK1, 11,  2); /* #31 */
309166150Snetchild	/* Parallel round 3 */
31064921Smarcel	R(d, e, a, b, c, F2, KK2,  9, 15);
311166150Snetchild	R(c, d, e, a, b, F2, KK2,  7,  5);
312166150Snetchild	R(b, c, d, e, a, F2, KK2, 15,  1);
313166150Snetchild	R(a, b, c, d, e, F2, KK2, 11,  3);
314166150Snetchild	R(e, a, b, c, d, F2, KK2,  8,  7);
315166150Snetchild	R(d, e, a, b, c, F2, KK2,  6, 14);
31664921Smarcel	R(c, d, e, a, b, F2, KK2,  6,  6);
31783366Sjulian	R(b, c, d, e, a, F2, KK2, 14,  9);
31883366Sjulian	R(a, b, c, d, e, F2, KK2, 12, 11);
319161310Snetchild	R(e, a, b, c, d, F2, KK2, 13,  8);
320161310Snetchild	R(d, e, a, b, c, F2, KK2,  5, 12);
321161310Snetchild	R(c, d, e, a, b, F2, KK2, 14,  2);
322161310Snetchild	R(b, c, d, e, a, F2, KK2, 13, 10);
323166150Snetchild	R(a, b, c, d, e, F2, KK2, 13,  0);
324166150Snetchild	R(e, a, b, c, d, F2, KK2,  7,  4);
325166150Snetchild	R(d, e, a, b, c, F2, KK2,  5, 13); /* #47 */
326166150Snetchild	/* Parallel round 4 */
327166150Snetchild	R(c, d, e, a, b, F1, KK3, 15,  8);
328170307Sjeff	R(b, c, d, e, a, F1, KK3,  5,  6);
329166150Snetchild	R(a, b, c, d, e, F1, KK3,  8,  4);
330166188Sjeff	R(e, a, b, c, d, F1, KK3, 11,  1);
331170307Sjeff	R(d, e, a, b, c, F1, KK3, 14,  3);
332166150Snetchild	R(c, d, e, a, b, F1, KK3, 14, 11);
33364921Smarcel	R(b, c, d, e, a, F1, KK3,  6, 15);
33464921Smarcel	R(a, b, c, d, e, F1, KK3, 14,  0);
33564921Smarcel	R(e, a, b, c, d, F1, KK3,  6,  5);
33664921Smarcel	R(d, e, a, b, c, F1, KK3,  9, 12);
33783366Sjulian	R(c, d, e, a, b, F1, KK3, 12,  2);
33864921Smarcel	R(b, c, d, e, a, F1, KK3,  9, 13);
33964921Smarcel	R(a, b, c, d, e, F1, KK3, 12,  9);
340161611Snetchild	R(e, a, b, c, d, F1, KK3,  5,  7);
341166150Snetchild	R(d, e, a, b, c, F1, KK3, 15, 10);
34264921Smarcel	R(c, d, e, a, b, F1, KK3,  8, 14); /* #63 */
34364921Smarcel	/* Parallel round 5 */
34472543Sjlemon	R(b, c, d, e, a, F0, KK4,  8, 12);
34572543Sjlemon	R(a, b, c, d, e, F0, KK4,  5, 15);
34664921Smarcel	R(e, a, b, c, d, F0, KK4, 12, 10);
34764921Smarcel	R(d, e, a, b, c, F0, KK4,  9,  4);
348161611Snetchild	R(c, d, e, a, b, F0, KK4, 12,  1);
349166150Snetchild	R(b, c, d, e, a, F0, KK4,  5,  5);
35064921Smarcel	R(a, b, c, d, e, F0, KK4, 14,  8);
351161611Snetchild	R(e, a, b, c, d, F0, KK4,  6,  7);
352166150Snetchild	R(d, e, a, b, c, F0, KK4,  8,  6);
353161611Snetchild	R(c, d, e, a, b, F0, KK4, 13,  2);
354161611Snetchild	R(b, c, d, e, a, F0, KK4,  6, 13);
35564921Smarcel	R(a, b, c, d, e, F0, KK4,  5, 14);
35683366Sjulian	R(e, a, b, c, d, F0, KK4, 15,  0);
35783366Sjulian	R(d, e, a, b, c, F0, KK4, 13,  3);
358161310Snetchild	R(c, d, e, a, b, F0, KK4, 11,  9);
359161310Snetchild	R(b, c, d, e, a, F0, KK4, 11, 11); /* #79 */
360161310Snetchild
361166150Snetchild	t =        state[1] + cc + d;
362166150Snetchild	state[1] = state[2] + dd + e;
363166150Snetchild	state[2] = state[3] + ee + a;
364166150Snetchild	state[3] = state[4] + aa + b;
365166150Snetchild	state[4] = state[0] + bb + c;
366166150Snetchild	state[0] = t;
367166150Snetchild}
368166150Snetchild