xref: /openbsd-src/lib/libcrypto/sha/sha512_amd64_generic.S (revision 8a0aadfb071fb49ac298061636c59d85823abbcf)
1*8a0aadfbSjsing/* $OpenBSD: sha512_amd64_generic.S,v 1.1 2024/11/16 14:56:39 jsing Exp $ */
2*8a0aadfbSjsing/*
3*8a0aadfbSjsing * Copyright (c) 2024 Joel Sing <jsing@openbsd.org>
4*8a0aadfbSjsing *
5*8a0aadfbSjsing * Permission to use, copy, modify, and distribute this software for any
6*8a0aadfbSjsing * purpose with or without fee is hereby granted, provided that the above
7*8a0aadfbSjsing * copyright notice and this permission notice appear in all copies.
8*8a0aadfbSjsing *
9*8a0aadfbSjsing * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*8a0aadfbSjsing * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*8a0aadfbSjsing * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*8a0aadfbSjsing * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*8a0aadfbSjsing * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*8a0aadfbSjsing * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*8a0aadfbSjsing * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*8a0aadfbSjsing */
17*8a0aadfbSjsing
18*8a0aadfbSjsing#ifdef __CET__
19*8a0aadfbSjsing#include <cet.h>
20*8a0aadfbSjsing#else
21*8a0aadfbSjsing#define _CET_ENDBR
22*8a0aadfbSjsing#endif
23*8a0aadfbSjsing
24*8a0aadfbSjsing#define	ctx		%rdi
25*8a0aadfbSjsing#define	in		%rsi
26*8a0aadfbSjsing#define	num		%rdx
27*8a0aadfbSjsing
28*8a0aadfbSjsing#define	round		%rdi
29*8a0aadfbSjsing
30*8a0aadfbSjsing#define	hs0		%r8
31*8a0aadfbSjsing#define	hs1		%r9
32*8a0aadfbSjsing#define	hs2		%r10
33*8a0aadfbSjsing#define	hs3		%r11
34*8a0aadfbSjsing#define	hs4		%r12
35*8a0aadfbSjsing#define	hs5		%r13
36*8a0aadfbSjsing#define	hs6		%r14
37*8a0aadfbSjsing#define	hs7		%r15
38*8a0aadfbSjsing
39*8a0aadfbSjsing#define	k512		%rbp
40*8a0aadfbSjsing
41*8a0aadfbSjsing#define	tmp0		%rax
42*8a0aadfbSjsing#define	tmp1		%rbx
43*8a0aadfbSjsing#define	tmp2		%rcx
44*8a0aadfbSjsing#define	tmp3		%rdx
45*8a0aadfbSjsing
46*8a0aadfbSjsing/*
47*8a0aadfbSjsing * Load message into wt, storing a copy in the message schedule:
48*8a0aadfbSjsing *
49*8a0aadfbSjsing *  Wt = Mt
50*8a0aadfbSjsing */
51*8a0aadfbSjsing#define sha512_message_schedule_load(idx, m, w, wt) \
52*8a0aadfbSjsing	movq	(m, round, 8), wt;				\
53*8a0aadfbSjsing	bswapq	wt;						\
54*8a0aadfbSjsing	movq	wt, ((idx&0xf)*8)(w);
55*8a0aadfbSjsing
56*8a0aadfbSjsing/*
57*8a0aadfbSjsing * Update message schedule and return current value in wt:
58*8a0aadfbSjsing *
59*8a0aadfbSjsing *  Wt = sigma1(W(t-2)) + W(t-7) + sigma0(W(t-15)) + W(t-16)
60*8a0aadfbSjsing *
61*8a0aadfbSjsing *  sigma0(x) = ror(x, 1) ^ ror(x, 8) ^ (x >> 7)
62*8a0aadfbSjsing *  sigma1(x) = ror(x, 19) ^ ror(x, 61) ^ (x >> 6)
63*8a0aadfbSjsing *
64*8a0aadfbSjsing */
65*8a0aadfbSjsing#define sha512_message_schedule_update(idx, w, wt) \
66*8a0aadfbSjsing	movq	(((idx-2)&0xf)*8)(w), wt;	/* sigma1 */	\
67*8a0aadfbSjsing	movq	wt, tmp1;			/* sigma1 */	\
68*8a0aadfbSjsing	rorq	$(61-19), tmp1;			/* sigma1 */	\
69*8a0aadfbSjsing	xorq	wt, tmp1;			/* sigma1 */	\
70*8a0aadfbSjsing	rorq	$19, tmp1;			/* sigma1 */	\
71*8a0aadfbSjsing	shrq	$6, wt;				/* sigma1 */	\
72*8a0aadfbSjsing	xorq	tmp1, wt;			/* sigma1 */	\
73*8a0aadfbSjsing	\
74*8a0aadfbSjsing	addq	(((idx-7)&0xf)*8)(w), wt;	/* Wt-7 */	\
75*8a0aadfbSjsing	addq	(((idx-16)&0xf)*8)(w), wt;	/* Wt-16 */	\
76*8a0aadfbSjsing	\
77*8a0aadfbSjsing	movq	(((idx-15)&0xf)*8)(w), tmp2;	/* sigma0 */	\
78*8a0aadfbSjsing	movq	tmp2, tmp3;			/* sigma0 */	\
79*8a0aadfbSjsing	rorq	$(8-1), tmp2;			/* sigma0 */	\
80*8a0aadfbSjsing	xorq	tmp3, tmp2;			/* sigma0 */	\
81*8a0aadfbSjsing	rorq	$1, tmp2;			/* sigma0 */	\
82*8a0aadfbSjsing	shrq	$7, tmp3;			/* sigma0 */	\
83*8a0aadfbSjsing	xorq	tmp3, tmp2;			/* sigma0 */	\
84*8a0aadfbSjsing	addq	tmp2, wt;			/* sigma0 */	\
85*8a0aadfbSjsing	\
86*8a0aadfbSjsing	movq	wt, ((idx&0xf)*8)(w);
87*8a0aadfbSjsing
88*8a0aadfbSjsing/*
89*8a0aadfbSjsing * Compute a SHA-512 round:
90*8a0aadfbSjsing *
91*8a0aadfbSjsing *  T1 = h + Sigma1(e) + Ch(e, f, g) + Kt + Wt
92*8a0aadfbSjsing *  T2 = Sigma0(a) + Maj(a, b, c)
93*8a0aadfbSjsing *
94*8a0aadfbSjsing *  Sigma0(x) = ror(x, 28) ^ ror(x, 34) ^ ror(x, 39)
95*8a0aadfbSjsing *  Sigma1(x) = ror(x, 14) ^ ror(x, 18) ^ ror(x, 41)
96*8a0aadfbSjsing *  Ch(x, y, z) = (x & y) ^ (~x & z) = ((y ^ z) & x) ^ z
97*8a0aadfbSjsing *  Maj(x, y, z) = (x & y) ^ (x & z) ^ (y & z) = ((y ^ z) & x) ^ (y & z)
98*8a0aadfbSjsing *
99*8a0aadfbSjsing * Upon completion d = d + T1, h = T1 + T2, pending rotation.
100*8a0aadfbSjsing */
101*8a0aadfbSjsing#define sha512_round(idx, a, b, c, d, e, f, g, h, k, w, wt) \
102*8a0aadfbSjsing	addq	wt, h;				/* T1 Wt */	\
103*8a0aadfbSjsing	addq	(k512, round, 8), h;		/* T1 Kt */	\
104*8a0aadfbSjsing	\
105*8a0aadfbSjsing	movq	e, tmp1;			/* T1 Sigma1 */	\
106*8a0aadfbSjsing	rorq	$(41-18), tmp1;			/* T1 Sigma1 */	\
107*8a0aadfbSjsing	xorq	e, tmp1;			/* T1 Sigma1 */ \
108*8a0aadfbSjsing	rorq	$(18-14), tmp1;			/* T1 Sigma1 */	\
109*8a0aadfbSjsing	xorq	e, tmp1;			/* T1 Sigma1 */ \
110*8a0aadfbSjsing	rorq	$14, tmp1;			/* T1 Sigma1 */	\
111*8a0aadfbSjsing	addq	tmp1, h;			/* T1 Sigma1 */	\
112*8a0aadfbSjsing	\
113*8a0aadfbSjsing	movq	f, tmp2;			/* T1 Ch */	\
114*8a0aadfbSjsing	xorq	g, tmp2;			/* T1 Ch */	\
115*8a0aadfbSjsing	andq	e, tmp2;			/* T1 Ch */	\
116*8a0aadfbSjsing	xorq	g, tmp2;			/* T1 Ch */	\
117*8a0aadfbSjsing	addq	tmp2, h;			/* T1 Ch */	\
118*8a0aadfbSjsing	\
119*8a0aadfbSjsing	addq	h, d;				/* d += T1 */	\
120*8a0aadfbSjsing	\
121*8a0aadfbSjsing	movq	a, tmp1;			/* T2 Sigma0 */	\
122*8a0aadfbSjsing	rorq	$(39-34), tmp1;			/* T2 Sigma0 */	\
123*8a0aadfbSjsing	xorq	a, tmp1;			/* T2 Sigma0 */	\
124*8a0aadfbSjsing	rorq	$(34-28), tmp1;			/* T2 Sigma0 */	\
125*8a0aadfbSjsing	xorq	a, tmp1;			/* T2 Sigma0 */	\
126*8a0aadfbSjsing	rorq	$28, tmp1;			/* T2 Sigma0 */	\
127*8a0aadfbSjsing	addq	tmp1, h;			/* T2 Sigma0 */	\
128*8a0aadfbSjsing	\
129*8a0aadfbSjsing	movq	b, tmp2;			/* T2 Maj */	\
130*8a0aadfbSjsing	xorq	c, tmp2;			/* T2 Maj */	\
131*8a0aadfbSjsing	andq	a, tmp2;			/* T2 Maj */	\
132*8a0aadfbSjsing	movq	b, tmp3;			/* T2 Maj */	\
133*8a0aadfbSjsing	andq	c, tmp3;			/* T2 Maj */	\
134*8a0aadfbSjsing	xorq	tmp2, tmp3;			/* T2 Maj */	\
135*8a0aadfbSjsing	addq	tmp3, h;			/* T2 Maj */	\
136*8a0aadfbSjsing	\
137*8a0aadfbSjsing	addq	$1, round;
138*8a0aadfbSjsing
139*8a0aadfbSjsing#define sha512_round_load(idx, a, b, c, d, e, f, g, h) \
140*8a0aadfbSjsing	sha512_message_schedule_load(idx, in, %rsp, tmp0) \
141*8a0aadfbSjsing	sha512_round(idx, a, b, c, d, e, f, g, h, k512, %rsp, tmp0)
142*8a0aadfbSjsing
143*8a0aadfbSjsing#define sha512_round_update(idx, a, b, c, d, e, f, g, h) \
144*8a0aadfbSjsing	sha512_message_schedule_update(idx, %rsp, tmp0) \
145*8a0aadfbSjsing	sha512_round(idx, a, b, c, d, e, f, g, h, k512, %rsp, tmp0)
146*8a0aadfbSjsing
147*8a0aadfbSjsing.text
148*8a0aadfbSjsing
149*8a0aadfbSjsing/*
150*8a0aadfbSjsing * void sha512_block_generic(SHA512_CTX *ctx, const void *in, size_t num);
151*8a0aadfbSjsing *
152*8a0aadfbSjsing * Standard x86-64 ABI: rdi = ctx, rsi = in, rdx = num
153*8a0aadfbSjsing */
154*8a0aadfbSjsing.align 16
155*8a0aadfbSjsing.globl	sha512_block_generic
156*8a0aadfbSjsing.type	sha512_block_generic,@function
157*8a0aadfbSjsingsha512_block_generic:
158*8a0aadfbSjsing	_CET_ENDBR
159*8a0aadfbSjsing
160*8a0aadfbSjsing	/* Save callee save registers. */
161*8a0aadfbSjsing	pushq	%rbx
162*8a0aadfbSjsing	pushq	%rbp
163*8a0aadfbSjsing	pushq	%r12
164*8a0aadfbSjsing	pushq	%r13
165*8a0aadfbSjsing	pushq	%r14
166*8a0aadfbSjsing	pushq	%r15
167*8a0aadfbSjsing
168*8a0aadfbSjsing	/* Allocate space for message schedule and context pointer. */
169*8a0aadfbSjsing	movq	%rsp, %rax
170*8a0aadfbSjsing	subq	$(128+3*8), %rsp
171*8a0aadfbSjsing	andq	$~63, %rsp
172*8a0aadfbSjsing	movq	%rax, (128+2*8)(%rsp)
173*8a0aadfbSjsing	movq	ctx, (128+1*8)(%rsp)
174*8a0aadfbSjsing
175*8a0aadfbSjsing	/* Compute and store end of message. */
176*8a0aadfbSjsing	shlq	$7, num
177*8a0aadfbSjsing	leaq	(in, num, 1), %rbx
178*8a0aadfbSjsing	movq	%rbx, (128+0*8)(%rsp)
179*8a0aadfbSjsing
180*8a0aadfbSjsing	/* Address of SHA-512 constants. */
181*8a0aadfbSjsing	leaq	K512(%rip), k512
182*8a0aadfbSjsing
183*8a0aadfbSjsing	/* Load current hash state from context. */
184*8a0aadfbSjsing	movq	(0*8)(ctx), hs0
185*8a0aadfbSjsing	movq	(1*8)(ctx), hs1
186*8a0aadfbSjsing	movq	(2*8)(ctx), hs2
187*8a0aadfbSjsing	movq	(3*8)(ctx), hs3
188*8a0aadfbSjsing	movq	(4*8)(ctx), hs4
189*8a0aadfbSjsing	movq	(5*8)(ctx), hs5
190*8a0aadfbSjsing	movq	(6*8)(ctx), hs6
191*8a0aadfbSjsing	movq	(7*8)(ctx), hs7
192*8a0aadfbSjsing
193*8a0aadfbSjsing	jmp	.Lblock_loop0
194*8a0aadfbSjsing
195*8a0aadfbSjsing.align 16
196*8a0aadfbSjsing.Lblock_loop0:
197*8a0aadfbSjsing	mov	$0, round
198*8a0aadfbSjsing
199*8a0aadfbSjsing	/* Round 0 through 15. */
200*8a0aadfbSjsing	sha512_round_load(0, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7)
201*8a0aadfbSjsing	sha512_round_load(1, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6)
202*8a0aadfbSjsing	sha512_round_load(2, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5)
203*8a0aadfbSjsing	sha512_round_load(3, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4)
204*8a0aadfbSjsing	sha512_round_load(4, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3)
205*8a0aadfbSjsing	sha512_round_load(5, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2)
206*8a0aadfbSjsing	sha512_round_load(6, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1)
207*8a0aadfbSjsing	sha512_round_load(7, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0)
208*8a0aadfbSjsing	sha512_round_load(8, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7)
209*8a0aadfbSjsing	sha512_round_load(9, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6)
210*8a0aadfbSjsing	sha512_round_load(10, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5)
211*8a0aadfbSjsing	sha512_round_load(11, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4)
212*8a0aadfbSjsing	sha512_round_load(12, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3)
213*8a0aadfbSjsing	sha512_round_load(13, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2)
214*8a0aadfbSjsing	sha512_round_load(14, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1)
215*8a0aadfbSjsing	sha512_round_load(15, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0)
216*8a0aadfbSjsing
217*8a0aadfbSjsing	jmp	.Lblock_loop16
218*8a0aadfbSjsing
219*8a0aadfbSjsing.align 16
220*8a0aadfbSjsing.Lblock_loop16:
221*8a0aadfbSjsing	/* Round 16 through 79. */
222*8a0aadfbSjsing	sha512_round_update(16, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7)
223*8a0aadfbSjsing	sha512_round_update(17, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6)
224*8a0aadfbSjsing	sha512_round_update(18, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5)
225*8a0aadfbSjsing	sha512_round_update(19, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4)
226*8a0aadfbSjsing	sha512_round_update(20, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3)
227*8a0aadfbSjsing	sha512_round_update(21, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2)
228*8a0aadfbSjsing	sha512_round_update(22, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1)
229*8a0aadfbSjsing	sha512_round_update(23, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0)
230*8a0aadfbSjsing	sha512_round_update(24, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7)
231*8a0aadfbSjsing	sha512_round_update(25, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6)
232*8a0aadfbSjsing	sha512_round_update(26, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5)
233*8a0aadfbSjsing	sha512_round_update(27, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4)
234*8a0aadfbSjsing	sha512_round_update(28, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3)
235*8a0aadfbSjsing	sha512_round_update(29, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2)
236*8a0aadfbSjsing	sha512_round_update(30, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1)
237*8a0aadfbSjsing	sha512_round_update(31, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0)
238*8a0aadfbSjsing
239*8a0aadfbSjsing	cmp	$80, round
240*8a0aadfbSjsing	jb	.Lblock_loop16
241*8a0aadfbSjsing
242*8a0aadfbSjsing	movq	(128+1*8)(%rsp), ctx
243*8a0aadfbSjsing
244*8a0aadfbSjsing	/* Add intermediate state to hash state. */
245*8a0aadfbSjsing	addq	(0*8)(ctx), hs0
246*8a0aadfbSjsing	addq	(1*8)(ctx), hs1
247*8a0aadfbSjsing	addq	(2*8)(ctx), hs2
248*8a0aadfbSjsing	addq	(3*8)(ctx), hs3
249*8a0aadfbSjsing	addq	(4*8)(ctx), hs4
250*8a0aadfbSjsing	addq	(5*8)(ctx), hs5
251*8a0aadfbSjsing	addq	(6*8)(ctx), hs6
252*8a0aadfbSjsing	addq	(7*8)(ctx), hs7
253*8a0aadfbSjsing
254*8a0aadfbSjsing	/* Store new hash state to context. */
255*8a0aadfbSjsing	movq	hs0, (0*8)(ctx)
256*8a0aadfbSjsing	movq	hs1, (1*8)(ctx)
257*8a0aadfbSjsing	movq	hs2, (2*8)(ctx)
258*8a0aadfbSjsing	movq	hs3, (3*8)(ctx)
259*8a0aadfbSjsing	movq	hs4, (4*8)(ctx)
260*8a0aadfbSjsing	movq	hs5, (5*8)(ctx)
261*8a0aadfbSjsing	movq	hs6, (6*8)(ctx)
262*8a0aadfbSjsing	movq	hs7, (7*8)(ctx)
263*8a0aadfbSjsing
264*8a0aadfbSjsing	addq	$128, in
265*8a0aadfbSjsing	cmpq	(128+0*8)(%rsp), in
266*8a0aadfbSjsing	jb	.Lblock_loop0
267*8a0aadfbSjsing
268*8a0aadfbSjsing	movq	(128+2*8)(%rsp), %rsp
269*8a0aadfbSjsing
270*8a0aadfbSjsing	/* Restore callee save registers. */
271*8a0aadfbSjsing	popq	%r15
272*8a0aadfbSjsing	popq	%r14
273*8a0aadfbSjsing	popq	%r13
274*8a0aadfbSjsing	popq	%r12
275*8a0aadfbSjsing	popq	%rbp
276*8a0aadfbSjsing	popq	%rbx
277*8a0aadfbSjsing
278*8a0aadfbSjsing	ret
279*8a0aadfbSjsing
280*8a0aadfbSjsing/*
281*8a0aadfbSjsing * SHA-512 constants - see FIPS 180-4 section 4.2.3.
282*8a0aadfbSjsing */
283*8a0aadfbSjsing.rodata
284*8a0aadfbSjsing.align	64
285*8a0aadfbSjsing.type	K512,@object
286*8a0aadfbSjsingK512:
287*8a0aadfbSjsing.quad	0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc
288*8a0aadfbSjsing.quad	0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118
289*8a0aadfbSjsing.quad	0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2
290*8a0aadfbSjsing.quad	0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694
291*8a0aadfbSjsing.quad	0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65
292*8a0aadfbSjsing.quad	0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5
293*8a0aadfbSjsing.quad	0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4
294*8a0aadfbSjsing.quad	0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70
295*8a0aadfbSjsing.quad	0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df
296*8a0aadfbSjsing.quad	0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b
297*8a0aadfbSjsing.quad	0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30
298*8a0aadfbSjsing.quad	0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8
299*8a0aadfbSjsing.quad	0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8
300*8a0aadfbSjsing.quad	0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3
301*8a0aadfbSjsing.quad	0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec
302*8a0aadfbSjsing.quad	0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b
303*8a0aadfbSjsing.quad	0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178
304*8a0aadfbSjsing.quad	0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b
305*8a0aadfbSjsing.quad	0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c
306*8a0aadfbSjsing.quad	0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
307*8a0aadfbSjsing.size	K512,.-K512
308