|
|
@@ -48,22 +48,22 @@
|
|
|
static const uint32_t
|
|
|
K[64] =
|
|
|
{
|
|
|
- 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
|
|
|
- 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
|
|
|
- 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
|
|
|
- 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
|
|
|
- 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
|
|
|
- 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
|
|
|
- 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
|
|
|
- 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
|
|
|
- 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
|
|
|
- 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
|
|
|
- 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
|
|
|
- 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
|
|
|
- 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
|
|
|
- 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
|
|
|
- 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
|
|
|
- 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL,
|
|
|
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
|
|
|
+ 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
|
|
|
+ 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
|
|
|
+ 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
|
|
|
+ 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
|
|
|
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
|
|
|
+ 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
|
|
|
+ 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
|
|
|
+ 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
|
|
|
+ 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
|
|
|
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
|
|
|
+ 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
|
|
|
+ 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
|
|
|
+ 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
|
|
|
+ 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
|
|
|
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL,
|
|
|
};
|
|
|
|
|
|
|
|
|
@@ -77,11 +77,11 @@ K[64] =
|
|
|
this */
|
|
|
|
|
|
/* #define Choice(x,y,z) ( ( (x) & (y) ) | ( ~(x) & (z) ) ) */
|
|
|
-#define Choice(x,y,z) ( (z) ^ ( (x) & ( (y) ^ (z) ) ) )
|
|
|
+#define Choice(x,y,z) ( (z) ^ ( (x) & ( (y) ^ (z) ) ) )
|
|
|
/* #define Majority(x,y,z) ( ((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)) ) */
|
|
|
#define Majority(x,y,z) ( ((x) & (y)) ^ ((z) & ((x) ^ (y))) )
|
|
|
|
|
|
-#define S0(x) (ROTL32(30,(x)) ^ ROTL32(19,(x)) ^ ROTL32(10,(x)))
|
|
|
+#define S0(x) (ROTL32(30,(x)) ^ ROTL32(19,(x)) ^ ROTL32(10,(x)))
|
|
|
#define S1(x) (ROTL32(26,(x)) ^ ROTL32(21,(x)) ^ ROTL32(7,(x)))
|
|
|
|
|
|
#define s0(x) (ROTL32(25,(x)) ^ ROTL32(14,(x)) ^ ((x) >> 3))
|
|
|
@@ -182,22 +182,22 @@ _nettle_sha256_compress(uint32_t *state, const uint8_t *input, const uint32_t *k
|
|
|
F = state[5];
|
|
|
G = state[6];
|
|
|
H = state[7];
|
|
|
-
|
|
|
+
|
|
|
/* Heavy mangling */
|
|
|
/* First 16 subrounds that act on the original data */
|
|
|
|
|
|
for (i = 0, d = data; i<16; i+=8, k += 8, d+= 8)
|
|
|
{
|
|
|
- ROUND(A, B, C, D, E, F, G, H, k[0], d[0]);
|
|
|
- ROUND(H, A, B, C, D, E, F, G, k[1], d[1]);
|
|
|
+ ROUND(A, B, C, D, E, F, G, H, k[0], d[0]);
|
|
|
+ ROUND(H, A, B, C, D, E, F, G, k[1], d[1]);
|
|
|
ROUND(G, H, A, B, C, D, E, F, k[2], d[2]);
|
|
|
ROUND(F, G, H, A, B, C, D, E, k[3], d[3]);
|
|
|
ROUND(E, F, G, H, A, B, C, D, k[4], d[4]);
|
|
|
ROUND(D, E, F, G, H, A, B, C, k[5], d[5]);
|
|
|
- ROUND(C, D, E, F, G, H, A, B, k[6], d[6]);
|
|
|
- ROUND(B, C, D, E, F, G, H, A, k[7], d[7]);
|
|
|
+ ROUND(C, D, E, F, G, H, A, B, k[6], d[6]);
|
|
|
+ ROUND(B, C, D, E, F, G, H, A, k[7], d[7]);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
for (; i<64; i += 16, k+= 16)
|
|
|
{
|
|
|
ROUND(A, B, C, D, E, F, G, H, k[ 0], EXPAND(data, 0));
|
|
|
@@ -235,20 +235,21 @@ _nettle_sha256_compress(uint32_t *state, const uint8_t *input, const uint32_t *k
|
|
|
/* Initialize the SHA values */
|
|
|
|
|
|
void
|
|
|
-sha256_init(struct sha256_ctx *ctx)
|
|
|
+sha256_init (void *ctx_)
|
|
|
{
|
|
|
/* Initial values, also generated by the shadata program. */
|
|
|
static const uint32_t H0[_SHA256_DIGEST_LENGTH] =
|
|
|
{
|
|
|
- 0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL,
|
|
|
- 0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL,
|
|
|
+ 0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL,
|
|
|
+ 0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL,
|
|
|
};
|
|
|
+ struct sha256_ctx *ctx = ctx_;
|
|
|
|
|
|
memcpy(ctx->state, H0, sizeof(H0));
|
|
|
|
|
|
/* Initialize bit count */
|
|
|
ctx->count = 0;
|
|
|
-
|
|
|
+
|
|
|
/* Initialize buffer */
|
|
|
ctx->index = 0;
|
|
|
}
|
|
|
@@ -322,9 +323,11 @@ sha256_init(struct sha256_ctx *ctx)
|
|
|
|
|
|
|
|
|
void
|
|
|
-sha256_update(struct sha256_ctx *ctx,
|
|
|
- size_t length, const uint8_t *data)
|
|
|
+sha256_update (void *ctx_,
|
|
|
+ const uint8_t *data,
|
|
|
+ size_t length)
|
|
|
{
|
|
|
+ struct sha256_ctx *ctx = ctx_;
|
|
|
MD_UPDATE (ctx, length, data, COMPRESS, ctx->count++);
|
|
|
}
|
|
|
|
|
|
@@ -337,7 +340,7 @@ _nettle_write_be32(size_t length, uint8_t *dst,
|
|
|
size_t i;
|
|
|
size_t words;
|
|
|
unsigned leftover;
|
|
|
-
|
|
|
+
|
|
|
words = length / 4;
|
|
|
leftover = length % 4;
|
|
|
|
|
|
@@ -348,9 +351,9 @@ _nettle_write_be32(size_t length, uint8_t *dst,
|
|
|
{
|
|
|
uint32_t word;
|
|
|
unsigned j = leftover;
|
|
|
-
|
|
|
+
|
|
|
word = src[i];
|
|
|
-
|
|
|
+
|
|
|
switch (leftover)
|
|
|
{
|
|
|
default:
|
|
|
@@ -369,9 +372,9 @@ _nettle_write_be32(size_t length, uint8_t *dst,
|
|
|
|
|
|
|
|
|
static void
|
|
|
-sha256_write_digest(struct sha256_ctx *ctx,
|
|
|
- size_t length,
|
|
|
- uint8_t *digest)
|
|
|
+sha256_write_digest (struct sha256_ctx *ctx,
|
|
|
+ size_t length,
|
|
|
+ uint8_t *digest)
|
|
|
{
|
|
|
uint64_t bit_count;
|
|
|
|
|
|
@@ -379,7 +382,7 @@ sha256_write_digest(struct sha256_ctx *ctx,
|
|
|
|
|
|
MD_PAD(ctx, 8, COMPRESS);
|
|
|
|
|
|
- /* There are 512 = 2^9 bits in one block */
|
|
|
+ /* There are 512 = 2^9 bits in one block */
|
|
|
bit_count = (ctx->count << 9) | (ctx->index << 3);
|
|
|
|
|
|
/* This is slightly inefficient, as the numbers are converted to
|
|
|
@@ -392,10 +395,13 @@ sha256_write_digest(struct sha256_ctx *ctx,
|
|
|
}
|
|
|
|
|
|
void
|
|
|
-sha256_digest(struct sha256_ctx *ctx,
|
|
|
- size_t length,
|
|
|
+sha256_digest (void *ctx_,
|
|
|
uint8_t *digest)
|
|
|
{
|
|
|
- sha256_write_digest(ctx, length, digest);
|
|
|
- sha256_init(ctx);
|
|
|
+ struct sha256_ctx *ctx = ctx_;
|
|
|
+
|
|
|
+ sha256_write_digest (ctx,
|
|
|
+ SHA256_DIGEST_SIZE,
|
|
|
+ digest);
|
|
|
+ sha256_init (ctx);
|
|
|
}
|