SHA-2 Cryptographic hash function

Previous topic - Next topic

MrTAToad

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.

Code (glbasic) Select

LOCAL t$="abc"
SHA2_Initialise()
SHA2_Process(t$,LEN(t$))
DEBUG "Digest : "+SHA2_Finish$()+"\n"


Main code :

Code (glbasic) Select

// --------------------------------- //
// 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...

bigsofty

Very impressive work, congrats in getting this beast to inline!  :booze:
Cheers,

Ian.

"It is practically impossible to teach good programming style to students that have had prior exposure to BASIC.  As potential programmers, they are mentally mutilated beyond hope of regeneration."
(E. W. Dijkstra)

Hatonastick

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:

MrTAToad

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 :)

MrTAToad

I've now update the program to create the hash result from a file :

Code (glbasic) Select
// --------------------------------- //
// 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

kanonet

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:
Code (glbasic) Select
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
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Hemlos

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?
Bing ChatGpt is pretty smart :O

MrTAToad

#7
That is interesting - seems it doesn't like compounded statements.

Or rather it seems the command to generate them is now ignored :

Code (glbasic) Select
INLINE

#define a(x,str) \
{ \
}

It does do the same in 10.283 though..

ENDINLINE


Changing these lines should sort it :

Code (glbasic) Select
#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; }


kanonet

#8
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?
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

MrTAToad

Use this instead :

Code (glbasic) Select
#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; }

kanonet

Yes this one did solve the problem, thank you sir!
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Hemlos

Quote from: MrTAToad on 2012-Oct-23
Use this instead :

With v10 i replaced these functions and still get errors.
Bing ChatGpt is pretty smart :O

MrTAToad

Try this :

Code (glbasic) Select
// --------------------------------- //
// 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

Hemlos

I assume i replace the whole project with that snip.
Still getting these errors..

Code (glbasic) Select
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 ***


Bing ChatGpt is pretty smart :O

Ruidesco

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.