static int sha512_ce_update(struct shash_desc *desc, const u8 *data, unsigned int len) { if (!may_use_simd()) return sha512_base_do_update(desc, data, len, (sha512_block_fn *)sha512_block_data_order); kernel_neon_begin(); sha512_base_do_update(desc, data, len, (sha512_block_fn *)sha512_ce_transform); kernel_neon_end(); return 0; }
int sha512_arm_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { sha512_base_do_update(desc, data, len, (sha512_block_fn *)sha512_block_data_order); return sha512_arm_final(desc, out); }
static int sha512_ce_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { if (!may_use_simd()) { if (len) sha512_base_do_update(desc, data, len, (sha512_block_fn *)sha512_block_data_order); sha512_base_do_finalize(desc, (sha512_block_fn *)sha512_block_data_order); return sha512_base_finish(desc, out); } kernel_neon_begin(); sha512_base_do_update(desc, data, len, (sha512_block_fn *)sha512_ce_transform); sha512_base_do_finalize(desc, (sha512_block_fn *)sha512_ce_transform); kernel_neon_end(); return sha512_base_finish(desc, out); }
static int sha512_ssse3_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { if (!irq_fpu_usable()) return crypto_sha512_finup(desc, data, len, out); kernel_fpu_begin(); if (len) sha512_base_do_update(desc, data, len, (sha512_block_fn *)sha512_transform_asm); sha512_base_do_finalize(desc, (sha512_block_fn *)sha512_transform_asm); kernel_fpu_end(); return sha512_base_finish(desc, out); }
static int sha512_ssse3_update(struct shash_desc *desc, const u8 *data, unsigned int len) { struct sha512_state *sctx = shash_desc_ctx(desc); if (!irq_fpu_usable() || (sctx->count[0] % SHA512_BLOCK_SIZE) + len < SHA512_BLOCK_SIZE) return crypto_sha512_update(desc, data, len); /* make sure casting to sha512_block_fn() is safe */ BUILD_BUG_ON(offsetof(struct sha512_state, state) != 0); kernel_fpu_begin(); sha512_base_do_update(desc, data, len, (sha512_block_fn *)sha512_transform_asm); kernel_fpu_end(); return 0; }
int sha512_arm_update(struct shash_desc *desc, const u8 *data, unsigned int len) { return sha512_base_do_update(desc, data, len, (sha512_block_fn *)sha512_block_data_order); }
int crypto_sha512_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *hash) { sha512_base_do_update(desc, data, len, sha512_generic_block_fn); return sha512_final(desc, hash); }
int crypto_sha512_update(struct shash_desc *desc, const u8 *data, unsigned int len) { return sha512_base_do_update(desc, data, len, sha512_generic_block_fn); }