OPENSSL_assert(len <= sizeof ctx->key);
void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,		  const EVP_MD *md, ENGINE *impl)	{	int i,j,reset=0;	unsigned char pad[HMAC_MAX_MD_CBLOCK];	if (md != NULL)		{		reset=1;		ctx->md=md;		}	else		md=ctx->md;	if (key != NULL)		{		reset=1;		j=EVP_MD_block_size(md);		if (j < len)			{			EVP_DigestInit_ex(&ctx->md_ctx,md, impl);			EVP_DigestUpdate(&ctx->md_ctx,key,len);			EVP_DigestFinal_ex(&(ctx->md_ctx),ctx->key,				&ctx->key_length);			}		else			{			memcpy(ctx->key,key,len);			ctx->key_length=len;			}		if(ctx->key_length != HMAC_MAX_MD_CBLOCK)			memset(&ctx->key[ctx->key_length], 0,				HMAC_MAX_MD_CBLOCK - ctx->key_length);		}	if (reset)			{		for (i=0; i<HMAC_MAX_MD_CBLOCK; i++)			pad[i]=0x36^ctx->key[i];		EVP_DigestInit_ex(&ctx->i_ctx,md, impl);		EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md));		for (i=0; i<HMAC_MAX_MD_CBLOCK; i++)			pad[i]=0x5c^ctx->key[i];		EVP_DigestInit_ex(&ctx->o_ctx,md, impl);		EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md));		}	EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->i_ctx);	}