Revert "Banish SSL_add_dir_cert_subjects_to_stack and OPENSSL_DIR_CTX to decrepit."
This reverts commit 112c4dd1ff
. Accidentally used
the wrong push line.
This commit is contained in:
parent
112c4dd1ff
commit
e4c678adda
@ -116,6 +116,8 @@ add_library(
|
||||
cpu-arm-linux.c
|
||||
cpu-intel.c
|
||||
crypto.c
|
||||
directory_posix.c
|
||||
directory_win.c
|
||||
ex_data.c
|
||||
mem.c
|
||||
refcount_c11.c
|
||||
|
66
crypto/directory.h
Normal file
66
crypto/directory.h
Normal file
@ -0,0 +1,66 @@
|
||||
/* Copied from Richard Levitte's (richard@levitte.org) LP library. All
|
||||
* symbol names have been changed, with permission from the author. */
|
||||
|
||||
/* $LP: LPlib/source/LPdir.h,v 1.1 2004/06/14 08:56:04 _cvs_levitte Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2004, Richard Levitte <richard@levitte.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef OPENSSL_HEADER_DIRECTORY_H
|
||||
#define OPENSSL_HEADER_DIRECTORY_H
|
||||
|
||||
#include <openssl/base.h>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Directory functions abstract the O/S specific operations for opening and
|
||||
* reading directories in the filesystem. */
|
||||
|
||||
|
||||
/* OPENSSL_dir_context_st is an opaque structure that represents an open
|
||||
* directory and a position in that directory. */
|
||||
typedef struct OPENSSL_dir_context_st OPENSSL_DIR_CTX;
|
||||
|
||||
/* OPENSSL_DIR_read reads a single filename from |ctx|. On the first call,
|
||||
* |directory| must be given and |*ctx| must be NULL. Subsequent calls with the
|
||||
* same |*ctx| will return subsequent file names until it returns NULL to
|
||||
* indicate EOF. The strings returned reference a buffer internal to the
|
||||
* |OPENSSL_DIR_CTX| and will be overridden by subsequent calls. */
|
||||
OPENSSL_EXPORT const char *OPENSSL_DIR_read(OPENSSL_DIR_CTX **ctx,
|
||||
const char *directory);
|
||||
|
||||
/* OPENSSL_DIR_end closes |*ctx|. It returns one on success and zero on
|
||||
* error. */
|
||||
OPENSSL_EXPORT int OPENSSL_DIR_end(OPENSSL_DIR_CTX **ctx);
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
#endif /* OPENSSL_HEADER_DIRECTORY_H */
|
108
crypto/directory_posix.c
Normal file
108
crypto/directory_posix.c
Normal file
@ -0,0 +1,108 @@
|
||||
/* $LP: LPlib/source/LPdir_unix.c,v 1.11 2004/09/23 22:07:22 _cvs_levitte Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2004, Richard Levitte <richard@levitte.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#if !defined(_POSIX_C_SOURCE)
|
||||
#define _POSIX_C_SOURCE 201409 /* for readdir_r */
|
||||
#endif
|
||||
|
||||
#include "directory.h"
|
||||
|
||||
|
||||
#if !defined(OPENSSL_WINDOWS)
|
||||
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined(OPENSSL_PNACL)
|
||||
/* pnacl doesn't include readdir_r! So we do the best we can. */
|
||||
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) {
|
||||
errno = 0;
|
||||
*result = readdir(dirp);
|
||||
if (*result != NULL) {
|
||||
return 0;
|
||||
}
|
||||
if (errno) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct OPENSSL_dir_context_st {
|
||||
DIR *dir;
|
||||
struct dirent dirent;
|
||||
};
|
||||
|
||||
const char *OPENSSL_DIR_read(OPENSSL_DIR_CTX **ctx, const char *directory) {
|
||||
struct dirent *dirent;
|
||||
|
||||
if (ctx == NULL || directory == NULL) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
if (*ctx == NULL) {
|
||||
*ctx = malloc(sizeof(OPENSSL_DIR_CTX));
|
||||
if (*ctx == NULL) {
|
||||
errno = ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
memset(*ctx, 0, sizeof(OPENSSL_DIR_CTX));
|
||||
|
||||
(*ctx)->dir = opendir(directory);
|
||||
if ((*ctx)->dir == NULL) {
|
||||
int save_errno = errno; /* Probably not needed, but I'm paranoid */
|
||||
free(*ctx);
|
||||
*ctx = NULL;
|
||||
errno = save_errno;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (readdir_r((*ctx)->dir, &(*ctx)->dirent, &dirent) != 0 ||
|
||||
dirent == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (*ctx)->dirent.d_name;
|
||||
}
|
||||
|
||||
int OPENSSL_DIR_end(OPENSSL_DIR_CTX **ctx) {
|
||||
if (ctx != NULL && *ctx != NULL) {
|
||||
int r = closedir((*ctx)->dir);
|
||||
free(*ctx);
|
||||
*ctx = NULL;
|
||||
return r == 0;
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* !OPENSSL_WINDOWS */
|
144
crypto/directory_win.c
Normal file
144
crypto/directory_win.c
Normal file
@ -0,0 +1,144 @@
|
||||
/* $LP: LPlib/source/LPdir_win.c,v 1.10 2004/08/26 13:36:05 _cvs_levitte Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2004, Richard Levitte <richard@levitte.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "directory.h"
|
||||
|
||||
|
||||
#if defined(OPENSSL_WINDOWS)
|
||||
|
||||
#pragma warning(push, 3)
|
||||
#include <windows.h>
|
||||
#pragma warning(pop)
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <tchar.h>
|
||||
|
||||
#ifndef NAME_MAX
|
||||
#define NAME_MAX 255
|
||||
#endif
|
||||
|
||||
#include <openssl/mem.h>
|
||||
|
||||
|
||||
struct OPENSSL_dir_context_st {
|
||||
WIN32_FIND_DATA ctx;
|
||||
HANDLE handle;
|
||||
char entry_name[NAME_MAX + 1];
|
||||
};
|
||||
|
||||
const char *OPENSSL_DIR_read(OPENSSL_DIR_CTX **ctx, const char *directory) {
|
||||
if (ctx == NULL || directory == NULL) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
if (*ctx == NULL) {
|
||||
*ctx = malloc(sizeof(OPENSSL_DIR_CTX));
|
||||
if (*ctx == NULL) {
|
||||
errno = ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
memset(*ctx, 0, sizeof(OPENSSL_DIR_CTX));
|
||||
|
||||
if (sizeof(TCHAR) != sizeof(char)) {
|
||||
TCHAR *wdir = NULL;
|
||||
/* len_0 denotes string length *with* trailing 0 */
|
||||
size_t index = 0, len_0 = strlen(directory) + 1;
|
||||
|
||||
wdir = (TCHAR *)malloc(len_0 * sizeof(TCHAR));
|
||||
if (wdir == NULL) {
|
||||
free(*ctx);
|
||||
*ctx = NULL;
|
||||
errno = ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!MultiByteToWideChar(CP_ACP, 0, directory, len_0, (WCHAR *)wdir,
|
||||
len_0)) {
|
||||
for (index = 0; index < len_0; index++) {
|
||||
wdir[index] = (TCHAR)directory[index];
|
||||
}
|
||||
}
|
||||
|
||||
(*ctx)->handle = FindFirstFile(wdir, &(*ctx)->ctx);
|
||||
|
||||
free(wdir);
|
||||
} else {
|
||||
(*ctx)->handle = FindFirstFile((TCHAR *)directory, &(*ctx)->ctx);
|
||||
}
|
||||
|
||||
if ((*ctx)->handle == INVALID_HANDLE_VALUE) {
|
||||
free(*ctx);
|
||||
*ctx = NULL;
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (FindNextFile((*ctx)->handle, &(*ctx)->ctx) == FALSE) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (sizeof(TCHAR) != sizeof(char)) {
|
||||
TCHAR *wdir = (*ctx)->ctx.cFileName;
|
||||
size_t index, len_0 = 0;
|
||||
|
||||
while (wdir[len_0] && len_0 < (sizeof((*ctx)->entry_name) - 1)) {
|
||||
len_0++;
|
||||
}
|
||||
len_0++;
|
||||
|
||||
if (!WideCharToMultiByte(CP_ACP, 0, (WCHAR *)wdir, len_0,
|
||||
(*ctx)->entry_name, sizeof((*ctx)->entry_name),
|
||||
NULL, 0)) {
|
||||
for (index = 0; index < len_0; index++) {
|
||||
(*ctx)->entry_name[index] = (char)wdir[index];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
strncpy((*ctx)->entry_name, (const char *)(*ctx)->ctx.cFileName,
|
||||
sizeof((*ctx)->entry_name) - 1);
|
||||
}
|
||||
|
||||
(*ctx)->entry_name[sizeof((*ctx)->entry_name) - 1] = '\0';
|
||||
|
||||
return (*ctx)->entry_name;
|
||||
}
|
||||
|
||||
int OPENSSL_DIR_end(OPENSSL_DIR_CTX **ctx) {
|
||||
if (ctx != NULL && *ctx != NULL) {
|
||||
FindClose((*ctx)->handle);
|
||||
free(*ctx);
|
||||
*ctx = NULL;
|
||||
return 1;
|
||||
}
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* OPENSSL_WINDOWS */
|
@ -9,7 +9,6 @@ add_subdirectory(obj)
|
||||
add_subdirectory(rc4)
|
||||
add_subdirectory(ripemd)
|
||||
add_subdirectory(rsa)
|
||||
add_subdirectory(ssl)
|
||||
add_subdirectory(x509)
|
||||
add_subdirectory(xts)
|
||||
|
||||
@ -27,9 +26,8 @@ add_library(
|
||||
$<TARGET_OBJECTS:rc4_decrepit>
|
||||
$<TARGET_OBJECTS:ripemd_decrepit>
|
||||
$<TARGET_OBJECTS:rsa_decrepit>
|
||||
$<TARGET_OBJECTS:ssl_decrepit>
|
||||
$<TARGET_OBJECTS:x509_decrepit>
|
||||
$<TARGET_OBJECTS:xts>
|
||||
)
|
||||
|
||||
target_link_libraries(decrepit crypto ssl)
|
||||
target_link_libraries(decrepit crypto)
|
||||
|
@ -1,9 +0,0 @@
|
||||
include_directories(../../include)
|
||||
|
||||
add_library(
|
||||
ssl_decrepit
|
||||
|
||||
OBJECT
|
||||
|
||||
ssl_decrepit.c
|
||||
)
|
@ -1,225 +0,0 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/mem.h>
|
||||
|
||||
|
||||
#if !defined(OPENSSL_WINDOWS) && !defined(OPENSSL_PNACL)
|
||||
|
||||
typedef struct {
|
||||
DIR *dir;
|
||||
struct dirent dirent;
|
||||
} OPENSSL_DIR_CTX;
|
||||
|
||||
static const char *OPENSSL_DIR_read(OPENSSL_DIR_CTX **ctx,
|
||||
const char *directory) {
|
||||
struct dirent *dirent;
|
||||
|
||||
if (ctx == NULL || directory == NULL) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
if (*ctx == NULL) {
|
||||
*ctx = malloc(sizeof(OPENSSL_DIR_CTX));
|
||||
if (*ctx == NULL) {
|
||||
errno = ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
memset(*ctx, 0, sizeof(OPENSSL_DIR_CTX));
|
||||
|
||||
(*ctx)->dir = opendir(directory);
|
||||
if ((*ctx)->dir == NULL) {
|
||||
int save_errno = errno; /* Probably not needed, but I'm paranoid */
|
||||
free(*ctx);
|
||||
*ctx = NULL;
|
||||
errno = save_errno;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (readdir_r((*ctx)->dir, &(*ctx)->dirent, &dirent) != 0 ||
|
||||
dirent == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (*ctx)->dirent.d_name;
|
||||
}
|
||||
|
||||
static int OPENSSL_DIR_end(OPENSSL_DIR_CTX **ctx) {
|
||||
if (ctx != NULL && *ctx != NULL) {
|
||||
int r = closedir((*ctx)->dir);
|
||||
free(*ctx);
|
||||
*ctx = NULL;
|
||||
return r == 0;
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Add a directory of certs to a stack.
|
||||
*
|
||||
* \param stack the stack to append to.
|
||||
* \param dir the directory to append from. All files in this directory will be
|
||||
* examined as potential certs. Any that are acceptable to
|
||||
* SSL_add_dir_cert_subjects_to_stack() that are not already in the stack will
|
||||
* be included.
|
||||
* \return 1 for success, 0 for failure. Note that in the case of failure some
|
||||
* certs may have been added to \c stack. */
|
||||
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
const char *dir) {
|
||||
OPENSSL_DIR_CTX *d = NULL;
|
||||
const char *filename;
|
||||
int ret = 0;
|
||||
|
||||
/* Note that a side effect is that the CAs will be sorted by name */
|
||||
while ((filename = OPENSSL_DIR_read(&d, dir))) {
|
||||
char buf[1024];
|
||||
int r;
|
||||
|
||||
if (strlen(dir) + strlen(filename) + 2 > sizeof(buf)) {
|
||||
OPENSSL_PUT_ERROR(SSL, SSL_R_PATH_TOO_LONG);
|
||||
goto err;
|
||||
}
|
||||
|
||||
r = BIO_snprintf(buf, sizeof buf, "%s/%s", dir, filename);
|
||||
if (r <= 0 || r >= (int)sizeof(buf) ||
|
||||
!SSL_add_file_cert_subjects_to_stack(stack, buf)) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (errno) {
|
||||
OPENSSL_PUT_ERROR(SSL, ERR_R_SYS_LIB);
|
||||
ERR_add_error_data(3, "OPENSSL_DIR_read(&ctx, '", dir, "')");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
if (d) {
|
||||
OPENSSL_DIR_end(&d);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* !WINDOWS && !PNACL */
|
@ -2163,6 +2163,12 @@ OPENSSL_EXPORT STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list);
|
||||
OPENSSL_EXPORT int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *out,
|
||||
const char *file);
|
||||
|
||||
/* SSL_add_dir_cert_subjects_to_stack lists files in directory |dir|. It calls
|
||||
* |SSL_add_file_cert_subjects_to_stack| on each file and returns one on success
|
||||
* or zero on error. */
|
||||
OPENSSL_EXPORT int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *out,
|
||||
const char *dir);
|
||||
|
||||
|
||||
/* Server name indication.
|
||||
*
|
||||
@ -3397,13 +3403,6 @@ OPENSSL_EXPORT int SSL_CTX_set_tmp_ecdh(SSL_CTX *ctx, const EC_KEY *ec_key);
|
||||
* |ec_key|'s curve. */
|
||||
OPENSSL_EXPORT int SSL_set_tmp_ecdh(SSL *ssl, const EC_KEY *ec_key);
|
||||
|
||||
/* SSL_add_dir_cert_subjects_to_stack lists files in directory |dir|. It calls
|
||||
* |SSL_add_file_cert_subjects_to_stack| on each file and returns one on success
|
||||
* or zero on error. This function is only available from the libdecrepit
|
||||
* library. */
|
||||
OPENSSL_EXPORT int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *out,
|
||||
const char *dir);
|
||||
|
||||
|
||||
/* Private structures.
|
||||
*
|
||||
|
@ -121,6 +121,7 @@
|
||||
#include <openssl/stack.h>
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#include "../crypto/directory.h"
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
@ -246,6 +247,53 @@ int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Add a directory of certs to a stack.
|
||||
*
|
||||
* \param stack the stack to append to.
|
||||
* \param dir the directory to append from. All files in this directory will be
|
||||
* examined as potential certs. Any that are acceptable to
|
||||
* SSL_add_dir_cert_subjects_to_stack() that are not already in the stack will
|
||||
* be included.
|
||||
* \return 1 for success, 0 for failure. Note that in the case of failure some
|
||||
* certs may have been added to \c stack. */
|
||||
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
const char *dir) {
|
||||
OPENSSL_DIR_CTX *d = NULL;
|
||||
const char *filename;
|
||||
int ret = 0;
|
||||
|
||||
/* Note that a side effect is that the CAs will be sorted by name */
|
||||
while ((filename = OPENSSL_DIR_read(&d, dir))) {
|
||||
char buf[1024];
|
||||
int r;
|
||||
|
||||
if (strlen(dir) + strlen(filename) + 2 > sizeof(buf)) {
|
||||
OPENSSL_PUT_ERROR(SSL, SSL_R_PATH_TOO_LONG);
|
||||
goto err;
|
||||
}
|
||||
|
||||
r = BIO_snprintf(buf, sizeof buf, "%s/%s", dir, filename);
|
||||
if (r <= 0 || r >= (int)sizeof(buf) ||
|
||||
!SSL_add_file_cert_subjects_to_stack(stack, buf)) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (errno) {
|
||||
OPENSSL_PUT_ERROR(SSL, ERR_R_SYS_LIB);
|
||||
ERR_add_error_data(3, "OPENSSL_DIR_read(&ctx, '", dir, "')");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
if (d) {
|
||||
OPENSSL_DIR_end(&d);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SSL_use_certificate_file(SSL *ssl, const char *file, int type) {
|
||||
int reason_code;
|
||||
BIO *in;
|
||||
|
Loading…
Reference in New Issue
Block a user