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