/* SPDX-License-Identifier: GPL-2.0-only */
/*
* sha256-ce.S - SHA-224/256 secure hash using ARMv8 Crypto Extensions
*
* Copyright (C) 2015 Linaro Ltd.
* Author: Ard Biesheuvel <ard.biesheuvel@linaro.org>
*/
#include <linux/linkage.h>
#include <asm/assembler.h>
.text
.arch armv8-a
.fpu crypto-neon-fp-armv8
k0 .req q7
k1 .req q8
rk .req r3
ta0 .req q9
ta1 .req q10
tb0 .req q10
tb1 .req q9
dga .req q11
dgb .req q12
dg0 .req q13
dg1 .req q14
dg2 .req q15
.macro add_only, ev, s0
vmov dg2, dg0
.ifnb \s0
vld1.32 {k\ev}, [rk, :128 ]!
.endif
sha256h.32 dg0, dg1, tb\ev
sha256h2.32 dg1, dg2, tb\ev
.ifnb \s0
vadd.u32 ta\ev, q\s0, k\ev
.endif
.endm
.macro add_update, ev, s0, s1, s2, s3
sha256su0.32 q\s0, q\s1
add_only \ev, \s1
sha256su1.32 q\s0, q\s2, q\s3
.endm
.align 6
.Lsha256_rcon:
.word 0 x428a2f98, 0 x71374491, 0 xb5c0fbcf, 0 xe9b5dba5
.word 0 x3956c25b, 0 x59f111f1, 0 x923f82a4, 0 xab1c5ed5
.word 0 xd807aa98, 0 x12835b01, 0 x243185be, 0 x550c7dc3
.word 0 x72be5d74, 0 x80deb1fe, 0 x9bdc06a7, 0 xc19bf174
.word 0 xe49b69c1, 0 xefbe4786, 0 x0fc19dc6, 0 x240ca1cc
.word 0 x2de92c6f, 0 x4a7484aa, 0 x5cb0a9dc, 0 x76f988da
.word 0 x983e5152, 0 xa831c66d, 0 xb00327c8, 0 xbf597fc7
.word 0 xc6e00bf3, 0 xd5a79147, 0 x06ca6351, 0 x14292967
.word 0 x27b70a85, 0 x2e1b2138, 0 x4d2c6dfc, 0 x53380d13
.word 0 x650a7354, 0 x766a0abb, 0 x81c2c92e, 0 x92722c85
.word 0 xa2bfe8a1, 0 xa81a664b, 0 xc24b8b70, 0 xc76c51a3
.word 0 xd192e819, 0 xd6990624, 0 xf40e3585, 0 x106aa070
.word 0 x19a4c116, 0 x1e376c08, 0 x2748774c, 0 x34b0bcb5
.word 0 x391c0cb3, 0 x4ed8aa4a, 0 x5b9cca4f, 0 x682e6ff3
.word 0 x748f82ee, 0 x78a5636f, 0 x84c87814, 0 x8cc70208
.word 0 x90befffa, 0 xa4506ceb, 0 xbef9a3f7, 0 xc67178f2
/*
* void sha256_ce_transform(struct sha256_block_state *state,
* const u8 *data, size_t nblocks);
*/
ENTRY(sha256_ce_transform)
/* load state */
vld1.32 {dga-dgb}, [r0]
/* load input */
0 : vld1.32 {q0-q1}, [r1]!
vld1.32 {q2-q3}, [r1]!
subs r2, r2, #1
#ifndef CONFIG_CPU_BIG_ENDIAN
vrev32.8 q0, q0
vrev32.8 q1, q1
vrev32.8 q2, q2
vrev32.8 q3, q3
#endif
/* load first round constant */
adr rk, .Lsha256_rcon
vld1.32 {k0}, [rk, :128 ]!
vadd.u32 ta0, q0, k0
vmov dg0, dga
vmov dg1, dgb
add_update 1 , 0 , 1 , 2 , 3
add_update 0 , 1 , 2 , 3 , 0
add_update 1 , 2 , 3 , 0 , 1
add_update 0 , 3 , 0 , 1 , 2
add_update 1 , 0 , 1 , 2 , 3
add_update 0 , 1 , 2 , 3 , 0
add_update 1 , 2 , 3 , 0 , 1
add_update 0 , 3 , 0 , 1 , 2
add_update 1 , 0 , 1 , 2 , 3
add_update 0 , 1 , 2 , 3 , 0
add_update 1 , 2 , 3 , 0 , 1
add_update 0 , 3 , 0 , 1 , 2
add_only 1 , 1
add_only 0 , 2
add_only 1 , 3
add_only 0
/* update state */
vadd.u32 dga, dga, dg0
vadd.u32 dgb, dgb, dg1
bne 0 b
/* store new state */
vst1.32 {dga-dgb}, [r0]
bx lr
ENDPROC(sha256_ce_transform)
Messung V0.5 in Prozent C=75 H=93 G=84
¤ Dauer der Verarbeitung: 0.7 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland