X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=sha256.c;h=fea934028cf43a52e553dede176c19c6a1731360;hp=524b1dd2eee05085bd669839833586baddec9e81;hb=9b1bf59ca8d49db1a7495d95119c68d62b036c59;hpb=dcaea6ca89915c690f7a6e90c64d7b5963fa1f5c diff --git a/sha256.c b/sha256.c index 524b1dd..fea9340 100644 --- a/sha256.c +++ b/sha256.c @@ -1,8 +1,13 @@ /** - * File: sha256.c - * Author: Daniel Otte - * Date: 16.05.2006 - * License: GPL + * \file sha256.c + * \author Daniel Otte + * \date 16.05.2006 + * + * \par License: + * GPL + * + * \brief SHA-256 implementation. + * * */ @@ -19,23 +24,38 @@ #endif +/*************************************************************************/ + uint32_t sha256_init_vector[]={ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 }; + +/*************************************************************************/ + +/** + * \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 + */ void sha256_init(sha256_ctx_t *state){ state->length=0; memcpy(state->h, sha256_init_vector, 8*4); } -/* +/*************************************************************************/ + +/** * rotate x right by n positions */ - uint32_t rotr32( uint32_t x, uint8_t n){ return ((x>>n) | (x<<(32-n))); } + +/*************************************************************************/ + // #define CHANGE_ENDIAN32(x) (((x)<<24) | ((x)>>24) | (((x)& 0x0000ff00)<<8) | (((x)& 0x00ff0000)>>8)) uint32_t change_endian32(uint32_t x){ @@ -43,6 +63,8 @@ uint32_t change_endian32(uint32_t x){ } +/*************************************************************************/ + /* sha256 functions as macros for speed and size, cause they are called only once */ #define CH(x,y,z) (((x)&(y)) ^ ((~(x))&(z))) @@ -66,6 +88,8 @@ uint32_t k[]={ }; +/*************************************************************************/ + /** * block must be, 512, Bit = 64, Byte, long !!! */ @@ -105,11 +129,17 @@ void sha256_nextBlock (sha256_ctx_t *state, void* block){ state->length += 512; } -/* - * length is the length of only THIS block in BITS not in bytes! + +/*************************************************************************/ + +/** + * \brief function to process the last block being hashed + * @param state Pointer to the context in which this block should be processed. + * @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 - * */ + */ void sha256_lastBlock(sha256_ctx_t *state, void* block, uint16_t length){ uint8_t lb[SHA256_BLOCK_BITS/8]; /* local block */ state->length += length; @@ -145,10 +175,11 @@ void sha256_lastBlock(sha256_ctx_t *state, void* block, uint16_t length){ } +/*************************************************************************/ + /* * length in bits! */ - void sha256(sha256_hash_t *dest, void* msg, uint32_t length){ /* length could be choosen longer but this is for ?C */ sha256_ctx_t s; sha256_init(&s); @@ -163,6 +194,7 @@ void sha256(sha256_hash_t *dest, void* msg, uint32_t length){ /* length could be +/*************************************************************************/ void sha256_ctx2hash(sha256_hash_t *dest, sha256_ctx_t *state){ #if defined LITTLE_ENDIAN