unsigned char A1[HMAC_MAX_MD_CBLOCK];
unsigned char A1[EVP_MAX_MD_SIZE];
static void tls1_P_hash(const EVP_MD *md, const unsigned char *sec,			int sec_len, unsigned char *seed, int seed_len,			unsigned char *out, int olen)	{	int chunk,n;	unsigned int j;	HMAC_CTX ctx;	HMAC_CTX ctx_tmp;	unsigned char A1[HMAC_MAX_MD_CBLOCK];	unsigned int A1_len;		chunk=EVP_MD_size(md);	HMAC_CTX_init(&ctx);	HMAC_CTX_init(&ctx_tmp);	HMAC_Init_ex(&ctx,sec,sec_len,md, NULL);	HMAC_Init_ex(&ctx_tmp,sec,sec_len,md, NULL);	HMAC_Update(&ctx,seed,seed_len);	HMAC_Final(&ctx,A1,&A1_len);	n=0;	for (;;)		{		HMAC_Init_ex(&ctx,NULL,0,NULL,NULL); /* re-init */		HMAC_Init_ex(&ctx_tmp,NULL,0,NULL,NULL); /* re-init */		HMAC_Update(&ctx,A1,A1_len);		HMAC_Update(&ctx_tmp,A1,A1_len);		HMAC_Update(&ctx,seed,seed_len);		if (olen > chunk)			{			HMAC_Final(&ctx,out,&j);			out+=j;			olen-=j;			HMAC_Final(&ctx_tmp,A1,&A1_len); /* calc the next A1 value */			}		else	/* last one */			{			HMAC_Final(&ctx,A1,&A1_len);			memcpy(out,A1,olen);			break;			}		}	HMAC_CTX_cleanup(&ctx);	HMAC_CTX_cleanup(&ctx_tmp);	memset(A1,0,sizeof(A1));	}