(verify_ocsp): require issuer to match too.
(free_ocsp): new function (hx509_revoke_ocsp_print): new function, print ocsp reply git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16986 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -76,6 +76,15 @@ hx509_revoke_init(hx509_context context, hx509_revoke_ctx *revoke) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | free_ocsp(struct revoke_ocsp *ocsp) | ||||||
|  | { | ||||||
|  |     free(ocsp->path); | ||||||
|  |     free_OCSPBasicOCSPResponse(&ocsp->ocsp); | ||||||
|  |     hx509_certs_free(&ocsp->certs); | ||||||
|  |     hx509_cert_free(ocsp->signer); | ||||||
|  | } | ||||||
|  |  | ||||||
| void | void | ||||||
| hx509_revoke_free(hx509_revoke_ctx *revoke) | hx509_revoke_free(hx509_revoke_ctx *revoke) | ||||||
| { | { | ||||||
| @@ -85,12 +94,10 @@ hx509_revoke_free(hx509_revoke_ctx *revoke) | |||||||
| 	free((*revoke)->crls.val[i].path); | 	free((*revoke)->crls.val[i].path); | ||||||
| 	free_CRLCertificateList(&(*revoke)->crls.val[i].crl); | 	free_CRLCertificateList(&(*revoke)->crls.val[i].crl); | ||||||
|     } |     } | ||||||
|     for (i = 0; i < (*revoke)->ocsps.len; i++) { |  | ||||||
| 	free((*revoke)->ocsps.val[i].path); |     for (i = 0; i < (*revoke)->ocsps.len; i++) | ||||||
| 	free_OCSPBasicOCSPResponse(&(*revoke)->ocsps.val[i].ocsp); | 	free_ocsp(&(*revoke)->ocsps.val[i]); | ||||||
| 	hx509_certs_free(&(*revoke)->ocsps.val[i].certs); |  | ||||||
| 	hx509_cert_free((*revoke)->ocsps.val[i].signer); |  | ||||||
|     } |  | ||||||
|     free((*revoke)->crls.val); |     free((*revoke)->crls.val); | ||||||
|  |  | ||||||
|     memset(*revoke, 0, sizeof(**revoke)); |     memset(*revoke, 0, sizeof(**revoke)); | ||||||
| @@ -121,6 +128,8 @@ verify_ocsp(hx509_context context, | |||||||
| 	q.keyhash_sha1 = &ocsp->ocsp.tbsResponseData.responderID.u.byKey; | 	q.keyhash_sha1 = &ocsp->ocsp.tbsResponseData.responderID.u.byKey; | ||||||
| 	break; | 	break; | ||||||
|     } |     } | ||||||
|  |     q.match =|HX509_QUERY_MATCH_ISSUER_NAME; | ||||||
|  |     q.issuer_name = &_hx509_get_cert(parent)->tbsCertificate.issuer; | ||||||
| 	 | 	 | ||||||
|     ret = hx509_certs_find(context, certs, &q, &signer); |     ret = hx509_certs_find(context, certs, &q, &signer); | ||||||
|     if (ret && ocsp->certs) |     if (ret && ocsp->certs) | ||||||
| @@ -777,3 +786,80 @@ hx509_ocsp_request(hx509_context context, | |||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | hx509_revoke_ocsp_print(hx509_context context, const char *path, FILE *out) | ||||||
|  | { | ||||||
|  |     struct revoke_ocsp ocsp; | ||||||
|  |     int ret, i; | ||||||
|  |      | ||||||
|  |     if (out == NULL) | ||||||
|  | 	out = stdout; | ||||||
|  |  | ||||||
|  |     memset(&ocsp, 0, sizeof(ocsp)); | ||||||
|  |  | ||||||
|  |     ocsp.path = strdup(path); | ||||||
|  |     if (ocsp.path == NULL) | ||||||
|  | 	return ENOMEM; | ||||||
|  |  | ||||||
|  |     ret = load_ocsp(context, &ocsp); | ||||||
|  |     if (ret) { | ||||||
|  | 	free_ocsp(&ocsp); | ||||||
|  | 	return ret; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fprintf(out, "signer: "); | ||||||
|  |  | ||||||
|  |     switch(ocsp.ocsp.tbsResponseData.responderID.element) { | ||||||
|  |     case choice_OCSPResponderID_byName: { | ||||||
|  | 	hx509_name n; | ||||||
|  | 	char *s; | ||||||
|  | 	_hx509_name_from_Name(&ocsp.ocsp.tbsResponseData.responderID.u.byName, &n); | ||||||
|  | 	hx509_name_to_string(n, &s); | ||||||
|  | 	hx509_name_free(&n); | ||||||
|  | 	fprintf(out, " byName: %s\n", s); | ||||||
|  | 	free(s); | ||||||
|  | 	break; | ||||||
|  |     } | ||||||
|  |     case choice_OCSPResponderID_byKey: { | ||||||
|  | 	char *s; | ||||||
|  | 	hex_encode(ocsp.ocsp.tbsResponseData.responderID.u.byKey.data, | ||||||
|  | 		   ocsp.ocsp.tbsResponseData.responderID.u.byKey.length, | ||||||
|  | 		   &s); | ||||||
|  | 	fprintf(out, " byKey: %s\n", s); | ||||||
|  | 	free(s); | ||||||
|  | 	break; | ||||||
|  |     } | ||||||
|  |     default: | ||||||
|  | 	_hx509_abort("choice_OCSPResponderID unknown"); | ||||||
|  | 	break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     fprintf(out, "replies: %d\n", ocsp.ocsp.tbsResponseData.responses.len); | ||||||
|  |  | ||||||
|  |     for (i = 0; i < ocsp.ocsp.tbsResponseData.responses.len; i++) { | ||||||
|  | 	char *status; | ||||||
|  | 	switch (ocsp.ocsp.tbsResponseData.responses.val[i].certStatus.element) { | ||||||
|  | 	case choice_OCSPCertStatus_good: | ||||||
|  | 	    status = "good"; | ||||||
|  | 	    break; | ||||||
|  | 	case choice_OCSPCertStatus_revoked: | ||||||
|  | 	    status = "revoked"; | ||||||
|  | 	    break; | ||||||
|  | 	case choice_OCSPCertStatus_unknown: | ||||||
|  | 	    status = "unknown"; | ||||||
|  | 	    break; | ||||||
|  | 	default: | ||||||
|  | 	    status = "element unknown"; | ||||||
|  | 	} | ||||||
|  | 	fprintf(out, "\t%d. status: %s\n", i, status); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fprintf(out, "appended certs:\n"); | ||||||
|  |     if (ocsp.certs) | ||||||
|  | 	ret = hx509_certs_iter(context, ocsp.certs, hx509_ci_print_names, out); | ||||||
|  |  | ||||||
|  |     free_ocsp(&ocsp); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand