#include #include "asn1.h" #include "bio.h" #include "x509.h" #include "pem.h" int verify_callback(int ok, X509_STORE_CTX *ctx); BIO *bio_err=NULL; main(argc,argv) int argc; char *argv[]; { X509 *x509,*x; 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; bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); EVP_add_digest(EVP_md2()); EVP_add_digest(EVP_md5()); EVP_add_digest(EVP_sha1()); EVP_add_digest(EVP_mdc2()); 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_errors(); /* We need to process the data */ if (PKCS7_get_detached(p7)) { if (detached == NULL) { printf("no data to verify the signature on\n"); exit(1); } else p7bio=PKCS7_dataInit(p7,detached); } else { p7bio=PKCS7_dataInit(p7,NULL); } /* 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; } /* We can now verify signatures */ sk=PKCS7_get_signer_info(p7); if (sk == NULL) { printf("there are no signatures on this data\n"); exit(1); } /* Ok, first we need to, for each subject entry, see if we can verify */ for (i=0; ierror) { case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert),buf,256); BIO_printf(bio_err,"issuer= %s\n",buf); break; case X509_V_ERR_CERT_NOT_YET_VALID: case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: BIO_printf(bio_err,"notBefore="); ASN1_UTCTIME_print(bio_err,X509_get_notBefore(ctx->current_cert)); BIO_printf(bio_err,"\n"); break; case X509_V_ERR_CERT_HAS_EXPIRED: case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: BIO_printf(bio_err,"notAfter="); ASN1_UTCTIME_print(bio_err,X509_get_notAfter(ctx->current_cert)); BIO_printf(bio_err,"\n"); break; } BIO_printf(bio_err,"verify return:%d\n",ok); return(ok); }