1cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe/* SHA-512 code by Jean-Luc Cooke <jlcooke@certainkey.com> 2cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * 3cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com> 4cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk> 5cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * Copyright (c) 2003 Kyle McMartin <kyle@debian.org> 6cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * 7cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * This program is free software; you can redistribute it and/or modify it 8cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * under the terms of the GNU General Public License as published by the 9cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * Free Software Foundation; either version 2, or (at your option) any 10cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * later version. 11cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe * 12cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe */ 13cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 14cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#include <string.h> 15cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#include <inttypes.h> 16cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 1700fb3c8dcbb940338fea9f6cab689b4924266305Jens Axboe#include "../lib/bswap.h" 18cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#include "sha512.h" 19cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 20cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define SHA384_DIGEST_SIZE 48 21cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define SHA512_DIGEST_SIZE 64 22cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define SHA384_HMAC_BLOCK_SIZE 128 23cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define SHA512_HMAC_BLOCK_SIZE 128 24cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 25cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic inline uint64_t Ch(uint64_t x, uint64_t y, uint64_t z) 26cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 27cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return z ^ (x & (y ^ z)); 28cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 29cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 30cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic inline uint64_t Maj(uint64_t x, uint64_t y, uint64_t z) 31cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 32cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return (x & y) | (z & (x | y)); 33cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 34cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 35cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic inline uint64_t RORuint64_t(uint64_t x, uint64_t y) 36cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 37cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return (x >> y) | (x << (64 - y)); 38cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 39cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 40cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic const uint64_t sha512_K[80] = { 41cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 42cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 43cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, 44cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 45cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 46cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 47cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, 48cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, 49cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 50cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 51cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, 52cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 53cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 54cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 55cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, 56cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, 57cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 58cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 59cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, 60cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 61cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 62cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 63cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, 64cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, 65cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 66cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 67cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL, 68cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}; 69cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 70cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define e0(x) (RORuint64_t(x,28) ^ RORuint64_t(x,34) ^ RORuint64_t(x,39)) 71cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define e1(x) (RORuint64_t(x,14) ^ RORuint64_t(x,18) ^ RORuint64_t(x,41)) 72cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define s0(x) (RORuint64_t(x, 1) ^ RORuint64_t(x, 8) ^ (x >> 7)) 73cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define s1(x) (RORuint64_t(x,19) ^ RORuint64_t(x,61) ^ (x >> 6)) 74cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 75cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe/* H* initial state for SHA-512 */ 76cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define H0 0x6a09e667f3bcc908ULL 77cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define H1 0xbb67ae8584caa73bULL 78cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define H2 0x3c6ef372fe94f82bULL 79cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define H3 0xa54ff53a5f1d36f1ULL 80cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define H4 0x510e527fade682d1ULL 81cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define H5 0x9b05688c2b3e6c1fULL 82cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define H6 0x1f83d9abfb41bd6bULL 83cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define H7 0x5be0cd19137e2179ULL 84cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 85cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe/* H'* initial state for SHA-384 */ 86cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define HP0 0xcbbb9d5dc1059ed8ULL 87cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define HP1 0x629a292a367cd507ULL 88cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define HP2 0x9159015a3070dd17ULL 89cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define HP3 0x152fecd8f70e5939ULL 90cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define HP4 0x67332667ffc00b31ULL 91cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define HP5 0x8eb44a8768581511ULL 92cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define HP6 0xdb0c2e0d64f98fa7ULL 93cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe#define HP7 0x47b5481dbefa4fa4ULL 94cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 95cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic inline void LOAD_OP(int I, uint64_t *W, const uint8_t *input) 96cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 97cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe W[I] = __be64_to_cpu( ((uint64_t *)(input))[I] ); 98cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 99cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 100cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic inline void BLEND_OP(int I, uint64_t *W) 101cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 102cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16]; 103cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 104cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 105cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void sha512_transform(uint64_t *state, uint64_t *W, const uint8_t *input) 106cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 107cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint64_t a, b, c, d, e, f, g, h, t1, t2; 108cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 109cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe int i; 110cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 111cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* load the input */ 112cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe for (i = 0; i < 16; i++) 113cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe LOAD_OP(i, W, input); 114cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 115cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe for (i = 16; i < 80; i++) 116cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe BLEND_OP(i, W); 117cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 118cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* load the state into our registers */ 119cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe a=state[0]; b=state[1]; c=state[2]; d=state[3]; 120cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe e=state[4]; f=state[5]; g=state[6]; h=state[7]; 121cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 122cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* now iterate */ 123cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe for (i=0; i<80; i+=8) { 124cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t1 = h + e1(e) + Ch(e,f,g) + sha512_K[i ] + W[i ]; 125cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2; 126cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t1 = g + e1(d) + Ch(d,e,f) + sha512_K[i+1] + W[i+1]; 127cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2; 128cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t1 = f + e1(c) + Ch(c,d,e) + sha512_K[i+2] + W[i+2]; 129cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2; 130cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t1 = e + e1(b) + Ch(b,c,d) + sha512_K[i+3] + W[i+3]; 131cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2; 132cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t1 = d + e1(a) + Ch(a,b,c) + sha512_K[i+4] + W[i+4]; 133cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2; 134cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t1 = c + e1(h) + Ch(h,a,b) + sha512_K[i+5] + W[i+5]; 135cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2; 136cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t1 = b + e1(g) + Ch(g,h,a) + sha512_K[i+6] + W[i+6]; 137cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2; 138cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t1 = a + e1(f) + Ch(f,g,h) + sha512_K[i+7] + W[i+7]; 139cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2; 140cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 141cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 142cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe state[0] += a; state[1] += b; state[2] += c; state[3] += d; 143cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe state[4] += e; state[5] += f; state[6] += g; state[7] += h; 144cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 145cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* erase our data */ 146cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe a = b = c = d = e = f = g = h = t1 = t2 = 0; 147cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 148cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 14925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboevoid fio_sha512_init(struct fio_sha512_ctx *sctx) 150cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 151cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->state[0] = H0; 152cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->state[1] = H1; 153cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->state[2] = H2; 154cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->state[3] = H3; 155cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->state[4] = H4; 156cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->state[5] = H5; 157cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->state[6] = H6; 158cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->state[7] = H7; 159cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->count[0] = sctx->count[1] = sctx->count[2] = sctx->count[3] = 0; 160cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 161cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 16225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboevoid fio_sha512_update(struct fio_sha512_ctx *sctx, const uint8_t *data, 16325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe unsigned int len) 164cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 1652b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int i, idx, part_len; 166cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 167cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* Compute number of bytes mod 128 */ 1682b13e716c0921356c0930522718e00b8df34293aJens Axboe idx = (unsigned int)((sctx->count[0] >> 3) & 0x7F); 169cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 170cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* Update number of bits */ 171cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe if ((sctx->count[0] += (len << 3)) < (len << 3)) { 172cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe if ((sctx->count[1] += 1) < 1) 173cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe if ((sctx->count[2] += 1) < 1) 174cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->count[3]++; 175cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sctx->count[1] += (len >> 29); 176cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 177cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 1782b13e716c0921356c0930522718e00b8df34293aJens Axboe part_len = 128 - idx; 179cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 180cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* Transform as many times as possible. */ 181cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe if (len >= part_len) { 1822b13e716c0921356c0930522718e00b8df34293aJens Axboe memcpy(&sctx->buf[idx], data, part_len); 183cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_transform(sctx->state, sctx->W, sctx->buf); 184cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 185cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe for (i = part_len; i + 127 < len; i+=128) 186cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_transform(sctx->state, sctx->W, &data[i]); 187cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 1882b13e716c0921356c0930522718e00b8df34293aJens Axboe idx = 0; 189cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } else { 190cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe i = 0; 191cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 192cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 193cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* Buffer remaining input */ 1942b13e716c0921356c0930522718e00b8df34293aJens Axboe memcpy(&sctx->buf[idx], &data[i], len - i); 195cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 196cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe /* erase our data */ 197cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe memset(sctx->W, 0, sizeof(sctx->W)); 198cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 199