else { pp=argv[0]; if (!BIO_read_filename(data,argv[0])) goto err; }
else break;
main(argc,argv)int argc;char *argv[];	{	BIO *in;	X509 *x509,*x;	EVP_PKEY *pkey;	PKCS7 *p7;	PKCS7_SIGNED *s;	PKCS7_SIGNER_INFO *si;	PKCS7_ISSUER_AND_SERIAL *ias;	X509_STORE_CTX cert_ctx;	X509_STORE *cert_store=NULL;	X509_LOOKUP *lookup=NULL;	BIO *data,*detached=NULL,*p7bio=NULL;	char buf[1024*4];	unsigned char *p,*pp;	int i,j,printit=0;	STACK *sk;	SSLeay_add_all_algorithms();	bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);	EVP_add_digest(EVP_sha1());	EVP_add_cipher(EVP_des_ede3_cbc());        if ((in=BIO_new_file("server.pem","r")) == NULL) goto err;        if ((x509=PEM_read_bio_X509(in,NULL,NULL)) == NULL) goto err;        BIO_reset(in);        if ((pkey=PEM_read_bio_PrivateKey(in,NULL,NULL)) == NULL) goto err;        BIO_free(in);	data=BIO_new(BIO_s_file());again:	pp=NULL;	while (argc > 1)		{		argc--;		argv++;		if (strcmp(argv[0],"-p") == 0)			{			printit=1;			}		else if ((strcmp(argv[0],"-d") == 0) && (argc >= 2))			{			detached=BIO_new(BIO_s_file());			if (!BIO_read_filename(detached,argv[1]))				goto err;			argc--;			argv++;			}		else			{			pp=argv[0];			if (!BIO_read_filename(data,argv[0]))				goto err;			}		}	if (pp == NULL)		BIO_set_fp(data,stdin,BIO_NOCLOSE);	/* Load the PKCS7 object from a file */	if ((p7=PEM_read_bio_PKCS7(data,NULL,NULL)) == NULL) goto err;	/* This stuff is being setup for certificate verification.	 * When using SSL, it could be replaced with a 	 * cert_stre=SSL_CTX_get_cert_store(ssl_ctx); */	cert_store=X509_STORE_new();	X509_STORE_set_default_paths(cert_store);	X509_STORE_load_locations(cert_store,NULL,"../../certs");	X509_STORE_set_verify_cb_func(cert_store,verify_callback);	ERR_clear_error();	/* We need to process the data */	/* We cannot support detached encryption */	p7bio=PKCS7_dataDecode(p7,pkey,detached,x509);		if (p7bio == NULL)		{		printf("problems decoding\n");		goto err;		}	/* We now have to 'read' from p7bio to calculate digests etc. */	for (;;)		{		i=BIO_read(p7bio,buf,sizeof(buf));		/* print it? */		if (i <= 0) break;		write(fileno(stdout),buf,i);		}	/* We can now verify signatures */	sk=PKCS7_get_signer_info(p7);	if (sk == NULL)		{		printf("there are no signatures on this data\n");		}	else		{		/* Ok, first we need to, for each subject entry,		 * see if we can verify */		ERR_clear_error();		for (i=0; i<sk_num(sk); i++)			{			si=(PKCS7_SIGNER_INFO *)sk_value(sk,i);			i=PKCS7_dataVerify(cert_store,&cert_ctx,p7bio,p7,si);			if (i <= 0)				goto err;			else				fprintf(stderr,"Signature verified\n");			}		}	X509_STORE_free(cert_store);	exit(0);err:	ERR_load_crypto_strings();	ERR_print_errors_fp(stderr);	exit(1);	}