Index: openssl/crypto/ocsp/ocsp_ht.c |
=================================================================== |
--- openssl/crypto/ocsp/ocsp_ht.c (revision 105093) |
+++ openssl/crypto/ocsp/ocsp_ht.c (working copy) |
@@ -118,39 +118,65 @@ |
OPENSSL_free(rctx); |
} |
-OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, |
- int maxline) |
+int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req) |
{ |
- static char post_hdr[] = "POST %s HTTP/1.0\r\n" |
+ static const char req_hdr[] = |
"Content-Type: application/ocsp-request\r\n" |
"Content-Length: %d\r\n\r\n"; |
+ if (BIO_printf(rctx->mem, req_hdr, i2d_OCSP_REQUEST(req, NULL)) <= 0) |
+ return 0; |
+ if (i2d_OCSP_REQUEST_bio(rctx->mem, req) <= 0) |
+ return 0; |
+ rctx->state = OHS_ASN1_WRITE; |
+ rctx->asn1_len = BIO_get_mem_data(rctx->mem, NULL); |
+ return 1; |
+ } |
+int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, |
+ const char *name, const char *value) |
+ { |
+ if (!name) |
+ return 0; |
+ if (BIO_puts(rctx->mem, name) <= 0) |
+ return 0; |
+ if (value) |
+ { |
+ if (BIO_write(rctx->mem, ": ", 2) != 2) |
+ return 0; |
+ if (BIO_puts(rctx->mem, value) <= 0) |
+ return 0; |
+ } |
+ if (BIO_write(rctx->mem, "\r\n", 2) != 2) |
+ return 0; |
+ return 1; |
+ } |
+ |
+OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, |
+ int maxline) |
+ { |
+ static const char post_hdr[] = "POST %s HTTP/1.0\r\n"; |
+ |
OCSP_REQ_CTX *rctx; |
rctx = OPENSSL_malloc(sizeof(OCSP_REQ_CTX)); |
- rctx->state = OHS_FIRSTLINE; |
+ rctx->state = OHS_ERROR; |
rctx->mem = BIO_new(BIO_s_mem()); |
rctx->io = io; |
+ rctx->asn1_len = 0; |
if (maxline > 0) |
rctx->iobuflen = maxline; |
else |
rctx->iobuflen = OCSP_MAX_LINE_LEN; |
rctx->iobuf = OPENSSL_malloc(rctx->iobuflen); |
+ if (!rctx->iobuf) |
+ return 0; |
if (!path) |
path = "/"; |
- if (BIO_printf(rctx->mem, post_hdr, path, |
- i2d_OCSP_REQUEST(req, NULL)) <= 0) |
- { |
- rctx->state = OHS_ERROR; |
+ if (BIO_printf(rctx->mem, post_hdr, path) <= 0) |
return 0; |
- } |
- if (i2d_OCSP_REQUEST_bio(rctx->mem, req) <= 0) |
- { |
- rctx->state = OHS_ERROR; |
+ |
+ if (req && !OCSP_REQ_CTX_set1_req(rctx, req)) |
return 0; |
- } |
- rctx->state = OHS_ASN1_WRITE; |
- rctx->asn1_len = BIO_get_mem_data(rctx->mem, NULL); |
return rctx; |
} |
@@ -371,11 +397,12 @@ |
case OHS_ASN1_HEADER: |
- /* Now reading ASN1 header: can read at least 6 bytes which |
- * is more than enough for any valid ASN1 SEQUENCE header |
+ /* Now reading ASN1 header: can read at least 2 bytes which |
+ * is enough for ASN1 SEQUENCE header and either length field |
+ * or at least the length of the length field. |
*/ |
n = BIO_get_mem_data(rctx->mem, &p); |
- if (n < 6) |
+ if (n < 2) |
goto next_io; |
/* Check it is an ASN1 SEQUENCE */ |
@@ -388,6 +415,11 @@ |
/* Check out length field */ |
if (*p & 0x80) |
{ |
+ /* If MSB set on initial length octet we can now |
+ * always read 6 octets: make sure we have them. |
+ */ |
+ if (n < 6) |
+ goto next_io; |
n = *p & 0x7F; |
/* Not NDEF or excessive length */ |
if (!n || (n > 4)) |