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); }
/* * 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; }