Blame SOURCES/0045-semodule-libsemanage-move-module-hashing-into-libsem.patch

30e25f
From 066007029b3dd250305d7fac0bfd53aa1e4543cf Mon Sep 17 00:00:00 2001
30e25f
From: Ondrej Mosnacek <omosnace@redhat.com>
30e25f
Date: Thu, 3 Feb 2022 17:53:23 +0100
30e25f
Subject: [PATCH] semodule,libsemanage: move module hashing into libsemanage
30e25f
30e25f
The main goal of this move is to have the SHA-256 implementation under
30e25f
libsemanage, since upcoming patches will make use of SHA-256 for a
30e25f
different (but similar) purpose in libsemanage. Having the hashing code
30e25f
in libsemanage will reduce code duplication and allow for easier hash
30e25f
algorithm upgrade in the future.
30e25f
30e25f
Note that libselinux currently also contains a hash function
30e25f
implementation (for yet another different purpose). This patch doesn't
30e25f
make any effort to address that duplicity yet.
30e25f
30e25f
This patch also changes the format of the hash string printed by
30e25f
semodule to include the name of the hash. The intent is to avoid
30e25f
ambiguity and potential collisions when the algorithm is potentially
30e25f
changed in the future.
30e25f
30e25f
Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
30e25f
---
30e25f
 policycoreutils/semodule/Makefile   |   2 +-
30e25f
 policycoreutils/semodule/semodule.c |  53 ++---
30e25f
 policycoreutils/semodule/sha256.c   | 294 ----------------------------
30e25f
 policycoreutils/semodule/sha256.h   |  89 ---------
30e25f
 4 files changed, 17 insertions(+), 421 deletions(-)
30e25f
 delete mode 100644 policycoreutils/semodule/sha256.c
30e25f
 delete mode 100644 policycoreutils/semodule/sha256.h
30e25f
30e25f
diff --git a/policycoreutils/semodule/Makefile b/policycoreutils/semodule/Makefile
30e25f
index 9875ac38..73801e48 100644
30e25f
--- a/policycoreutils/semodule/Makefile
30e25f
+++ b/policycoreutils/semodule/Makefile
30e25f
@@ -6,7 +6,7 @@ MANDIR = $(PREFIX)/share/man
30e25f
 
30e25f
 CFLAGS ?= -Werror -Wall -W
30e25f
 override LDLIBS += -lsepol -lselinux -lsemanage
30e25f
-SEMODULE_OBJS = semodule.o sha256.o
30e25f
+SEMODULE_OBJS = semodule.o
30e25f
 
30e25f
 all: semodule genhomedircon
30e25f
 
30e25f
diff --git a/policycoreutils/semodule/semodule.c b/policycoreutils/semodule/semodule.c
30e25f
index dc227058..243b1add 100644
30e25f
--- a/policycoreutils/semodule/semodule.c
30e25f
+++ b/policycoreutils/semodule/semodule.c
30e25f
@@ -24,8 +24,6 @@
30e25f
 
30e25f
 #include <semanage/modules.h>
30e25f
 
30e25f
-#include "sha256.h"
30e25f
-
30e25f
 enum client_modes {
30e25f
 	NO_MODE, INSTALL_M, REMOVE_M, EXTRACT_M, CIL_M, HLL_M,
30e25f
 	LIST_M, RELOAD, PRIORITY_M, ENABLE_M, DISABLE_M
30e25f
@@ -347,60 +345,38 @@ static void parse_command_line(int argc, char **argv)
30e25f
 
30e25f
 /* Get module checksum */
30e25f
 static char *hash_module_data(const char *module_name, const int prio) {
30e25f
-	semanage_module_info_t *extract_info = NULL;
30e25f
 	semanage_module_key_t *modkey = NULL;
30e25f
-	Sha256Context context;
30e25f
-	uint8_t sha256_hash[SHA256_HASH_SIZE];
30e25f
-	char *sha256_buf = NULL;
30e25f
-	void *data;
30e25f
-	size_t data_len = 0, i;
30e25f
+	char *hash_str = NULL;
30e25f
+	void *hash = NULL;
30e25f
+	size_t hash_len = 0;
30e25f
 	int result;
30e25f
 
30e25f
 	result = semanage_module_key_create(sh, &modkey);
30e25f
 	if (result != 0) {
30e25f
-		goto cleanup_extract;
30e25f
+		goto cleanup;
30e25f
 	}
30e25f
 
30e25f
 	result = semanage_module_key_set_name(sh, modkey, module_name);
30e25f
 	if (result != 0) {
30e25f
-		goto cleanup_extract;
30e25f
+		goto cleanup;
30e25f
 	}
30e25f
 
30e25f
 	result = semanage_module_key_set_priority(sh, modkey, prio);
30e25f
 	if (result != 0) {
30e25f
-		goto cleanup_extract;
30e25f
+		goto cleanup;
30e25f
 	}
30e25f
 
30e25f
-	result = semanage_module_extract(sh, modkey, 1, &data, &data_len,
30e25f
-									 &extract_info);
30e25f
+	result = semanage_module_compute_checksum(sh, modkey, 1, &hash_str,
30e25f
+						  &hash_len);
30e25f
 	if (result != 0) {
30e25f
-		goto cleanup_extract;
30e25f
-	}
30e25f
-
30e25f
-	Sha256Initialise(&context);
30e25f
-	Sha256Update(&context, data, data_len);
30e25f
-
30e25f
-	Sha256Finalise(&context, (SHA256_HASH *)sha256_hash);
30e25f
-
30e25f
-	sha256_buf = calloc(1, SHA256_HASH_SIZE * 2 + 1);
30e25f
-
30e25f
-	if (sha256_buf == NULL)
30e25f
-		goto cleanup_extract;
30e25f
-
30e25f
-	for (i = 0; i < SHA256_HASH_SIZE; i++) {
30e25f
-		sprintf((&sha256_buf[i * 2]), "%02x", sha256_hash[i]);
30e25f
+		goto cleanup;
30e25f
 	}
30e25f
-	sha256_buf[i * 2] = 0;
30e25f
 
30e25f
-cleanup_extract:
30e25f
-	if (data_len > 0) {
30e25f
-		munmap(data, data_len);
30e25f
-	}
30e25f
-	semanage_module_info_destroy(sh, extract_info);
30e25f
-	free(extract_info);
30e25f
+cleanup:
30e25f
+	free(hash);
30e25f
 	semanage_module_key_destroy(sh, modkey);
30e25f
 	free(modkey);
30e25f
-	return sha256_buf;
30e25f
+	return hash_str;
30e25f
 }
30e25f
 
30e25f
 int main(int argc, char *argv[])
30e25f
@@ -667,7 +643,10 @@ cleanup_extract:
30e25f
 					/* fixed width columns */
30e25f
 					column[0] = sizeof("000") - 1;
30e25f
 					column[3] = sizeof("disabled") - 1;
30e25f
-					column[4] = 64; /* SHA256_HASH_SIZE * 2 */
30e25f
+
30e25f
+					result = semanage_module_compute_checksum(sh, NULL, 0, NULL,
30e25f
+										  &column[4]);
30e25f
+					if (result != 0) goto cleanup_list;
30e25f
 
30e25f
 					/* variable width columns */
30e25f
 					const char *tmp = NULL;
30e25f
diff --git a/policycoreutils/semodule/sha256.c b/policycoreutils/semodule/sha256.c
30e25f
deleted file mode 100644
30e25f
index fe2aeef0..00000000
30e25f
--- a/policycoreutils/semodule/sha256.c
30e25f
+++ /dev/null
30e25f
@@ -1,294 +0,0 @@
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  WjCryptLib_Sha256
30e25f
-//
30e25f
-//  Implementation of SHA256 hash function.
30e25f
-//  Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org
30e25f
-//  Modified by WaterJuice retaining Public Domain license.
30e25f
-//
30e25f
-//  This is free and unencumbered software released into the public domain - June 2013 waterjuice.org
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  IMPORTS
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-#include "sha256.h"
30e25f
-#include <memory.h>
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  MACROS
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-#define ror(value, bits) (((value) >> (bits)) | ((value) << (32 - (bits))))
30e25f
-
30e25f
-#define MIN(x, y) ( ((x)<(y))?(x):(y) )
30e25f
-
30e25f
-#define STORE32H(x, y)                                                                     \
30e25f
-     { (y)[0] = (uint8_t)(((x)>>24)&255); (y)[1] = (uint8_t)(((x)>>16)&255);   \
30e25f
-       (y)[2] = (uint8_t)(((x)>>8)&255); (y)[3] = (uint8_t)((x)&255); }
30e25f
-
30e25f
-#define LOAD32H(x, y)                            \
30e25f
-     { x = ((uint32_t)((y)[0] & 255)<<24) | \
30e25f
-           ((uint32_t)((y)[1] & 255)<<16) | \
30e25f
-           ((uint32_t)((y)[2] & 255)<<8)  | \
30e25f
-           ((uint32_t)((y)[3] & 255)); }
30e25f
-
30e25f
-#define STORE64H(x, y)                                                                     \
30e25f
-   { (y)[0] = (uint8_t)(((x)>>56)&255); (y)[1] = (uint8_t)(((x)>>48)&255);     \
30e25f
-     (y)[2] = (uint8_t)(((x)>>40)&255); (y)[3] = (uint8_t)(((x)>>32)&255);     \
30e25f
-     (y)[4] = (uint8_t)(((x)>>24)&255); (y)[5] = (uint8_t)(((x)>>16)&255);     \
30e25f
-     (y)[6] = (uint8_t)(((x)>>8)&255); (y)[7] = (uint8_t)((x)&255); }
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  CONSTANTS
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-// The K array
30e25f
-static const uint32_t K[64] = {
30e25f
-    0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
30e25f
-    0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
30e25f
-    0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
30e25f
-    0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
30e25f
-    0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
30e25f
-    0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
30e25f
-    0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
30e25f
-    0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
30e25f
-    0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
30e25f
-    0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
30e25f
-    0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
30e25f
-    0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
30e25f
-    0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
30e25f
-};
30e25f
-
30e25f
-#define BLOCK_SIZE          64
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  INTERNAL FUNCTIONS
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-// Various logical functions
30e25f
-#define Ch( x, y, z )     (z ^ (x & (y ^ z)))
30e25f
-#define Maj( x, y, z )    (((x | y) & z) | (x & y))
30e25f
-#define S( x, n )         ror((x),(n))
30e25f
-#define R( x, n )         (((x)&0xFFFFFFFFUL)>>(n))
30e25f
-#define Sigma0( x )       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
30e25f
-#define Sigma1( x )       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
30e25f
-#define Gamma0( x )       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
30e25f
-#define Gamma1( x )       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
30e25f
-
30e25f
-#define Sha256Round( a, b, c, d, e, f, g, h, i )       \
30e25f
-     t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];   \
30e25f
-     t1 = Sigma0(a) + Maj(a, b, c);                    \
30e25f
-     d += t0;                                          \
30e25f
-     h  = t0 + t1;
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  TransformFunction
30e25f
-//
30e25f
-//  Compress 512-bits
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-static
30e25f
-void
30e25f
-    TransformFunction
30e25f
-    (
30e25f
-        Sha256Context*      Context,
30e25f
-        uint8_t const*      Buffer
30e25f
-    )
30e25f
-{
30e25f
-    uint32_t    S[8];
30e25f
-    uint32_t    W[64];
30e25f
-    uint32_t    t0;
30e25f
-    uint32_t    t1;
30e25f
-    uint32_t    t;
30e25f
-    int         i;
30e25f
-
30e25f
-    // Copy state into S
30e25f
-    for( i=0; i<8; i++ )
30e25f
-    {
30e25f
-        S[i] = Context->state[i];
30e25f
-    }
30e25f
-
30e25f
-    // Copy the state into 512-bits into W[0..15]
30e25f
-    for( i=0; i<16; i++ )
30e25f
-    {
30e25f
-        LOAD32H( W[i], Buffer + (4*i) );
30e25f
-    }
30e25f
-
30e25f
-    // Fill W[16..63]
30e25f
-    for( i=16; i<64; i++ )
30e25f
-    {
30e25f
-        W[i] = Gamma1( W[i-2]) + W[i-7] + Gamma0( W[i-15] ) + W[i-16];
30e25f
-    }
30e25f
-
30e25f
-    // Compress
30e25f
-    for( i=0; i<64; i++ )
30e25f
-    {
30e25f
-        Sha256Round( S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i );
30e25f
-        t = S[7];
30e25f
-        S[7] = S[6];
30e25f
-        S[6] = S[5];
30e25f
-        S[5] = S[4];
30e25f
-        S[4] = S[3];
30e25f
-        S[3] = S[2];
30e25f
-        S[2] = S[1];
30e25f
-        S[1] = S[0];
30e25f
-        S[0] = t;
30e25f
-    }
30e25f
-
30e25f
-    // Feedback
30e25f
-    for( i=0; i<8; i++ )
30e25f
-    {
30e25f
-        Context->state[i] = Context->state[i] + S[i];
30e25f
-    }
30e25f
-}
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  PUBLIC FUNCTIONS
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  Sha256Initialise
30e25f
-//
30e25f
-//  Initialises a SHA256 Context. Use this to initialise/reset a context.
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-void
30e25f
-    Sha256Initialise
30e25f
-    (
30e25f
-        Sha256Context*      Context         // [out]
30e25f
-    )
30e25f
-{
30e25f
-    Context->curlen = 0;
30e25f
-    Context->length = 0;
30e25f
-    Context->state[0] = 0x6A09E667UL;
30e25f
-    Context->state[1] = 0xBB67AE85UL;
30e25f
-    Context->state[2] = 0x3C6EF372UL;
30e25f
-    Context->state[3] = 0xA54FF53AUL;
30e25f
-    Context->state[4] = 0x510E527FUL;
30e25f
-    Context->state[5] = 0x9B05688CUL;
30e25f
-    Context->state[6] = 0x1F83D9ABUL;
30e25f
-    Context->state[7] = 0x5BE0CD19UL;
30e25f
-}
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  Sha256Update
30e25f
-//
30e25f
-//  Adds data to the SHA256 context. This will process the data and update the internal state of the context. Keep on
30e25f
-//  calling this function until all the data has been added. Then call Sha256Finalise to calculate the hash.
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-void
30e25f
-    Sha256Update
30e25f
-    (
30e25f
-        Sha256Context*      Context,        // [in out]
30e25f
-        void const*         Buffer,         // [in]
30e25f
-        uint32_t            BufferSize      // [in]
30e25f
-    )
30e25f
-{
30e25f
-    uint32_t n;
30e25f
-
30e25f
-    if( Context->curlen > sizeof(Context->buf) )
30e25f
-    {
30e25f
-       return;
30e25f
-    }
30e25f
-
30e25f
-    while( BufferSize > 0 )
30e25f
-    {
30e25f
-        if( Context->curlen == 0 && BufferSize >= BLOCK_SIZE )
30e25f
-        {
30e25f
-           TransformFunction( Context, (uint8_t*)Buffer );
30e25f
-           Context->length += BLOCK_SIZE * 8;
30e25f
-           Buffer = (uint8_t*)Buffer + BLOCK_SIZE;
30e25f
-           BufferSize -= BLOCK_SIZE;
30e25f
-        }
30e25f
-        else
30e25f
-        {
30e25f
-           n = MIN( BufferSize, (BLOCK_SIZE - Context->curlen) );
30e25f
-           memcpy( Context->buf + Context->curlen, Buffer, (size_t)n );
30e25f
-           Context->curlen += n;
30e25f
-           Buffer = (uint8_t*)Buffer + n;
30e25f
-           BufferSize -= n;
30e25f
-           if( Context->curlen == BLOCK_SIZE )
30e25f
-           {
30e25f
-              TransformFunction( Context, Context->buf );
30e25f
-              Context->length += 8*BLOCK_SIZE;
30e25f
-              Context->curlen = 0;
30e25f
-           }
30e25f
-       }
30e25f
-    }
30e25f
-}
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  Sha256Finalise
30e25f
-//
30e25f
-//  Performs the final calculation of the hash and returns the digest (32 byte buffer containing 256bit hash). After
30e25f
-//  calling this, Sha256Initialised must be used to reuse the context.
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-void
30e25f
-    Sha256Finalise
30e25f
-    (
30e25f
-        Sha256Context*      Context,        // [in out]
30e25f
-        SHA256_HASH*        Digest          // [out]
30e25f
-    )
30e25f
-{
30e25f
-    int i;
30e25f
-
30e25f
-    if( Context->curlen >= sizeof(Context->buf) )
30e25f
-    {
30e25f
-       return;
30e25f
-    }
30e25f
-
30e25f
-    // Increase the length of the message
30e25f
-    Context->length += Context->curlen * 8;
30e25f
-
30e25f
-    // Append the '1' bit
30e25f
-    Context->buf[Context->curlen++] = (uint8_t)0x80;
30e25f
-
30e25f
-    // if the length is currently above 56 bytes we append zeros
30e25f
-    // then compress.  Then we can fall back to padding zeros and length
30e25f
-    // encoding like normal.
30e25f
-    if( Context->curlen > 56 )
30e25f
-    {
30e25f
-        while( Context->curlen < 64 )
30e25f
-        {
30e25f
-            Context->buf[Context->curlen++] = (uint8_t)0;
30e25f
-        }
30e25f
-        TransformFunction(Context, Context->buf);
30e25f
-        Context->curlen = 0;
30e25f
-    }
30e25f
-
30e25f
-    // Pad up to 56 bytes of zeroes
30e25f
-    while( Context->curlen < 56 )
30e25f
-    {
30e25f
-        Context->buf[Context->curlen++] = (uint8_t)0;
30e25f
-    }
30e25f
-
30e25f
-    // Store length
30e25f
-    STORE64H( Context->length, Context->buf+56 );
30e25f
-    TransformFunction( Context, Context->buf );
30e25f
-
30e25f
-    // Copy output
30e25f
-    for( i=0; i<8; i++ )
30e25f
-    {
30e25f
-        STORE32H( Context->state[i], Digest->bytes+(4*i) );
30e25f
-    }
30e25f
-}
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  Sha256Calculate
30e25f
-//
30e25f
-//  Combines Sha256Initialise, Sha256Update, and Sha256Finalise into one function. Calculates the SHA256 hash of the
30e25f
-//  buffer.
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-void
30e25f
-    Sha256Calculate
30e25f
-    (
30e25f
-        void  const*        Buffer,         // [in]
30e25f
-        uint32_t            BufferSize,     // [in]
30e25f
-        SHA256_HASH*        Digest          // [in]
30e25f
-    )
30e25f
-{
30e25f
-    Sha256Context context;
30e25f
-
30e25f
-    Sha256Initialise( &context );
30e25f
-    Sha256Update( &context, Buffer, BufferSize );
30e25f
-    Sha256Finalise( &context, Digest );
30e25f
-}
30e25f
diff --git a/policycoreutils/semodule/sha256.h b/policycoreutils/semodule/sha256.h
30e25f
deleted file mode 100644
30e25f
index 406ed869..00000000
30e25f
--- a/policycoreutils/semodule/sha256.h
30e25f
+++ /dev/null
30e25f
@@ -1,89 +0,0 @@
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  WjCryptLib_Sha256
30e25f
-//
30e25f
-//  Implementation of SHA256 hash function.
30e25f
-//  Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org
30e25f
-//  Modified by WaterJuice retaining Public Domain license.
30e25f
-//
30e25f
-//  This is free and unencumbered software released into the public domain - June 2013 waterjuice.org
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-#pragma once
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  IMPORTS
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-#include <stdint.h>
30e25f
-#include <stdio.h>
30e25f
-
30e25f
-typedef struct
30e25f
-{
30e25f
-    uint64_t    length;
30e25f
-    uint32_t    state[8];
30e25f
-    uint32_t    curlen;
30e25f
-    uint8_t     buf[64];
30e25f
-} Sha256Context;
30e25f
-
30e25f
-#define SHA256_HASH_SIZE           ( 256 / 8 )
30e25f
-
30e25f
-typedef struct
30e25f
-{
30e25f
-    uint8_t      bytes [SHA256_HASH_SIZE];
30e25f
-} SHA256_HASH;
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  PUBLIC FUNCTIONS
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  Sha256Initialise
30e25f
-//
30e25f
-//  Initialises a SHA256 Context. Use this to initialise/reset a context.
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-void
30e25f
-    Sha256Initialise
30e25f
-    (
30e25f
-        Sha256Context*      Context         // [out]
30e25f
-    );
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  Sha256Update
30e25f
-//
30e25f
-//  Adds data to the SHA256 context. This will process the data and update the internal state of the context. Keep on
30e25f
-//  calling this function until all the data has been added. Then call Sha256Finalise to calculate the hash.
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-void
30e25f
-    Sha256Update
30e25f
-    (
30e25f
-        Sha256Context*      Context,        // [in out]
30e25f
-        void const*         Buffer,         // [in]
30e25f
-        uint32_t            BufferSize      // [in]
30e25f
-    );
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  Sha256Finalise
30e25f
-//
30e25f
-//  Performs the final calculation of the hash and returns the digest (32 byte buffer containing 256bit hash). After
30e25f
-//  calling this, Sha256Initialised must be used to reuse the context.
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-void
30e25f
-    Sha256Finalise
30e25f
-    (
30e25f
-        Sha256Context*      Context,        // [in out]
30e25f
-        SHA256_HASH*        Digest          // [out]
30e25f
-    );
30e25f
-
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-//  Sha256Calculate
30e25f
-//
30e25f
-//  Combines Sha256Initialise, Sha256Update, and Sha256Finalise into one function. Calculates the SHA256 hash of the
30e25f
-//  buffer.
30e25f
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30e25f
-void
30e25f
-    Sha256Calculate
30e25f
-    (
30e25f
-        void  const*        Buffer,         // [in]
30e25f
-        uint32_t            BufferSize,     // [in]
30e25f
-        SHA256_HASH*        Digest          // [in]
30e25f
-    );
30e25f
-- 
30e25f
2.30.2
30e25f