tmp.page = virt_to_page(out); tmp.offset = offset_in_page(out); tmp.length = crypto_tfm_alg_digestsize(tfm); 
sg_set_buf(&tmp, out, crypto_tfm_alg_digestsize(tfm)); 
void crypto_hmac_final(struct crypto_tfm *tfm, u8 *key,                       unsigned int *keylen, u8 *out){	unsigned int i;	struct scatterlist tmp;	char *opad = tfm->crt_digest.dit_hmac_block;		if (*keylen > crypto_tfm_alg_blocksize(tfm)) {		hash_key(tfm, key, *keylen);		*keylen = crypto_tfm_alg_digestsize(tfm);	}	crypto_digest_final(tfm, out);	memset(opad, 0, crypto_tfm_alg_blocksize(tfm));	memcpy(opad, key, *keylen);			for (i = 0; i < crypto_tfm_alg_blocksize(tfm); i++)		opad[i] ^= 0x5c;	tmp.page = virt_to_page(opad);	tmp.offset = offset_in_page(opad);	tmp.length = crypto_tfm_alg_blocksize(tfm);	crypto_digest_init(tfm);	crypto_digest_update(tfm, &tmp, 1);		tmp.page = virt_to_page(out);	tmp.offset = offset_in_page(out);	tmp.length = crypto_tfm_alg_digestsize(tfm);		crypto_digest_update(tfm, &tmp, 1);	crypto_digest_final(tfm, out);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/378f058cc49bcda7fa63d3cd86d2f9a0a5188b1c/hmac.c/buggy/crypto/hmac.c