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