/* $Id$ */ #include #include #include #include #include #include #include #include static X509 *read_cert(const char *filename, int format, int verbose) { X509 *x = NULL; BIO *b; if ((b = BIO_new_file(filename, "r")) == NULL) goto done; switch (format) { case 'p': x = PEM_read_bio_X509_AUX(b, NULL, NULL, NULL); break; case 'd': x = d2i_X509_bio(b, NULL); break; } if (verbose && x != NULL) { X509_print_fp(stdout, x); printf("\n"); } #if 0 if (x->rfc3779_addr == NULL) x->rfc3779_addr = X509_get_ext_d2i(x, NID_sbgp_ipAddrBlock, NULL, NULL); if (x->rfc3779_asid == NULL) x->rfc3779_asid = X509_get_ext_d2i(x, NID_sbgp_autonomousSysNum, NULL, NULL); #else /* * We run this for the side-effect of calling x509v3_cache_extensions() */ X509_check_ca(x); #endif done: BIO_free(b); return x; } static void *parse_resource_set(int nid, char *text, int verbose) { X509_EXTENSION *ext; void *result; if ((ext = X509V3_EXT_conf_nid(NULL, NULL, nid, text)) == NULL) return NULL; if (verbose) { printf("Parsed resource set:\n"); X509V3_EXT_print_fp(stdout, ext, 0, 3); printf("\n"); } result = X509V3_EXT_d2i(ext); X509_EXTENSION_free(ext); return result; } #define lose(_msg_) \ do { \ if (_msg_) \ fprintf(stderr, "%s: %s\n", argv[0], _msg_); \ ret = 1; \ goto done; \ } while(0) int main(int argc, char *argv[]) { STACK_OF(X509) *chain = NULL; ASIdentifiers *asid = NULL; IPAddrBlocks *addr = NULL; int c, ret = 0, verbose = 0; X509 *x; OpenSSL_add_all_algorithms(); ERR_load_crypto_strings(); if ((chain = sk_X509_new_null()) == NULL) lose("Couldn't allocate X509 stack"); while ((c = getopt(argc, argv, "p:d:a:i:v")) > 0) { switch (c) { case 'v': verbose = 1; break; case 'p': case 'd': if ((x = read_cert(optarg, c, verbose)) == NULL) lose("Couldn't read certificate"); sk_X509_push(chain, x); break; case 'a': if (asid != NULL) lose("Can't specify more than one ASIdentifier"); if ((asid = parse_resource_set(NID_sbgp_autonomousSysNum, optarg, verbose)) == NULL) lose("Couldn't read ASIdentifier"); break; case 'i': if (addr != NULL) lose("Can't specify more than one IPAddrBlock"); if ((addr = parse_resource_set(NID_sbgp_ipAddrBlock, optarg, verbose)) == NULL) lose("Couldn't read IPAddrBlock"); break; default: fprintf(stderr, "usage: %s" " [-i IPAddrBlock] [-a ASIdentifier]" " [-p PEM-certfile] [-d DER-certfile]\n", argv[0]); ret = 1; goto done; } } printf("Checking ASIdentifier coverage..."); if (v3_asid_validate_resource_set(chain, asid, 0)) printf("covered\n"); else printf("NOT covered\n"); printf("Checking IPAddrBlock coverage..."); if (v3_addr_validate_resource_set(chain, addr, 0)) printf("covered\n"); else printf("NOT covered\n"); done: sk_X509_pop_free(chain, X509_free); EVP_cleanup(); ERR_free_strings(); return ret; }