2 * Glue code for the SHA256 Secure Hash Algorithm assembly implementation
3 * using NEON instructions.
5 * Copyright © 2015 Google Inc.
7 * This file is based on sha512_neon_glue.c:
8 * Copyright © 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the Free
12 * Software Foundation; either version 2 of the License, or (at your option)
17 #include <crypto/internal/hash.h>
18 #include <linux/cryptohash.h>
19 #include <linux/types.h>
20 #include <linux/string.h>
21 #include <crypto/sha.h>
22 #include <crypto/sha256_base.h>
23 #include <asm/byteorder.h>
27 #include "sha256_glue.h"
29 asmlinkage
void sha256_block_data_order_neon(u32
*digest
, const void *data
,
30 unsigned int num_blks
);
32 static int sha256_update(struct shash_desc
*desc
, const u8
*data
,
35 struct sha256_state
*sctx
= shash_desc_ctx(desc
);
37 if (!may_use_simd() ||
38 (sctx
->count
% SHA256_BLOCK_SIZE
) + len
< SHA256_BLOCK_SIZE
)
39 return crypto_sha256_arm_update(desc
, data
, len
);
42 sha256_base_do_update(desc
, data
, len
,
43 (sha256_block_fn
*)sha256_block_data_order_neon
);
49 static int sha256_finup(struct shash_desc
*desc
, const u8
*data
,
50 unsigned int len
, u8
*out
)
53 return crypto_sha256_arm_finup(desc
, data
, len
, out
);
57 sha256_base_do_update(desc
, data
, len
,
58 (sha256_block_fn
*)sha256_block_data_order_neon
);
59 sha256_base_do_finalize(desc
,
60 (sha256_block_fn
*)sha256_block_data_order_neon
);
63 return sha256_base_finish(desc
, out
);
66 static int sha256_final(struct shash_desc
*desc
, u8
*out
)
68 return sha256_finup(desc
, NULL
, 0, out
);
71 struct shash_alg sha256_neon_algs
[] = { {
72 .digestsize
= SHA256_DIGEST_SIZE
,
73 .init
= sha256_base_init
,
74 .update
= sha256_update
,
75 .final
= sha256_final
,
76 .finup
= sha256_finup
,
77 .descsize
= sizeof(struct sha256_state
),
80 .cra_driver_name
= "sha256-neon",
82 .cra_flags
= CRYPTO_ALG_TYPE_SHASH
,
83 .cra_blocksize
= SHA256_BLOCK_SIZE
,
84 .cra_module
= THIS_MODULE
,
87 .digestsize
= SHA224_DIGEST_SIZE
,
88 .init
= sha224_base_init
,
89 .update
= sha256_update
,
90 .final
= sha256_final
,
91 .finup
= sha256_finup
,
92 .descsize
= sizeof(struct sha256_state
),
95 .cra_driver_name
= "sha224-neon",
97 .cra_flags
= CRYPTO_ALG_TYPE_SHASH
,
98 .cra_blocksize
= SHA224_BLOCK_SIZE
,
99 .cra_module
= THIS_MODULE
,