int (*callback)())
pem_password_cb *callback)
int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *plen,	     int (*callback)())	{	int i,j,o,klen;	long len;	EVP_CIPHER_CTX ctx;	unsigned char key[EVP_MAX_KEY_LENGTH];	char buf[PEM_BUFSIZE];	len= *plen;	if (cipher->cipher == NULL) return(1);	if (callback == NULL)		klen=def_callback(buf,PEM_BUFSIZE,0);	else		klen=callback(buf,PEM_BUFSIZE,0);	if (klen <= 0)		{		PEMerr(PEM_F_PEM_DO_HEADER,PEM_R_BAD_PASSWORD_READ);		return(0);		}	EVP_BytesToKey(cipher->cipher,EVP_md5(),&(cipher->iv[0]),		(unsigned char *)buf,klen,1,key,NULL);	j=(int)len;	EVP_DecryptInit(&ctx,cipher->cipher,key,&(cipher->iv[0]));	EVP_DecryptUpdate(&ctx,data,&i,data,j);	o=EVP_DecryptFinal(&ctx,&(data[i]),&j);	EVP_CIPHER_CTX_cleanup(&ctx);	memset((char *)buf,0,sizeof(buf));	memset((char *)key,0,sizeof(key));	j+=i;	if (!o)		{		PEMerr(PEM_F_PEM_DO_HEADER,PEM_R_BAD_DECRYPT);		return(0);		}	*plen=j;	return(1);	}