diff options
author | Adrian-Ken Rueegsegger <rueegsegger@swiss-it.ch> | 2008-05-26 06:33:44 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2008-07-10 08:35:15 -0400 |
commit | 2952ff1a598ce300c911d00d82872d00ca8b61ca (patch) | |
tree | 09ba233e8291144f6e149abd1743117dacfa1fe5 /crypto | |
parent | c928a0cddd070720268013fd012508059aa3de5a (diff) |
[CRYPTO] rmd256: Fix endian issues
This patch fixes endian issues making rmd256 work
properly on big-endian machines.
Signed-off-by: Adrian-Ken Rueegsegger <rueegsegger@swiss-it.ch>
Acked-by: Sebastian Siewior <sebastian@breakpoint.cc>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/rmd256.c | 37 |
1 files changed, 9 insertions, 28 deletions
diff --git a/crypto/rmd256.c b/crypto/rmd256.c index 060ee81cb8ad..88f2203751ae 100644 --- a/crypto/rmd256.c +++ b/crypto/rmd256.c | |||
@@ -44,7 +44,7 @@ struct rmd256_ctx { | |||
44 | #define F4(x, y, z) (y ^ (z & (x ^ y))) /* z ? x : y */ | 44 | #define F4(x, y, z) (y ^ (z & (x ^ y))) /* z ? x : y */ |
45 | 45 | ||
46 | #define ROUND(a, b, c, d, f, k, x, s) { \ | 46 | #define ROUND(a, b, c, d, f, k, x, s) { \ |
47 | (a) += f((b), (c), (d)) + (x) + (k); \ | 47 | (a) += f((b), (c), (d)) + le32_to_cpu(x) + (k); \ |
48 | (a) = rol32((a), (s)); \ | 48 | (a) = rol32((a), (s)); \ |
49 | } | 49 | } |
50 | 50 | ||
@@ -233,28 +233,6 @@ static void rmd256_transform(u32 *state, u32 const *in) | |||
233 | return; | 233 | return; |
234 | } | 234 | } |
235 | 235 | ||
236 | static inline void le32_to_cpu_array(u32 *buf, unsigned int words) | ||
237 | { | ||
238 | while (words--) { | ||
239 | le32_to_cpus(buf); | ||
240 | buf++; | ||
241 | } | ||
242 | } | ||
243 | |||
244 | static inline void cpu_to_le32_array(u32 *buf, unsigned int words) | ||
245 | { | ||
246 | while (words--) { | ||
247 | cpu_to_le32s(buf); | ||
248 | buf++; | ||
249 | } | ||
250 | } | ||
251 | |||
252 | static inline void rmd256_transform_helper(struct rmd256_ctx *ctx) | ||
253 | { | ||
254 | le32_to_cpu_array(ctx->buffer, sizeof(ctx->buffer) / sizeof(u32)); | ||
255 | rmd256_transform(ctx->state, ctx->buffer); | ||
256 | } | ||
257 | |||
258 | static void rmd256_init(struct crypto_tfm *tfm) | 236 | static void rmd256_init(struct crypto_tfm *tfm) |
259 | { | 237 | { |
260 | struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm); | 238 | struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm); |
@@ -291,13 +269,13 @@ static void rmd256_update(struct crypto_tfm *tfm, const u8 *data, | |||
291 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), | 269 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), |
292 | data, avail); | 270 | data, avail); |
293 | 271 | ||
294 | rmd256_transform_helper(rctx); | 272 | rmd256_transform(rctx->state, rctx->buffer); |
295 | data += avail; | 273 | data += avail; |
296 | len -= avail; | 274 | len -= avail; |
297 | 275 | ||
298 | while (len >= sizeof(rctx->buffer)) { | 276 | while (len >= sizeof(rctx->buffer)) { |
299 | memcpy(rctx->buffer, data, sizeof(rctx->buffer)); | 277 | memcpy(rctx->buffer, data, sizeof(rctx->buffer)); |
300 | rmd256_transform_helper(rctx); | 278 | rmd256_transform(rctx->state, rctx->buffer); |
301 | data += sizeof(rctx->buffer); | 279 | data += sizeof(rctx->buffer); |
302 | len -= sizeof(rctx->buffer); | 280 | len -= sizeof(rctx->buffer); |
303 | } | 281 | } |
@@ -309,10 +287,12 @@ static void rmd256_update(struct crypto_tfm *tfm, const u8 *data, | |||
309 | static void rmd256_final(struct crypto_tfm *tfm, u8 *out) | 287 | static void rmd256_final(struct crypto_tfm *tfm, u8 *out) |
310 | { | 288 | { |
311 | struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm); | 289 | struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm); |
312 | u32 index, padlen; | 290 | u32 i, index, padlen; |
313 | u64 bits; | 291 | u64 bits; |
292 | u32 *dst = (u32 *)out; | ||
314 | static const u8 padding[64] = { 0x80, }; | 293 | static const u8 padding[64] = { 0x80, }; |
315 | bits = rctx->byte_count << 3; | 294 | |
295 | bits = cpu_to_le64(rctx->byte_count << 3); | ||
316 | 296 | ||
317 | /* Pad out to 56 mod 64 */ | 297 | /* Pad out to 56 mod 64 */ |
318 | index = rctx->byte_count & 0x3f; | 298 | index = rctx->byte_count & 0x3f; |
@@ -323,7 +303,8 @@ static void rmd256_final(struct crypto_tfm *tfm, u8 *out) | |||
323 | rmd256_update(tfm, (const u8 *)&bits, sizeof(bits)); | 303 | rmd256_update(tfm, (const u8 *)&bits, sizeof(bits)); |
324 | 304 | ||
325 | /* Store state in digest */ | 305 | /* Store state in digest */ |
326 | memcpy(out, rctx->state, sizeof(rctx->state)); | 306 | for (i = 0; i < 8; i++) |
307 | dst[i] = cpu_to_le32(rctx->state[i]); | ||
327 | 308 | ||
328 | /* Wipe context */ | 309 | /* Wipe context */ |
329 | memset(rctx, 0, sizeof(*rctx)); | 310 | memset(rctx, 0, sizeof(*rctx)); |