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