1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ocsp_lib.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Written by Tom Titchener <Tom_Titchener@groove.net> for the OpenSSL 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project. */ 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* History: 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project This file was transfered to Richard Levitte from CertCo by Kathy 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Weinhold in mid-spring 2000 to be included in OpenSSL or released 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project as a patch kit. */ 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * openssl-core@openssl.org. 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <cryptlib.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h> 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h> 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509v3.h> 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ocsp.h> 72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/asn1t.h> 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Convert a certificate and its issuer to an OCSP_CERTID */ 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer) 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME *iname; 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_INTEGER *serial; 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_BIT_STRING *ikey; 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SHA1 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!dgst) dgst = EVP_sha1(); 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (subject) 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project iname = X509_get_issuer_name(subject); 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project serial = X509_get_serialNumber(subject); 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project iname = X509_get_subject_name(issuer); 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project serial = NULL; 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ikey = X509_get0_pubkey_bitstr(issuer); 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return OCSP_cert_id_new(dgst, iname, ikey, serial); 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME *issuerName, 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_BIT_STRING* issuerKey, 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_INTEGER *serialNumber) 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int nid; 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int i; 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_ALGOR *alg; 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OCSP_CERTID *cid = NULL; 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char md[EVP_MAX_MD_SIZE]; 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(cid = OCSP_CERTID_new())) goto err; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project alg = cid->hashAlgorithm; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (alg->algorithm != NULL) ASN1_OBJECT_free(alg->algorithm); 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((nid = EVP_MD_type(dgst)) == NID_undef) 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OCSPerr(OCSP_F_OCSP_CERT_ID_NEW,OCSP_R_UNKNOWN_NID); 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(alg->algorithm=OBJ_nid2obj(nid))) goto err; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((alg->parameter=ASN1_TYPE_new()) == NULL) goto err; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project alg->parameter->type=V_ASN1_NULL; 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!X509_NAME_digest(issuerName, dgst, md, &i)) goto digerr; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(ASN1_OCTET_STRING_set(cid->issuerNameHash, md, i))) goto err; 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Calculate the issuerKey hash, excluding tag and length */ 127392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!EVP_Digest(issuerKey->data, issuerKey->length, md, &i, dgst, NULL)) 128392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(ASN1_OCTET_STRING_set(cid->issuerKeyHash, md, i))) goto err; 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (serialNumber) 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_INTEGER_free(cid->serialNumber); 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(cid->serialNumber = ASN1_INTEGER_dup(serialNumber))) goto err; 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return cid; 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdigerr: 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OCSPerr(OCSP_F_OCSP_CERT_ID_NEW,OCSP_R_DIGEST_ERR); 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr: 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cid) OCSP_CERTID_free(cid); 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b) 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret; 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = OBJ_cmp(a->hashAlgorithm->algorithm, b->hashAlgorithm->algorithm); 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) return ret; 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = ASN1_OCTET_STRING_cmp(a->issuerNameHash, b->issuerNameHash); 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) return ret; 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ASN1_OCTET_STRING_cmp(a->issuerKeyHash, b->issuerKeyHash); 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b) 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret; 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = OCSP_id_issuer_cmp(a, b); 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) return ret; 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ASN1_INTEGER_cmp(a->serialNumber, b->serialNumber); 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Parse a URL and split it up into host, port and path components and whether 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * it is SSL. 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl) 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *p, *buf; 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *host, *port; 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *phost = NULL; 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pport = NULL; 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *ppath = NULL; 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 178ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom /* dup the buffer since we are going to mess with it */ 179ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom buf = BUF_strdup(url); 180ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom if (!buf) goto mem_err; 181ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Check for initial colon */ 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p = strchr(buf, ':'); 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!p) goto parse_err; 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *(p++) = '\0'; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!strcmp(buf, "http")) 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pssl = 0; 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project port = "80"; 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(buf, "https")) 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pssl = 1; 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project port = "443"; 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto parse_err; 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Check for double slash */ 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((p[0] != '/') || (p[1] != '/')) 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto parse_err; 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p += 2; 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project host = p; 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Check for trailing part of path */ 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p = strchr(p, '/'); 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!p) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *ppath = BUF_strdup("/"); 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *ppath = BUF_strdup(p); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Set start of path to 0 so hostname is valid */ 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *p = '\0'; 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!*ppath) goto mem_err; 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 225c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root p = host; 226c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root if(host[0] == '[') 227c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root { 228c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root /* ipv6 literal */ 229c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root host++; 230c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root p = strchr(host, ']'); 231c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root if(!p) goto parse_err; 232c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root *p = '\0'; 233c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root p++; 234c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root } 235c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Look for optional ':' for port number */ 237c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root if ((p = strchr(p, ':'))) 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *p = 0; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project port = p + 1; 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Not found: set default port */ 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*pssl) port = "443"; 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else port = "80"; 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *pport = BUF_strdup(port); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!*pport) goto mem_err; 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *phost = BUF_strdup(host); 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!*phost) goto mem_err; 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(buf); 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mem_err: 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OCSPerr(OCSP_F_OCSP_PARSE_URL, ERR_R_MALLOC_FAILURE); 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project parse_err: 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OCSPerr(OCSP_F_OCSP_PARSE_URL, OCSP_R_ERROR_PARSING_URL); 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err: 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (buf) OPENSSL_free(buf); 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*ppath) OPENSSL_free(*ppath); 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*pport) OPENSSL_free(*pport); 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*phost) OPENSSL_free(*phost); 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIMPLEMENT_ASN1_DUP_FUNCTION(OCSP_CERTID) 278