sha256.c
author Ryan C. Gordon <icculus@icculus.org>
Fri, 23 Jun 2017 17:28:03 -0400
changeset 58 1390348facc7
parent 46 fe4f59680246
permissions -rw-r--r--
Command line tool that decrypts an OPVault keychain and dumps it to stdout. To compile: gcc -o opvault opvault.c cJSON.c -lcrypto Usage: ./opvault </path/to/mykeychain.opvault> <password> This is just a proof of concept; I'll be recycling this into proper OPVault support in 1pass later and deleting this tool. This uses OpenSSL's libcrypto for the math instead of all the homegrown crypto this project is otherwise using. I'll probably migrate the rest in this direction, too, since this wasn't as bad as I expected to use and gets you all the package-manager mojo of automatic bug fixes and security patches and shared code, etc. cJSON parses JSON in C. That is from https://github.com/DaveGamble/cJSON An example OPVault keychain from AgileBits is available here: https://cache.agilebits.com/security-kb/
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     1
/*********************************************************************
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     2
* Filename:   sha256.c
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     3
* Author:     Brad Conte (brad AT bradconte.com)
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     4
* Copyright:
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     5
* Disclaimer: This code is presented "as is" without any guarantees.
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     6
* Details:    Implementation of the SHA-256 hashing algorithm.
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     7
              SHA-256 is one of the three algorithms in the SHA2
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     8
              specification. The others, SHA-384 and SHA-512, are not
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     9
              offered in this implementation.
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    10
              Algorithm specification can be found here:
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    11
               * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    12
              This implementation uses little endian byte order.
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    13
*********************************************************************/
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    14
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    15
/*************************** HEADER FILES ***************************/
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    16
#include <stdlib.h>
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    17
#include <memory.h>
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    18
#include "sha256.h"
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    19
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    20
/****************************** MACROS ******************************/
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    21
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    22
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    23
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    24
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    25
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    26
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    27
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    28
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    29
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    30
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    31
/**************************** VARIABLES *****************************/
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    32
static const WORD k[64] = {
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    33
	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    34
	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    35
	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    36
	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    37
	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    38
	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    39
	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    40
	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    41
};
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    42
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    43
/*********************** FUNCTION DEFINITIONS ***********************/
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    44
void sha256_transform(SHA256_CTX *ctx, const BYTE data[])
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    45
{
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    46
	WORD a, b, c, d, e, f, g, h, i, j, t1, t2, m[64];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    47
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    48
	for (i = 0, j = 0; i < 16; ++i, j += 4)
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    49
		m[i] = (data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) | (data[j + 3]);
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    50
	for ( ; i < 64; ++i)
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    51
		m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    52
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    53
	a = ctx->state[0];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    54
	b = ctx->state[1];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    55
	c = ctx->state[2];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    56
	d = ctx->state[3];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    57
	e = ctx->state[4];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    58
	f = ctx->state[5];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    59
	g = ctx->state[6];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    60
	h = ctx->state[7];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    61
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    62
	for (i = 0; i < 64; ++i) {
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    63
		t1 = h + EP1(e) + CH(e,f,g) + k[i] + m[i];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    64
		t2 = EP0(a) + MAJ(a,b,c);
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    65
		h = g;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    66
		g = f;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    67
		f = e;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    68
		e = d + t1;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    69
		d = c;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    70
		c = b;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    71
		b = a;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    72
		a = t1 + t2;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    73
	}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    74
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    75
	ctx->state[0] += a;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    76
	ctx->state[1] += b;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    77
	ctx->state[2] += c;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    78
	ctx->state[3] += d;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    79
	ctx->state[4] += e;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    80
	ctx->state[5] += f;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    81
	ctx->state[6] += g;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    82
	ctx->state[7] += h;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    83
}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    84
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    85
void sha256_init(SHA256_CTX *ctx)
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    86
{
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    87
	ctx->datalen = 0;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    88
	ctx->bitlen = 0;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    89
	ctx->state[0] = 0x6a09e667;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    90
	ctx->state[1] = 0xbb67ae85;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    91
	ctx->state[2] = 0x3c6ef372;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    92
	ctx->state[3] = 0xa54ff53a;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    93
	ctx->state[4] = 0x510e527f;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    94
	ctx->state[5] = 0x9b05688c;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    95
	ctx->state[6] = 0x1f83d9ab;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    96
	ctx->state[7] = 0x5be0cd19;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    97
}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    98
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    99
void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len)
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   100
{
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   101
	WORD i;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   102
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   103
	for (i = 0; i < len; ++i) {
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   104
		ctx->data[ctx->datalen] = data[i];
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   105
		ctx->datalen++;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   106
		if (ctx->datalen == 64) {
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   107
			sha256_transform(ctx, ctx->data);
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   108
			ctx->bitlen += 512;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   109
			ctx->datalen = 0;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   110
		}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   111
	}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   112
}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   113
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   114
void sha256_final(SHA256_CTX *ctx, BYTE hash[])
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   115
{
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   116
	WORD i;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   117
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   118
	i = ctx->datalen;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   119
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   120
	// Pad whatever data is left in the buffer.
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   121
	if (ctx->datalen < 56) {
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   122
		ctx->data[i++] = 0x80;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   123
		while (i < 56)
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   124
			ctx->data[i++] = 0x00;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   125
	}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   126
	else {
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   127
		ctx->data[i++] = 0x80;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   128
		while (i < 64)
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   129
			ctx->data[i++] = 0x00;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   130
		sha256_transform(ctx, ctx->data);
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   131
		memset(ctx->data, 0, 56);
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   132
	}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   133
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   134
	// Append to the padding the total message's length in bits and transform.
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   135
	ctx->bitlen += ctx->datalen * 8;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   136
	ctx->data[63] = ctx->bitlen;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   137
	ctx->data[62] = ctx->bitlen >> 8;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   138
	ctx->data[61] = ctx->bitlen >> 16;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   139
	ctx->data[60] = ctx->bitlen >> 24;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   140
	ctx->data[59] = ctx->bitlen >> 32;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   141
	ctx->data[58] = ctx->bitlen >> 40;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   142
	ctx->data[57] = ctx->bitlen >> 48;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   143
	ctx->data[56] = ctx->bitlen >> 56;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   144
	sha256_transform(ctx, ctx->data);
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   145
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   146
	// Since this implementation uses little endian byte ordering and SHA uses big endian,
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   147
	// reverse all the bytes when copying the final state to the output hash.
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   148
	for (i = 0; i < 4; ++i) {
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   149
		hash[i]      = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   150
		hash[i + 4]  = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   151
		hash[i + 8]  = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   152
		hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   153
		hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   154
		hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   155
		hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   156
		hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   157
	}
fe4f59680246 Added experimental support for using a "trusted device."
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   158
}