xref: /aosp_15_r20/external/selinux/libsemanage/src/sha256.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2*2d543d20SAndroid Build Coastguard Worker //  WjCryptLib_Sha256
3*2d543d20SAndroid Build Coastguard Worker //
4*2d543d20SAndroid Build Coastguard Worker //  Implementation of SHA256 hash function.
5*2d543d20SAndroid Build Coastguard Worker //  Original author: Tom St Denis, [email protected], http://libtom.org
6*2d543d20SAndroid Build Coastguard Worker //  Modified by WaterJuice retaining Public Domain license.
7*2d543d20SAndroid Build Coastguard Worker //
8*2d543d20SAndroid Build Coastguard Worker //  This is free and unencumbered software released into the public domain - June 2013 waterjuice.org
9*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10*2d543d20SAndroid Build Coastguard Worker 
11*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
12*2d543d20SAndroid Build Coastguard Worker //  IMPORTS
13*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
14*2d543d20SAndroid Build Coastguard Worker 
15*2d543d20SAndroid Build Coastguard Worker #include "sha256.h"
16*2d543d20SAndroid Build Coastguard Worker #include <memory.h>
17*2d543d20SAndroid Build Coastguard Worker 
18*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19*2d543d20SAndroid Build Coastguard Worker //  MACROS
20*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
21*2d543d20SAndroid Build Coastguard Worker 
22*2d543d20SAndroid Build Coastguard Worker #define ror(value, bits) (((value) >> (bits)) | ((value) << (32 - (bits))))
23*2d543d20SAndroid Build Coastguard Worker 
24*2d543d20SAndroid Build Coastguard Worker #define MIN(x, y) ( ((x)<(y))?(x):(y) )
25*2d543d20SAndroid Build Coastguard Worker 
26*2d543d20SAndroid Build Coastguard Worker #define STORE32H(x, y)                                                                     \
27*2d543d20SAndroid Build Coastguard Worker      { (y)[0] = (uint8_t)(((x)>>24)&255); (y)[1] = (uint8_t)(((x)>>16)&255);   \
28*2d543d20SAndroid Build Coastguard Worker        (y)[2] = (uint8_t)(((x)>>8)&255); (y)[3] = (uint8_t)((x)&255); }
29*2d543d20SAndroid Build Coastguard Worker 
30*2d543d20SAndroid Build Coastguard Worker #define LOAD32H(x, y)                            \
31*2d543d20SAndroid Build Coastguard Worker      { x = ((uint32_t)((y)[0] & 255)<<24) | \
32*2d543d20SAndroid Build Coastguard Worker            ((uint32_t)((y)[1] & 255)<<16) | \
33*2d543d20SAndroid Build Coastguard Worker            ((uint32_t)((y)[2] & 255)<<8)  | \
34*2d543d20SAndroid Build Coastguard Worker            ((uint32_t)((y)[3] & 255)); }
35*2d543d20SAndroid Build Coastguard Worker 
36*2d543d20SAndroid Build Coastguard Worker #define STORE64H(x, y)                                                                     \
37*2d543d20SAndroid Build Coastguard Worker    { (y)[0] = (uint8_t)(((x)>>56)&255); (y)[1] = (uint8_t)(((x)>>48)&255);     \
38*2d543d20SAndroid Build Coastguard Worker      (y)[2] = (uint8_t)(((x)>>40)&255); (y)[3] = (uint8_t)(((x)>>32)&255);     \
39*2d543d20SAndroid Build Coastguard Worker      (y)[4] = (uint8_t)(((x)>>24)&255); (y)[5] = (uint8_t)(((x)>>16)&255);     \
40*2d543d20SAndroid Build Coastguard Worker      (y)[6] = (uint8_t)(((x)>>8)&255); (y)[7] = (uint8_t)((x)&255); }
41*2d543d20SAndroid Build Coastguard Worker 
42*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
43*2d543d20SAndroid Build Coastguard Worker //  CONSTANTS
44*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45*2d543d20SAndroid Build Coastguard Worker 
46*2d543d20SAndroid Build Coastguard Worker // The K array
47*2d543d20SAndroid Build Coastguard Worker static const uint32_t K[64] = {
48*2d543d20SAndroid Build Coastguard Worker     0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
49*2d543d20SAndroid Build Coastguard Worker     0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
50*2d543d20SAndroid Build Coastguard Worker     0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
51*2d543d20SAndroid Build Coastguard Worker     0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
52*2d543d20SAndroid Build Coastguard Worker     0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
53*2d543d20SAndroid Build Coastguard Worker     0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
54*2d543d20SAndroid Build Coastguard Worker     0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
55*2d543d20SAndroid Build Coastguard Worker     0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
56*2d543d20SAndroid Build Coastguard Worker     0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
57*2d543d20SAndroid Build Coastguard Worker     0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
58*2d543d20SAndroid Build Coastguard Worker     0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
59*2d543d20SAndroid Build Coastguard Worker     0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
60*2d543d20SAndroid Build Coastguard Worker     0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
61*2d543d20SAndroid Build Coastguard Worker };
62*2d543d20SAndroid Build Coastguard Worker 
63*2d543d20SAndroid Build Coastguard Worker #define BLOCK_SIZE          64
64*2d543d20SAndroid Build Coastguard Worker 
65*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
66*2d543d20SAndroid Build Coastguard Worker //  INTERNAL FUNCTIONS
67*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
68*2d543d20SAndroid Build Coastguard Worker 
69*2d543d20SAndroid Build Coastguard Worker // Various logical functions
70*2d543d20SAndroid Build Coastguard Worker #define Ch( x, y, z )     (z ^ (x & (y ^ z)))
71*2d543d20SAndroid Build Coastguard Worker #define Maj( x, y, z )    (((x | y) & z) | (x & y))
72*2d543d20SAndroid Build Coastguard Worker #define S( x, n )         ror((x),(n))
73*2d543d20SAndroid Build Coastguard Worker #define R( x, n )         (((x)&0xFFFFFFFFUL)>>(n))
74*2d543d20SAndroid Build Coastguard Worker #define Sigma0( x )       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
75*2d543d20SAndroid Build Coastguard Worker #define Sigma1( x )       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
76*2d543d20SAndroid Build Coastguard Worker #define Gamma0( x )       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
77*2d543d20SAndroid Build Coastguard Worker #define Gamma1( x )       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
78*2d543d20SAndroid Build Coastguard Worker 
79*2d543d20SAndroid Build Coastguard Worker #define Sha256Round( a, b, c, d, e, f, g, h, i )       \
80*2d543d20SAndroid Build Coastguard Worker      t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];   \
81*2d543d20SAndroid Build Coastguard Worker      t1 = Sigma0(a) + Maj(a, b, c);                    \
82*2d543d20SAndroid Build Coastguard Worker      d += t0;                                          \
83*2d543d20SAndroid Build Coastguard Worker      h  = t0 + t1;
84*2d543d20SAndroid Build Coastguard Worker 
85*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
86*2d543d20SAndroid Build Coastguard Worker //  TransformFunction
87*2d543d20SAndroid Build Coastguard Worker //
88*2d543d20SAndroid Build Coastguard Worker //  Compress 512-bits
89*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
90*2d543d20SAndroid Build Coastguard Worker static
91*2d543d20SAndroid Build Coastguard Worker void
TransformFunction(Sha256Context * Context,uint8_t const * Buffer)92*2d543d20SAndroid Build Coastguard Worker     TransformFunction
93*2d543d20SAndroid Build Coastguard Worker     (
94*2d543d20SAndroid Build Coastguard Worker         Sha256Context*      Context,
95*2d543d20SAndroid Build Coastguard Worker         uint8_t const*      Buffer
96*2d543d20SAndroid Build Coastguard Worker     )
97*2d543d20SAndroid Build Coastguard Worker {
98*2d543d20SAndroid Build Coastguard Worker     uint32_t    S[8];
99*2d543d20SAndroid Build Coastguard Worker     uint32_t    W[64];
100*2d543d20SAndroid Build Coastguard Worker     uint32_t    t0;
101*2d543d20SAndroid Build Coastguard Worker     uint32_t    t1;
102*2d543d20SAndroid Build Coastguard Worker     uint32_t    t;
103*2d543d20SAndroid Build Coastguard Worker     int         i;
104*2d543d20SAndroid Build Coastguard Worker 
105*2d543d20SAndroid Build Coastguard Worker     // Copy state into S
106*2d543d20SAndroid Build Coastguard Worker     for( i=0; i<8; i++ )
107*2d543d20SAndroid Build Coastguard Worker     {
108*2d543d20SAndroid Build Coastguard Worker         S[i] = Context->state[i];
109*2d543d20SAndroid Build Coastguard Worker     }
110*2d543d20SAndroid Build Coastguard Worker 
111*2d543d20SAndroid Build Coastguard Worker     // Copy the state into 512-bits into W[0..15]
112*2d543d20SAndroid Build Coastguard Worker     for( i=0; i<16; i++ )
113*2d543d20SAndroid Build Coastguard Worker     {
114*2d543d20SAndroid Build Coastguard Worker         LOAD32H( W[i], Buffer + (4*i) );
115*2d543d20SAndroid Build Coastguard Worker     }
116*2d543d20SAndroid Build Coastguard Worker 
117*2d543d20SAndroid Build Coastguard Worker     // Fill W[16..63]
118*2d543d20SAndroid Build Coastguard Worker     for( i=16; i<64; i++ )
119*2d543d20SAndroid Build Coastguard Worker     {
120*2d543d20SAndroid Build Coastguard Worker         W[i] = Gamma1( W[i-2]) + W[i-7] + Gamma0( W[i-15] ) + W[i-16];
121*2d543d20SAndroid Build Coastguard Worker     }
122*2d543d20SAndroid Build Coastguard Worker 
123*2d543d20SAndroid Build Coastguard Worker     // Compress
124*2d543d20SAndroid Build Coastguard Worker     for( i=0; i<64; i++ )
125*2d543d20SAndroid Build Coastguard Worker     {
126*2d543d20SAndroid Build Coastguard Worker         Sha256Round( S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i );
127*2d543d20SAndroid Build Coastguard Worker         t = S[7];
128*2d543d20SAndroid Build Coastguard Worker         S[7] = S[6];
129*2d543d20SAndroid Build Coastguard Worker         S[6] = S[5];
130*2d543d20SAndroid Build Coastguard Worker         S[5] = S[4];
131*2d543d20SAndroid Build Coastguard Worker         S[4] = S[3];
132*2d543d20SAndroid Build Coastguard Worker         S[3] = S[2];
133*2d543d20SAndroid Build Coastguard Worker         S[2] = S[1];
134*2d543d20SAndroid Build Coastguard Worker         S[1] = S[0];
135*2d543d20SAndroid Build Coastguard Worker         S[0] = t;
136*2d543d20SAndroid Build Coastguard Worker     }
137*2d543d20SAndroid Build Coastguard Worker 
138*2d543d20SAndroid Build Coastguard Worker     // Feedback
139*2d543d20SAndroid Build Coastguard Worker     for( i=0; i<8; i++ )
140*2d543d20SAndroid Build Coastguard Worker     {
141*2d543d20SAndroid Build Coastguard Worker         Context->state[i] = Context->state[i] + S[i];
142*2d543d20SAndroid Build Coastguard Worker     }
143*2d543d20SAndroid Build Coastguard Worker }
144*2d543d20SAndroid Build Coastguard Worker 
145*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
146*2d543d20SAndroid Build Coastguard Worker //  PUBLIC FUNCTIONS
147*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
148*2d543d20SAndroid Build Coastguard Worker 
149*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
150*2d543d20SAndroid Build Coastguard Worker //  Sha256Initialise
151*2d543d20SAndroid Build Coastguard Worker //
152*2d543d20SAndroid Build Coastguard Worker //  Initialises a SHA256 Context. Use this to initialise/reset a context.
153*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
154*2d543d20SAndroid Build Coastguard Worker void
Sha256Initialise(Sha256Context * Context)155*2d543d20SAndroid Build Coastguard Worker     Sha256Initialise
156*2d543d20SAndroid Build Coastguard Worker     (
157*2d543d20SAndroid Build Coastguard Worker         Sha256Context*      Context         // [out]
158*2d543d20SAndroid Build Coastguard Worker     )
159*2d543d20SAndroid Build Coastguard Worker {
160*2d543d20SAndroid Build Coastguard Worker     Context->curlen = 0;
161*2d543d20SAndroid Build Coastguard Worker     Context->length = 0;
162*2d543d20SAndroid Build Coastguard Worker     Context->state[0] = 0x6A09E667UL;
163*2d543d20SAndroid Build Coastguard Worker     Context->state[1] = 0xBB67AE85UL;
164*2d543d20SAndroid Build Coastguard Worker     Context->state[2] = 0x3C6EF372UL;
165*2d543d20SAndroid Build Coastguard Worker     Context->state[3] = 0xA54FF53AUL;
166*2d543d20SAndroid Build Coastguard Worker     Context->state[4] = 0x510E527FUL;
167*2d543d20SAndroid Build Coastguard Worker     Context->state[5] = 0x9B05688CUL;
168*2d543d20SAndroid Build Coastguard Worker     Context->state[6] = 0x1F83D9ABUL;
169*2d543d20SAndroid Build Coastguard Worker     Context->state[7] = 0x5BE0CD19UL;
170*2d543d20SAndroid Build Coastguard Worker }
171*2d543d20SAndroid Build Coastguard Worker 
172*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
173*2d543d20SAndroid Build Coastguard Worker //  Sha256Update
174*2d543d20SAndroid Build Coastguard Worker //
175*2d543d20SAndroid Build Coastguard Worker //  Adds data to the SHA256 context. This will process the data and update the internal state of the context. Keep on
176*2d543d20SAndroid Build Coastguard Worker //  calling this function until all the data has been added. Then call Sha256Finalise to calculate the hash.
177*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
178*2d543d20SAndroid Build Coastguard Worker void
Sha256Update(Sha256Context * Context,void const * Buffer,uint32_t BufferSize)179*2d543d20SAndroid Build Coastguard Worker     Sha256Update
180*2d543d20SAndroid Build Coastguard Worker     (
181*2d543d20SAndroid Build Coastguard Worker         Sha256Context*      Context,        // [in out]
182*2d543d20SAndroid Build Coastguard Worker         void const*         Buffer,         // [in]
183*2d543d20SAndroid Build Coastguard Worker         uint32_t            BufferSize      // [in]
184*2d543d20SAndroid Build Coastguard Worker     )
185*2d543d20SAndroid Build Coastguard Worker {
186*2d543d20SAndroid Build Coastguard Worker     uint32_t n;
187*2d543d20SAndroid Build Coastguard Worker 
188*2d543d20SAndroid Build Coastguard Worker     if( Context->curlen > sizeof(Context->buf) )
189*2d543d20SAndroid Build Coastguard Worker     {
190*2d543d20SAndroid Build Coastguard Worker        return;
191*2d543d20SAndroid Build Coastguard Worker     }
192*2d543d20SAndroid Build Coastguard Worker 
193*2d543d20SAndroid Build Coastguard Worker     while( BufferSize > 0 )
194*2d543d20SAndroid Build Coastguard Worker     {
195*2d543d20SAndroid Build Coastguard Worker         if( Context->curlen == 0 && BufferSize >= BLOCK_SIZE )
196*2d543d20SAndroid Build Coastguard Worker         {
197*2d543d20SAndroid Build Coastguard Worker            TransformFunction( Context, (uint8_t*)Buffer );
198*2d543d20SAndroid Build Coastguard Worker            Context->length += BLOCK_SIZE * 8;
199*2d543d20SAndroid Build Coastguard Worker            Buffer = (uint8_t*)Buffer + BLOCK_SIZE;
200*2d543d20SAndroid Build Coastguard Worker            BufferSize -= BLOCK_SIZE;
201*2d543d20SAndroid Build Coastguard Worker         }
202*2d543d20SAndroid Build Coastguard Worker         else
203*2d543d20SAndroid Build Coastguard Worker         {
204*2d543d20SAndroid Build Coastguard Worker            n = MIN( BufferSize, (BLOCK_SIZE - Context->curlen) );
205*2d543d20SAndroid Build Coastguard Worker            memcpy( Context->buf + Context->curlen, Buffer, (size_t)n );
206*2d543d20SAndroid Build Coastguard Worker            Context->curlen += n;
207*2d543d20SAndroid Build Coastguard Worker            Buffer = (uint8_t*)Buffer + n;
208*2d543d20SAndroid Build Coastguard Worker            BufferSize -= n;
209*2d543d20SAndroid Build Coastguard Worker            if( Context->curlen == BLOCK_SIZE )
210*2d543d20SAndroid Build Coastguard Worker            {
211*2d543d20SAndroid Build Coastguard Worker               TransformFunction( Context, Context->buf );
212*2d543d20SAndroid Build Coastguard Worker               Context->length += 8*BLOCK_SIZE;
213*2d543d20SAndroid Build Coastguard Worker               Context->curlen = 0;
214*2d543d20SAndroid Build Coastguard Worker            }
215*2d543d20SAndroid Build Coastguard Worker        }
216*2d543d20SAndroid Build Coastguard Worker     }
217*2d543d20SAndroid Build Coastguard Worker }
218*2d543d20SAndroid Build Coastguard Worker 
219*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
220*2d543d20SAndroid Build Coastguard Worker //  Sha256Finalise
221*2d543d20SAndroid Build Coastguard Worker //
222*2d543d20SAndroid Build Coastguard Worker //  Performs the final calculation of the hash and returns the digest (32 byte buffer containing 256bit hash). After
223*2d543d20SAndroid Build Coastguard Worker //  calling this, Sha256Initialised must be used to reuse the context.
224*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
225*2d543d20SAndroid Build Coastguard Worker void
Sha256Finalise(Sha256Context * Context,SHA256_HASH * Digest)226*2d543d20SAndroid Build Coastguard Worker     Sha256Finalise
227*2d543d20SAndroid Build Coastguard Worker     (
228*2d543d20SAndroid Build Coastguard Worker         Sha256Context*      Context,        // [in out]
229*2d543d20SAndroid Build Coastguard Worker         SHA256_HASH*        Digest          // [out]
230*2d543d20SAndroid Build Coastguard Worker     )
231*2d543d20SAndroid Build Coastguard Worker {
232*2d543d20SAndroid Build Coastguard Worker     int i;
233*2d543d20SAndroid Build Coastguard Worker 
234*2d543d20SAndroid Build Coastguard Worker     if( Context->curlen >= sizeof(Context->buf) )
235*2d543d20SAndroid Build Coastguard Worker     {
236*2d543d20SAndroid Build Coastguard Worker        return;
237*2d543d20SAndroid Build Coastguard Worker     }
238*2d543d20SAndroid Build Coastguard Worker 
239*2d543d20SAndroid Build Coastguard Worker     // Increase the length of the message
240*2d543d20SAndroid Build Coastguard Worker     Context->length += Context->curlen * 8;
241*2d543d20SAndroid Build Coastguard Worker 
242*2d543d20SAndroid Build Coastguard Worker     // Append the '1' bit
243*2d543d20SAndroid Build Coastguard Worker     Context->buf[Context->curlen++] = (uint8_t)0x80;
244*2d543d20SAndroid Build Coastguard Worker 
245*2d543d20SAndroid Build Coastguard Worker     // if the length is currently above 56 bytes we append zeros
246*2d543d20SAndroid Build Coastguard Worker     // then compress.  Then we can fall back to padding zeros and length
247*2d543d20SAndroid Build Coastguard Worker     // encoding like normal.
248*2d543d20SAndroid Build Coastguard Worker     if( Context->curlen > 56 )
249*2d543d20SAndroid Build Coastguard Worker     {
250*2d543d20SAndroid Build Coastguard Worker         while( Context->curlen < 64 )
251*2d543d20SAndroid Build Coastguard Worker         {
252*2d543d20SAndroid Build Coastguard Worker             Context->buf[Context->curlen++] = (uint8_t)0;
253*2d543d20SAndroid Build Coastguard Worker         }
254*2d543d20SAndroid Build Coastguard Worker         TransformFunction(Context, Context->buf);
255*2d543d20SAndroid Build Coastguard Worker         Context->curlen = 0;
256*2d543d20SAndroid Build Coastguard Worker     }
257*2d543d20SAndroid Build Coastguard Worker 
258*2d543d20SAndroid Build Coastguard Worker     // Pad up to 56 bytes of zeroes
259*2d543d20SAndroid Build Coastguard Worker     while( Context->curlen < 56 )
260*2d543d20SAndroid Build Coastguard Worker     {
261*2d543d20SAndroid Build Coastguard Worker         Context->buf[Context->curlen++] = (uint8_t)0;
262*2d543d20SAndroid Build Coastguard Worker     }
263*2d543d20SAndroid Build Coastguard Worker 
264*2d543d20SAndroid Build Coastguard Worker     // Store length
265*2d543d20SAndroid Build Coastguard Worker     STORE64H( Context->length, Context->buf+56 );
266*2d543d20SAndroid Build Coastguard Worker     TransformFunction( Context, Context->buf );
267*2d543d20SAndroid Build Coastguard Worker 
268*2d543d20SAndroid Build Coastguard Worker     // Copy output
269*2d543d20SAndroid Build Coastguard Worker     for( i=0; i<8; i++ )
270*2d543d20SAndroid Build Coastguard Worker     {
271*2d543d20SAndroid Build Coastguard Worker         STORE32H( Context->state[i], Digest->bytes+(4*i) );
272*2d543d20SAndroid Build Coastguard Worker     }
273*2d543d20SAndroid Build Coastguard Worker }
274*2d543d20SAndroid Build Coastguard Worker 
275*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
276*2d543d20SAndroid Build Coastguard Worker //  Sha256Calculate
277*2d543d20SAndroid Build Coastguard Worker //
278*2d543d20SAndroid Build Coastguard Worker //  Combines Sha256Initialise, Sha256Update, and Sha256Finalise into one function. Calculates the SHA256 hash of the
279*2d543d20SAndroid Build Coastguard Worker //  buffer.
280*2d543d20SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
281*2d543d20SAndroid Build Coastguard Worker void
Sha256Calculate(void const * Buffer,uint32_t BufferSize,SHA256_HASH * Digest)282*2d543d20SAndroid Build Coastguard Worker     Sha256Calculate
283*2d543d20SAndroid Build Coastguard Worker     (
284*2d543d20SAndroid Build Coastguard Worker         void  const*        Buffer,         // [in]
285*2d543d20SAndroid Build Coastguard Worker         uint32_t            BufferSize,     // [in]
286*2d543d20SAndroid Build Coastguard Worker         SHA256_HASH*        Digest          // [in]
287*2d543d20SAndroid Build Coastguard Worker     )
288*2d543d20SAndroid Build Coastguard Worker {
289*2d543d20SAndroid Build Coastguard Worker     Sha256Context context;
290*2d543d20SAndroid Build Coastguard Worker 
291*2d543d20SAndroid Build Coastguard Worker     Sha256Initialise( &context );
292*2d543d20SAndroid Build Coastguard Worker     Sha256Update( &context, Buffer, BufferSize );
293*2d543d20SAndroid Build Coastguard Worker     Sha256Finalise( &context, Digest );
294*2d543d20SAndroid Build Coastguard Worker }
295