Esempio n. 1
0
void SHA512::transform (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);
		for (j = 0; j < 16; j++) {
			SHA2_PACK64(&sub_block[j << 3], &w[j]);
		}
		for (j = 16; j < 80; j++) {
			w[j] = SHA512_F4(w[j - 2]) + w[j - 7] + SHA512_F3(w[j - 15]) + w[j - 16];
		}
		for (j = 0; j < 8; j++) {
			wv[j] = m_h[j];
		}
		for (j = 0; j < 80; j++) {
			t1 = wv[7] + SHA512_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6]) + sha512_k[j] + w[j];
			t2 = SHA512_F1(wv[0]) + SHA2_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++) {
			m_h[j] += wv[j];
		}

	}
}
Esempio n. 2
0
void SHA256::transform(const SHA256::uint8 *message, unsigned int block_nb)
{
    uint32 w[64];
    uint32 wv[8];
    uint32 t1, t2;
    const SHA256::uint8 *sub_block;
    int i;
    int j;
    for (i = 0; i < (int) block_nb; i++) {
        sub_block = message + (i << 6);
        for (j = 0; j < 16; j++) {
            SHA2_PACK32(&sub_block[j << 2], &w[j]);
        }
        for (j = 16; j < 64; j++) {
            w[j] =  SHA256_F4(w[j -  2]) + w[j -  7] + SHA256_F3(w[j - 15]) + w[j - 16];
        }
        for (j = 0; j < 8; j++) {
            wv[j] = m_h[j];
        }
        for (j = 0; j < 64; j++) {
            t1 = wv[7] + SHA256_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6])
                + sha256_k[j] + w[j];
            t2 = SHA256_F1(wv[0]) + SHA2_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++) {
            m_h[j] += wv[j];
        }
    }
}
Esempio n. 3
0
void SHA512_HashBlock (SHA512_CONTEXT * context)
{
    uint64_t a, b, c, d, e, f, g, h;
    uint8_t i;
    uint64_t t1, t2;
    uint8_t * dataPtr = context->partialBlock;;
    uint64_t * schedulePtr;
#if defined (CRYPTO_HASH_CONFIG_SHA_SMALL_RAM)
    uint8_t j;
#endif

    schedulePtr = context->workingBuffer;
    for (i = 0; i < 16; i++)
    {
        t1 = *dataPtr++;
        t1 <<= 8;
        t1 += *dataPtr++;
        t1 <<= 8;
        t1 += *dataPtr++;
        t1 <<= 8;
        t1 += *dataPtr++;
        t1 <<= 8;
        t1 += *dataPtr++;
        t1 <<= 8;
        t1 += *dataPtr++;
        t1 <<= 8;
        t1 += *dataPtr++;
        t1 <<= 8;
        t1 += *dataPtr++;
        *(schedulePtr + i) = t1;
    }

#if !defined (CRYPTO_HASH_CONFIG_SHA_SMALL_RAM)
    for (i = 16; i < 80; i++)
    {
        schedulePtr = context->workingBuffer + i;
        *schedulePtr = SHA2_SIG_L1(*(schedulePtr - 2)) + *(schedulePtr - 7) + SHA2_SIG_L0(*(schedulePtr - 15)) + *(schedulePtr - 16);
    }
#endif

    a = context->h[0];
    b = context->h[1];
    c = context->h[2];
    d = context->h[3];
    e = context->h[4];
    f = context->h[5];
    g = context->h[6];
    h = context->h[7];

    schedulePtr = context->workingBuffer;
    for (i = 0; i < 80; i++)
    {
#if defined (CRYPTO_HASH_CONFIG_SHA_SMALL_RAM)
        j = i & 0xf;
        if (i >= 16)
        {
            *(schedulePtr + j) = SHA2_SIG_L1(*(schedulePtr + ((14 + j) & 0xf))) + *(schedulePtr + ((9 + j) & 0xf)) + SHA2_SIG_L0(*(schedulePtr + ((1 + j) & 0xf))) + *(schedulePtr + j);
        }
        t1 = h + SHA2_SIG_U1(e) + SHA2_CH(e,f,g) + SHA512_K[i] + *(schedulePtr + j);
#else
        t1 = h + SHA2_SIG_U1(e) + SHA2_CH(e,f,g) + SHA512_K[i] + *(schedulePtr + i);
#endif
        t2 = SHA2_SIG_U0(a) + SHA2_MAJ(a,b,c);
        h = g;
        g = f;
        f = e;
        e = d + t1;
        d = c;
        c = b;
        b = a;
        a = t1 + t2;
    }

    context->h[0] += a;
    context->h[1] += b;
    context->h[2] += c;
    context->h[3] += d;
    context->h[4] += e;
    context->h[5] += f;
    context->h[6] += g;
    context->h[7] += h;
}