As mentioned yesterday, I wanted to get SHA-2 up and running.... And here it is.
I've implemented the 512 byte digest and not the lower versions.
SHA-2 is a verifiable system (and the code does match the results from the original routine too)
The letters "abc" produce the hex string : ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
One million "a" produces : e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b
At the moment, it will only deal with passed strings - I'll get it dealing with data from files later on.
LOCAL t$="abc"
SHA2_Initialise()
SHA2_Process(t$,LEN(t$))
DEBUG "Digest : "+SHA2_Finish$()+"\n"
Main code :
// --------------------------------- //
// Project: SHA-2
// Start: Tuesday, November 17, 2009
// IDE Version: 7.177
INLINE
#define SHA512_DIGEST_SIZE ( 512 / 8)
#define SHA512_BLOCK_SIZE (1024 / 8)
#define SHFR(x, n) (x >> n)
#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n)))
#define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n)))
#define CH(x, y, z) ((x & y) ^ (~x & z))
#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
#define SHA512_F1(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
#define SHA512_F2(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
#define SHA512_F3(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHFR(x, 7))
#define SHA512_F4(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHFR(x, 6))
#define UNPACK32(x, str) \
{ \
*((str) + 3) = (uint8) ((x) ); \
*((str) + 2) = (uint8) ((x) >> 8); \
*((str) + 1) = (uint8) ((x) >> 16); \
*((str) + 0) = (uint8) ((x) >> 24); \
}
#define UNPACK64(x, str) \
{ \
*((str) + 7) = (uint8) ((x) ); \
*((str) + 6) = (uint8) ((x) >> 8); \
*((str) + 5) = (uint8) ((x) >> 16); \
*((str) + 4) = (uint8) ((x) >> 24); \
*((str) + 3) = (uint8) ((x) >> 32); \
*((str) + 2) = (uint8) ((x) >> 40); \
*((str) + 1) = (uint8) ((x) >> 48); \
*((str) + 0) = (uint8) ((x) >> 56); \
}
#define PACK64(str, x) \
{ \
*(x) = ((uint64) *((str) + 7) ) \
| ((uint64) *((str) + 6) << 8) \
| ((uint64) *((str) + 5) << 16) \
| ((uint64) *((str) + 4) << 24) \
| ((uint64) *((str) + 3) << 32) \
| ((uint64) *((str) + 2) << 40) \
| ((uint64) *((str) + 1) << 48) \
| ((uint64) *((str) + 0) << 56); \
}
#define SHA512_SCR(i) \
{ \
w[i] = SHA512_F4(w[i - 2]) + w[i - 7] \
+ SHA512_F3(w[i - 15]) + w[i - 16]; \
}
#define SHA512_EXP(a, b, c, d, e, f, g ,h, j) \
{ \
t1 = wv[h] + SHA512_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \
+ sha512_k[j] + w[j]; \
t2 = SHA512_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \
wv[d] += t1; \
wv[h] = t1 + t2; \
}
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef unsigned long long uint64;
typedef struct {
unsigned int tot_len;
unsigned int len;
unsigned char block[2 * SHA512_BLOCK_SIZE];
uint64 h[8];
} sha512_ctx;
typedef sha512_ctx sha384_ctx;
void sha512_init(sha512_ctx *ctx);
void sha512_update(sha512_ctx *ctx, const unsigned char *message,
unsigned int len);
void sha512_final(sha512_ctx *ctx, unsigned char *digest);
void sha512(const unsigned char *message, unsigned int len,
unsigned char *digest);
typedef unsigned int size_t;
extern "C" void *memcpy(void *destination, const void *source, size_t num );
extern "C" void *memset(void *ptr, int value, size_t num);
extern "C" int sprintf ( char * str, const char * format, ... );
uint64 sha512_h0[8] =
{0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL};
uint64 sha512_k[80] =
{0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL};
sha512_ctx userData;
unsigned char digest[SHA512_DIGEST_SIZE];
void sha512_transf(sha512_ctx *ctx, const unsigned char *message,unsigned int block_nb)
{
uint64 w[80];
uint64 wv[8];
uint64 t1, t2;
const unsigned char *sub_block;
int i, j;
for (i = 0; i < (int) block_nb; i++) {
sub_block = message + (i << 7);
#ifndef UNROLL_LOOPS
for (j = 0; j < 16; j++) {
PACK64(&sub_block[j << 3], &w[j]);
}
for (j = 16; j < 80; j++) {
SHA512_SCR(j);
}
for (j = 0; j < 8; j++) {
wv[j] = ctx->h[j];
}
for (j = 0; j < 80; j++) {
t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
+ sha512_k[j] + w[j];
t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
wv[7] = wv[6];
wv[6] = wv[5];
wv[5] = wv[4];
wv[4] = wv[3] + t1;
wv[3] = wv[2];
wv[2] = wv[1];
wv[1] = wv[0];
wv[0] = t1 + t2;
}
for (j = 0; j < 8; j++) {
ctx->h[j] += wv[j];
}
#else
PACK64(&sub_block[ 0], &w[ 0]); PACK64(&sub_block[ 8], &w[ 1]);
PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]);
PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]);
PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]);
PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]);
PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]);
PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]);
PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]);
SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19);
SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23);
SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27);
SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31);
SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35);
SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39);
SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43);
SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47);
SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51);
SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55);
SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59);
SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63);
SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67);
SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71);
SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75);
SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79);
wv[0] = ctx->h[0]; wv[1] = ctx->h[1];
wv[2] = ctx->h[2]; wv[3] = ctx->h[3];
wv[4] = ctx->h[4]; wv[5] = ctx->h[5];
wv[6] = ctx->h[6]; wv[7] = ctx->h[7];
j = 0;
do {
SHA512_EXP(0,1,2,3,4,5,6,7,j); j++;
SHA512_EXP(7,0,1,2,3,4,5,6,j); j++;
SHA512_EXP(6,7,0,1,2,3,4,5,j); j++;
SHA512_EXP(5,6,7,0,1,2,3,4,j); j++;
SHA512_EXP(4,5,6,7,0,1,2,3,j); j++;
SHA512_EXP(3,4,5,6,7,0,1,2,j); j++;
SHA512_EXP(2,3,4,5,6,7,0,1,j); j++;
SHA512_EXP(1,2,3,4,5,6,7,0,j); j++;
} while (j < 80);
ctx->h[0] += wv[0]; ctx->h[1] += wv[1];
ctx->h[2] += wv[2]; ctx->h[3] += wv[3];
ctx->h[4] += wv[4]; ctx->h[5] += wv[5];
ctx->h[6] += wv[6]; ctx->h[7] += wv[7];
#endif /* !UNROLL_LOOPS */
}
}
void sha512(const unsigned char *message, unsigned int len,
unsigned char *digest)
{
sha512_ctx ctx;
sha512_init(&ctx);
sha512_update(&ctx, message, len);
sha512_final(&ctx, digest);
}
void sha512_init(sha512_ctx *ctx)
{
#ifndef UNROLL_LOOPS
int i;
for (i = 0; i < 8; i++) {
ctx->h[i] = sha512_h0[i];
}
#else
ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1];
ctx->h[2] = sha512_h0[2]; ctx->h[3] = sha512_h0[3];
ctx->h[4] = sha512_h0[4]; ctx->h[5] = sha512_h0[5];
ctx->h[6] = sha512_h0[6]; ctx->h[7] = sha512_h0[7];
#endif /* !UNROLL_LOOPS */
ctx->len = 0;
ctx->tot_len = 0;
}
void sha512_update(sha512_ctx *ctx, const unsigned char *message,
unsigned int len)
{
unsigned int block_nb;
unsigned int new_len, rem_len, tmp_len;
const unsigned char *shifted_message;
tmp_len = SHA512_BLOCK_SIZE - ctx->len;
rem_len = len < tmp_len ? len : tmp_len;
memcpy(&ctx->block[ctx->len], message, rem_len);
if (ctx->len + len < SHA512_BLOCK_SIZE) {
ctx->len += len;
return;
}
new_len = len - rem_len;
block_nb = new_len / SHA512_BLOCK_SIZE;
shifted_message = message + rem_len;
sha512_transf(ctx, ctx->block, 1);
sha512_transf(ctx, shifted_message, block_nb);
rem_len = new_len % SHA512_BLOCK_SIZE;
memcpy(ctx->block, &shifted_message[block_nb << 7],
rem_len);
ctx->len = rem_len;
ctx->tot_len += (block_nb + 1) << 7;
}
void sha512_final(sha512_ctx *ctx, unsigned char *digest)
{
unsigned int block_nb;
unsigned int pm_len;
unsigned int len_b;
#ifndef UNROLL_LOOPS
int i;
#endif
block_nb = 1 + ((SHA512_BLOCK_SIZE - 17)
< (ctx->len % SHA512_BLOCK_SIZE));
len_b = (ctx->tot_len + ctx->len) << 3;
pm_len = block_nb << 7;
memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
ctx->block[ctx->len] = 0x80;
UNPACK32(len_b, ctx->block + pm_len - 4);
sha512_transf(ctx, ctx->block, block_nb);
#ifndef UNROLL_LOOPS
for (i = 0 ; i < 8; i++) {
UNPACK64(ctx->h[i], &digest[i << 3]);
}
#else
UNPACK64(ctx->h[0], &digest[ 0]);
UNPACK64(ctx->h[1], &digest[ 8]);
UNPACK64(ctx->h[2], &digest[16]);
UNPACK64(ctx->h[3], &digest[24]);
UNPACK64(ctx->h[4], &digest[32]);
UNPACK64(ctx->h[5], &digest[40]);
UNPACK64(ctx->h[6], &digest[48]);
UNPACK64(ctx->h[7], &digest[56]);
#endif /* !UNROLL_LOOPS */
}
ENDINLINE
FUNCTION SHA2_Initialise%:
INLINE
sha512_init(&userData);
memset(&digest,(char) 0,sizeof(digest));
ENDINLINE
ENDFUNCTION
FUNCTION SHA2_Process%:data$,length%
INLINE
sha512_update(&userData,(const unsigned char *) data_Str.c_str(),length);
ENDINLINE
ENDFUNCTION
FUNCTION SHA2_Finish$:
LOCAL result$
INLINE
sha512_final(&userData,(unsigned char *) &digest);
unsigned char output[2 * SHA512_DIGEST_SIZE + 1];
int i;
output[2 * SHA512_DIGEST_SIZE] = '\0';
for (i = 0; i < (int) SHA512_DIGEST_SIZE ; i++) {
sprintf((char *) output + 2 * i, "%02x", digest[i]);
}
result_Str.assign((char *) &output);
ENDINLINE
RETURN result$
ENDFUNCTION
And no, I dont understand any of it either - but it works, which is the main thing...
Very impressive work, congrats in getting this beast to inline! :booze:
Good to see you ignored SHA-1 which is not as safe as it once was. I don't pretend to understand it all (maths was never my strong suit) but I have had a long interest in Cryptography. I was (before I 'retired' from coding) looking to create a crypto library as I have a habit of doing that whenever I start using any new language. Glad to see someone else is getting into it instead. So when can we expect to see all the other usual algorithms? =D
Seriously though, well done mate! :booze:
Glad you both like it!
The SHA-2 family may suffer from the same problem as SHA-1, although no attacks have been reported. Using the 512 byte version certainly makes it harder to attack it though :)
I've now update the program to create the hash result from a file :
// --------------------------------- //
// Project: SHA-2
// Start: Tuesday, November 17, 2009
// IDE Version: 7.177
INLINE
#define SHA512_DIGEST_SIZE ( 512 / 8)
#define SHA512_BLOCK_SIZE (1024 / 8)
#define SHFR(x, n) (x >> n)
#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n)))
#define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n)))
#define CH(x, y, z) ((x & y) ^ (~x & z))
#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
#define SHA512_F1(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
#define SHA512_F2(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
#define SHA512_F3(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHFR(x, 7))
#define SHA512_F4(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHFR(x, 6))
#define UNPACK32(x, str) \
{ \
*((str) + 3) = (uint8) ((x) ); \
*((str) + 2) = (uint8) ((x) >> 8); \
*((str) + 1) = (uint8) ((x) >> 16); \
*((str) + 0) = (uint8) ((x) >> 24); \
}
#define UNPACK64(x, str) \
{ \
*((str) + 7) = (uint8) ((x) ); \
*((str) + 6) = (uint8) ((x) >> 8); \
*((str) + 5) = (uint8) ((x) >> 16); \
*((str) + 4) = (uint8) ((x) >> 24); \
*((str) + 3) = (uint8) ((x) >> 32); \
*((str) + 2) = (uint8) ((x) >> 40); \
*((str) + 1) = (uint8) ((x) >> 48); \
*((str) + 0) = (uint8) ((x) >> 56); \
}
#define PACK64(str, x) \
{ \
*(x) = ((uint64) *((str) + 7) ) \
| ((uint64) *((str) + 6) << 8) \
| ((uint64) *((str) + 5) << 16) \
| ((uint64) *((str) + 4) << 24) \
| ((uint64) *((str) + 3) << 32) \
| ((uint64) *((str) + 2) << 40) \
| ((uint64) *((str) + 1) << 48) \
| ((uint64) *((str) + 0) << 56); \
}
#define SHA512_SCR(i) \
{ \
w[i] = SHA512_F4(w[i - 2]) + w[i - 7] \
+ SHA512_F3(w[i - 15]) + w[i - 16]; \
}
#define SHA512_EXP(a, b, c, d, e, f, g ,h, j) \
{ \
t1 = wv[h] + SHA512_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \
+ sha512_k[j] + w[j]; \
t2 = SHA512_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \
wv[d] += t1; \
wv[h] = t1 + t2; \
}
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef unsigned long long uint64;
typedef struct {
unsigned int tot_len;
unsigned int len;
unsigned char block[2 * SHA512_BLOCK_SIZE];
uint64 h[8];
} sha512_ctx;
typedef sha512_ctx sha384_ctx;
void sha512_init(sha512_ctx *ctx);
void sha512_update(sha512_ctx *ctx, const unsigned char *message,
unsigned int len);
void sha512_final(sha512_ctx *ctx, unsigned char *digest);
void sha512(const unsigned char *message, unsigned int len,
unsigned char *digest);
typedef unsigned int size_t;
extern "C" void *memcpy(void *destination, const void *source, size_t num );
extern "C" void *memset(void *ptr, int value, size_t num);
extern "C" int sprintf ( char * str, const char * format, ... );
extern "C" int open(char * filename, int flags, int mode);
extern "C" int close(int fd);
extern "C" void * memset ( void * ptr, int value, size_t num );
extern "C" int read(int fd, void * ptr, int numbytes);
#define _O_RDONLY 0
#define _O_WRONLY 1
#define _O_RDWR 2
#define _O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
#define _O_APPEND 0x0008
#define _O_CREAT 0x0100
#define _O_TRUNC 0x0200
#define _O_EXCL 0x0400
#define _O_TEXT 0x4000
#define _O_BINARY 0x8000
#define _O_RAW _O_BINARY
#define _O_TEMPORARY 0x0040
#define _O_RANDOM 0x0010
#define _O_SEQUENTIAL _O_RANDOM
#define _O_SHORT_LIVED 0x1000
uint64 sha512_h0[8] =
{0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL};
uint64 sha512_k[80] =
{0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL};
sha512_ctx userData;
unsigned char digest[SHA512_DIGEST_SIZE];
void sha512_transf(sha512_ctx *ctx, const unsigned char *message,unsigned int block_nb)
{
uint64 w[80];
uint64 wv[8];
uint64 t1, t2;
const unsigned char *sub_block;
int i, j;
for (i = 0; i < (int) block_nb; i++) {
sub_block = message + (i << 7);
#ifndef UNROLL_LOOPS
for (j = 0; j < 16; j++) {
PACK64(&sub_block[j << 3], &w[j]);
}
for (j = 16; j < 80; j++) {
SHA512_SCR(j);
}
for (j = 0; j < 8; j++) {
wv[j] = ctx->h[j];
}
for (j = 0; j < 80; j++) {
t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
+ sha512_k[j] + w[j];
t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
wv[7] = wv[6];
wv[6] = wv[5];
wv[5] = wv[4];
wv[4] = wv[3] + t1;
wv[3] = wv[2];
wv[2] = wv[1];
wv[1] = wv[0];
wv[0] = t1 + t2;
}
for (j = 0; j < 8; j++) {
ctx->h[j] += wv[j];
}
#else
PACK64(&sub_block[ 0], &w[ 0]); PACK64(&sub_block[ 8], &w[ 1]);
PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]);
PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]);
PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]);
PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]);
PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]);
PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]);
PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]);
SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19);
SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23);
SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27);
SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31);
SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35);
SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39);
SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43);
SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47);
SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51);
SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55);
SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59);
SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63);
SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67);
SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71);
SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75);
SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79);
wv[0] = ctx->h[0]; wv[1] = ctx->h[1];
wv[2] = ctx->h[2]; wv[3] = ctx->h[3];
wv[4] = ctx->h[4]; wv[5] = ctx->h[5];
wv[6] = ctx->h[6]; wv[7] = ctx->h[7];
j = 0;
do {
SHA512_EXP(0,1,2,3,4,5,6,7,j); j++;
SHA512_EXP(7,0,1,2,3,4,5,6,j); j++;
SHA512_EXP(6,7,0,1,2,3,4,5,j); j++;
SHA512_EXP(5,6,7,0,1,2,3,4,j); j++;
SHA512_EXP(4,5,6,7,0,1,2,3,j); j++;
SHA512_EXP(3,4,5,6,7,0,1,2,j); j++;
SHA512_EXP(2,3,4,5,6,7,0,1,j); j++;
SHA512_EXP(1,2,3,4,5,6,7,0,j); j++;
} while (j < 80);
ctx->h[0] += wv[0]; ctx->h[1] += wv[1];
ctx->h[2] += wv[2]; ctx->h[3] += wv[3];
ctx->h[4] += wv[4]; ctx->h[5] += wv[5];
ctx->h[6] += wv[6]; ctx->h[7] += wv[7];
#endif /* !UNROLL_LOOPS */
}
}
void sha512_init(sha512_ctx *ctx)
{
#ifndef UNROLL_LOOPS
int i;
for (i = 0; i < 8; i++) {
ctx->h[i] = sha512_h0[i];
}
#else
ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1];
ctx->h[2] = sha512_h0[2]; ctx->h[3] = sha512_h0[3];
ctx->h[4] = sha512_h0[4]; ctx->h[5] = sha512_h0[5];
ctx->h[6] = sha512_h0[6]; ctx->h[7] = sha512_h0[7];
#endif /* !UNROLL_LOOPS */
ctx->len = 0;
ctx->tot_len = 0;
}
void sha512_update(sha512_ctx *ctx, const unsigned char *message,
unsigned int len)
{
unsigned int block_nb;
unsigned int new_len, rem_len, tmp_len;
const unsigned char *shifted_message;
tmp_len = SHA512_BLOCK_SIZE - ctx->len;
rem_len = len < tmp_len ? len : tmp_len;
memcpy(&ctx->block[ctx->len], message, rem_len);
if (ctx->len + len < SHA512_BLOCK_SIZE) {
ctx->len += len;
return;
}
new_len = len - rem_len;
block_nb = new_len / SHA512_BLOCK_SIZE;
shifted_message = message + rem_len;
sha512_transf(ctx, ctx->block, 1);
sha512_transf(ctx, shifted_message, block_nb);
rem_len = new_len % SHA512_BLOCK_SIZE;
memcpy(ctx->block, &shifted_message[block_nb << 7],
rem_len);
ctx->len = rem_len;
ctx->tot_len += (block_nb + 1) << 7;
}
void sha512_final(sha512_ctx *ctx, unsigned char *digest)
{
unsigned int block_nb;
unsigned int pm_len;
unsigned int len_b;
#ifndef UNROLL_LOOPS
int i;
#endif
block_nb = 1 + ((SHA512_BLOCK_SIZE - 17)
< (ctx->len % SHA512_BLOCK_SIZE));
len_b = (ctx->tot_len + ctx->len) << 3;
pm_len = block_nb << 7;
memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
ctx->block[ctx->len] = 0x80;
UNPACK32(len_b, ctx->block + pm_len - 4);
sha512_transf(ctx, ctx->block, block_nb);
#ifndef UNROLL_LOOPS
for (i = 0 ; i < 8; i++) {
UNPACK64(ctx->h[i], &digest[i << 3]);
}
#else
UNPACK64(ctx->h[0], &digest[ 0]);
UNPACK64(ctx->h[1], &digest[ 8]);
UNPACK64(ctx->h[2], &digest[16]);
UNPACK64(ctx->h[3], &digest[24]);
UNPACK64(ctx->h[4], &digest[32]);
UNPACK64(ctx->h[5], &digest[40]);
UNPACK64(ctx->h[6], &digest[48]);
UNPACK64(ctx->h[7], &digest[56]);
#endif /* !UNROLL_LOOPS */
}
ENDINLINE
FUNCTION SHA2_Initialise%:
INLINE
sha512_init(&userData);
memset(&digest,(char) 0,sizeof(digest));
ENDINLINE
ENDFUNCTION
FUNCTION SHA2_Process%:data$,length%
INLINE
sha512_update(&userData,(const unsigned char *) data_Str.c_str(),length);
ENDINLINE
ENDFUNCTION
FUNCTION SHA2_Finish$:
LOCAL result$
INLINE
sha512_final(&userData,(unsigned char *) &digest);
unsigned char output[2 * SHA512_DIGEST_SIZE + 1];
int i;
output[2 * SHA512_DIGEST_SIZE] = '\0';
for (i = 0; i < (int) SHA512_DIGEST_SIZE ; i++) {
sprintf((char *) output + 2 * i, "%02x", digest[i]);
}
result_Str.assign((char *) &output);
ENDINLINE
RETURN result$
ENDFUNCTION
FUNCTION SHA2_FromFile$:fileName$,BYREF error%
LOCAL result$
result$=""
INLINE
int handle,length;
unsigned char output[2 * SHA512_DIGEST_SIZE + 1];
int i;
char buffer[4096];
error=0;
handle=open((char *) fileName_Str.c_str(),_O_RDONLY | _O_BINARY,0);
if (handle<0)
{
error=handle;
}
else
{
sha512_init(&userData);
memset(&digest,(char) 0,sizeof(digest));
memset(&buffer,(char) 0,sizeof(buffer));
length=read(handle,(char *) &buffer,sizeof(buffer));
do {
if (length<0)
{
error=length;
break;
}
else
if (length>0)
{
sha512_update(&userData,(const unsigned char *) &buffer,length);
length=read(handle,(char *) &buffer,sizeof(buffer));
}
} while (length>0);
}
if (handle>0)
{
close(handle);
}
ENDINLINE
// Now to finalise the result, if everything was okay
IF error%=0
RETURN SHA2_Finish$()
ELSE
RETURN ""
ENDIF
ENDFUNCTION
Very nice work MrT, but I cant get it working with V11.171 (did not test other versions) can you please have a look at your code and help me? Here is the error log:
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp: In function `int __GLBASIC__::__MainGameSub_()':
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:100: error: `str' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:100: error: `uint8' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:100: error: `x' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:116: error: `str' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:116: error: `uint8' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:116: error: `x' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:140: error: `x' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:140: error: `str' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:164: error: `w' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:164: error: `i' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:176: error: `t1' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:176: error: `wv' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:176: error: `h' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:176: error: `e' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:176: error: `f' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:176: error: `g' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:178: error: `sha512_k' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:178: error: `j' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:178: error: `w' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:180: error: `t2' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:180: error: `a' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:180: error: `b' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:180: error: `c' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:182: error: `d' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:216: error: non-local function `void __GLBASIC__::sha512_init(__GLBASIC__::__MainGameSub_()::sha512_ctx*)' uses local type `__GLBASIC__::__MainGameSub_()::sha512_ctx'
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:220: error: non-local function `void __GLBASIC__::sha512_update(__GLBASIC__::__MainGameSub_()::sha512_ctx*, const unsigned char*, unsigned int)' uses local type `__GLBASIC__::__MainGameSub_()::sha512_ctx'
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:222: error: non-local function `void __GLBASIC__::sha512_final(__GLBASIC__::__MainGameSub_()::sha512_ctx*, unsigned char*)' uses local type `__GLBASIC__::__MainGameSub_()::sha512_ctx'
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:234: error: expected unqualified-id before string constant
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:236: error: expected unqualified-id before string constant
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:238: error: expected unqualified-id before string constant
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:348: error: a function-definition is not allowed here before '{' token
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:538: error: a function-definition is not allowed here before '{' token
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:556: error: a function-definition is not allowed here before '{' token
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:594: error: a function-definition is not allowed here before '{' token
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:660: error: a function-definition is not allowed here before '{' token
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp: In function `DGNat __GLBASIC__::SHA2_Initialise()':
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:760: error: `userData' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:760: error: `sha512_init' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:762: error: `digest' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:762: error: `memset' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp: In function `DGNat __GLBASIC__::SHA2_Process(__GLBASIC__::DGStr, DGNat)':
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:794: error: `userData' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:794: error: `sha512_update' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp: In function `__GLBASIC__::DGStr __GLBASIC__::SHA2_Finish_Str()':
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:832: error: `userData' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:832: error: `digest' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:832: error: `sha512_final' was not declared in this scope
C:\Users\kanonet\AppData\Local\Temp\glbasic\gpc_temp0.cpp:846: error: `sprintf' was not declared in this scope
Same for GLBasic IDE, Version: 10.283
I tried to verify the problem myself with no luck.
Yet it still leads me to wonder if it is a problem with the IDE
The original shows IDE Version: 7.177
What has been changed with the inline stuff for glbasic since then?
That is interesting - seems it doesn't like compounded statements.
Or rather it seems the command to generate them is now ignored :
INLINE
#define a(x,str) \
{ \
}
It does do the same in 10.283 though..
ENDINLINE
Changing these lines should sort it :
#define UNPACK32(x, str) { *((str) + 3) = (uint8) ((x) ); *((str) + 2) = (uint8) ((x) >> 8); *((str) + 1) = (uint8) ((x) >> 16); *((str) + 0) = (uint8) ((x) >> 24); }
#define UNPACK64(x, str) { *((str) + 7) = (uint8) ((x) ); *((str) + 6) = (uint8) ((x) >> 8); *((str) + 5) = (uint8) ((x) >> 16); *((str) + 4) = (uint8) ((x) >> 24); *((str) + 3) = (uint8) ((x) >> 32); }
#define PACK64(str, x) { *(x) = ((uint64) *((str) + 7) ) | ((uint64) *((str) + 6) << 8) | ((uint64) *((str) + 5) << 16) | ((uint64) *((str) + 4) << 24) | ((uint64) *((str) + 3) << 32) | ((uint64) *((str) + 2) << 40) | ((uint64) *((str) + 1) << 48) | ((uint64) *((str) + 0) << 56); }
#define SHA512_SCR(i) { w[i] = SHA512_F4(w[i - 2]) + w[i - 7] + SHA512_F3(w[i - 15]) + w[i - 16]; }
#define SHA512_EXP(a, b, c, d, e, f, g ,h, j) { t1 = wv[h] + SHA512_F2(wv[e]) + CH(wv[e], wv[f], wv[g])+ sha512_k[j] + w[j]; t2 = SHA512_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); wv[d] += t1; wv[h] = t1 + t2; }
Thanks now it works.
For everyone that's dumb like me: you need to remember, that you need a function before the 1st Inline block, to close the main loop.
Oh no, it compiles, but it does not work correctly. E.g. the string "abc" produces the hash "000000a193617aba00000049ae2041310000004e89a97ea2000000e64b55d39a0000002a274fc1a800000023a3feebbd00000023643ce80e0000004fa54ca49f" which obviously is wrong. What can we do?
Use this instead :
#define UNPACK32(x, str) { *((str) + 3) = (uint8) ((x) ); *((str) + 2) = (uint8) ((x) >> 8); *((str) + 1) = (uint8) ((x) >> 16); *((str) + 0) = (uint8) ((x) >> 24); }
#define UNPACK64(x, str) { *((str)+7)=(uint8)((x)); *((str)+6)=(uint8)((x)>>8); *((str)+5)=(uint8)((x)>>16); *((str)+4)=(uint8)((x)>>24); *((str)+3)=(uint8)((x)>>32); *((str)+2)=(uint8)((x)>>40); *((str)+1)=(uint8)((x)>>48); *((str)+0)=(uint8)((x)>>56); }
#define PACK64(str,x) { *(x)=((uint64)*((str)+7)) |((uint64)*((str)+6)<<8) |((uint64)*((str)+5)<<16) |((uint64)*((str)+4)<<24) |((uint64)*((str)+3)<<32) |((uint64)*((str)+2)<<40) |((uint64)*((str)+1)<<48) |((uint64)*((str)+0)<<56); }
#define SHA512_SCR(i) { w[i]=SHA512_F4(w[i-2])+w[i-7] +SHA512_F3(w[i-15])+w[i-16]; }
#define SHA512_EXP(a,b,c,d,e,f,g,h,j) { t1=wv[h]+SHA512_F2(wv[e])+CH(wv[e],wv[f],wv[g]) +sha512_k[j]+w[j]; t2=SHA512_F1(wv[a])+MAJ(wv[a],wv[b],wv[c]); wv[d]+=t1; wv[h]=t1+t2; }
Yes this one did solve the problem, thank you sir!
Quote from: MrTAToad on 2012-Oct-23
Use this instead :
With v10 i replaced these functions and still get errors.
Try this :
// --------------------------------- //
// Project: SHA-2
// Start: Tuesday, November 17, 2009
// IDE Version: 7.177
INLINE
#define SHA512_DIGEST_SIZE ( 512 / 8)
#define SHA512_BLOCK_SIZE (1024 / 8)
#define SHFR(x, n) (x >> n)
#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n)))
#define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n)))
#define CH(x, y, z) ((x & y) ^ (~x & z))
#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
#define SHA512_F1(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
#define SHA512_F2(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
#define SHA512_F3(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHFR(x, 7))
#define SHA512_F4(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHFR(x, 6))
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef unsigned long long uint64;
typedef struct {
unsigned int tot_len;
unsigned int len;
unsigned char block[2 * SHA512_BLOCK_SIZE];
uint64 h[8];
} sha512_ctx;
typedef sha512_ctx sha384_ctx;
void sha512_init(sha512_ctx *ctx);
void sha512_update(sha512_ctx *ctx, const unsigned char *message,
unsigned int len);
void sha512_final(sha512_ctx *ctx, unsigned char *digest);
void sha512(const unsigned char *message, unsigned int len,
unsigned char *digest);
typedef unsigned int size_t;
extern "C" void *memcpy(void *destination, const void *source, size_t num );
extern "C" void *memset(void *ptr, int value, size_t num);
extern "C" int sprintf ( char * str, const char * format, ... );
#define UNPACK32(x, str) { *((str) + 3) = (uint8) ((x) ); *((str) + 2) = (uint8) ((x) >> 8); *((str) + 1) = (uint8) ((x) >> 16); *((str) + 0) = (uint8) ((x) >> 24); }
#define UNPACK64(x, str) { *((str)+7)=(uint8)((x)); *((str)+6)=(uint8)((x)>>8); *((str)+5)=(uint8)((x)>>16); *((str)+4)=(uint8)((x)>>24); *((str)+3)=(uint8)((x)>>32); *((str)+2)=(uint8)((x)>>40); *((str)+1)=(uint8)((x)>>48); *((str)+0)=(uint8)((x)>>56); }
#define PACK64(str,x) { *(x)=((uint64)*((str)+7)) |((uint64)*((str)+6)<<8) |((uint64)*((str)+5)<<16) |((uint64)*((str)+4)<<24) |((uint64)*((str)+3)<<32) |((uint64)*((str)+2)<<40) |((uint64)*((str)+1)<<48) |((uint64)*((str)+0)<<56); }
#define SHA512_SCR(i) { w[i]=SHA512_F4(w[i-2])+w[i-7] +SHA512_F3(w[i-15])+w[i-16]; }
#define SHA512_EXP(a,b,c,d,e,f,g,h,j) { t1=wv[h]+SHA512_F2(wv[e])+CH(wv[e],wv[f],wv[g]) +sha512_k[j]+w[j]; t2=SHA512_F1(wv[a])+MAJ(wv[a],wv[b],wv[c]); wv[d]+=t1; wv[h]=t1+t2; }
uint64 sha512_h0[8] =
{0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL};
uint64 sha512_k[80] =
{0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL};
sha512_ctx userData;
unsigned char digest[SHA512_DIGEST_SIZE];
void sha512_transf(sha512_ctx *ctx, const unsigned char *message,unsigned int block_nb)
{
uint64 w[80];
uint64 wv[8];
uint64 t1, t2;
const unsigned char *sub_block;
int i, j;
for (i = 0; i < (int) block_nb; i++) {
sub_block = message + (i << 7);
#ifndef UNROLL_LOOPS
for (j = 0; j < 16; j++) {
PACK64(&sub_block[j << 3], &w[j]);
}
for (j = 16; j < 80; j++) {
SHA512_SCR(j);
}
for (j = 0; j < 8; j++) {
wv[j] = ctx->h[j];
}
for (j = 0; j < 80; j++) {
t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
+ sha512_k[j] + w[j];
t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
wv[7] = wv[6];
wv[6] = wv[5];
wv[5] = wv[4];
wv[4] = wv[3] + t1;
wv[3] = wv[2];
wv[2] = wv[1];
wv[1] = wv[0];
wv[0] = t1 + t2;
}
for (j = 0; j < 8; j++) {
ctx->h[j] += wv[j];
}
#else
PACK64(&sub_block[ 0], &w[ 0]); PACK64(&sub_block[ 8], &w[ 1]);
PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]);
PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]);
PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]);
PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]);
PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]);
PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]);
PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]);
SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19);
SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23);
SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27);
SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31);
SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35);
SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39);
SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43);
SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47);
SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51);
SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55);
SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59);
SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63);
SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67);
SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71);
SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75);
SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79);
wv[0] = ctx->h[0]; wv[1] = ctx->h[1];
wv[2] = ctx->h[2]; wv[3] = ctx->h[3];
wv[4] = ctx->h[4]; wv[5] = ctx->h[5];
wv[6] = ctx->h[6]; wv[7] = ctx->h[7];
j = 0;
do {
SHA512_EXP(0,1,2,3,4,5,6,7,j); j++;
SHA512_EXP(7,0,1,2,3,4,5,6,j); j++;
SHA512_EXP(6,7,0,1,2,3,4,5,j); j++;
SHA512_EXP(5,6,7,0,1,2,3,4,j); j++;
SHA512_EXP(4,5,6,7,0,1,2,3,j); j++;
SHA512_EXP(3,4,5,6,7,0,1,2,j); j++;
SHA512_EXP(2,3,4,5,6,7,0,1,j); j++;
SHA512_EXP(1,2,3,4,5,6,7,0,j); j++;
} while (j < 80);
ctx->h[0] += wv[0]; ctx->h[1] += wv[1];
ctx->h[2] += wv[2]; ctx->h[3] += wv[3];
ctx->h[4] += wv[4]; ctx->h[5] += wv[5];
ctx->h[6] += wv[6]; ctx->h[7] += wv[7];
#endif /* !UNROLL_LOOPS */
}
}
void sha512(const unsigned char *message, unsigned int len,
unsigned char *digest)
{
sha512_ctx ctx;
sha512_init(&ctx);
sha512_update(&ctx, message, len);
sha512_final(&ctx, digest);
}
void sha512_init(sha512_ctx *ctx)
{
#ifndef UNROLL_LOOPS
int i;
for (i = 0; i < 8; i++) {
ctx->h[i] = sha512_h0[i];
}
#else
ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1];
ctx->h[2] = sha512_h0[2]; ctx->h[3] = sha512_h0[3];
ctx->h[4] = sha512_h0[4]; ctx->h[5] = sha512_h0[5];
ctx->h[6] = sha512_h0[6]; ctx->h[7] = sha512_h0[7];
#endif /* !UNROLL_LOOPS */
ctx->len = 0;
ctx->tot_len = 0;
}
void sha512_update(sha512_ctx *ctx, const unsigned char *message,
unsigned int len)
{
unsigned int block_nb;
unsigned int new_len, rem_len, tmp_len;
const unsigned char *shifted_message;
tmp_len = SHA512_BLOCK_SIZE - ctx->len;
rem_len = len < tmp_len ? len : tmp_len;
memcpy(&ctx->block[ctx->len], message, rem_len);
if (ctx->len + len < SHA512_BLOCK_SIZE) {
ctx->len += len;
return;
}
new_len = len - rem_len;
block_nb = new_len / SHA512_BLOCK_SIZE;
shifted_message = message + rem_len;
sha512_transf(ctx, ctx->block, 1);
sha512_transf(ctx, shifted_message, block_nb);
rem_len = new_len % SHA512_BLOCK_SIZE;
memcpy(ctx->block, &shifted_message[block_nb << 7],
rem_len);
ctx->len = rem_len;
ctx->tot_len += (block_nb + 1) << 7;
}
void sha512_final(sha512_ctx *ctx, unsigned char *digest)
{
unsigned int block_nb;
unsigned int pm_len;
unsigned int len_b;
#ifndef UNROLL_LOOPS
int i;
#endif
block_nb = 1 + ((SHA512_BLOCK_SIZE - 17)
< (ctx->len % SHA512_BLOCK_SIZE));
len_b = (ctx->tot_len + ctx->len) << 3;
pm_len = block_nb << 7;
memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
ctx->block[ctx->len] = 0x80;
UNPACK32(len_b, ctx->block + pm_len - 4);
sha512_transf(ctx, ctx->block, block_nb);
#ifndef UNROLL_LOOPS
for (i = 0 ; i < 8; i++) {
UNPACK64(ctx->h[i], &digest[i << 3]);
}
#else
UNPACK64(ctx->h[0], &digest[ 0]);
UNPACK64(ctx->h[1], &digest[ 8]);
UNPACK64(ctx->h[2], &digest[16]);
UNPACK64(ctx->h[3], &digest[24]);
UNPACK64(ctx->h[4], &digest[32]);
UNPACK64(ctx->h[5], &digest[40]);
UNPACK64(ctx->h[6], &digest[48]);
UNPACK64(ctx->h[7], &digest[56]);
#endif /* !UNROLL_LOOPS */
}
ENDINLINE
FUNCTION SHA2_Initialise%:
INLINE
sha512_init(&userData);
memset(&digest,(char) 0,sizeof(digest));
ENDINLINE
ENDFUNCTION
FUNCTION SHA2_Process%:data$,length%
INLINE
sha512_update(&userData,(const unsigned char *) data_Str.c_str(),length);
ENDINLINE
ENDFUNCTION
FUNCTION SHA2_Finish$:
LOCAL result$
INLINE
sha512_final(&userData,(unsigned char *) &digest);
unsigned char output[2 * SHA512_DIGEST_SIZE + 1];
int i;
output[2 * SHA512_DIGEST_SIZE] = '\0';
for (i = 0; i < (int) SHA512_DIGEST_SIZE ; i++) {
sprintf((char *) output + 2 * i, "%02x", digest[i]);
}
result_Str.assign((char *) &output);
ENDINLINE
RETURN result$
ENDFUNCTION
I assume i replace the whole project with that snip.
Still getting these errors..
compiling:
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp: In function `int __GLBASIC__::__MainGameSub_()':
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:92: error: non-local function `void __GLBASIC__::sha512_init(__GLBASIC__::__MainGameSub_()::sha512_ctx*)' uses local type `__GLBASIC__::__MainGameSub_()::sha512_ctx'
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:96: error: non-local function `void __GLBASIC__::sha512_update(__GLBASIC__::__MainGameSub_()::sha512_ctx*, const unsigned char*, unsigned int)' uses local type `__GLBASIC__::__MainGameSub_()::sha512_ctx'
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:98: error: non-local function `void __GLBASIC__::sha512_final(__GLBASIC__::__MainGameSub_()::sha512_ctx*, unsigned char*)' uses local type `__GLBASIC__::__MainGameSub_()::sha512_ctx'
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:110: error: expected unqualified-id before string constant
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:112: error: expected unqualified-id before string constant
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:114: error: expected unqualified-id before string constant
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:258: error: a function-definition is not allowed here before '{' token
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:448: error: a function-definition is not allowed here before '{' token
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:466: error: a function-definition is not allowed here before '{' token
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:504: error: a function-definition is not allowed here before '{' token
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:570: error: a function-definition is not allowed here before '{' token
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp: In function `DGNat __GLBASIC__::SHA2_Initialise()':
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:665: error: `userData' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:665: error: `sha512_init' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:667: error: `digest' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:667: error: `memset' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp: In function `DGNat __GLBASIC__::SHA2_Process(__GLBASIC__::DGStr, DGNat)':
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:692: error: `userData' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:692: error: `sha512_update' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp: In function `__GLBASIC__::DGStr __GLBASIC__::SHA2_Finish_Str()':
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:724: error: `userData' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:724: error: `digest' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:724: error: `sha512_final' was not declared in this scope
C:\DOCUME~1\Admin\LOCALS~1\Temp\glbasic\gpc_temp0.cpp:738: error: `sprintf' was not declared in this scope
*** FATAL ERROR - Please post this output in the forum
_______________________________________
*** Finished ***
Elapsed: 1.1 sec. Time: 19:02
Build: 0 succeeded.
*** 1 FAILED ***
Put MrTAToad's last batch of code in a separate secondary .gbas, and then in the main document of the project put the first 4 lines of code of the first post in this thread. It works here.
Or just add the famous:
FUNCTION foo:
ENDFUNCTION
before the first INLINE. You need to close the main function before you can call this INLINE part.
Its must better to put all INLINE stuff in source files and not the main program file.