Esempio n. 1
0
void SHA256_Test() {
    u8 i,k;
    u8 *hash;
    u8 hash1[32];
    u8 output[65];

    u32 t1, t2;
    UARTWriteLine("Start SHA256 Test...");
    TimerInit();

    t1 = GetTime();

    for (k = 0; k < 100; k++) {
        sha256_init();
        for (i = 0; i < 80; i++) sha256_write(test_vector[i]);
        hash = sha256_result();
        memcpy(hash1, hash, 32);

        sha256_init();
        for (i = 0; i < 32; i++) sha256_write(hash1[i]);
        hash = sha256_result();
        memcpy(hash1, hash, 32);
    }

    t2 = GetTime();
  
    for (i = 0; i < 32; i++) {
        sprintf(output + i * 2, "%02X", hash1[i]);
    }
    output[64] = '\0';
    UARTWriteLine("SHA256 Result:");
    UARTWriteString(output);
    sprintf(output, "%u", t2 - t1);
    UARTWriteLine("100 DHash(ms):");
    UARTWriteString(output);
}
Esempio n. 2
0
/*
 * 	Generate a #PKCS1.5 padded message
 * 	The output string buffer should have enough memory to incorporate the padding.
 */
int pkcs1_v1_5_generate(unsigned char *output, const unsigned char *msg, const size_t msg_len, const size_t block_len, enum pkcs1_v1_5_msg_type msg_type, const enum pkcs1_v1_5_sign_hash_method h_method)
{
	size_t pad_len, hash_len;
	uint8_t sha256_buf[SHA256_HASH_SIZE];
	struct sha256nfo sha256_h;
	struct sha1nfo sha1_h;
	char *hash_name;


	memset(output, 0, block_len);

	/* 
	 *  Hash type
	 */
	switch(h_method)
	{
	case SHA1:
		hash_len = SHA1_HASH_LENGTH;
		hash_name = PKCS1_SIGN_HASH_METHOD_SHA_1;
		break;
	case SHA256:
		hash_len =	SHA256_HASH_SIZE;
		hash_name = PKCS1_SIGN_HASH_METHOD_SHA_256;
		break;
	default:
		return -1;
	}

	if (3 + strlen(hash_name) + hash_len > block_len)
		return 0x01;

	
	/* Padding */
	output[0] = 0x00;
	switch (msg_type)
	{
	case pkcs1_signature:
		output[1] = PKCS1_BT_01;
		pad_len = block_len - strlen(hash_name) - hash_len - (3);
		memset(output + 2, 0xff, pad_len);
		break;
	case pkcs1_msg:
		output[1] = PKCS1_BT_02;
		pad_len = block_len - msg_len - (3);
		pkcs1_v1_5_gen_rpadding(output + 2, pad_len);
		break;
	}
	output[2 + pad_len] = 0x00;


	/* 
	 *  Hash value
	 */
    switch (msg_type)
	{
	case pkcs1_signature:
		memcpy(output +  3 + pad_len, hash_name, strlen(hash_name));
		switch(h_method)
		{
		case SHA1:
			sha1_init(&sha1_h);
			sha1_write(&sha1_h, (char*) msg, msg_len); 
			memcpy(output  + 3 + pad_len + strlen(hash_name), sha1_result(&sha1_h), SHA1_HASH_LENGTH);
			break;

		case SHA256:
			sha256_init(&sha256_h);
			sha256_write(&sha256_h, (uint8_t*) msg, msg_len); 
			sha256_result(&sha256_h, sha256_buf);

			memcpy(output  + 3 + pad_len + strlen(hash_name), sha256_buf, SHA256_HASH_SIZE);
			break;
		default:
			return -1;
		}
		break;

	case pkcs1_msg:
		memcpy(output + 3 + pad_len, msg, msg_len);
		break;
	}


	return 0x00;
}