You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ocsp.c 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. /*
  2. * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of the
  7. * License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  17. * 02110-1301, USA.
  18. */
  19. FILE_LICENCE ( GPL2_OR_LATER );
  20. #include <stdint.h>
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <errno.h>
  25. #include <ipxe/asn1.h>
  26. #include <ipxe/x509.h>
  27. #include <ipxe/sha1.h>
  28. #include <ipxe/base64.h>
  29. #include <ipxe/uri.h>
  30. #include <ipxe/ocsp.h>
  31. /** @file
  32. *
  33. * Online Certificate Status Protocol
  34. *
  35. */
  36. /* Disambiguate the various error causes */
  37. #define EACCES_CERT_STATUS \
  38. __einfo_error ( EINFO_EACCES_CERT_STATUS )
  39. #define EINFO_EACCES_CERT_STATUS \
  40. __einfo_uniqify ( EINFO_EACCES, 0x01, \
  41. "Certificate status not good" )
  42. #define EACCES_CERT_MISMATCH \
  43. __einfo_error ( EINFO_EACCES_CERT_MISMATCH )
  44. #define EINFO_EACCES_CERT_MISMATCH \
  45. __einfo_uniqify ( EINFO_EACCES, 0x02, \
  46. "Certificate ID mismatch" )
  47. #define EACCES_NON_OCSP_SIGNING \
  48. __einfo_error ( EINFO_EACCES_NON_OCSP_SIGNING )
  49. #define EINFO_EACCES_NON_OCSP_SIGNING \
  50. __einfo_uniqify ( EINFO_EACCES, 0x03, \
  51. "Not an OCSP signing certificate" )
  52. #define EACCES_STALE \
  53. __einfo_error ( EINFO_EACCES_STALE )
  54. #define EINFO_EACCES_STALE \
  55. __einfo_uniqify ( EINFO_EACCES, 0x04, \
  56. "Stale (or premature) OCSP repsonse" )
  57. #define EPROTO_MALFORMED_REQUEST \
  58. __einfo_error ( EINFO_EPROTO_MALFORMED_REQUEST )
  59. #define EINFO_EPROTO_MALFORMED_REQUEST \
  60. __einfo_uniqify ( EINFO_EPROTO, OCSP_STATUS_MALFORMED_REQUEST, \
  61. "Illegal confirmation request" )
  62. #define EPROTO_INTERNAL_ERROR \
  63. __einfo_error ( EINFO_EPROTO_INTERNAL_ERROR )
  64. #define EINFO_EPROTO_INTERNAL_ERROR \
  65. __einfo_uniqify ( EINFO_EPROTO, OCSP_STATUS_INTERNAL_ERROR, \
  66. "Internal error in issuer" )
  67. #define EPROTO_TRY_LATER \
  68. __einfo_error ( EINFO_EPROTO_TRY_LATER )
  69. #define EINFO_EPROTO_TRY_LATER \
  70. __einfo_uniqify ( EINFO_EPROTO, OCSP_STATUS_TRY_LATER, \
  71. "Try again later" )
  72. #define EPROTO_SIG_REQUIRED \
  73. __einfo_error ( EINFO_EPROTO_SIG_REQUIRED )
  74. #define EINFO_EPROTO_SIG_REQUIRED \
  75. __einfo_uniqify ( EINFO_EPROTO, OCSP_STATUS_SIG_REQUIRED, \
  76. "Must sign the request" )
  77. #define EPROTO_UNAUTHORIZED \
  78. __einfo_error ( EINFO_EPROTO_UNAUTHORIZED )
  79. #define EINFO_EPROTO_UNAUTHORIZED \
  80. __einfo_uniqify ( EINFO_EPROTO, OCSP_STATUS_UNAUTHORIZED, \
  81. "Request unauthorized" )
  82. #define EPROTO_STATUS( status ) \
  83. EUNIQ ( EPROTO, (status), EPROTO_MALFORMED_REQUEST, \
  84. EPROTO_INTERNAL_ERROR, EPROTO_TRY_LATER, \
  85. EPROTO_SIG_REQUIRED, EPROTO_UNAUTHORIZED )
  86. /** OCSP digest algorithm */
  87. #define ocsp_digest_algorithm sha1_algorithm
  88. /** OCSP digest algorithm identifier */
  89. static const uint8_t ocsp_algorithm_id[] =
  90. { OCSP_ALGORITHM_IDENTIFIER ( ASN1_OID_SHA1 ) };
  91. /** OCSP basic response type */
  92. static const uint8_t oid_basic_response_type[] = { ASN1_OID_OCSP_BASIC };
  93. /** OCSP basic response type cursor */
  94. static struct asn1_cursor oid_basic_response_type_cursor =
  95. ASN1_OID_CURSOR ( oid_basic_response_type );
  96. /**
  97. * Free OCSP check
  98. *
  99. * @v refcnt Reference count
  100. */
  101. static void ocsp_free ( struct refcnt *refcnt ) {
  102. struct ocsp_check *ocsp =
  103. container_of ( refcnt, struct ocsp_check, refcnt );
  104. x509_put ( ocsp->cert );
  105. x509_put ( ocsp->issuer );
  106. free ( ocsp->uri_string );
  107. free ( ocsp->request.builder.data );
  108. free ( ocsp->response.data );
  109. x509_put ( ocsp->response.signer );
  110. free ( ocsp );
  111. }
  112. /**
  113. * Build OCSP request
  114. *
  115. * @v ocsp OCSP check
  116. * @ret rc Return status code
  117. */
  118. static int ocsp_request ( struct ocsp_check *ocsp ) {
  119. struct digest_algorithm *digest = &ocsp_digest_algorithm;
  120. struct asn1_builder *builder = &ocsp->request.builder;
  121. struct asn1_cursor *cert_id = &ocsp->request.cert_id;
  122. uint8_t digest_ctx[digest->ctxsize];
  123. uint8_t name_digest[digest->digestsize];
  124. uint8_t pubkey_digest[digest->digestsize];
  125. int rc;
  126. /* Generate digests */
  127. digest_init ( digest, digest_ctx );
  128. digest_update ( digest, digest_ctx, ocsp->cert->issuer.raw.data,
  129. ocsp->cert->issuer.raw.len );
  130. digest_final ( digest, digest_ctx, name_digest );
  131. digest_init ( digest, digest_ctx );
  132. digest_update ( digest, digest_ctx,
  133. ocsp->issuer->subject.public_key.raw_bits.data,
  134. ocsp->issuer->subject.public_key.raw_bits.len );
  135. digest_final ( digest, digest_ctx, pubkey_digest );
  136. /* Construct request */
  137. if ( ( rc = ( asn1_prepend_raw ( builder, ocsp->cert->serial.raw.data,
  138. ocsp->cert->serial.raw.len ),
  139. asn1_prepend ( builder, ASN1_OCTET_STRING,
  140. pubkey_digest, sizeof ( pubkey_digest ) ),
  141. asn1_prepend ( builder, ASN1_OCTET_STRING,
  142. name_digest, sizeof ( name_digest ) ),
  143. asn1_prepend ( builder, ASN1_SEQUENCE,
  144. ocsp_algorithm_id,
  145. sizeof ( ocsp_algorithm_id ) ),
  146. asn1_wrap ( builder, ASN1_SEQUENCE ),
  147. asn1_wrap ( builder, ASN1_SEQUENCE ),
  148. asn1_wrap ( builder, ASN1_SEQUENCE ),
  149. asn1_wrap ( builder, ASN1_SEQUENCE ),
  150. asn1_wrap ( builder, ASN1_SEQUENCE ) ) ) != 0 ) {
  151. DBGC ( ocsp, "OCSP %p \"%s\" could not build request: %s\n",
  152. ocsp, ocsp->cert->subject.name, strerror ( rc ) );
  153. return rc;
  154. }
  155. DBGC2 ( ocsp, "OCSP %p \"%s\" request is:\n",
  156. ocsp, ocsp->cert->subject.name );
  157. DBGC2_HDA ( ocsp, 0, builder->data, builder->len );
  158. /* Parse certificate ID for comparison with response */
  159. cert_id->data = builder->data;
  160. cert_id->len = builder->len;
  161. if ( ( rc = ( asn1_enter ( cert_id, ASN1_SEQUENCE ),
  162. asn1_enter ( cert_id, ASN1_SEQUENCE ),
  163. asn1_enter ( cert_id, ASN1_SEQUENCE ),
  164. asn1_enter ( cert_id, ASN1_SEQUENCE ) ) ) != 0 ) {
  165. DBGC ( ocsp, "OCSP %p \"%s\" could not locate certID: %s\n",
  166. ocsp, ocsp->cert->subject.name, strerror ( rc ) );
  167. return rc;
  168. }
  169. return 0;
  170. }
  171. /**
  172. * Build OCSP URI string
  173. *
  174. * @v ocsp OCSP check
  175. * @ret rc Return status code
  176. */
  177. static int ocsp_uri_string ( struct ocsp_check *ocsp ) {
  178. char *base_uri_string;
  179. char *base64_request;
  180. size_t base64_request_len;
  181. size_t uri_string_len;
  182. size_t prefix_len;
  183. int rc;
  184. /* Sanity check */
  185. base_uri_string = ocsp->cert->extensions.auth_info.ocsp.uri;
  186. if ( ! base_uri_string ) {
  187. DBGC ( ocsp, "OCSP %p \"%s\" has no OCSP URI\n",
  188. ocsp, ocsp->cert->subject.name );
  189. rc = -ENOTTY;
  190. goto err_no_uri;
  191. }
  192. /* Base64-encode the request */
  193. base64_request_len = ( base64_encoded_len ( ocsp->request.builder.len )
  194. + 1 /* NUL */ );
  195. base64_request = malloc ( base64_request_len );
  196. if ( ! base64_request ) {
  197. rc = -ENOMEM;
  198. goto err_alloc_base64;
  199. }
  200. base64_encode ( ocsp->request.builder.data, ocsp->request.builder.len,
  201. base64_request );
  202. /* Allocate URI string */
  203. uri_string_len = ( strlen ( base_uri_string ) + 1 /* "/" */ +
  204. uri_encode ( base64_request, NULL, 0, URI_FRAGMENT )
  205. + 1 /* NUL */ );
  206. ocsp->uri_string = malloc ( uri_string_len );
  207. if ( ! ocsp->uri_string ) {
  208. rc = -ENOMEM;
  209. goto err_alloc_uri;
  210. }
  211. /* Construct URI string */
  212. prefix_len = snprintf ( ocsp->uri_string, uri_string_len,
  213. "%s/", base_uri_string );
  214. uri_encode ( base64_request, ( ocsp->uri_string + prefix_len ),
  215. ( uri_string_len - prefix_len ), URI_FRAGMENT );
  216. DBGC2 ( ocsp, "OCSP %p \"%s\" URI is %s\n",
  217. ocsp, ocsp->cert->subject.name, ocsp->uri_string );
  218. /* Free base64-encoded request */
  219. free ( base64_request );
  220. base64_request = NULL;
  221. return 0;
  222. err_alloc_uri:
  223. free ( base64_request );
  224. err_alloc_base64:
  225. err_no_uri:
  226. return rc;
  227. }
  228. /**
  229. * Create OCSP check
  230. *
  231. * @v cert Certificate to check
  232. * @v issuer Issuing certificate
  233. * @ret ocsp OCSP check
  234. * @ret rc Return status code
  235. */
  236. int ocsp_check ( struct x509_certificate *cert,
  237. struct x509_certificate *issuer,
  238. struct ocsp_check **ocsp ) {
  239. int rc;
  240. /* Sanity checks */
  241. assert ( cert != NULL );
  242. assert ( issuer != NULL );
  243. assert ( issuer->valid );
  244. /* Allocate and initialise check */
  245. *ocsp = zalloc ( sizeof ( **ocsp ) );
  246. if ( ! *ocsp ) {
  247. rc = -ENOMEM;
  248. goto err_alloc;
  249. }
  250. ref_init ( &(*ocsp)->refcnt, ocsp_free );
  251. (*ocsp)->cert = x509_get ( cert );
  252. (*ocsp)->issuer = x509_get ( issuer );
  253. /* Build request */
  254. if ( ( rc = ocsp_request ( *ocsp ) ) != 0 )
  255. goto err_request;
  256. /* Build URI string */
  257. if ( ( rc = ocsp_uri_string ( *ocsp ) ) != 0 )
  258. goto err_uri_string;
  259. return 0;
  260. err_uri_string:
  261. err_request:
  262. ocsp_put ( *ocsp );
  263. err_alloc:
  264. *ocsp = NULL;
  265. return rc;
  266. }
  267. /**
  268. * Parse OCSP response status
  269. *
  270. * @v ocsp OCSP check
  271. * @v raw ASN.1 cursor
  272. * @ret rc Return status code
  273. */
  274. static int ocsp_parse_response_status ( struct ocsp_check *ocsp,
  275. const struct asn1_cursor *raw ) {
  276. struct asn1_cursor cursor;
  277. uint8_t status;
  278. int rc;
  279. /* Enter responseStatus */
  280. memcpy ( &cursor, raw, sizeof ( cursor ) );
  281. if ( ( rc = asn1_enter ( &cursor, ASN1_ENUMERATED ) ) != 0 ) {
  282. DBGC ( ocsp, "OCSP %p \"%s\" could not locate responseStatus: "
  283. "%s\n", ocsp, ocsp->cert->subject.name, strerror ( rc ));
  284. return rc;
  285. }
  286. /* Extract response status */
  287. if ( cursor.len != sizeof ( status ) ) {
  288. DBGC ( ocsp, "OCSP %p \"%s\" invalid status:\n",
  289. ocsp, ocsp->cert->subject.name );
  290. DBGC_HDA ( ocsp, 0, cursor.data, cursor.len );
  291. return -EINVAL;
  292. }
  293. memcpy ( &status, cursor.data, sizeof ( status ) );
  294. /* Check response status */
  295. if ( status != OCSP_STATUS_SUCCESSFUL ) {
  296. DBGC ( ocsp, "OCSP %p \"%s\" response status %d\n",
  297. ocsp, ocsp->cert->subject.name, status );
  298. return EPROTO_STATUS ( status );
  299. }
  300. return 0;
  301. }
  302. /**
  303. * Parse OCSP response type
  304. *
  305. * @v ocsp OCSP check
  306. * @v raw ASN.1 cursor
  307. * @ret rc Return status code
  308. */
  309. static int ocsp_parse_response_type ( struct ocsp_check *ocsp,
  310. const struct asn1_cursor *raw ) {
  311. struct asn1_cursor cursor;
  312. /* Enter responseType */
  313. memcpy ( &cursor, raw, sizeof ( cursor ) );
  314. asn1_enter ( &cursor, ASN1_OID );
  315. /* Check responseType is "basic" */
  316. if ( asn1_compare ( &oid_basic_response_type_cursor, &cursor ) != 0 ) {
  317. DBGC ( ocsp, "OCSP %p \"%s\" response type not supported:\n",
  318. ocsp, ocsp->cert->subject.name );
  319. DBGC_HDA ( ocsp, 0, cursor.data, cursor.len );
  320. return -ENOTSUP;
  321. }
  322. return 0;
  323. }
  324. /**
  325. * Parse OCSP certificate ID
  326. *
  327. * @v ocsp OCSP check
  328. * @v raw ASN.1 cursor
  329. * @ret rc Return status code
  330. */
  331. static int ocsp_parse_cert_id ( struct ocsp_check *ocsp,
  332. const struct asn1_cursor *raw ) {
  333. struct asn1_cursor cursor;
  334. /* Check certID matches request */
  335. memcpy ( &cursor, raw, sizeof ( cursor ) );
  336. asn1_shrink_any ( &cursor );
  337. if ( asn1_compare ( &cursor, &ocsp->request.cert_id ) != 0 ) {
  338. DBGC ( ocsp, "OCSP %p \"%s\" certID mismatch:\n",
  339. ocsp, ocsp->cert->subject.name );
  340. DBGC_HDA ( ocsp, 0, ocsp->request.cert_id.data,
  341. ocsp->request.cert_id.len );
  342. DBGC_HDA ( ocsp, 0, cursor.data, cursor.len );
  343. return -EACCES_CERT_MISMATCH;
  344. }
  345. return 0;
  346. }
  347. /**
  348. * Parse OCSP responses
  349. *
  350. * @v ocsp OCSP check
  351. * @v raw ASN.1 cursor
  352. * @ret rc Return status code
  353. */
  354. static int ocsp_parse_responses ( struct ocsp_check *ocsp,
  355. const struct asn1_cursor *raw ) {
  356. struct ocsp_response *response = &ocsp->response;
  357. struct asn1_cursor cursor;
  358. int rc;
  359. /* Enter responses */
  360. memcpy ( &cursor, raw, sizeof ( cursor ) );
  361. asn1_enter ( &cursor, ASN1_SEQUENCE );
  362. /* Enter first singleResponse */
  363. asn1_enter ( &cursor, ASN1_SEQUENCE );
  364. /* Parse certID */
  365. if ( ( rc = ocsp_parse_cert_id ( ocsp, &cursor ) ) != 0 )
  366. return rc;
  367. asn1_skip_any ( &cursor );
  368. /* Check certStatus */
  369. if ( asn1_type ( &cursor ) != ASN1_IMPLICIT_TAG ( 0 ) ) {
  370. DBGC ( ocsp, "OCSP %p \"%s\" non-good certStatus:\n",
  371. ocsp, ocsp->cert->subject.name );
  372. DBGC_HDA ( ocsp, 0, cursor.data, cursor.len );
  373. return -EACCES_CERT_STATUS;
  374. }
  375. asn1_skip_any ( &cursor );
  376. /* Parse thisUpdate */
  377. if ( ( rc = asn1_generalized_time ( &cursor,
  378. &response->this_update ) ) != 0 ) {
  379. DBGC ( ocsp, "OCSP %p \"%s\" could not parse thisUpdate: %s\n",
  380. ocsp, ocsp->cert->subject.name, strerror ( rc ) );
  381. return rc;
  382. }
  383. DBGC2 ( ocsp, "OCSP %p \"%s\" this update was at time %lld\n",
  384. ocsp, ocsp->cert->subject.name, response->this_update );
  385. asn1_skip_any ( &cursor );
  386. /* Parse nextUpdate, if present */
  387. if ( asn1_type ( &cursor ) == ASN1_EXPLICIT_TAG ( 0 ) ) {
  388. asn1_enter ( &cursor, ASN1_EXPLICIT_TAG ( 0 ) );
  389. if ( ( rc = asn1_generalized_time ( &cursor,
  390. &response->next_update ) ) != 0 ) {
  391. DBGC ( ocsp, "OCSP %p \"%s\" could not parse "
  392. "nextUpdate: %s\n", ocsp,
  393. ocsp->cert->subject.name, strerror ( rc ) );
  394. return rc;
  395. }
  396. DBGC2 ( ocsp, "OCSP %p \"%s\" next update is at time %lld\n",
  397. ocsp, ocsp->cert->subject.name, response->next_update );
  398. } else {
  399. /* If no nextUpdate is present, this indicates that
  400. * "newer revocation information is available all the
  401. * time". Actually, this indicates that there is no
  402. * point to performing the OCSP check, since an
  403. * attacker could replay the response at any future
  404. * time and it would still be valid.
  405. */
  406. DBGC ( ocsp, "OCSP %p \"%s\" responder is a moron\n",
  407. ocsp, ocsp->cert->subject.name );
  408. response->next_update = time ( NULL );
  409. }
  410. return 0;
  411. }
  412. /**
  413. * Parse OCSP response data
  414. *
  415. * @v ocsp OCSP check
  416. * @v raw ASN.1 cursor
  417. * @ret rc Return status code
  418. */
  419. static int ocsp_parse_tbs_response_data ( struct ocsp_check *ocsp,
  420. const struct asn1_cursor *raw ) {
  421. struct ocsp_response *response = &ocsp->response;
  422. struct asn1_cursor cursor;
  423. int rc;
  424. /* Record raw tbsResponseData */
  425. memcpy ( &cursor, raw, sizeof ( cursor ) );
  426. asn1_shrink_any ( &cursor );
  427. memcpy ( &response->tbs, &cursor, sizeof ( response->tbs ) );
  428. /* Enter tbsResponseData */
  429. asn1_enter ( &cursor, ASN1_SEQUENCE );
  430. /* Skip version, if present */
  431. asn1_skip_if_exists ( &cursor, ASN1_EXPLICIT_TAG ( 0 ) );
  432. /* Skip responderID */
  433. asn1_skip_any ( &cursor );
  434. /* Skip producedAt */
  435. asn1_skip_any ( &cursor );
  436. /* Parse responses */
  437. if ( ( rc = ocsp_parse_responses ( ocsp, &cursor ) ) != 0 )
  438. return rc;
  439. return 0;
  440. }
  441. /**
  442. * Parse OCSP certificates
  443. *
  444. * @v ocsp OCSP check
  445. * @v raw ASN.1 cursor
  446. * @ret rc Return status code
  447. */
  448. static int ocsp_parse_certs ( struct ocsp_check *ocsp,
  449. const struct asn1_cursor *raw ) {
  450. struct ocsp_response *response = &ocsp->response;
  451. struct asn1_cursor cursor;
  452. int rc;
  453. /* Enter certs */
  454. memcpy ( &cursor, raw, sizeof ( cursor ) );
  455. asn1_enter ( &cursor, ASN1_EXPLICIT_TAG ( 0 ) );
  456. asn1_enter ( &cursor, ASN1_SEQUENCE );
  457. /* Parse certificate, if present. The data structure permits
  458. * multiple certificates, but the protocol requires that the
  459. * OCSP signing certificate must either be the issuer itself,
  460. * or must be directly issued by the issuer (see RFC2560
  461. * section 4.2.2.2 "Authorized Responders").
  462. */
  463. if ( ( cursor.len != 0 ) &&
  464. ( ( rc = x509_certificate ( cursor.data, cursor.len,
  465. &response->signer ) ) != 0 ) ) {
  466. DBGC ( ocsp, "OCSP %p \"%s\" could not parse certificate: "
  467. "%s\n", ocsp, ocsp->cert->subject.name, strerror ( rc ));
  468. DBGC_HDA ( ocsp, 0, cursor.data, cursor.len );
  469. return rc;
  470. }
  471. DBGC2 ( ocsp, "OCSP %p \"%s\" response is signed by \"%s\"\n", ocsp,
  472. ocsp->cert->subject.name, response->signer->subject.name );
  473. return 0;
  474. }
  475. /**
  476. * Parse OCSP basic response
  477. *
  478. * @v ocsp OCSP check
  479. * @v raw ASN.1 cursor
  480. * @ret rc Return status code
  481. */
  482. static int ocsp_parse_basic_response ( struct ocsp_check *ocsp,
  483. const struct asn1_cursor *raw ) {
  484. struct ocsp_response *response = &ocsp->response;
  485. struct asn1_algorithm **algorithm = &response->algorithm;
  486. struct asn1_bit_string *signature = &response->signature;
  487. struct asn1_cursor cursor;
  488. int rc;
  489. /* Enter BasicOCSPResponse */
  490. memcpy ( &cursor, raw, sizeof ( cursor ) );
  491. asn1_enter ( &cursor, ASN1_SEQUENCE );
  492. /* Parse tbsResponseData */
  493. if ( ( rc = ocsp_parse_tbs_response_data ( ocsp, &cursor ) ) != 0 )
  494. return rc;
  495. asn1_skip_any ( &cursor );
  496. /* Parse signatureAlgorithm */
  497. if ( ( rc = asn1_signature_algorithm ( &cursor, algorithm ) ) != 0 ) {
  498. DBGC ( ocsp, "OCSP %p \"%s\" cannot parse signature "
  499. "algorithm: %s\n",
  500. ocsp, ocsp->cert->subject.name, strerror ( rc ) );
  501. return rc;
  502. }
  503. DBGC2 ( ocsp, "OCSP %p \"%s\" signature algorithm is %s\n",
  504. ocsp, ocsp->cert->subject.name, (*algorithm)->name );
  505. asn1_skip_any ( &cursor );
  506. /* Parse signature */
  507. if ( ( rc = asn1_integral_bit_string ( &cursor, signature ) ) != 0 ) {
  508. DBGC ( ocsp, "OCSP %p \"%s\" cannot parse signature: %s\n",
  509. ocsp, ocsp->cert->subject.name, strerror ( rc ) );
  510. return rc;
  511. }
  512. asn1_skip_any ( &cursor );
  513. /* Parse certs, if present */
  514. if ( ( asn1_type ( &cursor ) == ASN1_EXPLICIT_TAG ( 0 ) ) &&
  515. ( ( rc = ocsp_parse_certs ( ocsp, &cursor ) ) != 0 ) )
  516. return rc;
  517. return 0;
  518. }
  519. /**
  520. * Parse OCSP response bytes
  521. *
  522. * @v ocsp OCSP check
  523. * @v raw ASN.1 cursor
  524. * @ret rc Return status code
  525. */
  526. static int ocsp_parse_response_bytes ( struct ocsp_check *ocsp,
  527. const struct asn1_cursor *raw ) {
  528. struct asn1_cursor cursor;
  529. int rc;
  530. /* Enter responseBytes */
  531. memcpy ( &cursor, raw, sizeof ( cursor ) );
  532. asn1_enter ( &cursor, ASN1_EXPLICIT_TAG ( 0 ) );
  533. asn1_enter ( &cursor, ASN1_SEQUENCE );
  534. /* Parse responseType */
  535. if ( ( rc = ocsp_parse_response_type ( ocsp, &cursor ) ) != 0 )
  536. return rc;
  537. asn1_skip_any ( &cursor );
  538. /* Enter response */
  539. asn1_enter ( &cursor, ASN1_OCTET_STRING );
  540. /* Parse response */
  541. if ( ( rc = ocsp_parse_basic_response ( ocsp, &cursor ) ) != 0 )
  542. return rc;
  543. return 0;
  544. }
  545. /**
  546. * Parse OCSP response
  547. *
  548. * @v ocsp OCSP check
  549. * @v raw ASN.1 cursor
  550. * @ret rc Return status code
  551. */
  552. static int ocsp_parse_response ( struct ocsp_check *ocsp,
  553. const struct asn1_cursor *raw ) {
  554. struct asn1_cursor cursor;
  555. int rc;
  556. /* Enter OCSPResponse */
  557. memcpy ( &cursor, raw, sizeof ( cursor ) );
  558. asn1_enter ( &cursor, ASN1_SEQUENCE );
  559. /* Parse responseStatus */
  560. if ( ( rc = ocsp_parse_response_status ( ocsp, &cursor ) ) != 0 )
  561. return rc;
  562. asn1_skip_any ( &cursor );
  563. /* Parse responseBytes */
  564. if ( ( rc = ocsp_parse_response_bytes ( ocsp, &cursor ) ) != 0 )
  565. return rc;
  566. return 0;
  567. }
  568. /**
  569. * Receive OCSP response
  570. *
  571. * @v ocsp OCSP check
  572. * @v data Response data
  573. * @v len Length of response data
  574. * @ret rc Return status code
  575. */
  576. int ocsp_response ( struct ocsp_check *ocsp, const void *data, size_t len ) {
  577. struct ocsp_response *response = &ocsp->response;
  578. struct asn1_cursor cursor;
  579. int rc;
  580. /* Duplicate data */
  581. x509_put ( response->signer );
  582. response->signer = NULL;
  583. free ( response->data );
  584. response->data = malloc ( len );
  585. if ( ! response->data )
  586. return -ENOMEM;
  587. memcpy ( response->data, data, len );
  588. cursor.data = response->data;
  589. cursor.len = len;
  590. /* Parse response */
  591. if ( ( rc = ocsp_parse_response ( ocsp, &cursor ) ) != 0 )
  592. return rc;
  593. return 0;
  594. }
  595. /**
  596. * OCSP dummy root certificate store
  597. *
  598. * OCSP validation uses no root certificates, since it takes place
  599. * only when there already exists a validated issuer certificate.
  600. */
  601. static struct x509_root ocsp_root = {
  602. .digest = &ocsp_digest_algorithm,
  603. .count = 0,
  604. .fingerprints = NULL,
  605. };
  606. /**
  607. * Check OCSP response signature
  608. *
  609. * @v ocsp OCSP check
  610. * @v signer Signing certificate
  611. * @ret rc Return status code
  612. */
  613. static int ocsp_check_signature ( struct ocsp_check *ocsp,
  614. struct x509_certificate *signer ) {
  615. struct ocsp_response *response = &ocsp->response;
  616. struct digest_algorithm *digest = response->algorithm->digest;
  617. struct pubkey_algorithm *pubkey = response->algorithm->pubkey;
  618. struct x509_public_key *public_key = &signer->subject.public_key;
  619. uint8_t digest_ctx[ digest->ctxsize ];
  620. uint8_t digest_out[ digest->digestsize ];
  621. uint8_t pubkey_ctx[ pubkey->ctxsize ];
  622. int rc;
  623. /* Generate digest */
  624. digest_init ( digest, digest_ctx );
  625. digest_update ( digest, digest_ctx, response->tbs.data,
  626. response->tbs.len );
  627. digest_final ( digest, digest_ctx, digest_out );
  628. /* Initialise public-key algorithm */
  629. if ( ( rc = pubkey_init ( pubkey, pubkey_ctx, public_key->raw.data,
  630. public_key->raw.len ) ) != 0 ) {
  631. DBGC ( ocsp, "OCSP %p \"%s\" could not initialise public key: "
  632. "%s\n", ocsp, ocsp->cert->subject.name, strerror ( rc ));
  633. goto err_init;
  634. }
  635. /* Verify digest */
  636. if ( ( rc = pubkey_verify ( pubkey, pubkey_ctx, digest, digest_out,
  637. response->signature.data,
  638. response->signature.len ) ) != 0 ) {
  639. DBGC ( ocsp, "OCSP %p \"%s\" signature verification failed: "
  640. "%s\n", ocsp, ocsp->cert->subject.name, strerror ( rc ));
  641. goto err_verify;
  642. }
  643. DBGC2 ( ocsp, "OCSP %p \"%s\" signature is correct\n",
  644. ocsp, ocsp->cert->subject.name );
  645. err_verify:
  646. pubkey_final ( pubkey, pubkey_ctx );
  647. err_init:
  648. return rc;
  649. }
  650. /**
  651. * Validate OCSP response
  652. *
  653. * @v ocsp OCSP check
  654. * @v time Time at which to validate response
  655. * @ret rc Return status code
  656. */
  657. int ocsp_validate ( struct ocsp_check *ocsp, time_t time ) {
  658. struct ocsp_response *response = &ocsp->response;
  659. struct x509_certificate *signer = response->signer;
  660. int rc;
  661. /* Sanity checks */
  662. assert ( response->data != NULL );
  663. assert ( signer != NULL );
  664. /* Validate signer, if applicable. If the signer is not the
  665. * issuer, then it must be signed directly by the issuer.
  666. */
  667. if ( signer != ocsp->issuer ) {
  668. /* Forcibly invalidate the signer, since we need to
  669. * ensure that it was signed by our issuer (and not
  670. * some other issuer). This prevents a sub-CA's OCSP
  671. * certificate from fraudulently signing OCSP
  672. * responses from the parent CA.
  673. */
  674. x509_invalidate ( signer );
  675. if ( ( rc = x509_validate ( signer, ocsp->issuer, time,
  676. &ocsp_root ) ) != 0 ) {
  677. DBGC ( ocsp, "OCSP %p \"%s\" could not validate "
  678. "signer \"%s\": %s\n", ocsp,
  679. ocsp->cert->subject.name, signer->subject.name,
  680. strerror ( rc ) );
  681. return rc;
  682. }
  683. /* If signer is not the issuer, then it must have the
  684. * extendedKeyUsage id-kp-OCSPSigning.
  685. */
  686. if ( ! ( signer->extensions.ext_usage.bits &
  687. X509_OCSP_SIGNING ) ) {
  688. DBGC ( ocsp, "OCSP %p \"%s\" signer \"%s\" is "
  689. "not an OCSP-signing certificate\n", ocsp,
  690. ocsp->cert->subject.name, signer->subject.name );
  691. return -EACCES_NON_OCSP_SIGNING;
  692. }
  693. }
  694. /* Check OCSP response signature */
  695. if ( ( rc = ocsp_check_signature ( ocsp, signer ) ) != 0 )
  696. return rc;
  697. /* Check OCSP response is valid at the specified time
  698. * (allowing for some margin of error).
  699. */
  700. if ( response->this_update > ( time + X509_ERROR_MARGIN_TIME ) ) {
  701. DBGC ( ocsp, "OCSP %p \"%s\" response is not yet valid (at "
  702. "time %lld)\n", ocsp, ocsp->cert->subject.name, time );
  703. return -EACCES_STALE;
  704. }
  705. if ( response->next_update < ( time - X509_ERROR_MARGIN_TIME ) ) {
  706. DBGC ( ocsp, "OCSP %p \"%s\" response is stale (at time "
  707. "%lld)\n", ocsp, ocsp->cert->subject.name, time );
  708. return -EACCES_STALE;
  709. }
  710. DBGC2 ( ocsp, "OCSP %p \"%s\" response is valid (at time %lld)\n",
  711. ocsp, ocsp->cert->subject.name, time );
  712. /* Mark certificate as passing OCSP verification */
  713. ocsp->cert->extensions.auth_info.ocsp.good = 1;
  714. /* Validate certificate against issuer */
  715. if ( ( rc = x509_validate ( ocsp->cert, ocsp->issuer, time,
  716. &ocsp_root ) ) != 0 ) {
  717. DBGC ( ocsp, "OCSP %p \"%s\" could not validate certificate: "
  718. "%s\n", ocsp, ocsp->cert->subject.name, strerror ( rc ));
  719. return rc;
  720. }
  721. DBGC ( ocsp, "OCSP %p \"%s\" successfully validated using \"%s\"\n",
  722. ocsp, ocsp->cert->subject.name, signer->subject.name );
  723. return 0;
  724. }