ocsp_vfy.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. /*
  2. * Copyright 2001-2016 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the OpenSSL license (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #include <openssl/ocsp.h>
  10. #include "ocsp_lcl.h"
  11. #include <openssl/err.h>
  12. #include <string.h>
  13. static int ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs,
  14. STACK_OF(X509) *certs, unsigned long flags);
  15. static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id);
  16. static int ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain);
  17. static int ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp,
  18. OCSP_CERTID **ret);
  19. static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid,
  20. STACK_OF(OCSP_SINGLERESP) *sresp);
  21. static int ocsp_check_delegated(X509 *x);
  22. static int ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req,
  23. X509_NAME *nm, STACK_OF(X509) *certs,
  24. unsigned long flags);
  25. /* Verify a basic response message */
  26. int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,
  27. X509_STORE *st, unsigned long flags)
  28. {
  29. X509 *signer, *x;
  30. STACK_OF(X509) *chain = NULL;
  31. STACK_OF(X509) *untrusted = NULL;
  32. X509_STORE_CTX *ctx = NULL;
  33. int i, ret = ocsp_find_signer(&signer, bs, certs, flags);
  34. if (!ret) {
  35. OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,
  36. OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND);
  37. goto end;
  38. }
  39. ctx = X509_STORE_CTX_new();
  40. if (ctx == NULL) {
  41. OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, ERR_R_MALLOC_FAILURE);
  42. goto f_err;
  43. }
  44. if ((ret == 2) && (flags & OCSP_TRUSTOTHER))
  45. flags |= OCSP_NOVERIFY;
  46. if (!(flags & OCSP_NOSIGS)) {
  47. EVP_PKEY *skey;
  48. skey = X509_get0_pubkey(signer);
  49. if (skey == NULL) {
  50. OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_NO_SIGNER_KEY);
  51. goto err;
  52. }
  53. ret = OCSP_BASICRESP_verify(bs, skey, 0);
  54. if (ret <= 0) {
  55. OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNATURE_FAILURE);
  56. goto end;
  57. }
  58. }
  59. if (!(flags & OCSP_NOVERIFY)) {
  60. int init_res;
  61. if (flags & OCSP_NOCHAIN) {
  62. untrusted = NULL;
  63. } else if (bs->certs && certs) {
  64. untrusted = sk_X509_dup(bs->certs);
  65. for (i = 0; i < sk_X509_num(certs); i++) {
  66. if (!sk_X509_push(untrusted, sk_X509_value(certs, i))) {
  67. OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, ERR_R_MALLOC_FAILURE);
  68. goto f_err;
  69. }
  70. }
  71. } else {
  72. untrusted = bs->certs;
  73. }
  74. init_res = X509_STORE_CTX_init(ctx, st, signer, untrusted);
  75. if (!init_res) {
  76. OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, ERR_R_X509_LIB);
  77. goto f_err;
  78. }
  79. X509_STORE_CTX_set_purpose(ctx, X509_PURPOSE_OCSP_HELPER);
  80. ret = X509_verify_cert(ctx);
  81. chain = X509_STORE_CTX_get1_chain(ctx);
  82. if (ret <= 0) {
  83. i = X509_STORE_CTX_get_error(ctx);
  84. OCSPerr(OCSP_F_OCSP_BASIC_VERIFY,
  85. OCSP_R_CERTIFICATE_VERIFY_ERROR);
  86. ERR_add_error_data(2, "Verify error:",
  87. X509_verify_cert_error_string(i));
  88. goto end;
  89. }
  90. if (flags & OCSP_NOCHECKS) {
  91. ret = 1;
  92. goto end;
  93. }
  94. /*
  95. * At this point we have a valid certificate chain need to verify it
  96. * against the OCSP issuer criteria.
  97. */
  98. ret = ocsp_check_issuer(bs, chain);
  99. /* If fatal error or valid match then finish */
  100. if (ret != 0)
  101. goto end;
  102. /*
  103. * Easy case: explicitly trusted. Get root CA and check for explicit
  104. * trust
  105. */
  106. if (flags & OCSP_NOEXPLICIT)
  107. goto end;
  108. x = sk_X509_value(chain, sk_X509_num(chain) - 1);
  109. if (X509_check_trust(x, NID_OCSP_sign, 0) != X509_TRUST_TRUSTED) {
  110. OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_ROOT_CA_NOT_TRUSTED);
  111. goto err;
  112. }
  113. ret = 1;
  114. }
  115. end:
  116. X509_STORE_CTX_free(ctx);
  117. sk_X509_pop_free(chain, X509_free);
  118. if (bs->certs && certs)
  119. sk_X509_free(untrusted);
  120. return ret;
  121. err:
  122. ret = 0;
  123. goto end;
  124. f_err:
  125. ret = -1;
  126. goto end;
  127. }
  128. static int ocsp_find_signer(X509 **psigner, OCSP_BASICRESP *bs,
  129. STACK_OF(X509) *certs, unsigned long flags)
  130. {
  131. X509 *signer;
  132. OCSP_RESPID *rid = &bs->tbsResponseData.responderId;
  133. if ((signer = ocsp_find_signer_sk(certs, rid))) {
  134. *psigner = signer;
  135. return 2;
  136. }
  137. if (!(flags & OCSP_NOINTERN) &&
  138. (signer = ocsp_find_signer_sk(bs->certs, rid))) {
  139. *psigner = signer;
  140. return 1;
  141. }
  142. /* Maybe lookup from store if by subject name */
  143. *psigner = NULL;
  144. return 0;
  145. }
  146. static X509 *ocsp_find_signer_sk(STACK_OF(X509) *certs, OCSP_RESPID *id)
  147. {
  148. int i;
  149. unsigned char tmphash[SHA_DIGEST_LENGTH], *keyhash;
  150. X509 *x;
  151. /* Easy if lookup by name */
  152. if (id->type == V_OCSP_RESPID_NAME)
  153. return X509_find_by_subject(certs, id->value.byName);
  154. /* Lookup by key hash */
  155. /* If key hash isn't SHA1 length then forget it */
  156. if (id->value.byKey->length != SHA_DIGEST_LENGTH)
  157. return NULL;
  158. keyhash = id->value.byKey->data;
  159. /* Calculate hash of each key and compare */
  160. for (i = 0; i < sk_X509_num(certs); i++) {
  161. x = sk_X509_value(certs, i);
  162. X509_pubkey_digest(x, EVP_sha1(), tmphash, NULL);
  163. if (!memcmp(keyhash, tmphash, SHA_DIGEST_LENGTH))
  164. return x;
  165. }
  166. return NULL;
  167. }
  168. static int ocsp_check_issuer(OCSP_BASICRESP *bs, STACK_OF(X509) *chain)
  169. {
  170. STACK_OF(OCSP_SINGLERESP) *sresp;
  171. X509 *signer, *sca;
  172. OCSP_CERTID *caid = NULL;
  173. int i;
  174. sresp = bs->tbsResponseData.responses;
  175. if (sk_X509_num(chain) <= 0) {
  176. OCSPerr(OCSP_F_OCSP_CHECK_ISSUER, OCSP_R_NO_CERTIFICATES_IN_CHAIN);
  177. return -1;
  178. }
  179. /* See if the issuer IDs match. */
  180. i = ocsp_check_ids(sresp, &caid);
  181. /* If ID mismatch or other error then return */
  182. if (i <= 0)
  183. return i;
  184. signer = sk_X509_value(chain, 0);
  185. /* Check to see if OCSP responder CA matches request CA */
  186. if (sk_X509_num(chain) > 1) {
  187. sca = sk_X509_value(chain, 1);
  188. i = ocsp_match_issuerid(sca, caid, sresp);
  189. if (i < 0)
  190. return i;
  191. if (i) {
  192. /* We have a match, if extensions OK then success */
  193. if (ocsp_check_delegated(signer))
  194. return 1;
  195. return 0;
  196. }
  197. }
  198. /* Otherwise check if OCSP request signed directly by request CA */
  199. return ocsp_match_issuerid(signer, caid, sresp);
  200. }
  201. /*
  202. * Check the issuer certificate IDs for equality. If there is a mismatch with
  203. * the same algorithm then there's no point trying to match any certificates
  204. * against the issuer. If the issuer IDs all match then we just need to check
  205. * equality against one of them.
  206. */
  207. static int ocsp_check_ids(STACK_OF(OCSP_SINGLERESP) *sresp, OCSP_CERTID **ret)
  208. {
  209. OCSP_CERTID *tmpid, *cid;
  210. int i, idcount;
  211. idcount = sk_OCSP_SINGLERESP_num(sresp);
  212. if (idcount <= 0) {
  213. OCSPerr(OCSP_F_OCSP_CHECK_IDS,
  214. OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA);
  215. return -1;
  216. }
  217. cid = sk_OCSP_SINGLERESP_value(sresp, 0)->certId;
  218. *ret = NULL;
  219. for (i = 1; i < idcount; i++) {
  220. tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId;
  221. /* Check to see if IDs match */
  222. if (OCSP_id_issuer_cmp(cid, tmpid)) {
  223. /* If algorithm mismatch let caller deal with it */
  224. if (OBJ_cmp(tmpid->hashAlgorithm.algorithm,
  225. cid->hashAlgorithm.algorithm))
  226. return 2;
  227. /* Else mismatch */
  228. return 0;
  229. }
  230. }
  231. /* All IDs match: only need to check one ID */
  232. *ret = cid;
  233. return 1;
  234. }
  235. static int ocsp_match_issuerid(X509 *cert, OCSP_CERTID *cid,
  236. STACK_OF(OCSP_SINGLERESP) *sresp)
  237. {
  238. /* If only one ID to match then do it */
  239. if (cid) {
  240. const EVP_MD *dgst;
  241. X509_NAME *iname;
  242. int mdlen;
  243. unsigned char md[EVP_MAX_MD_SIZE];
  244. if ((dgst = EVP_get_digestbyobj(cid->hashAlgorithm.algorithm))
  245. == NULL) {
  246. OCSPerr(OCSP_F_OCSP_MATCH_ISSUERID,
  247. OCSP_R_UNKNOWN_MESSAGE_DIGEST);
  248. return -1;
  249. }
  250. mdlen = EVP_MD_size(dgst);
  251. if (mdlen < 0)
  252. return -1;
  253. if ((cid->issuerNameHash.length != mdlen) ||
  254. (cid->issuerKeyHash.length != mdlen))
  255. return 0;
  256. iname = X509_get_subject_name(cert);
  257. if (!X509_NAME_digest(iname, dgst, md, NULL))
  258. return -1;
  259. if (memcmp(md, cid->issuerNameHash.data, mdlen))
  260. return 0;
  261. X509_pubkey_digest(cert, dgst, md, NULL);
  262. if (memcmp(md, cid->issuerKeyHash.data, mdlen))
  263. return 0;
  264. return 1;
  265. } else {
  266. /* We have to match the whole lot */
  267. int i, ret;
  268. OCSP_CERTID *tmpid;
  269. for (i = 0; i < sk_OCSP_SINGLERESP_num(sresp); i++) {
  270. tmpid = sk_OCSP_SINGLERESP_value(sresp, i)->certId;
  271. ret = ocsp_match_issuerid(cert, tmpid, NULL);
  272. if (ret <= 0)
  273. return ret;
  274. }
  275. return 1;
  276. }
  277. }
  278. static int ocsp_check_delegated(X509 *x)
  279. {
  280. if ((X509_get_extension_flags(x) & EXFLAG_XKUSAGE)
  281. && (X509_get_extended_key_usage(x) & XKU_OCSP_SIGN))
  282. return 1;
  283. OCSPerr(OCSP_F_OCSP_CHECK_DELEGATED, OCSP_R_MISSING_OCSPSIGNING_USAGE);
  284. return 0;
  285. }
  286. /*
  287. * Verify an OCSP request. This is fortunately much easier than OCSP response
  288. * verify. Just find the signers certificate and verify it against a given
  289. * trust value.
  290. */
  291. int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs,
  292. X509_STORE *store, unsigned long flags)
  293. {
  294. X509 *signer;
  295. X509_NAME *nm;
  296. GENERAL_NAME *gen;
  297. int ret = 0;
  298. X509_STORE_CTX *ctx = X509_STORE_CTX_new();
  299. if (ctx == NULL) {
  300. OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, ERR_R_MALLOC_FAILURE);
  301. goto err;
  302. }
  303. if (!req->optionalSignature) {
  304. OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_REQUEST_NOT_SIGNED);
  305. goto err;
  306. }
  307. gen = req->tbsRequest.requestorName;
  308. if (!gen || gen->type != GEN_DIRNAME) {
  309. OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,
  310. OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE);
  311. goto err;
  312. }
  313. nm = gen->d.directoryName;
  314. ret = ocsp_req_find_signer(&signer, req, nm, certs, flags);
  315. if (ret <= 0) {
  316. OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,
  317. OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND);
  318. goto err;
  319. }
  320. if ((ret == 2) && (flags & OCSP_TRUSTOTHER))
  321. flags |= OCSP_NOVERIFY;
  322. if (!(flags & OCSP_NOSIGS)) {
  323. EVP_PKEY *skey;
  324. skey = X509_get0_pubkey(signer);
  325. ret = OCSP_REQUEST_verify(req, skey);
  326. if (ret <= 0) {
  327. OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, OCSP_R_SIGNATURE_FAILURE);
  328. goto err;
  329. }
  330. }
  331. if (!(flags & OCSP_NOVERIFY)) {
  332. int init_res;
  333. if (flags & OCSP_NOCHAIN)
  334. init_res = X509_STORE_CTX_init(ctx, store, signer, NULL);
  335. else
  336. init_res = X509_STORE_CTX_init(ctx, store, signer,
  337. req->optionalSignature->certs);
  338. if (!init_res) {
  339. OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY, ERR_R_X509_LIB);
  340. goto err;
  341. }
  342. X509_STORE_CTX_set_purpose(ctx, X509_PURPOSE_OCSP_HELPER);
  343. X509_STORE_CTX_set_trust(ctx, X509_TRUST_OCSP_REQUEST);
  344. ret = X509_verify_cert(ctx);
  345. if (ret <= 0) {
  346. ret = X509_STORE_CTX_get_error(ctx);
  347. OCSPerr(OCSP_F_OCSP_REQUEST_VERIFY,
  348. OCSP_R_CERTIFICATE_VERIFY_ERROR);
  349. ERR_add_error_data(2, "Verify error:",
  350. X509_verify_cert_error_string(ret));
  351. goto err;
  352. }
  353. }
  354. ret = 1;
  355. goto end;
  356. err:
  357. ret = 0;
  358. end:
  359. X509_STORE_CTX_free(ctx);
  360. return ret;
  361. }
  362. static int ocsp_req_find_signer(X509 **psigner, OCSP_REQUEST *req,
  363. X509_NAME *nm, STACK_OF(X509) *certs,
  364. unsigned long flags)
  365. {
  366. X509 *signer;
  367. if (!(flags & OCSP_NOINTERN)) {
  368. signer = X509_find_by_subject(req->optionalSignature->certs, nm);
  369. if (signer) {
  370. *psigner = signer;
  371. return 1;
  372. }
  373. }
  374. signer = X509_find_by_subject(certs, nm);
  375. if (signer) {
  376. *psigner = signer;
  377. return 2;
  378. }
  379. return 0;
  380. }