xref: /linux/crypto/rmd160.c (revision d6ebf528)
1c6580eb8SAdrian-Ken Rueegsegger // SPDX-License-Identifier: GPL-2.0-or-later
2c6580eb8SAdrian-Ken Rueegsegger /*
3c6580eb8SAdrian-Ken Rueegsegger  * Cryptographic API.
4c6580eb8SAdrian-Ken Rueegsegger  *
5c6580eb8SAdrian-Ken Rueegsegger  * RIPEMD-160 - RACE Integrity Primitives Evaluation Message Digest.
6c6580eb8SAdrian-Ken Rueegsegger  *
7c6580eb8SAdrian-Ken Rueegsegger  * Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
83181c225SAdrian-Ken Rueegsegger  *
9c6580eb8SAdrian-Ken Rueegsegger  * Copyright (c) 2008 Adrian-Ken Rueegsegger <ken@codelabs.ch>
10c6580eb8SAdrian-Ken Rueegsegger  */
11c6580eb8SAdrian-Ken Rueegsegger #include <crypto/internal/hash.h>
12c6580eb8SAdrian-Ken Rueegsegger #include <linux/init.h>
13c6580eb8SAdrian-Ken Rueegsegger #include <linux/module.h>
14c6580eb8SAdrian-Ken Rueegsegger #include <linux/mm.h>
15c6580eb8SAdrian-Ken Rueegsegger #include <linux/types.h>
16e5835fbaSHerbert Xu #include <asm/byteorder.h>
17c6580eb8SAdrian-Ken Rueegsegger 
18c6580eb8SAdrian-Ken Rueegsegger #include "ripemd.h"
19c6580eb8SAdrian-Ken Rueegsegger 
20c6580eb8SAdrian-Ken Rueegsegger struct rmd160_ctx {
21c6580eb8SAdrian-Ken Rueegsegger 	u64 byte_count;
22c6580eb8SAdrian-Ken Rueegsegger 	u32 state[5];
23c6580eb8SAdrian-Ken Rueegsegger 	__le32 buffer[16];
24c6580eb8SAdrian-Ken Rueegsegger };
25c6580eb8SAdrian-Ken Rueegsegger 
26c6580eb8SAdrian-Ken Rueegsegger #define K1  RMD_K1
27c6580eb8SAdrian-Ken Rueegsegger #define K2  RMD_K2
28caee1688SHarvey Harrison #define K3  RMD_K3
29c6580eb8SAdrian-Ken Rueegsegger #define K4  RMD_K4
30c6580eb8SAdrian-Ken Rueegsegger #define K5  RMD_K5
31ba6b0398SAdrian-Ken Rueegsegger #define KK1 RMD_K6
32ba6b0398SAdrian-Ken Rueegsegger #define KK2 RMD_K7
33ba6b0398SAdrian-Ken Rueegsegger #define KK3 RMD_K8
34ba6b0398SAdrian-Ken Rueegsegger #define KK4 RMD_K9
35ba6b0398SAdrian-Ken Rueegsegger #define KK5 RMD_K1
36ba6b0398SAdrian-Ken Rueegsegger 
37ba6b0398SAdrian-Ken Rueegsegger #define F1(x, y, z) (x ^ y ^ z)		/* XOR */
38ba6b0398SAdrian-Ken Rueegsegger #define F2(x, y, z) (z ^ (x & (y ^ z)))	/* x ? y : z */
39ba6b0398SAdrian-Ken Rueegsegger #define F3(x, y, z) ((x | ~y) ^ z)
40ba6b0398SAdrian-Ken Rueegsegger #define F4(x, y, z) (y ^ (z & (x ^ y)))	/* z ? x : y */
41c6580eb8SAdrian-Ken Rueegsegger #define F5(x, y, z) (x ^ (y | ~z))
42c6580eb8SAdrian-Ken Rueegsegger 
43c6580eb8SAdrian-Ken Rueegsegger #define ROUND(a, b, c, d, e, f, k, x, s)  { \
44c6580eb8SAdrian-Ken Rueegsegger 	(a) += f((b), (c), (d)) + le32_to_cpup(&(x)) + (k); \
45c6580eb8SAdrian-Ken Rueegsegger 	(a) = rol32((a), (s)) + (e); \
46c6580eb8SAdrian-Ken Rueegsegger 	(c) = rol32((c), 10); \
47c6580eb8SAdrian-Ken Rueegsegger }
48c6580eb8SAdrian-Ken Rueegsegger 
rmd160_transform(u32 * state,const __le32 * in)495cdcc22fSHerbert Xu static void rmd160_transform(u32 *state, const __le32 *in)
50c6580eb8SAdrian-Ken Rueegsegger {
51c6580eb8SAdrian-Ken Rueegsegger 	u32 aa, bb, cc, dd, ee, aaa, bbb, ccc, ddd, eee;
52c6580eb8SAdrian-Ken Rueegsegger 
53c6580eb8SAdrian-Ken Rueegsegger 	/* Initialize left lane */
54caee1688SHarvey Harrison 	aa = state[0];
55c6580eb8SAdrian-Ken Rueegsegger 	bb = state[1];
56c6580eb8SAdrian-Ken Rueegsegger 	cc = state[2];
57c6580eb8SAdrian-Ken Rueegsegger 	dd = state[3];
58c6580eb8SAdrian-Ken Rueegsegger 	ee = state[4];
59c6580eb8SAdrian-Ken Rueegsegger 
60c6580eb8SAdrian-Ken Rueegsegger 	/* Initialize right lane */
61c6580eb8SAdrian-Ken Rueegsegger 	aaa = state[0];
62c6580eb8SAdrian-Ken Rueegsegger 	bbb = state[1];
63c6580eb8SAdrian-Ken Rueegsegger 	ccc = state[2];
64c6580eb8SAdrian-Ken Rueegsegger 	ddd = state[3];
65c6580eb8SAdrian-Ken Rueegsegger 	eee = state[4];
66c6580eb8SAdrian-Ken Rueegsegger 
67c6580eb8SAdrian-Ken Rueegsegger 	/* round 1: left lane */
68c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F1, K1, in[0],  11);
69c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F1, K1, in[1],  14);
70c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F1, K1, in[2],  15);
71c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F1, K1, in[3],  12);
72c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F1, K1, in[4],   5);
73c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F1, K1, in[5],   8);
74c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F1, K1, in[6],   7);
75c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F1, K1, in[7],   9);
76c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F1, K1, in[8],  11);
77c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F1, K1, in[9],  13);
78c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F1, K1, in[10], 14);
79c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F1, K1, in[11], 15);
80c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F1, K1, in[12],  6);
81c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F1, K1, in[13],  7);
82c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F1, K1, in[14],  9);
83c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F1, K1, in[15],  8);
84c6580eb8SAdrian-Ken Rueegsegger 
85c6580eb8SAdrian-Ken Rueegsegger 	/* round 2: left lane" */
86c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F2, K2, in[7],   7);
87c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F2, K2, in[4],   6);
88c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F2, K2, in[13],  8);
89c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F2, K2, in[1],  13);
90c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F2, K2, in[10], 11);
91c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F2, K2, in[6],   9);
92c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F2, K2, in[15],  7);
93c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F2, K2, in[3],  15);
94c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F2, K2, in[12],  7);
95c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F2, K2, in[0],  12);
96c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F2, K2, in[9],  15);
97c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F2, K2, in[5],   9);
98c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F2, K2, in[2],  11);
99c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F2, K2, in[14],  7);
100c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F2, K2, in[11], 13);
101c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F2, K2, in[8],  12);
102c6580eb8SAdrian-Ken Rueegsegger 
103c6580eb8SAdrian-Ken Rueegsegger 	/* round 3: left lane" */
104c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F3, K3, in[3],  11);
105c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F3, K3, in[10], 13);
106c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F3, K3, in[14],  6);
107c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F3, K3, in[4],   7);
108c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F3, K3, in[9],  14);
109c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F3, K3, in[15],  9);
110c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F3, K3, in[8],  13);
111c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F3, K3, in[1],  15);
112c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F3, K3, in[2],  14);
113c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F3, K3, in[7],   8);
114c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F3, K3, in[0],  13);
115c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F3, K3, in[6],   6);
116c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F3, K3, in[13],  5);
117c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F3, K3, in[11], 12);
118c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F3, K3, in[5],   7);
119c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F3, K3, in[12],  5);
120c6580eb8SAdrian-Ken Rueegsegger 
121c6580eb8SAdrian-Ken Rueegsegger 	/* round 4: left lane" */
122c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F4, K4, in[1],  11);
123c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F4, K4, in[9],  12);
124c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F4, K4, in[11], 14);
125c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F4, K4, in[10], 15);
126c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F4, K4, in[0],  14);
127c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F4, K4, in[8],  15);
128c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F4, K4, in[12],  9);
129c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F4, K4, in[4],   8);
130c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F4, K4, in[13],  9);
131c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F4, K4, in[3],  14);
132c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F4, K4, in[7],   5);
133c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F4, K4, in[15],  6);
134c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F4, K4, in[14],  8);
135c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F4, K4, in[5],   6);
136c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F4, K4, in[6],   5);
137c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F4, K4, in[2],  12);
138c6580eb8SAdrian-Ken Rueegsegger 
139c6580eb8SAdrian-Ken Rueegsegger 	/* round 5: left lane" */
140c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F5, K5, in[4],   9);
141c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F5, K5, in[0],  15);
142c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F5, K5, in[5],   5);
143c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F5, K5, in[9],  11);
144c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F5, K5, in[7],   6);
145c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F5, K5, in[12],  8);
146c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F5, K5, in[2],  13);
147c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F5, K5, in[10], 12);
148c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F5, K5, in[14],  5);
149c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F5, K5, in[1],  12);
150c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F5, K5, in[3],  13);
151c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F5, K5, in[8],  14);
152c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F5, K5, in[11], 11);
153c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F5, K5, in[6],   8);
154c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F5, K5, in[15],  5);
155c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F5, K5, in[13],  6);
156c6580eb8SAdrian-Ken Rueegsegger 
157c6580eb8SAdrian-Ken Rueegsegger 	/* round 1: right lane */
158c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[5],   8);
159c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[14],  9);
160c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[7],   9);
161c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[0],  11);
162c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[9],  13);
163c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[2],  15);
164c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[11], 15);
165c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[4],   5);
166c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[13],  7);
167c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[6],   7);
168c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[15],  8);
169c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[8],  11);
170c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[1],  14);
171c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[10], 14);
172c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[3],  12);
173c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[12],  6);
174c6580eb8SAdrian-Ken Rueegsegger 
175c6580eb8SAdrian-Ken Rueegsegger 	/* round 2: right lane */
176c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[6],   9);
177c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[11], 13);
178c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[3],  15);
179c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[7],   7);
180c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[0],  12);
181c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[13],  8);
182c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[5],   9);
183c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[10], 11);
184c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[14],  7);
185c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[15],  7);
186c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[8],  12);
187c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[12],  7);
188c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[4],   6);
189c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[9],  15);
190c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[1],  13);
191c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[2],  11);
192c6580eb8SAdrian-Ken Rueegsegger 
193c6580eb8SAdrian-Ken Rueegsegger 	/* round 3: right lane */
194c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[15],  9);
195c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[5],   7);
196c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[1],  15);
197c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[3],  11);
198c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[7],   8);
199c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[14],  6);
200c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[6],   6);
201c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[9],  14);
202c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[11], 12);
203c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[8],  13);
204c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[12],  5);
205c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[2],  14);
206c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[10], 13);
207c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[0],  13);
208c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[4],   7);
209c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[13],  5);
210c6580eb8SAdrian-Ken Rueegsegger 
211c6580eb8SAdrian-Ken Rueegsegger 	/* round 4: right lane */
212c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[8],  15);
213c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[6],   5);
214c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[4],   8);
215c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[1],  11);
216c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[3],  14);
217c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[11], 14);
218c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[15],  6);
219c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[0],  14);
220c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[5],   6);
221c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[12],  9);
222c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[2],  12);
223c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[13],  9);
224c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[9],  12);
225c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[7],   5);
226c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[10], 15);
227c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[14],  8);
228c6580eb8SAdrian-Ken Rueegsegger 
229c6580eb8SAdrian-Ken Rueegsegger 	/* round 5: right lane */
230c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[12],  8);
231c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[15],  5);
232c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[10], 12);
233c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[4],   9);
234c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[1],  12);
235c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[5],   5);
236c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[8],  14);
237c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[7],   6);
238c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[6],   8);
239c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[2],  13);
240c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[13],  6);
241c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[14],  5);
242c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[0],  15);
243c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[3],  13);
244c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[9],  11);
245c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[11], 11);
246c6580eb8SAdrian-Ken Rueegsegger 
247c6580eb8SAdrian-Ken Rueegsegger 	/* combine results */
248c6580eb8SAdrian-Ken Rueegsegger 	ddd += cc + state[1];		/* final result for state[0] */
249c6580eb8SAdrian-Ken Rueegsegger 	state[1] = state[2] + dd + eee;
250c6580eb8SAdrian-Ken Rueegsegger 	state[2] = state[3] + ee + aaa;
251c6580eb8SAdrian-Ken Rueegsegger 	state[3] = state[4] + aa + bbb;
252c6580eb8SAdrian-Ken Rueegsegger 	state[4] = state[0] + bb + ccc;
253c6580eb8SAdrian-Ken Rueegsegger 	state[0] = ddd;
254c6580eb8SAdrian-Ken Rueegsegger }
255c6580eb8SAdrian-Ken Rueegsegger 
rmd160_init(struct shash_desc * desc)256c6580eb8SAdrian-Ken Rueegsegger static int rmd160_init(struct shash_desc *desc)
257c6580eb8SAdrian-Ken Rueegsegger {
258c6580eb8SAdrian-Ken Rueegsegger 	struct rmd160_ctx *rctx = shash_desc_ctx(desc);
259c6580eb8SAdrian-Ken Rueegsegger 
260c6580eb8SAdrian-Ken Rueegsegger 	rctx->byte_count = 0;
261e5835fbaSHerbert Xu 
262c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[0] = RMD_H0;
263e5835fbaSHerbert Xu 	rctx->state[1] = RMD_H1;
264c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[2] = RMD_H2;
265c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[3] = RMD_H3;
266c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[4] = RMD_H4;
267c6580eb8SAdrian-Ken Rueegsegger 
268c6580eb8SAdrian-Ken Rueegsegger 	memset(rctx->buffer, 0, sizeof(rctx->buffer));
269c6580eb8SAdrian-Ken Rueegsegger 
270c6580eb8SAdrian-Ken Rueegsegger 	return 0;
271c6580eb8SAdrian-Ken Rueegsegger }
272c6580eb8SAdrian-Ken Rueegsegger 
rmd160_update(struct shash_desc * desc,const u8 * data,unsigned int len)273c6580eb8SAdrian-Ken Rueegsegger static int rmd160_update(struct shash_desc *desc, const u8 *data,
274e5835fbaSHerbert Xu 			 unsigned int len)
275e5835fbaSHerbert Xu {
276c6580eb8SAdrian-Ken Rueegsegger 	struct rmd160_ctx *rctx = shash_desc_ctx(desc);
277c6580eb8SAdrian-Ken Rueegsegger 	const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f);
278e5835fbaSHerbert Xu 
279c6580eb8SAdrian-Ken Rueegsegger 	rctx->byte_count += len;
280c6580eb8SAdrian-Ken Rueegsegger 
281e5835fbaSHerbert Xu 	/* Enough space in buffer? If so copy and we're done */
282c6580eb8SAdrian-Ken Rueegsegger 	if (avail > len) {
283c6580eb8SAdrian-Ken Rueegsegger 		memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
284c6580eb8SAdrian-Ken Rueegsegger 		       data, len);
285c6580eb8SAdrian-Ken Rueegsegger 		goto out;
286c6580eb8SAdrian-Ken Rueegsegger 	}
287c6580eb8SAdrian-Ken Rueegsegger 
288c6580eb8SAdrian-Ken Rueegsegger 	memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
289c6580eb8SAdrian-Ken Rueegsegger 	       data, avail);
290e5835fbaSHerbert Xu 
291c6580eb8SAdrian-Ken Rueegsegger 	rmd160_transform(rctx->state, rctx->buffer);
292c6580eb8SAdrian-Ken Rueegsegger 	data += avail;
293c6580eb8SAdrian-Ken Rueegsegger 	len -= avail;
294c6580eb8SAdrian-Ken Rueegsegger 
295c6580eb8SAdrian-Ken Rueegsegger 	while (len >= sizeof(rctx->buffer)) {
296c928a0cdSAdrian-Ken Rueegsegger 		memcpy(rctx->buffer, data, sizeof(rctx->buffer));
297c6580eb8SAdrian-Ken Rueegsegger 		rmd160_transform(rctx->state, rctx->buffer);
298c6580eb8SAdrian-Ken Rueegsegger 		data += sizeof(rctx->buffer);
299c6580eb8SAdrian-Ken Rueegsegger 		len -= sizeof(rctx->buffer);
300c6580eb8SAdrian-Ken Rueegsegger 	}
301c6580eb8SAdrian-Ken Rueegsegger 
302c928a0cdSAdrian-Ken Rueegsegger 	memcpy(rctx->buffer, data, len);
303c6580eb8SAdrian-Ken Rueegsegger 
304c6580eb8SAdrian-Ken Rueegsegger out:
305c6580eb8SAdrian-Ken Rueegsegger 	return 0;
306c6580eb8SAdrian-Ken Rueegsegger }
307c6580eb8SAdrian-Ken Rueegsegger 
308e5835fbaSHerbert Xu /* Add padding and return the message digest. */
rmd160_final(struct shash_desc * desc,u8 * out)309e5835fbaSHerbert Xu static int rmd160_final(struct shash_desc *desc, u8 *out)
310e5835fbaSHerbert Xu {
311c6580eb8SAdrian-Ken Rueegsegger 	struct rmd160_ctx *rctx = shash_desc_ctx(desc);
312c6580eb8SAdrian-Ken Rueegsegger 	u32 i, index, padlen;
313c6580eb8SAdrian-Ken Rueegsegger 	__le64 bits;
314e5835fbaSHerbert Xu 	__le32 *dst = (__le32 *)out;
315c6580eb8SAdrian-Ken Rueegsegger 	static const u8 padding[64] = { 0x80, };
316e5835fbaSHerbert Xu 
317c928a0cdSAdrian-Ken Rueegsegger 	bits = cpu_to_le64(rctx->byte_count << 3);
318caee1688SHarvey Harrison 
319caee1688SHarvey Harrison 	/* Pad out to 56 mod 64 */
320c6580eb8SAdrian-Ken Rueegsegger 	index = rctx->byte_count & 0x3f;
321c928a0cdSAdrian-Ken Rueegsegger 	padlen = (index < 56) ? (56 - index) : ((64+56) - index);
322c928a0cdSAdrian-Ken Rueegsegger 	rmd160_update(desc, padding, padlen);
323c6580eb8SAdrian-Ken Rueegsegger 
324c6580eb8SAdrian-Ken Rueegsegger 	/* Append length */
325c6580eb8SAdrian-Ken Rueegsegger 	rmd160_update(desc, (const u8 *)&bits, sizeof(bits));
326c6580eb8SAdrian-Ken Rueegsegger 
327e5835fbaSHerbert Xu 	/* Store state in digest */
328c6580eb8SAdrian-Ken Rueegsegger 	for (i = 0; i < 5; i++)
329c6580eb8SAdrian-Ken Rueegsegger 		dst[i] = cpu_to_le32p(&rctx->state[i]);
330e5835fbaSHerbert Xu 
331c6580eb8SAdrian-Ken Rueegsegger 	/* Wipe context */
332c6580eb8SAdrian-Ken Rueegsegger 	memset(rctx, 0, sizeof(*rctx));
333c928a0cdSAdrian-Ken Rueegsegger 
3345cdcc22fSHerbert Xu 	return 0;
335c6580eb8SAdrian-Ken Rueegsegger }
336c6580eb8SAdrian-Ken Rueegsegger 
337c6580eb8SAdrian-Ken Rueegsegger static struct shash_alg alg = {
338e5835fbaSHerbert Xu 	.digestsize	=	RMD160_DIGEST_SIZE,
339e5835fbaSHerbert Xu 	.init		=	rmd160_init,
340c6580eb8SAdrian-Ken Rueegsegger 	.update		=	rmd160_update,
341c6580eb8SAdrian-Ken Rueegsegger 	.final		=	rmd160_final,
342e5835fbaSHerbert Xu 	.descsize	=	sizeof(struct rmd160_ctx),
343e5835fbaSHerbert Xu 	.base		=	{
344e5835fbaSHerbert Xu 		.cra_name	 =	"rmd160",
345e5835fbaSHerbert Xu 		.cra_driver_name =	"rmd160-generic",
346e5835fbaSHerbert Xu 		.cra_blocksize	 =	RMD160_BLOCK_SIZE,
347e5835fbaSHerbert Xu 		.cra_module	 =	THIS_MODULE,
348e5835fbaSHerbert Xu 	}
349c6580eb8SAdrian-Ken Rueegsegger };
350*d6ebf528SEric Biggers 
rmd160_mod_init(void)351c6580eb8SAdrian-Ken Rueegsegger static int __init rmd160_mod_init(void)
352c6580eb8SAdrian-Ken Rueegsegger {
353e5835fbaSHerbert Xu 	return crypto_register_shash(&alg);
354c6580eb8SAdrian-Ken Rueegsegger }
355c6580eb8SAdrian-Ken Rueegsegger 
rmd160_mod_fini(void)356c6580eb8SAdrian-Ken Rueegsegger static void __exit rmd160_mod_fini(void)
357c6580eb8SAdrian-Ken Rueegsegger {
358e5835fbaSHerbert Xu 	crypto_unregister_shash(&alg);
359c6580eb8SAdrian-Ken Rueegsegger }
360c6580eb8SAdrian-Ken Rueegsegger 
361c6580eb8SAdrian-Ken Rueegsegger subsys_initcall(rmd160_mod_init);
362c6580eb8SAdrian-Ken Rueegsegger module_exit(rmd160_mod_fini);
363e5835fbaSHerbert Xu 
364c6580eb8SAdrian-Ken Rueegsegger MODULE_LICENSE("GPL");
365c6580eb8SAdrian-Ken Rueegsegger MODULE_AUTHOR("Adrian-Ken Rueegsegger <ken@codelabs.ch>");
366c4741b23SEric Biggers MODULE_DESCRIPTION("RIPEMD-160 Message Digest");
367c6580eb8SAdrian-Ken Rueegsegger MODULE_ALIAS_CRYPTO("rmd160");
368c6580eb8SAdrian-Ken Rueegsegger