xref: /linux/crypto/rmd160.c (revision f088104d837a991c65e51fa30bb4196169b3244d)
12874c5fdSThomas Gleixner // 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
8c6580eb8SAdrian-Ken Rueegsegger  *
93181c225SAdrian-Ken Rueegsegger  * Copyright (c) 2008 Adrian-Ken Rueegsegger <ken@codelabs.ch>
10c6580eb8SAdrian-Ken Rueegsegger  */
11e5835fbaSHerbert Xu #include <crypto/internal/hash.h>
124a7e1e81SHerbert Xu #include <linux/kernel.h>
13c6580eb8SAdrian-Ken Rueegsegger #include <linux/module.h>
144a7e1e81SHerbert Xu #include <linux/string.h>
15c6580eb8SAdrian-Ken Rueegsegger #include "ripemd.h"
16c6580eb8SAdrian-Ken Rueegsegger 
17c6580eb8SAdrian-Ken Rueegsegger struct rmd160_ctx {
18c6580eb8SAdrian-Ken Rueegsegger 	u64 byte_count;
19c6580eb8SAdrian-Ken Rueegsegger 	u32 state[5];
20c6580eb8SAdrian-Ken Rueegsegger };
21c6580eb8SAdrian-Ken Rueegsegger 
22ba6b0398SAdrian-Ken Rueegsegger #define K1  RMD_K1
23ba6b0398SAdrian-Ken Rueegsegger #define K2  RMD_K2
24ba6b0398SAdrian-Ken Rueegsegger #define K3  RMD_K3
25ba6b0398SAdrian-Ken Rueegsegger #define K4  RMD_K4
26ba6b0398SAdrian-Ken Rueegsegger #define K5  RMD_K5
27ba6b0398SAdrian-Ken Rueegsegger #define KK1 RMD_K6
28ba6b0398SAdrian-Ken Rueegsegger #define KK2 RMD_K7
29ba6b0398SAdrian-Ken Rueegsegger #define KK3 RMD_K8
30ba6b0398SAdrian-Ken Rueegsegger #define KK4 RMD_K9
31ba6b0398SAdrian-Ken Rueegsegger #define KK5 RMD_K1
32c6580eb8SAdrian-Ken Rueegsegger 
33c6580eb8SAdrian-Ken Rueegsegger #define F1(x, y, z) (x ^ y ^ z)		/* XOR */
34c6580eb8SAdrian-Ken Rueegsegger #define F2(x, y, z) (z ^ (x & (y ^ z)))	/* x ? y : z */
35c6580eb8SAdrian-Ken Rueegsegger #define F3(x, y, z) ((x | ~y) ^ z)
36c6580eb8SAdrian-Ken Rueegsegger #define F4(x, y, z) (y ^ (z & (x ^ y)))	/* z ? x : y */
37c6580eb8SAdrian-Ken Rueegsegger #define F5(x, y, z) (x ^ (y | ~z))
38c6580eb8SAdrian-Ken Rueegsegger 
39c6580eb8SAdrian-Ken Rueegsegger #define ROUND(a, b, c, d, e, f, k, x, s)  { \
405cdcc22fSHerbert Xu 	(a) += f((b), (c), (d)) + le32_to_cpup(&(x)) + (k); \
41c6580eb8SAdrian-Ken Rueegsegger 	(a) = rol32((a), (s)) + (e); \
42c6580eb8SAdrian-Ken Rueegsegger 	(c) = rol32((c), 10); \
43c6580eb8SAdrian-Ken Rueegsegger }
44c6580eb8SAdrian-Ken Rueegsegger 
rmd160_transform(u32 * state,const __le32 * in)45caee1688SHarvey Harrison static void rmd160_transform(u32 *state, const __le32 *in)
46c6580eb8SAdrian-Ken Rueegsegger {
47c6580eb8SAdrian-Ken Rueegsegger 	u32 aa, bb, cc, dd, ee, aaa, bbb, ccc, ddd, eee;
48c6580eb8SAdrian-Ken Rueegsegger 
49c6580eb8SAdrian-Ken Rueegsegger 	/* Initialize left lane */
50c6580eb8SAdrian-Ken Rueegsegger 	aa = state[0];
51c6580eb8SAdrian-Ken Rueegsegger 	bb = state[1];
52c6580eb8SAdrian-Ken Rueegsegger 	cc = state[2];
53c6580eb8SAdrian-Ken Rueegsegger 	dd = state[3];
54c6580eb8SAdrian-Ken Rueegsegger 	ee = state[4];
55c6580eb8SAdrian-Ken Rueegsegger 
56c6580eb8SAdrian-Ken Rueegsegger 	/* Initialize right lane */
57c6580eb8SAdrian-Ken Rueegsegger 	aaa = state[0];
58c6580eb8SAdrian-Ken Rueegsegger 	bbb = state[1];
59c6580eb8SAdrian-Ken Rueegsegger 	ccc = state[2];
60c6580eb8SAdrian-Ken Rueegsegger 	ddd = state[3];
61c6580eb8SAdrian-Ken Rueegsegger 	eee = state[4];
62c6580eb8SAdrian-Ken Rueegsegger 
63c6580eb8SAdrian-Ken Rueegsegger 	/* round 1: left lane */
64c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F1, K1, in[0],  11);
65c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F1, K1, in[1],  14);
66c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F1, K1, in[2],  15);
67c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F1, K1, in[3],  12);
68c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F1, K1, in[4],   5);
69c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F1, K1, in[5],   8);
70c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F1, K1, in[6],   7);
71c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F1, K1, in[7],   9);
72c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F1, K1, in[8],  11);
73c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F1, K1, in[9],  13);
74c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F1, K1, in[10], 14);
75c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F1, K1, in[11], 15);
76c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F1, K1, in[12],  6);
77c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F1, K1, in[13],  7);
78c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F1, K1, in[14],  9);
79c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F1, K1, in[15],  8);
80c6580eb8SAdrian-Ken Rueegsegger 
81c6580eb8SAdrian-Ken Rueegsegger 	/* round 2: left lane" */
82c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F2, K2, in[7],   7);
83c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F2, K2, in[4],   6);
84c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F2, K2, in[13],  8);
85c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F2, K2, in[1],  13);
86c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F2, K2, in[10], 11);
87c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F2, K2, in[6],   9);
88c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F2, K2, in[15],  7);
89c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F2, K2, in[3],  15);
90c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F2, K2, in[12],  7);
91c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F2, K2, in[0],  12);
92c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F2, K2, in[9],  15);
93c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F2, K2, in[5],   9);
94c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F2, K2, in[2],  11);
95c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F2, K2, in[14],  7);
96c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F2, K2, in[11], 13);
97c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F2, K2, in[8],  12);
98c6580eb8SAdrian-Ken Rueegsegger 
99c6580eb8SAdrian-Ken Rueegsegger 	/* round 3: left lane" */
100c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F3, K3, in[3],  11);
101c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F3, K3, in[10], 13);
102c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F3, K3, in[14],  6);
103c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F3, K3, in[4],   7);
104c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F3, K3, in[9],  14);
105c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F3, K3, in[15],  9);
106c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F3, K3, in[8],  13);
107c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F3, K3, in[1],  15);
108c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F3, K3, in[2],  14);
109c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F3, K3, in[7],   8);
110c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F3, K3, in[0],  13);
111c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F3, K3, in[6],   6);
112c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F3, K3, in[13],  5);
113c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F3, K3, in[11], 12);
114c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F3, K3, in[5],   7);
115c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F3, K3, in[12],  5);
116c6580eb8SAdrian-Ken Rueegsegger 
117c6580eb8SAdrian-Ken Rueegsegger 	/* round 4: left lane" */
118c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F4, K4, in[1],  11);
119c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F4, K4, in[9],  12);
120c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F4, K4, in[11], 14);
121c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F4, K4, in[10], 15);
122c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F4, K4, in[0],  14);
123c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F4, K4, in[8],  15);
124c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F4, K4, in[12],  9);
125c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F4, K4, in[4],   8);
126c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F4, K4, in[13],  9);
127c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F4, K4, in[3],  14);
128c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F4, K4, in[7],   5);
129c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F4, K4, in[15],  6);
130c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F4, K4, in[14],  8);
131c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F4, K4, in[5],   6);
132c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F4, K4, in[6],   5);
133c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F4, K4, in[2],  12);
134c6580eb8SAdrian-Ken Rueegsegger 
135c6580eb8SAdrian-Ken Rueegsegger 	/* round 5: left lane" */
136c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F5, K5, in[4],   9);
137c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F5, K5, in[0],  15);
138c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F5, K5, in[5],   5);
139c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F5, K5, in[9],  11);
140c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F5, K5, in[7],   6);
141c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F5, K5, in[12],  8);
142c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F5, K5, in[2],  13);
143c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F5, K5, in[10], 12);
144c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F5, K5, in[14],  5);
145c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F5, K5, in[1],  12);
146c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F5, K5, in[3],  13);
147c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aa, bb, cc, dd, ee, F5, K5, in[8],  14);
148c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ee, aa, bb, cc, dd, F5, K5, in[11], 11);
149c6580eb8SAdrian-Ken Rueegsegger 	ROUND(dd, ee, aa, bb, cc, F5, K5, in[6],   8);
150c6580eb8SAdrian-Ken Rueegsegger 	ROUND(cc, dd, ee, aa, bb, F5, K5, in[15],  5);
151c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bb, cc, dd, ee, aa, F5, K5, in[13],  6);
152c6580eb8SAdrian-Ken Rueegsegger 
153c6580eb8SAdrian-Ken Rueegsegger 	/* round 1: right lane */
154c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[5],   8);
155c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[14],  9);
156c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[7],   9);
157c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[0],  11);
158c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[9],  13);
159c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[2],  15);
160c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[11], 15);
161c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[4],   5);
162c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[13],  7);
163c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[6],   7);
164c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[15],  8);
165c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[8],  11);
166c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[1],  14);
167c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[10], 14);
168c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[3],  12);
169c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[12],  6);
170c6580eb8SAdrian-Ken Rueegsegger 
171c6580eb8SAdrian-Ken Rueegsegger 	/* round 2: right lane */
172c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[6],   9);
173c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[11], 13);
174c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[3],  15);
175c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[7],   7);
176c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[0],  12);
177c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[13],  8);
178c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[5],   9);
179c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[10], 11);
180c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[14],  7);
181c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[15],  7);
182c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[8],  12);
183c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[12],  7);
184c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[4],   6);
185c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[9],  15);
186c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[1],  13);
187c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[2],  11);
188c6580eb8SAdrian-Ken Rueegsegger 
189c6580eb8SAdrian-Ken Rueegsegger 	/* round 3: right lane */
190c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[15],  9);
191c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[5],   7);
192c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[1],  15);
193c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[3],  11);
194c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[7],   8);
195c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[14],  6);
196c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[6],   6);
197c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[9],  14);
198c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[11], 12);
199c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[8],  13);
200c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[12],  5);
201c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[2],  14);
202c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[10], 13);
203c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[0],  13);
204c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[4],   7);
205c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[13],  5);
206c6580eb8SAdrian-Ken Rueegsegger 
207c6580eb8SAdrian-Ken Rueegsegger 	/* round 4: right lane */
208c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[8],  15);
209c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[6],   5);
210c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[4],   8);
211c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[1],  11);
212c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[3],  14);
213c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[11], 14);
214c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[15],  6);
215c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[0],  14);
216c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[5],   6);
217c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[12],  9);
218c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[2],  12);
219c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[13],  9);
220c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[9],  12);
221c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[7],   5);
222c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[10], 15);
223c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[14],  8);
224c6580eb8SAdrian-Ken Rueegsegger 
225c6580eb8SAdrian-Ken Rueegsegger 	/* round 5: right lane */
226c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[12],  8);
227c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[15],  5);
228c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[10], 12);
229c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[4],   9);
230c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[1],  12);
231c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[5],   5);
232c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[8],  14);
233c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[7],   6);
234c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[6],   8);
235c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[2],  13);
236c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[13],  6);
237c6580eb8SAdrian-Ken Rueegsegger 	ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[14],  5);
238c6580eb8SAdrian-Ken Rueegsegger 	ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[0],  15);
239c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[3],  13);
240c6580eb8SAdrian-Ken Rueegsegger 	ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[9],  11);
241c6580eb8SAdrian-Ken Rueegsegger 	ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[11], 11);
242c6580eb8SAdrian-Ken Rueegsegger 
243c6580eb8SAdrian-Ken Rueegsegger 	/* combine results */
244c6580eb8SAdrian-Ken Rueegsegger 	ddd += cc + state[1];		/* final result for state[0] */
245c6580eb8SAdrian-Ken Rueegsegger 	state[1] = state[2] + dd + eee;
246c6580eb8SAdrian-Ken Rueegsegger 	state[2] = state[3] + ee + aaa;
247c6580eb8SAdrian-Ken Rueegsegger 	state[3] = state[4] + aa + bbb;
248c6580eb8SAdrian-Ken Rueegsegger 	state[4] = state[0] + bb + ccc;
249c6580eb8SAdrian-Ken Rueegsegger 	state[0] = ddd;
250c6580eb8SAdrian-Ken Rueegsegger }
251c6580eb8SAdrian-Ken Rueegsegger 
rmd160_init(struct shash_desc * desc)252e5835fbaSHerbert Xu static int rmd160_init(struct shash_desc *desc)
253c6580eb8SAdrian-Ken Rueegsegger {
254e5835fbaSHerbert Xu 	struct rmd160_ctx *rctx = shash_desc_ctx(desc);
255c6580eb8SAdrian-Ken Rueegsegger 
256c6580eb8SAdrian-Ken Rueegsegger 	rctx->byte_count = 0;
257c6580eb8SAdrian-Ken Rueegsegger 
258c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[0] = RMD_H0;
259c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[1] = RMD_H1;
260c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[2] = RMD_H2;
261c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[3] = RMD_H3;
262c6580eb8SAdrian-Ken Rueegsegger 	rctx->state[4] = RMD_H4;
263c6580eb8SAdrian-Ken Rueegsegger 
264e5835fbaSHerbert Xu 	return 0;
265c6580eb8SAdrian-Ken Rueegsegger }
266c6580eb8SAdrian-Ken Rueegsegger 
rmd160_update(struct shash_desc * desc,const u8 * data,unsigned int len)267e5835fbaSHerbert Xu static int rmd160_update(struct shash_desc *desc, const u8 *data,
268c6580eb8SAdrian-Ken Rueegsegger 			 unsigned int len)
269c6580eb8SAdrian-Ken Rueegsegger {
2704a7e1e81SHerbert Xu 	int remain = len - round_down(len, RMD160_BLOCK_SIZE);
271e5835fbaSHerbert Xu 	struct rmd160_ctx *rctx = shash_desc_ctx(desc);
2724a7e1e81SHerbert Xu 	__le32 buffer[RMD160_BLOCK_SIZE / 4];
273c6580eb8SAdrian-Ken Rueegsegger 
2744a7e1e81SHerbert Xu 	rctx->byte_count += len - remain;
275c6580eb8SAdrian-Ken Rueegsegger 
2764a7e1e81SHerbert Xu 	do {
2774a7e1e81SHerbert Xu 		memcpy(buffer, data, sizeof(buffer));
2784a7e1e81SHerbert Xu 		rmd160_transform(rctx->state, buffer);
2794a7e1e81SHerbert Xu 		data += sizeof(buffer);
2804a7e1e81SHerbert Xu 		len -= sizeof(buffer);
2814a7e1e81SHerbert Xu 	} while (len >= sizeof(buffer));
282c6580eb8SAdrian-Ken Rueegsegger 
2834a7e1e81SHerbert Xu 	memzero_explicit(buffer, sizeof(buffer));
2844a7e1e81SHerbert Xu 	return remain;
285c6580eb8SAdrian-Ken Rueegsegger }
286c6580eb8SAdrian-Ken Rueegsegger 
287c6580eb8SAdrian-Ken Rueegsegger /* Add padding and return the message digest. */
rmd160_finup(struct shash_desc * desc,const u8 * src,unsigned int len,u8 * out)2884a7e1e81SHerbert Xu static int rmd160_finup(struct shash_desc *desc, const u8 *src,
2894a7e1e81SHerbert Xu 			unsigned int len, u8 *out)
290c6580eb8SAdrian-Ken Rueegsegger {
2914a7e1e81SHerbert Xu 	unsigned int bit_offset = RMD160_BLOCK_SIZE / 8 - 1;
292e5835fbaSHerbert Xu 	struct rmd160_ctx *rctx = shash_desc_ctx(desc);
2934a7e1e81SHerbert Xu 	union {
2944a7e1e81SHerbert Xu 		__le64 l64[RMD160_BLOCK_SIZE / 4];
2954a7e1e81SHerbert Xu 		__le32 l32[RMD160_BLOCK_SIZE / 2];
2964a7e1e81SHerbert Xu 		u8 u8[RMD160_BLOCK_SIZE * 2];
2974a7e1e81SHerbert Xu 	} block = {};
298caee1688SHarvey Harrison 	__le32 *dst = (__le32 *)out;
2994a7e1e81SHerbert Xu 	u32 i;
300c928a0cdSAdrian-Ken Rueegsegger 
3014a7e1e81SHerbert Xu 	rctx->byte_count += len;
3024a7e1e81SHerbert Xu 	if (len >= bit_offset * 8)
3034a7e1e81SHerbert Xu 		bit_offset += RMD160_BLOCK_SIZE / 8;
3044a7e1e81SHerbert Xu 	memcpy(&block, src, len);
3054a7e1e81SHerbert Xu 	block.u8[len] = 0x80;
3064a7e1e81SHerbert Xu 	block.l64[bit_offset] = cpu_to_le64(rctx->byte_count << 3);
307c6580eb8SAdrian-Ken Rueegsegger 
3084a7e1e81SHerbert Xu 	rmd160_transform(rctx->state, block.l32);
3094a7e1e81SHerbert Xu 	if (bit_offset > RMD160_BLOCK_SIZE / 8)
3104a7e1e81SHerbert Xu 		rmd160_transform(rctx->state,
3114a7e1e81SHerbert Xu 				 block.l32 + RMD160_BLOCK_SIZE / 4);
3124a7e1e81SHerbert Xu 	memzero_explicit(&block, sizeof(block));
313c6580eb8SAdrian-Ken Rueegsegger 
314c6580eb8SAdrian-Ken Rueegsegger 	/* Store state in digest */
315c928a0cdSAdrian-Ken Rueegsegger 	for (i = 0; i < 5; i++)
3165cdcc22fSHerbert Xu 		dst[i] = cpu_to_le32p(&rctx->state[i]);
317e5835fbaSHerbert Xu 	return 0;
318c6580eb8SAdrian-Ken Rueegsegger }
319c6580eb8SAdrian-Ken Rueegsegger 
320e5835fbaSHerbert Xu static struct shash_alg alg = {
321e5835fbaSHerbert Xu 	.digestsize	=	RMD160_DIGEST_SIZE,
322e5835fbaSHerbert Xu 	.init		=	rmd160_init,
323e5835fbaSHerbert Xu 	.update		=	rmd160_update,
3244a7e1e81SHerbert Xu 	.finup		=	rmd160_finup,
325e5835fbaSHerbert Xu 	.descsize	=	sizeof(struct rmd160_ctx),
326e5835fbaSHerbert Xu 	.base		=	{
327c6580eb8SAdrian-Ken Rueegsegger 		.cra_name	 =	"rmd160",
328d6ebf528SEric Biggers 		.cra_driver_name =	"rmd160-generic",
3294a7e1e81SHerbert Xu 		.cra_flags	 =	CRYPTO_AHASH_ALG_BLOCK_ONLY,
330c6580eb8SAdrian-Ken Rueegsegger 		.cra_blocksize	 =	RMD160_BLOCK_SIZE,
331c6580eb8SAdrian-Ken Rueegsegger 		.cra_module	 =	THIS_MODULE,
332e5835fbaSHerbert Xu 	}
333c6580eb8SAdrian-Ken Rueegsegger };
334c6580eb8SAdrian-Ken Rueegsegger 
rmd160_mod_init(void)335c6580eb8SAdrian-Ken Rueegsegger static int __init rmd160_mod_init(void)
336c6580eb8SAdrian-Ken Rueegsegger {
337e5835fbaSHerbert Xu 	return crypto_register_shash(&alg);
338c6580eb8SAdrian-Ken Rueegsegger }
339c6580eb8SAdrian-Ken Rueegsegger 
rmd160_mod_fini(void)340c6580eb8SAdrian-Ken Rueegsegger static void __exit rmd160_mod_fini(void)
341c6580eb8SAdrian-Ken Rueegsegger {
342e5835fbaSHerbert Xu 	crypto_unregister_shash(&alg);
343c6580eb8SAdrian-Ken Rueegsegger }
344c6580eb8SAdrian-Ken Rueegsegger 
345*ef93f156SHerbert Xu module_init(rmd160_mod_init);
346c6580eb8SAdrian-Ken Rueegsegger module_exit(rmd160_mod_fini);
347c6580eb8SAdrian-Ken Rueegsegger 
348c6580eb8SAdrian-Ken Rueegsegger MODULE_LICENSE("GPL");
3493181c225SAdrian-Ken Rueegsegger MODULE_AUTHOR("Adrian-Ken Rueegsegger <ken@codelabs.ch>");
350c6580eb8SAdrian-Ken Rueegsegger MODULE_DESCRIPTION("RIPEMD-160 Message Digest");
3515d26a105SKees Cook MODULE_ALIAS_CRYPTO("rmd160");
352