Пример #1
0
/*
 * keylength in bits!
 * message length in bits!
 */
void hmac_sha1(void* dest, const void* key, uint16_t keylength_b, const void* msg, uint32_t msglength_b){ /* a one-shot*/
	sha1_ctx_t s;
	uint8_t i;
	uint8_t buffer[SHA1_BLOCK_BYTES];
	
	memset(buffer, 0, SHA1_BLOCK_BYTES);
	
	/* if key is larger than a block we have to hash it*/
	if (keylength_b > SHA1_BLOCK_BITS){
		sha1((void*)buffer, key, keylength_b);
	} else {
		memcpy(buffer, key, (keylength_b+7)/8);
	}
	
	for (i=0; i<SHA1_BLOCK_BYTES; ++i){
		buffer[i] ^= IPAD;
	}
	sha1_init(&s);
	sha1_nextBlock(&s, buffer);
	while (msglength_b >= SHA1_BLOCK_BITS){
		sha1_nextBlock(&s, msg);
		msg = (uint8_t*)msg + SHA1_BLOCK_BYTES;
		msglength_b -=  SHA1_BLOCK_BITS;
	}
	sha1_lastBlock(&s, msg, msglength_b);
	/* since buffer still contains key xor ipad we can do ... */
	for (i=0; i<SHA1_BLOCK_BYTES; ++i){
		buffer[i] ^= IPAD ^ OPAD;
	}
	sha1_ctx2hash(dest, &s); /* save inner hash temporary to dest */
	sha1_init(&s);
	sha1_nextBlock(&s, buffer);
	sha1_lastBlock(&s, dest, SHA1_HASH_BITS);
	sha1_ctx2hash(dest, &s);
}
Пример #2
0
void shacal1_enc(void *buffer, void *key, uint16_t keysize_b){
	sha1_ctx_t ctx, t_ctx;
	uint8_t i;
	memcpy(t_ctx.h, buffer, SHA1_HASH_BITS/8);
	
	uint8_t keybuffer[SHA1_BLOCK_BITS/8];
	memset(keybuffer, 0, SHA1_BLOCK_BITS/8);
	if(keysize_b>SHA1_BLOCK_BITS)
		keysize_b=SHA1_BLOCK_BITS;
	memcpy(keybuffer, key, (keysize_b+7)/8);
	
	memcpy(t_ctx.h, buffer, SHA1_HASH_BITS/8);
	sha1_ctx2hash(&ctx.h[0], &t_ctx);
	memcpy(t_ctx.h, ctx.h, SHA1_HASH_BITS/8);
	sha1_nextBlock(&ctx, keybuffer);
	for(i=0; i<5; ++i)
		ctx.h[i] -= t_ctx.h[i];
	sha1_ctx2hash(buffer, &ctx);
}
Пример #3
0
void hmac_sha1_final(void* dest, hmac_sha1_ctx_t *s){
	sha1_ctx2hash((sha1_hash_t*)dest, &(s->a));
	sha1_lastBlock(&(s->b), dest, SHA1_HASH_BITS);
	sha1_ctx2hash((sha1_hash_t*)dest, &(s->b));
}