2 ** _ __ ___ ___ __| | ___ ___| | mod_ssl
3 ** | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL
4 ** | | | | | | (_) | (_| | \__ \__ \ | www.modssl.org
5 ** |_| |_| |_|\___/ \__,_|___|___/___/_| ftp.modssl.org
11 /* ====================================================================
12 * The Apache Software License, Version 1.1
14 * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
21 * 1. Redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer.
24 * 2. Redistributions in binary form must reproduce the above copyright
25 * notice, this list of conditions and the following disclaimer in
26 * the documentation and/or other materials provided with the
29 * 3. The end-user documentation included with the redistribution,
30 * if any, must include the following acknowledgment:
31 * "This product includes software developed by the
32 * Apache Software Foundation (http://www.apache.org/)."
33 * Alternately, this acknowledgment may appear in the software itself,
34 * if and wherever such third-party acknowledgments normally appear.
36 * 4. The names "Apache" and "Apache Software Foundation" must
37 * not be used to endorse or promote products derived from this
38 * software without prior written permission. For written
39 * permission, please contact apache@apache.org.
41 * 5. Products derived from this software may not be called "Apache",
42 * nor may "Apache" appear in their name, without prior written
43 * permission of the Apache Software Foundation.
45 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
46 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
47 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
48 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
49 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
51 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
52 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
53 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
54 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
55 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57 * ====================================================================
59 /* ``Every day of my life
60 I am forced to add another
61 name to the list of people
66 /* _________________________________________________________________
69 ** _________________________________________________________________
72 char *ssl_util_vhostid(apr_pool_t *p, server_rec *s)
79 host = s->server_hostname;
85 port = DEFAULT_HTTPS_PORT;
87 port = DEFAULT_HTTP_PORT;
89 id = apr_psprintf(p, "%s:%lu", host, (unsigned long)port);
93 void ssl_util_strupper(char *s)
100 static const char ssl_util_uuencode_six2pr[64+1] =
101 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
103 void ssl_util_uuencode(char *szTo, const char *szFrom, BOOL bPad)
105 ssl_util_uuencode_binary((unsigned char *)szTo,
106 (const unsigned char *)szFrom,
107 strlen(szFrom), bPad);
110 void ssl_util_uuencode_binary(
111 unsigned char *szTo, const unsigned char *szFrom, int nLength, BOOL bPad)
113 const unsigned char *s;
116 for (s = szFrom; nLength > 0; s += 3) {
117 *szTo++ = ssl_util_uuencode_six2pr[s[0] >> 2];
118 *szTo++ = ssl_util_uuencode_six2pr[(s[0] << 4 | s[1] >> 4) & 0x3f];
119 if (--nLength == 0) {
123 *szTo++ = ssl_util_uuencode_six2pr[(s[1] << 2 | s[2] >> 6) & 0x3f];
124 if (--nLength == 0) {
128 *szTo++ = ssl_util_uuencode_six2pr[s[2] & 0x3f];
131 while(bPad && nPad--)
137 apr_file_t *ssl_util_ppopen(server_rec *s, apr_pool_t *p, char *cmd)
139 apr_procattr_t *procattr;
142 if (apr_procattr_create(&procattr, p) != APR_SUCCESS)
144 if (apr_procattr_io_set(procattr, APR_FULL_BLOCK, APR_FULL_BLOCK,
145 APR_FULL_BLOCK) != APR_SUCCESS)
147 if (apr_procattr_dir_set(procattr,
148 ap_make_dirstr_parent(p, cmd)) != APR_SUCCESS)
150 if (apr_procattr_cmdtype_set(procattr, APR_PROGRAM) != APR_SUCCESS)
152 if ((proc = (apr_proc_t *)apr_pcalloc(p, sizeof(apr_proc_t))) == NULL)
154 if (apr_proc_create(proc, cmd, NULL, NULL, procattr, p) != APR_SUCCESS)
159 void ssl_util_ppclose(server_rec *s, apr_pool_t *p, apr_file_t *fp)
166 * Run a filter program and read the first line of its stdout output
168 char *ssl_util_readfilter(server_rec *s, apr_pool_t *p, char *cmd)
170 static char buf[MAX_STRING_LEN];
176 if ((fp = ssl_util_ppopen(s, p, cmd)) == NULL)
178 for (k = 0; apr_file_read(fp, &c, &nbytes) == APR_SUCCESS
179 && nbytes == 1 && (k < MAX_STRING_LEN-1) ; ) {
180 if (c == '\n' || c == '\r')
185 ssl_util_ppclose(s, p, fp);
190 BOOL ssl_util_path_check(ssl_pathcheck_t pcm, const char *path, apr_pool_t *p)
196 if (pcm & SSL_PCM_EXISTS && apr_stat(&finfo, path,
197 APR_FINFO_TYPE|APR_FINFO_SIZE, p) != 0)
199 if (pcm & SSL_PCM_ISREG && finfo.filetype != APR_REG)
201 if (pcm & SSL_PCM_ISDIR && finfo.filetype != APR_DIR)
203 if (pcm & SSL_PCM_ISNONZERO && finfo.size <= 0)
208 ssl_algo_t ssl_util_algotypeof(X509 *pCert, EVP_PKEY *pKey)
212 t = SSL_ALGO_UNKNOWN;
214 pKey = X509_get_pubkey(pCert);
216 switch (EVP_PKEY_type(pKey->type)) {
230 char *ssl_util_algotypestr(ssl_algo_t t)
248 char *ssl_util_ptxtsub(
249 apr_pool_t *p, const char *cpLine, const char *cpMatch, char *cpSubst)
251 #define MAX_PTXTSUB 100
252 char *cppMatch[MAX_PTXTSUB];
264 * Pass 1: find substitution locations and calculate sizes
266 nLine = strlen(cpLine);
267 nMatch = strlen(cpMatch);
268 nSubst = strlen(cpSubst);
269 for (cpI = (char *)cpLine, i = 0, nResult = 0;
270 cpI < cpLine+nLine && i < MAX_PTXTSUB; ) {
271 if ((cp = strstr(cpI, cpMatch)) != NULL) {
273 nResult += ((cp-cpI)+nSubst);
277 nResult += strlen(cpI);
286 * Pass 2: allocate memory and assemble result
288 cpResult = apr_pcalloc(p, nResult+1);
289 for (cpI = (char *)cpLine, cpO = cpResult, i = 0; cppMatch[i] != NULL; i++) {
290 apr_cpystrn(cpO, cpI, cppMatch[i]-cpI+1);
291 cpO += (cppMatch[i]-cpI);
292 apr_cpystrn(cpO, cpSubst, nSubst+1);
294 cpI = (cppMatch[i]+nMatch);
296 apr_cpystrn(cpO, cpI, cpResult+nResult-cpO+1);
302 ssl_util_setmodconfig(
303 server_rec *s, const char *key, SSLModConfigRec *mc)
305 return apr_pool_userdata_set((void *)mc, key, apr_pool_cleanup_null, s->process->pool);
309 ssl_util_getmodconfig(
310 server_rec *s, const char *key)
312 SSLModConfigRec *mc = NULL;
314 if (apr_pool_userdata_get((void **)&mc, key, s->process->pool) != APR_SUCCESS)
315 ssl_log(s, SSL_LOG_TRACE, "Unable to retrieve SSLModConfig from global pool");
320 ssl_util_getmodconfig_ssl(
321 SSL *ssl, const char *key)
323 conn_rec *c = (conn_rec *)SSL_get_app_data(ssl);
324 SSLModConfigRec *mc = NULL;
327 mc = ssl_util_getmodconfig(c->base_server, key);