Browse Source

[ocsp] Avoid including a double path separator in request URI

The OCSP responder URI included within an X.509 certificate may or may
not include a trailing slash.  We currently rely on the fact that
format_uri() incorrectly inserts an initial slash, which we include
unconditionally within the OCSP request URI.

Switch to using uri_encode() directly, and insert a slash only if the
X.509 certificate's OCSP responder URI does not already include a
trailing slash.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 8 years ago
parent
commit
42c2a6aab7
1 changed files with 26 additions and 28 deletions
  1. 26
    28
      src/crypto/ocsp.c

+ 26
- 28
src/crypto/ocsp.c View File

209
 static int ocsp_uri_string ( struct ocsp_check *ocsp ) {
209
 static int ocsp_uri_string ( struct ocsp_check *ocsp ) {
210
 	struct x509_ocsp_responder *responder =
210
 	struct x509_ocsp_responder *responder =
211
 		&ocsp->cert->extensions.auth_info.ocsp;
211
 		&ocsp->cert->extensions.auth_info.ocsp;
212
-	struct uri path_uri;
213
-	char *path_base64_string;
214
-	char *path_uri_string;
215
-	size_t path_len;
212
+	char *base64;
213
+	char *sep;
214
+	size_t base64_len;
215
+	size_t uri_len;
216
 	size_t len;
216
 	size_t len;
217
 	int rc;
217
 	int rc;
218
 
218
 
224
 		goto err_no_uri;
224
 		goto err_no_uri;
225
 	}
225
 	}
226
 
226
 
227
-	/* Base64-encode the request as the URI path */
228
-	path_len = ( base64_encoded_len ( ocsp->request.builder.len )
229
-		     + 1 /* NUL */ );
230
-	path_base64_string = malloc ( path_len );
231
-	if ( ! path_base64_string ) {
227
+	/* Calculate base64-encoded request length */
228
+	base64_len = ( base64_encoded_len ( ocsp->request.builder.len )
229
+		       + 1 /* NUL */ );
230
+
231
+	/* Allocate and construct the base64-encoded request */
232
+	base64 = malloc ( base64_len );
233
+	if ( ! base64 ) {
232
 		rc = -ENOMEM;
234
 		rc = -ENOMEM;
233
-		goto err_path_base64;
235
+		goto err_alloc_base64;
234
 	}
236
 	}
235
 	base64_encode ( ocsp->request.builder.data, ocsp->request.builder.len,
237
 	base64_encode ( ocsp->request.builder.data, ocsp->request.builder.len,
236
-			path_base64_string, path_len );
238
+			base64, base64_len );
237
 
239
 
238
-	/* URI-encode the Base64-encoded request */
239
-	memset ( &path_uri, 0, sizeof ( path_uri ) );
240
-	path_uri.path = path_base64_string;
241
-	path_uri_string = format_uri_alloc ( &path_uri );
242
-	if ( ! path_uri_string ) {
243
-		rc = -ENOMEM;
244
-		goto err_path_uri;
245
-	}
240
+	/* Calculate URI-encoded base64-encoded request length */
241
+	uri_len = ( uri_encode ( URI_PATH, base64, ( base64_len - 1 /* NUL */ ),
242
+				 NULL, 0 ) + 1 /* NUL */ );
246
 
243
 
247
-	/* Construct URI string */
248
-	len = ( responder->uri.len + strlen ( path_uri_string ) + 1 /* NUL */ );
244
+	/* Allocate and construct the URI string */
245
+	len = ( responder->uri.len + 1 /* possible "/" */ + uri_len );
249
 	ocsp->uri_string = zalloc ( len );
246
 	ocsp->uri_string = zalloc ( len );
250
 	if ( ! ocsp->uri_string ) {
247
 	if ( ! ocsp->uri_string ) {
251
 		rc = -ENOMEM;
248
 		rc = -ENOMEM;
252
-		goto err_ocsp_uri;
249
+		goto err_alloc_uri;
253
 	}
250
 	}
254
 	memcpy ( ocsp->uri_string, responder->uri.data, responder->uri.len );
251
 	memcpy ( ocsp->uri_string, responder->uri.data, responder->uri.len );
255
-	strcpy ( &ocsp->uri_string[responder->uri.len], path_uri_string );
252
+	sep = &ocsp->uri_string[ responder->uri.len - 1 ];
253
+	if ( *sep != '/' )
254
+		*(++sep) = '/';
255
+	uri_encode ( URI_PATH, base64, base64_len, ( sep + 1 ), uri_len );
256
 	DBGC2 ( ocsp, "OCSP %p \"%s\" URI is %s\n",
256
 	DBGC2 ( ocsp, "OCSP %p \"%s\" URI is %s\n",
257
 		ocsp, x509_name ( ocsp->cert ), ocsp->uri_string );
257
 		ocsp, x509_name ( ocsp->cert ), ocsp->uri_string );
258
 
258
 
259
 	/* Success */
259
 	/* Success */
260
 	rc = 0;
260
 	rc = 0;
261
 
261
 
262
- err_ocsp_uri:
263
-	free ( path_uri_string );
264
- err_path_uri:
265
-	free ( path_base64_string );
266
- err_path_base64:
262
+ err_alloc_uri:
263
+	free ( base64 );
264
+ err_alloc_base64:
267
  err_no_uri:
265
  err_no_uri:
268
 	return rc;
266
 	return rc;
269
 }
267
 }

Loading…
Cancel
Save