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>
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>
16c6580eb8SAdrian-Ken Rueegsegger #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];
23caee1688SHarvey Harrison __le32 buffer[16];
24c6580eb8SAdrian-Ken Rueegsegger };
25c6580eb8SAdrian-Ken Rueegsegger
26ba6b0398SAdrian-Ken Rueegsegger #define K1 RMD_K1
27ba6b0398SAdrian-Ken Rueegsegger #define K2 RMD_K2
28ba6b0398SAdrian-Ken Rueegsegger #define K3 RMD_K3
29ba6b0398SAdrian-Ken Rueegsegger #define K4 RMD_K4
30ba6b0398SAdrian-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
36c6580eb8SAdrian-Ken Rueegsegger
37c6580eb8SAdrian-Ken Rueegsegger #define F1(x, y, z) (x ^ y ^ z) /* XOR */
38c6580eb8SAdrian-Ken Rueegsegger #define F2(x, y, z) (z ^ (x & (y ^ z))) /* x ? y : z */
39c6580eb8SAdrian-Ken Rueegsegger #define F3(x, y, z) ((x | ~y) ^ z)
40c6580eb8SAdrian-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) { \
445cdcc22fSHerbert Xu (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)49caee1688SHarvey Harrison 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 */
54c6580eb8SAdrian-Ken Rueegsegger 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)256e5835fbaSHerbert Xu static int rmd160_init(struct shash_desc *desc)
257c6580eb8SAdrian-Ken Rueegsegger {
258e5835fbaSHerbert Xu struct rmd160_ctx *rctx = shash_desc_ctx(desc);
259c6580eb8SAdrian-Ken Rueegsegger
260c6580eb8SAdrian-Ken Rueegsegger rctx->byte_count = 0;
261c6580eb8SAdrian-Ken Rueegsegger
262c6580eb8SAdrian-Ken Rueegsegger rctx->state[0] = RMD_H0;
263c6580eb8SAdrian-Ken Rueegsegger 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));
269e5835fbaSHerbert Xu
270e5835fbaSHerbert Xu return 0;
271c6580eb8SAdrian-Ken Rueegsegger }
272c6580eb8SAdrian-Ken Rueegsegger
rmd160_update(struct shash_desc * desc,const u8 * data,unsigned int len)273e5835fbaSHerbert Xu static int rmd160_update(struct shash_desc *desc, const u8 *data,
274c6580eb8SAdrian-Ken Rueegsegger unsigned int len)
275c6580eb8SAdrian-Ken Rueegsegger {
276e5835fbaSHerbert Xu struct rmd160_ctx *rctx = shash_desc_ctx(desc);
277c6580eb8SAdrian-Ken Rueegsegger const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f);
278c6580eb8SAdrian-Ken Rueegsegger
279c6580eb8SAdrian-Ken Rueegsegger rctx->byte_count += len;
280c6580eb8SAdrian-Ken Rueegsegger
281c6580eb8SAdrian-Ken Rueegsegger /* 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);
285e5835fbaSHerbert Xu goto out;
286c6580eb8SAdrian-Ken Rueegsegger }
287c6580eb8SAdrian-Ken Rueegsegger
288c6580eb8SAdrian-Ken Rueegsegger memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
289c6580eb8SAdrian-Ken Rueegsegger data, avail);
290c6580eb8SAdrian-Ken Rueegsegger
291c928a0cdSAdrian-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)) {
296c6580eb8SAdrian-Ken Rueegsegger memcpy(rctx->buffer, data, sizeof(rctx->buffer));
297c928a0cdSAdrian-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
302c6580eb8SAdrian-Ken Rueegsegger memcpy(rctx->buffer, data, len);
303e5835fbaSHerbert Xu
304e5835fbaSHerbert Xu out:
305e5835fbaSHerbert Xu return 0;
306c6580eb8SAdrian-Ken Rueegsegger }
307c6580eb8SAdrian-Ken Rueegsegger
308c6580eb8SAdrian-Ken Rueegsegger /* 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)
310c6580eb8SAdrian-Ken Rueegsegger {
311e5835fbaSHerbert Xu struct rmd160_ctx *rctx = shash_desc_ctx(desc);
312c928a0cdSAdrian-Ken Rueegsegger u32 i, index, padlen;
313caee1688SHarvey Harrison __le64 bits;
314caee1688SHarvey Harrison __le32 *dst = (__le32 *)out;
315c6580eb8SAdrian-Ken Rueegsegger static const u8 padding[64] = { 0x80, };
316c928a0cdSAdrian-Ken Rueegsegger
317c928a0cdSAdrian-Ken Rueegsegger bits = cpu_to_le64(rctx->byte_count << 3);
318c6580eb8SAdrian-Ken Rueegsegger
319c6580eb8SAdrian-Ken Rueegsegger /* Pad out to 56 mod 64 */
320c6580eb8SAdrian-Ken Rueegsegger index = rctx->byte_count & 0x3f;
321c6580eb8SAdrian-Ken Rueegsegger padlen = (index < 56) ? (56 - index) : ((64+56) - index);
322e5835fbaSHerbert Xu rmd160_update(desc, padding, padlen);
323c6580eb8SAdrian-Ken Rueegsegger
324c6580eb8SAdrian-Ken Rueegsegger /* Append length */
325e5835fbaSHerbert Xu rmd160_update(desc, (const u8 *)&bits, sizeof(bits));
326c6580eb8SAdrian-Ken Rueegsegger
327c6580eb8SAdrian-Ken Rueegsegger /* Store state in digest */
328c928a0cdSAdrian-Ken Rueegsegger for (i = 0; i < 5; i++)
3295cdcc22fSHerbert Xu dst[i] = cpu_to_le32p(&rctx->state[i]);
330c6580eb8SAdrian-Ken Rueegsegger
331c6580eb8SAdrian-Ken Rueegsegger /* Wipe context */
332c6580eb8SAdrian-Ken Rueegsegger memset(rctx, 0, sizeof(*rctx));
333e5835fbaSHerbert Xu
334e5835fbaSHerbert Xu return 0;
335c6580eb8SAdrian-Ken Rueegsegger }
336c6580eb8SAdrian-Ken Rueegsegger
337e5835fbaSHerbert Xu static struct shash_alg alg = {
338e5835fbaSHerbert Xu .digestsize = RMD160_DIGEST_SIZE,
339e5835fbaSHerbert Xu .init = rmd160_init,
340e5835fbaSHerbert Xu .update = rmd160_update,
341e5835fbaSHerbert Xu .final = rmd160_final,
342e5835fbaSHerbert Xu .descsize = sizeof(struct rmd160_ctx),
343e5835fbaSHerbert Xu .base = {
344c6580eb8SAdrian-Ken Rueegsegger .cra_name = "rmd160",
345*d6ebf528SEric Biggers .cra_driver_name = "rmd160-generic",
346c6580eb8SAdrian-Ken Rueegsegger .cra_blocksize = RMD160_BLOCK_SIZE,
347c6580eb8SAdrian-Ken Rueegsegger .cra_module = THIS_MODULE,
348e5835fbaSHerbert Xu }
349c6580eb8SAdrian-Ken Rueegsegger };
350c6580eb8SAdrian-Ken Rueegsegger
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
361c4741b23SEric Biggers subsys_initcall(rmd160_mod_init);
362c6580eb8SAdrian-Ken Rueegsegger module_exit(rmd160_mod_fini);
363c6580eb8SAdrian-Ken Rueegsegger
364c6580eb8SAdrian-Ken Rueegsegger MODULE_LICENSE("GPL");
3653181c225SAdrian-Ken Rueegsegger MODULE_AUTHOR("Adrian-Ken Rueegsegger <ken@codelabs.ch>");
366c6580eb8SAdrian-Ken Rueegsegger MODULE_DESCRIPTION("RIPEMD-160 Message Digest");
3675d26a105SKees Cook MODULE_ALIAS_CRYPTO("rmd160");
368