void blake224_hash( uint8_t *out, const uint8_t *in, uint64_t inlen ) { state224 S; blake224_init( &S ); blake224_update( &S, in, inlen ); blake224_final( &S, out ); }
unsigned char *blake224_file(unsigned char *out, FILE *fp) { state224 context; size_t ret = 0; int errsv = 0; unsigned char buf[8192], *digest = NULL; blake224_init(&context); for (;;) { ret = fread(buf, 1, 8192, fp); errsv = errno; if ((ret != 8192) && ferror(fp)) { errno = errsv; return NULL; } blake224_update(&context, (const uint8_t *) buf, ret); if (feof(fp)) break; } if (!out) { if (!(digest = malloc(28))) return NULL; } else { digest = out; } blake224_final(&context, (uint8_t *) digest); return digest; }
/* BLAKE-224 Generic Interface */ unsigned char *blake224_buffer(unsigned char *out, const unsigned char *in, size_t in_len) { state224 context; unsigned char *digest = NULL; blake224_init(&context); if (!out) { if (!(digest = malloc(28))) return NULL; } else { digest = out; } blake224_update(&context, (const uint8_t *) in, in_len); blake224_final(&context, (uint8_t *) digest); return digest; }
int main( int argc, char **argv ) { #define BLOCK224 64 FILE *fp; int i, j, bytesread; uint8_t in[BLOCK224], out[28]; state224 S; blake224_test(); for( i = 1; i < argc; ++i ) { fp = fopen( *( argv + i ), "r" ); if ( fp == NULL ) { printf( "Error: unable to open %s\n", *( argv + i ) ); return 1; } blake224_init( &S ); while( 1 ) { bytesread = fread( in, 1, BLOCK224, fp ); if ( bytesread ) blake224_update( &S, in, bytesread ); else break; } blake224_final( &S, out ); for( j = 0; j < 28; ++j ) printf( "%02x", out[j] ); printf( " %s\n", *( argv + i ) ); fclose( fp ); } return 0; }
void blake224_final( state224 *S, uint8_t *out ) { uint8_t msglen[8], zz = 0x00, oz = 0x80; uint32_t lo = S->t[0] + ( S->buflen << 3 ), hi = S->t[1]; /* support for hashing more than 2^32 bits */ if ( lo < ( S->buflen << 3 ) ) hi++; U32TO8_BIG( msglen + 0, hi ); U32TO8_BIG( msglen + 4, lo ); if ( S->buflen == 55 ) /* one padding byte */ { S->t[0] -= 8; blake224_update( S, &oz, 1 ); } else { if ( S->buflen < 55 ) /* enough space to fill the block */ { if ( !S->buflen ) S->nullt = 1; S->t[0] -= 440 - ( S->buflen << 3 ); blake224_update( S, padding, 55 - S->buflen ); } else /* need 2 compressions */ { S->t[0] -= 512 - ( S->buflen << 3 ); blake224_update( S, padding, 64 - S->buflen ); S->t[0] -= 440; blake224_update( S, padding + 1, 55 ); S->nullt = 1; } blake224_update( S, &zz, 1 ); S->t[0] -= 8; } S->t[0] -= 64; blake224_update( S, msglen, 8 ); U32TO8_BIG( out + 0, S->h[0] ); U32TO8_BIG( out + 4, S->h[1] ); U32TO8_BIG( out + 8, S->h[2] ); U32TO8_BIG( out + 12, S->h[3] ); U32TO8_BIG( out + 16, S->h[4] ); U32TO8_BIG( out + 20, S->h[5] ); U32TO8_BIG( out + 24, S->h[6] ); }