extending sha256 (C)

This commit is contained in:
bg 2009-12-26 15:03:17 +00:00
parent c88d9d78db
commit 3602a99dd3
4 changed files with 34 additions and 18 deletions

View File

@ -205,7 +205,7 @@ end
# MAIN #
################################################################################
opts = Getopt::Std.getopts("s:f:i:hdca")
opts = Getopt::Std.getopts("s:f:i:j:hdca")
conf = Hash.new
conf = readconfigfile("/etc/testport.conf", conf)
@ -266,6 +266,7 @@ algo_tasks.each do |algoa|
next
else
i=0
i = opts["j"] if opts["j"]
logfile=File.open(conf["PORT"]["testlogbase"]+algo+".txt", "a")
while conf[algo]["file_#{i}"] != nil
puts("Testing #{algo} with #{conf[algo]["file_#{i}"]}")

View File

@ -18,15 +18,15 @@
*/
/**
* \file sha256.c
* \author Daniel Otte
* \author Daniel Otte
* \date 16.05.2006
*
* \par License:
*
* \par License:
* GPL
*
*
* \brief SHA-256 implementation.
*
*
*
*
*/
#include <stdint.h>
@ -52,7 +52,7 @@ uint32_t sha256_init_vector[]={
/*************************************************************************/
/**
* \brief \c sh256_init initialises a sha256 context for hashing.
* \brief \c sh256_init initialises a sha256 context for hashing.
* \c sh256_init c initialises the given sha256 context for hashing
* @param state pointer to a sha256 context
* @return none
@ -125,10 +125,10 @@ void sha256_nextBlock (sha256_ctx_t *state, const void* block){
memcpy((void*)w, block, 64);
#endif
for (i=16; i<64; ++i){
w[i] = SIGMA_b(w[i-2]) + w[i-7] + SIGMA_a(w[i-15]) + w[i-16];
w[i] = SIGMA_b(w[i-2]) + w[i-7] + SIGMA_a(w[i-15]) + w[i-16];
}
/* init working variables */
/* init working variables */
memcpy((void*)a,(void*)(state->h), 8*4);
/* do the, fun stuff, */
@ -143,9 +143,9 @@ void sha256_nextBlock (sha256_ctx_t *state, const void* block){
/* update, the, state, */
for (i=0; i<8; ++i){
state->h[i] += a[i];
}
}
state->length += 512;
}
}
/*************************************************************************/
@ -156,13 +156,19 @@ void sha256_nextBlock (sha256_ctx_t *state, const void* block){
* @param block Pointer to the message wich should be hashed.
* @param length is the length of only THIS block in BITS not in bytes!
* bits are big endian, meaning high bits come first.
* if you have a message with bits at the end, the byte must be padded with zeros
* if you have a message with bits at the end, the byte must be padded with zeros
*/
void sha256_lastBlock(sha256_ctx_t *state, const void* block, uint16_t length){
uint8_t lb[SHA256_BLOCK_BITS/8]; /* local block */
while(length>=SHA256_BLOCK_BITS){
sha256_nextBlock(state, block);
length -= SHA256_BLOCK_BITS;
block = (uint8_t*)block+SHA256_BLOCK_BYTES;
}
state->length += length;
memcpy (&(lb[0]), block, length/8);
/* set the final one bit */
if (length & 0x7){ // if we have single bits at the end
lb[length/8] = ((uint8_t*)(block))[length/8];
@ -176,13 +182,13 @@ void sha256_lastBlock(sha256_ctx_t *state, const void* block, uint16_t length){
memset((void*)(&(lb[length])), 0, 64-length);
sha256_nextBlock(state, lb);
state->length -= 512;
length = 0;
length = 0;
}
memset((void*)(&(lb[length])), 0, 56-length);
/* store the 64bit length value */
#if defined LITTLE_ENDIAN
/* this is now rolled up */
uint8_t i;
uint8_t i;
for (i=1; i<=8; ++i){
lb[55+i] = (uint8_t)(state->length>>(64- 8*i));
}

View File

@ -135,11 +135,12 @@ uint8_t buffer_add(char c){
t |= v;
shavs_ctx.buffer[shavs_ctx.buffer_idx]=t;
shavs_ctx.buffer_idx++;
shavs_ctx.in_byte = 0;
}else{
t |= v<<4;
shavs_ctx.buffer[shavs_ctx.buffer_idx]=t;
shavs_ctx.in_byte = 1;
}
shavs_ctx.in_byte ^= 1;
return 0;
}
@ -180,7 +181,7 @@ void shavs_test1(void){
char c;
uint8_t diggest[pgm_read_word(shavs_algo->hashsize_b)/8];
shavs_ctx.buffersize_B=pgm_read_word(&(shavs_algo->blocksize_b))/8;
uint8_t buffer[shavs_ctx.buffersize_B+1];
uint8_t buffer[shavs_ctx.buffersize_B+5];
shavs_ctx.buffer = buffer;
cli_putstr_P(PSTR("\r\nbuffer_size = 0x"));
cli_hexdump_rev(&(shavs_ctx.buffersize_B), 2);

8
testconf/Sha256.conf Normal file
View File

@ -0,0 +1,8 @@
[SHA-256]
algo=a
file_0=testvectors/shavs/SHA1+2/BitTestVectors/SHA256ShortMsg.txt
file_1=testvectors/shavs/SHA1+2/BitTestVectors/SHA256LongMsg.txt
file_2=testvectors/shavs/SHA1+2/ByteTestVectors/SHA256ShortMsg.txt
file_3=testvectors/shavs/SHA1+2/ByteTestVectors/SHA256LongMsg.txt