BASIC

Author Topic: SHA-2 Cryptographic hash function  (Read 4687 times)

MrTAToad

  • Guest
SHA-2 Cryptographic hash function
« on: 2009-Nov-17 »
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] = &#39;\0&#39;;

    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...
« Last Edit: 2009-Nov-18 by MrTAToad »

Offline bigsofty

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 2448
    • View Profile
Re: SHA-2 Cryptographic hash function
« Reply #1 on: 2009-Nov-18 »
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

  • Guest
Re: SHA-2 Cryptographic hash function
« Reply #2 on: 2009-Nov-18 »
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

  • Guest
Re: SHA-2 Cryptographic hash function
« Reply #3 on: 2009-Nov-18 »
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

  • Guest
Re: SHA-2 Cryptographic hash function
« Reply #4 on: 2009-Nov-21 »
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] = &#39;\0&#39;;

    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

Offline kanonet

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1142
    • View Profile
    • My GLBasic code archiv
Re: SHA-2 Cryptographic hash function
« Reply #5 on: 2012-Oct-20 »
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

Offline Hemlos

  • To boldy go where no pixel has gone before!
  • Global Moderator
  • Prof. Inline
  • *******
  • Posts: 1577
  • Particle Hawk
    • View Profile
    • Silver Volumetric Software
Re: SHA-2 Cryptographic hash function
« Reply #6 on: 2012-Oct-23 »
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?
Volume_of_Earth(km^3) = 4/3*3.14*POW(6371.392896,3)

http://silver.binhoster.com/

MrTAToad

  • Guest
Re: SHA-2 Cryptographic hash function
« Reply #7 on: 2012-Oct-23 »
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; }
 
« Last Edit: 2012-Oct-23 by MrTAToad »

Offline kanonet

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1142
    • View Profile
    • My GLBasic code archiv
Re: SHA-2 Cryptographic hash function
« Reply #8 on: 2012-Oct-23 »
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?
« Last Edit: 2012-Oct-23 by kanonet »
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

MrTAToad

  • Guest
Re: SHA-2 Cryptographic hash function
« Reply #9 on: 2012-Oct-23 »
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;    }
 

Offline kanonet

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1142
    • View Profile
    • My GLBasic code archiv
Re: SHA-2 Cryptographic hash function
« Reply #10 on: 2012-Oct-23 »
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

Offline Hemlos

  • To boldy go where no pixel has gone before!
  • Global Moderator
  • Prof. Inline
  • *******
  • Posts: 1577
  • Particle Hawk
    • View Profile
    • Silver Volumetric Software
Re: SHA-2 Cryptographic hash function
« Reply #11 on: 2012-Oct-23 »
Use this instead :

With v10 i replaced these functions and still get errors.
Volume_of_Earth(km^3) = 4/3*3.14*POW(6371.392896,3)

http://silver.binhoster.com/

MrTAToad

  • Guest
Re: SHA-2 Cryptographic hash function
« Reply #12 on: 2012-Oct-24 »
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

Offline Hemlos

  • To boldy go where no pixel has gone before!
  • Global Moderator
  • Prof. Inline
  • *******
  • Posts: 1577
  • Particle Hawk
    • View Profile
    • Silver Volumetric Software
Re: SHA-2 Cryptographic hash function
« Reply #13 on: 2012-Oct-24 »
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 ***

Volume_of_Earth(km^3) = 4/3*3.14*POW(6371.392896,3)

http://silver.binhoster.com/

Offline Ruidesco

  • Mr. Polyvector
  • ***
  • Posts: 236
    • View Profile
Re: SHA-2 Cryptographic hash function
« Reply #14 on: 2012-Oct-24 »
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.