sha: define SHA256_BUFFER_SIZE and SUM_SIZE.

This commit is contained in:
Scott Prager
2014-07-26 02:32:22 -04:00
parent 2e873c8767
commit 338dd10f33
2 changed files with 25 additions and 21 deletions

View File

@@ -52,9 +52,10 @@ void sha256_start(context_sha256_T *ctx)
ctx->state[7] = 0x5BE0CD19; ctx->state[7] = 0x5BE0CD19;
} }
static void sha256_process(context_sha256_T *ctx, const char_u data[64]) static void sha256_process(context_sha256_T *ctx,
const char_u data[SHA256_BUFFER_SIZE])
{ {
uint32_t temp1, temp2, W[64]; uint32_t temp1, temp2, W[SHA256_BUFFER_SIZE];
uint32_t A, B, C, D, E, F, G, H; uint32_t A, B, C, D, E, F, G, H;
GET_UINT32(W[0], data, 0); GET_UINT32(W[0], data, 0);
@@ -186,7 +187,7 @@ void sha256_update(context_sha256_T *ctx, const char_u *input, size_t length)
return; return;
} }
uint32_t left = ctx->total[0] & 0x3F; // left < 64 uint32_t left = ctx->total[0] & (SHA256_BUFFER_SIZE-1); // left < buf size
ctx->total[0] += (uint32_t) length; ctx->total[0] += (uint32_t) length;
ctx->total[0] &= 0xFFFFFFFF; ctx->total[0] &= 0xFFFFFFFF;
@@ -195,7 +196,7 @@ void sha256_update(context_sha256_T *ctx, const char_u *input, size_t length)
ctx->total[1]++; ctx->total[1]++;
} }
size_t fill = 64 - left; size_t fill = SHA256_BUFFER_SIZE - left;
if (left && (length >= fill)) { if (left && (length >= fill)) {
memcpy((void *)(ctx->buffer + left), (void *)input, fill); memcpy((void *)(ctx->buffer + left), (void *)input, fill);
@@ -205,10 +206,10 @@ void sha256_update(context_sha256_T *ctx, const char_u *input, size_t length)
left = 0; left = 0;
} }
while (length >= 64) { while (length >= SHA256_BUFFER_SIZE) {
sha256_process(ctx, input); sha256_process(ctx, input);
length -= 64; length -= SHA256_BUFFER_SIZE;
input += 64; input += SHA256_BUFFER_SIZE;
} }
if (length) { if (length) {
@@ -216,14 +217,14 @@ void sha256_update(context_sha256_T *ctx, const char_u *input, size_t length)
} }
} }
static char_u sha256_padding[64] = { static char_u sha256_padding[SHA256_BUFFER_SIZE] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}; };
void sha256_finish(context_sha256_T *ctx, char_u digest[32]) void sha256_finish(context_sha256_T *ctx, char_u digest[SHA256_SUM_SIZE])
{ {
uint32_t last, padn; uint32_t last, padn;
uint32_t high, low; uint32_t high, low;
@@ -251,7 +252,7 @@ void sha256_finish(context_sha256_T *ctx, char_u digest[32])
PUT_UINT32(ctx->state[7], digest, 28); PUT_UINT32(ctx->state[7], digest, 28);
} }
static const unsigned int kShaStep = 2; #define SHA_STEP 2
/// Gets the hex digest of the buffer. /// Gets the hex digest of the buffer.
/// ///
@@ -265,8 +266,8 @@ static const unsigned int kShaStep = 2;
char_u *sha256_bytes(const char_u *restrict buf, size_t buf_len, char_u *sha256_bytes(const char_u *restrict buf, size_t buf_len,
const char_u *restrict salt, size_t salt_len) const char_u *restrict salt, size_t salt_len)
{ {
char_u sha256sum[32]; char_u sha256sum[SHA256_SUM_SIZE];
static char_u hexit[65]; static char_u hexit[SHA256_BUFFER_SIZE + 1]; // buf size + NULL
context_sha256_T ctx; context_sha256_T ctx;
sha256_self_test(); sha256_self_test();
@@ -279,8 +280,8 @@ char_u *sha256_bytes(const char_u *restrict buf, size_t buf_len,
} }
sha256_finish(&ctx, sha256sum); sha256_finish(&ctx, sha256sum);
for (size_t j = 0; j < 32; j++) { for (size_t j = 0; j < SHA256_SUM_SIZE; j++) {
snprintf((char *) hexit + j * kShaStep, kShaStep+1, "%02x", sha256sum[j]); snprintf((char *) hexit + j * SHA_STEP, SHA_STEP+1, "%02x", sha256sum[j]);
} }
hexit[sizeof(hexit) - 1] = '\0'; hexit[sizeof(hexit) - 1] = '\0';
return hexit; return hexit;
@@ -307,10 +308,10 @@ static char *sha_self_test_vector[] = {
/// @returns true if not failures generated. /// @returns true if not failures generated.
bool sha256_self_test(void) bool sha256_self_test(void)
{ {
char output[65]; char output[SHA256_BUFFER_SIZE + 1]; // buf size + NULL
context_sha256_T ctx; context_sha256_T ctx;
char_u buf[1000]; char_u buf[1000];
char_u sha256sum[32]; char_u sha256sum[SHA256_SUM_SIZE];
char_u *hexit; char_u *hexit;
static bool sha256_self_tested = false; static bool sha256_self_tested = false;
@@ -336,12 +337,12 @@ bool sha256_self_test(void)
} }
sha256_finish(&ctx, sha256sum); sha256_finish(&ctx, sha256sum);
for (size_t j = 0; j < 32; j++) { for (size_t j = 0; j < SHA256_SUM_SIZE; j++) {
snprintf(output + j * kShaStep, kShaStep+1, "%02x", sha256sum[j]); snprintf(output + j * SHA_STEP, SHA_STEP+1, "%02x", sha256sum[j]);
} }
} }
if (memcmp(output, sha_self_test_vector[i], 64)) { if (memcmp(output, sha_self_test_vector[i], SHA256_BUFFER_SIZE)) {
failures = true; failures = true;
output[sizeof(output) - 1] = '\0'; output[sizeof(output) - 1] = '\0';
@@ -362,7 +363,7 @@ void sha2_seed(char_u *restrict header, size_t header_len,
char_u *restrict salt, size_t salt_len) char_u *restrict salt, size_t salt_len)
{ {
static char_u random_data[1000]; static char_u random_data[1000];
char_u sha256sum[32]; char_u sha256sum[SHA256_SUM_SIZE];
context_sha256_T ctx; context_sha256_T ctx;
unsigned int seed = (unsigned int) os_hrtime(); unsigned int seed = (unsigned int) os_hrtime();

View File

@@ -5,10 +5,13 @@
#include "nvim/types.h" // for char_u #include "nvim/types.h" // for char_u
#define SHA256_BUFFER_SIZE 64
#define SHA256_SUM_SIZE 32
typedef struct { typedef struct {
uint32_t total[2]; uint32_t total[2];
uint32_t state[8]; uint32_t state[8];
char_u buffer[64]; char_u buffer[SHA256_BUFFER_SIZE];
} context_sha256_T; } context_sha256_T;
#ifdef INCLUDE_GENERATED_DECLARATIONS #ifdef INCLUDE_GENERATED_DECLARATIONS