ssl_util.c revision 184f5da95d14895f7f33c90b8b8f70653afb0d92
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz/* _ _
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** _ __ ___ ___ __| | ___ ___| | mod_ssl
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** | | | | | | (_) | (_| | \__ \__ \ | www.modssl.org
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** |_| |_| |_|\___/ \__,_|___|___/___/_| ftp.modssl.org
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** |_____|
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** ssl_util.c
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** Utility Functions
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz*/
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz/* ====================================================================
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * The Apache Software License, Version 1.1
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * reserved.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * Redistribution and use in source and binary forms, with or without
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * modification, are permitted provided that the following conditions
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * are met:
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * 1. Redistributions of source code must retain the above copyright
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * notice, this list of conditions and the following disclaimer.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * 2. Redistributions in binary form must reproduce the above copyright
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * notice, this list of conditions and the following disclaimer in
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * the documentation and/or other materials provided with the
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * distribution.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * 3. The end-user documentation included with the redistribution,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * if any, must include the following acknowledgment:
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * "This product includes software developed by the
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * Apache Software Foundation (http://www.apache.org/)."
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * Alternately, this acknowledgment may appear in the software itself,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * if and wherever such third-party acknowledgments normally appear.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * 4. The names "Apache" and "Apache Software Foundation" must
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * not be used to endorse or promote products derived from this
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * software without prior written permission. For written
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * permission, please contact apache@apache.org.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * 5. Products derived from this software may not be called "Apache",
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * nor may "Apache" appear in their name, without prior written
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * permission of the Apache Software Foundation.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * SUCH DAMAGE.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * ====================================================================
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* ``Every day of my life
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz I am forced to add another
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz name to the list of people
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz who piss me off!''
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz -- Calvin */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz#include "mod_ssl.h"
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz/* _________________________________________________________________
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz**
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** Utility Functions
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz** _________________________________________________________________
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz*/
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzchar *ssl_util_vhostid(apr_pool_t *p, server_rec *s)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *id;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz SSLSrvConfigRec *sc;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *host;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz unsigned int port;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz host = s->server_hostname;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (s->port != 0)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz port = s->port;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz else {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz sc = mySrvConfig(s);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (sc->bEnabled)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz port = DEFAULT_HTTPS_PORT;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz else
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz port = DEFAULT_HTTP_PORT;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz id = apr_psprintf(p, "%s:%u", host, port);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return id;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzvoid ssl_util_strupper(char *s)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz for (; *s; ++s)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *s = apr_toupper(*s);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzstatic const char ssl_util_uuencode_six2pr[64+1] =
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzvoid ssl_util_uuencode(char *szTo, const char *szFrom, BOOL bPad)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz ssl_util_uuencode_binary((unsigned char *)szTo,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz (const unsigned char *)szFrom,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz strlen(szFrom), bPad);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzvoid ssl_util_uuencode_binary(
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz unsigned char *szTo, const unsigned char *szFrom, int nLength, BOOL bPad)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz const unsigned char *s;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz int nPad = 0;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz for (s = szFrom; nLength > 0; s += 3) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *szTo++ = ssl_util_uuencode_six2pr[s[0] >> 2];
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *szTo++ = ssl_util_uuencode_six2pr[(s[0] << 4 | s[1] >> 4) & 0x3f];
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (--nLength == 0) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz nPad = 2;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *szTo++ = ssl_util_uuencode_six2pr[(s[1] << 2 | s[2] >> 6) & 0x3f];
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (--nLength == 0) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz nPad = 1;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *szTo++ = ssl_util_uuencode_six2pr[s[2] & 0x3f];
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz --nLength;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz while(bPad && nPad--)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *szTo++ = NUL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *szTo = NUL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzapr_file_t *ssl_util_ppopen(server_rec *s, apr_pool_t *p, char *cmd)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_procattr_t *procattr;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_proc_t *proc;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (apr_procattr_create(&procattr, p) != APR_SUCCESS)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (apr_procattr_io_set(procattr, APR_FULL_BLOCK, APR_FULL_BLOCK,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz APR_FULL_BLOCK) != APR_SUCCESS)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (apr_procattr_dir_set(procattr,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz ap_make_dirstr_parent(p, cmd)) != APR_SUCCESS)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (apr_procattr_cmdtype_set(procattr, APR_PROGRAM) != APR_SUCCESS)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if ((proc = (apr_proc_t *)apr_pcalloc(p, sizeof(apr_proc_t))) == NULL)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (apr_proc_create(proc, cmd, NULL, NULL, procattr, p) != APR_SUCCESS)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return proc->out;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzvoid ssl_util_ppclose(server_rec *s, apr_pool_t *p, apr_file_t *fp)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_file_close(fp);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz/*
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * Run a filter program and read the first line of its stdout output
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzchar *ssl_util_readfilter(server_rec *s, apr_pool_t *p, char *cmd)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz static char buf[MAX_STRING_LEN];
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_file_t *fp;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_size_t nbytes;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char c;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz int k;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if ((fp = ssl_util_ppopen(s, p, cmd)) == NULL)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz for (k = 0; apr_file_read(fp, &c, &nbytes) == APR_SUCCESS
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz && nbytes == 1 && (k < MAX_STRING_LEN-1) ; ) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (c == '\n' || c == '\r')
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz buf[k++] = c;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz buf[k] = NUL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz ssl_util_ppclose(s, p, fp);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return buf;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst SchulzBOOL ssl_util_path_check(ssl_pathcheck_t pcm, char *path, apr_pool_t *p)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_finfo_t finfo;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (path == NULL)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return FALSE;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (pcm & SSL_PCM_EXISTS && apr_stat(&finfo, path,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz APR_FINFO_TYPE|APR_FINFO_SIZE, p) != 0)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return FALSE;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (pcm & SSL_PCM_ISREG && finfo.filetype != APR_REG)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return FALSE;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (pcm & SSL_PCM_ISDIR && finfo.filetype != APR_DIR)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return FALSE;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (pcm & SSL_PCM_ISNONZERO && finfo.size <= 0)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return FALSE;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return TRUE;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzssl_algo_t ssl_util_algotypeof(X509 *pCert, EVP_PKEY *pKey)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz ssl_algo_t t;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz t = SSL_ALGO_UNKNOWN;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (pCert != NULL)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz pKey = X509_get_pubkey(pCert);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (pKey != NULL) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz switch (EVP_PKEY_type(pKey->type)) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz case EVP_PKEY_RSA:
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz t = SSL_ALGO_RSA;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz case EVP_PKEY_DSA:
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz t = SSL_ALGO_DSA;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz default:
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return t;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzchar *ssl_util_algotypestr(ssl_algo_t t)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *cp;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cp = "UNKNOWN";
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz switch (t) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz case SSL_ALGO_RSA:
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cp = "RSA";
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz case SSL_ALGO_DSA:
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cp = "DSA";
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz default:
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return cp;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzchar *ssl_util_ptxtsub(
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_pool_t *p, const char *cpLine, const char *cpMatch, char *cpSubst)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz#define MAX_PTXTSUB 100
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *cppMatch[MAX_PTXTSUB];
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *cpResult;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz int nResult;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz int nLine;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz int nSubst;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz int nMatch;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *cpI;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *cpO;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *cp;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz int i;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /*
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * Pass 1: find substitution locations and calculate sizes
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz nLine = strlen(cpLine);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz nMatch = strlen(cpMatch);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz nSubst = strlen(cpSubst);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz for (cpI = (char *)cpLine, i = 0, nResult = 0;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cpI < cpLine+nLine && i < MAX_PTXTSUB; ) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if ((cp = strstr(cpI, cpMatch)) != NULL) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cppMatch[i++] = cp;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz nResult += ((cp-cpI)+nSubst);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cpI = (cp+nMatch);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz else {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz nResult += strlen(cpI);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz break;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cppMatch[i] = NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (i == 0)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /*
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * Pass 2: allocate memory and assemble result
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cpResult = apr_pcalloc(p, nResult+1);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz for (cpI = (char *)cpLine, cpO = cpResult, i = 0; cppMatch[i] != NULL; i++) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_cpystrn(cpO, cpI, cppMatch[i]-cpI+1);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cpO += (cppMatch[i]-cpI);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_cpystrn(cpO, cpSubst, nSubst+1);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cpO += nSubst;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz cpI = (cppMatch[i]+nMatch);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_cpystrn(cpO, cpI, cpResult+nResult-cpO+1);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return cpResult;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz