diff --git a/CMakeLists.txt b/CMakeLists.txt index 51d6e8b..cf980a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,6 @@ option(LIBRESSL_SKIP_INSTALL "Skip installation" ${LIBRESSL_SKIP_INSTALL}) option(ENABLE_ASM "Enable assembly" ON) option(ENABLE_EXTRATESTS "Enable extra tests that may be unreliable on some platforms" OFF) option(ENABLE_NC "Enable installing TLS-enabled nc(1)" OFF) -option(ENABLE_VSTEST "Enable test on Visual Studio" OFF) set(OPENSSLDIR ${OPENSSLDIR} CACHE PATH "Set the default openssl directory" FORCE) if(NOT LIBRESSL_SKIP_INSTALL) @@ -79,7 +78,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "SunOS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__EXTENSIONS__") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE=600") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBSD_COMP") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic -m64") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") endif() add_definitions(-DLIBRESSL_INTERNAL) @@ -98,7 +97,7 @@ if(WIN32) add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_CRT_DEPRECATED_NO_WARNINGS) add_definitions(-D_REENTRANT -D_POSIX_THREAD_SAFE_FUNCTIONS) - add_definitions(-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0501) + add_definitions(-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0600) add_definitions(-DCPPFLAGS -DOPENSSL_NO_SPEED -DNO_SYSLOG -DNO_CRYPT) endif() @@ -107,26 +106,23 @@ if(MSVC) message(STATUS "Using [${CMAKE_C_COMPILER_ID}] compiler") if(CMAKE_C_COMPILER_ID MATCHES "MSVC") set(MSVC_DISABLED_WARNINGS_LIST - "C4057" # C4057: 'initializing' : 'unsigned char *' differs in - # indirection to slightly different base types from 'char [2]' - "C4018" # '>=': signed/unsigned mismatch - "C4100" # 'exarg' : unreferenced formal parameter + "C4018" # 'expression' : signed/unsigned mismatch + "C4057" # 'operator' : 'identifier1' indirection to + # slightly different base types from 'identifier2' + "C4100" # 'identifier' : unreferenced formal parameter "C4127" # conditional expression is constant - "C4146" # unary minus operator applied to unsigned - # type, result still unsigned - "C4242" # 'function' : conversion from 'int' to 'uint8_t', - # possible loss of data - "C4244" # 'function' : conversion from 'int' to 'uint8_t', - # possible loss of data - "C4245" # 'initializing': conversion from 'long' to - # 'unsigned long', signed/unsigned mismatch - "C4267" # conversion from 'size_t' to 'some type that is almost - # certainly safe to convert a size_t to'. - "C4389" # '!=': signed/unsigned mismatch + "C4146" # unary minus operator applied to unsigned type, + # result still unsigned + "C4244" # 'argument' : conversion from 'type1' to 'type2', + # possible loss of data + "C4245" # 'conversion' : conversion from 'type1' to 'type2', + # signed/unsigned mismatch + "C4267" # 'var' : conversion from 'size_t' to 'type', + # possible loss of data + "C4389" # 'operator' : signed/unsigned mismatch "C4706" # assignment within conditional expression - "C4820" # 'bytes' bytes padding added after construct 'member_name' - "C4996" # 'read': The POSIX name for this item is deprecated. Instead, - # use the ISO C++ conformant name: _read. + "C4996" # The POSIX name for this item is deprecated. + # Instead, use the ISO C and C++ conformant name ) elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") add_definitions(-D_CRT_SUPPRESS_RESTRICT) @@ -157,11 +153,6 @@ if(HAVE_ASPRINTF) add_definitions(-DHAVE_ASPRINTF) endif() -check_function_exists(inet_pton HAVE_INET_PTON) -if(HAVE_INET_PTON) - add_definitions(-DHAVE_INET_PTON) -endif() - check_function_exists(reallocarray HAVE_REALLOCARRAY) if(HAVE_REALLOCARRAY) add_definitions(-DHAVE_REALLOCARRAY) @@ -269,32 +260,23 @@ if(ENABLE_ASM) endif() endif() -if(NOT (CMAKE_SYSTEM_NAME MATCHES "(Darwin|CYGWIN)")) - set(BUILD_SHARED true) -endif() +set(OPENSSL_LIBS tls ssl crypto) -# USE_SHARED builds applications (e.g. openssl) using shared LibreSSL. -# By default, applications use LibreSSL static library to avoid dependencies. -# USE_SHARED isn't set by default; use -DUSE_SHARED=ON with CMake to enable. -# Can be helpful for debugging; don't use for public releases. -if(NOT BUILD_SHARED) - set(USE_SHARED off) -endif() - -if(USE_SHARED) - set(OPENSSL_LIBS tls-shared ssl-shared crypto-shared) -else() - set(OPENSSL_LIBS tls ssl crypto) -endif() - -if(CMAKE_HOST_WIN32) +if(WIN32) set(OPENSSL_LIBS ${OPENSSL_LIBS} ws2_32) endif() + +check_function_exists(clock_gettime HAVE_CLOCK_GETTIME) +if(HAVE_CLOCK_GETTIME) + add_definitions(-DHAVE_CLOCK_GETTIME) +endif() + if(CMAKE_SYSTEM_NAME MATCHES "Linux") check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME) if (HAVE_CLOCK_GETTIME) set(OPENSSL_LIBS ${OPENSSL_LIBS} rt) endif() + set(OPENSSL_LIBS ${OPENSSL_LIBS} pthread) endif() if(CMAKE_SYSTEM_NAME MATCHES "HP-UX") set(OPENSSL_LIBS ${OPENSSL_LIBS} pthread) diff --git a/ChangeLog b/ChangeLog index 893ea06..e00e9f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -28,6 +28,65 @@ history is also available from Git. LibreSSL Portable Release Notes: +2.7.2 - Stable release + + * Updated and added extensive new HISTORY sections to API manuals. + + * Added support for shared library builds with CMake on all supported + platforms. Note that some of the CMake options have changed, consult + the README for details. + +2.7.1 - Bug fixes + + * Fixed a bug in int_x509_param_set_hosts, calling strlen() if name + length provided is 0 to match the OpenSSL behaviour. Issue noticed + by Christian Heimes . + + * Fixed builds macOS 10.11 and older. + +2.7.0 - Bug fixes and improvements + + * Added support for many OpenSSL 1.0.2 and 1.1 APIs, based on + observations of real-world usage in applications. These are + implemented in parallel with existing OpenSSL 1.0.1 APIs - visibility + changes have not been made to existing structs, allowing code written + for older OpenSSL APIs to continue working. + + * Extensive corrections, improvements, and additions to the + API documentation, including new public APIs from OpenSSL that had + no pre-existing documentation. + + * Added support for automatic library initialization in libcrypto, + libssl, and libtls. Support for pthread_once or a compatible + equivalent is now required of the target operating system. As a + side-effect, minimum Windows support is Vista or higher. + + * Converted more packet handling methods to CBB, which improves + resiliency when generating TLS messages. + + * Completed TLS extension handling rewrite, improving consistency of + checks for malformed and duplicate extensions. + + * Rewrote ASN1_TYPE_{get,set}_octetstring() using templated ASN.1. + This removes the last remaining use of the old M_ASN1_* macros + (asn1_mac.h) from API that needs to continue to exist. + + * Added support for client-side session resumption in libtls. + A libtls client can specify a session file descriptor (a regular + file with appropriate ownership and permissions) and libtls will + manage reading and writing of session data across TLS handshakes. + + * Improved support for strict alignment on ARMv7 architectures, + conditionally enabling assembly in those cases. + + * Fixed a memory leak in libtls when reusing a tls_config. + + * Merged more DTLS support into the regular TLS code path, removing + duplicated code. + + * Many improvements to Windows Cmake-based builds and tests, + especially when targeting Visual Studio. + 2.6.4 - Bug fixes * Make tls_config_parse_protocols() work correctly when passed a NULL diff --git a/README.md b/README.md index 0198152..d03e3bb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Official repository is development, not release versions of LibreSSL, and needs external applications to prepare for build. -Built from https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.6.4.tar.gz +Built from https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.7.2.tar.gz Modifications: - Removed tests/mandocs/pkgconfig/scripts/apps/cmake_uninstall from both filesystem and CMakeLists.txt diff --git a/README.windows b/README.windows new file mode 100644 index 0000000..a88ddc9 --- /dev/null +++ b/README.windows @@ -0,0 +1,65 @@ +# Building + +For Windows systems, LibreSSL supports the mingw-w64 toolchain, which can use +GCC or Clang as the compiler. Contrary to its name, mingw-w64 supports both +32-bit and 64-bit build environments. If your project already uses mingw-w64, +then LibreSSL should integrate very nicely. Old versions of the mingw-w64 +toolchain, such as the one packaged with Ubuntu 12.04, may have trouble +building LibreSSL. Please try it with a recent toolchain if you encounter +troubles. Cygwin provides an easy method of installing the latest mingw-w64 +cross compilers on Windows. + +To configure and build LibreSSL for a 32-bit system, use the following +build steps: + + CC=i686-w64-mingw32-gcc CPPFLAGS=-D__MINGW_USE_VC2005_COMPAT \ + ./configure --host=i686-w64-mingw32 + make + make check + +For 64-bit builds, use these instead: + + CC=x86_64-w64-mingw32-gcc ./configure --host=x86_64-w64-mingw32 + make + make check + +# Why the -D__MINGW_USE_VC2005_COMPAT flag on 32-bit systems? + +An ABI change introduced with Microsoft Visual C++ 2005 (also known as +Visual C++ 8.0) switched time_t from 32-bit to 64-bit. It is important to +build LibreSSL with 64-bit time_t whenever possible, because 32-bit time_t +is unable to represent times past 2038 (this is commonly known as the +Y2K38 problem). + +If LibreSSL is built with 32-bit time_t, when verifying a certificate whose +expiry date is set past 19 January 2038, it will be unable to tell if the +certificate has expired or not, and thus take the safe stance and reject it. + +In order to avoid this, you need to build LibreSSL (and everything that links +with it) with the -D__MINGW_USE_VC2005_COMPAT flag. This tells mingw-w64 to +use the new ABI. + +64-bit systems always have a 64-bit time_t and are not affected by this +problem. + +# Using Libressl with Visual Studio + +A script for generating ready-to-use .DLL and static .LIB files is included in +the source repository at +https://github.com/libressl-portable/portable/blob/master/dist-win.sh + +This script uses mingw-w64 to build LibreSSL and then uses Visual Studio tools +to generate compatible library import files ready-to-use with Visual +Studio projects. Static and dynamic libraries are included. The script uses +cv2pdb to generate Visual Studio and windbg compatible debug files. cv2pdb is a +tool developed for the D language and can be found here: +https://github.com/rainers/cv2pdb + +Pre-built Windows binaries are available with LibreSSL releases if you do not +have a mingw-w64 build environment. Mingw-w64 code is largely, but not 100%, +compatible with code built from Visual Studio. Notably, FILE * pointers cannot +be shared between code built for Mingw-w64 and Visual Studio. + +As of LibreSSL 2.2.2, Visual Studio Native builds can be produced using CMake. +This produces ABI-compatible libraries for linking with native code generated +by Visual Studio. diff --git a/VERSION b/VERSION index 22c0950..c57e1bc 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -2.6.4 +2.7.2 diff --git a/cmake_export_symbol.cmake b/cmake_export_symbol.cmake index cbc65f2..0883001 100644 --- a/cmake_export_symbol.cmake +++ b/cmake_export_symbol.cmake @@ -1,49 +1,55 @@ -macro(export_symbol TARGET FILENAME) +macro(export_symbol TARGET SYMBOLS_PATH) set(FLAG "") + get_filename_component(FILENAME ${SYMBOLS_PATH} NAME) if(WIN32) string(REPLACE ".sym" ".def" DEF_FILENAME ${FILENAME}) - file(WRITE ${DEF_FILENAME} "EXPORTS\n") - file(READ ${FILENAME} SYMBOLS) - file(APPEND ${DEF_FILENAME} "${SYMBOLS}") - target_sources(${TARGET} PRIVATE ${DEF_FILENAME}) + file(TO_CMAKE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${DEF_FILENAME}" DEF_PATH) + file(WRITE ${DEF_PATH} "EXPORTS\n") + file(READ ${SYMBOLS_PATH} SYMBOLS) + file(APPEND ${DEF_PATH} "${SYMBOLS}") + target_sources(${TARGET} PRIVATE ${DEF_PATH}) elseif(APPLE) - file(READ ${FILENAME} SYMBOLS) + file(READ ${SYMBOLS_PATH} SYMBOLS) string(REGEX REPLACE "\n$" "" SYMBOLS ${SYMBOLS}) string(REPLACE "\n" "\n_" SYMBOLS ${SYMBOLS}) string(REGEX REPLACE "(.)$" "\\1\\n" SYMBOLS ${SYMBOLS}) string(REPLACE ".sym" ".exp" EXP_FILENAME ${FILENAME}) - file(WRITE ${EXP_FILENAME} "_${SYMBOLS}") - set(FLAG "-exported_symbols_list ${EXP_FILENAME}") + file(TO_CMAKE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${EXP_FILENAME}" EXP_PATH) + file(WRITE ${EXP_PATH} "_${SYMBOLS}") + set(FLAG "-exported_symbols_list ${EXP_PATH}") set_target_properties(${TARGET} PROPERTIES LINK_FLAGS ${FLAG}) elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX") - file(READ ${FILENAME} SYMBOLS) + file(READ ${SYMBOLS_PATH} SYMBOLS) string(REGEX REPLACE "\n$" "" SYMBOLS ${SYMBOLS}) string(REPLACE "\n" "\n+e " SYMBOLS ${SYMBOLS}) string(REPLACE ".sym" ".opt" OPT_FILENAME ${FILENAME}) - file(WRITE ${OPT_FILENAME} "+e ${SYMBOLS}") - set(FLAG "-Wl,-c,${OPT_FILENAME}") + file(TO_CMAKE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${OPT_FILENAME}" OPT_PATH) + file(WRITE ${OPT_PATH} "+e ${SYMBOLS}") + set(FLAG "-Wl,-c,${OPT_PATH}") set_target_properties(${TARGET} PROPERTIES LINK_FLAGS ${FLAG}) elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS") - file(READ ${FILENAME} SYMBOLS) + file(READ ${SYMBOLS_PATH} SYMBOLS) string(REPLACE "\n" ";\n" SYMBOLS ${SYMBOLS}) string(REPLACE ".sym" ".ver" VER_FILENAME ${FILENAME}) - file(WRITE ${VER_FILENAME} + file(TO_CMAKE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${VER_FILENAME}" VER_PATH) + file(WRITE ${VER_PATH} "{\nglobal:\n${SYMBOLS}\nlocal:\n*;\n};\n") - set(FLAG "-Wl,-M${VER_FILENAME}") + set(FLAG "-Wl,-M${VER_PATH}") set_target_properties(${TARGET} PROPERTIES LINK_FLAGS ${FLAG}) elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang") - file(READ ${FILENAME} SYMBOLS) + file(READ ${SYMBOLS_PATH} SYMBOLS) string(REPLACE "\n" ";\n" SYMBOLS ${SYMBOLS}) string(REPLACE ".sym" ".ver" VER_FILENAME ${FILENAME}) - file(WRITE ${VER_FILENAME} + file(TO_CMAKE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${VER_FILENAME}" VER_PATH) + file(WRITE ${VER_PATH} "{\nglobal:\n${SYMBOLS}\nlocal:\n*;\n};\n") - set(FLAG "-Wl,--version-script,\"${VER_FILENAME}\"") + set(FLAG "-Wl,--version-script,\"${VER_PATH}\"") set_target_properties(${TARGET} PROPERTIES LINK_FLAGS ${FLAG}) endif() diff --git a/cmake_uninstall.cmake.in b/cmake_uninstall.cmake.in new file mode 100644 index 0000000..bb8055d --- /dev/null +++ b/cmake_uninstall.cmake.in @@ -0,0 +1,21 @@ +if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") +endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif(NOT "${rm_retval}" STREQUAL 0) + else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") +endforeach(file) diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index e347bb6..2fa08a5 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -112,6 +112,7 @@ set( ${CRYPTO_SRC} cpt_err.c cryptlib.c + crypto_init.c cversion.c ex_data.c malloc-wrapper.c @@ -217,6 +218,7 @@ set( bio/bio_cb.c bio/bio_err.c bio/bio_lib.c + bio/bio_meth.c bio/bss_acpt.c bio/bss_bio.c bio/bss_conn.c @@ -323,6 +325,7 @@ set( dsa/dsa_gen.c dsa/dsa_key.c dsa/dsa_lib.c + dsa/dsa_meth.c dsa/dsa_ossl.c dsa/dsa_pmeth.c dsa/dsa_prn.c @@ -551,6 +554,7 @@ set( rsa/rsa_err.c rsa/rsa_gen.c rsa/rsa_lib.c + rsa/rsa_meth.c rsa/rsa_none.c rsa/rsa_oaep.c rsa/rsa_pk1.c @@ -642,19 +646,19 @@ set( x509v3/v3err.c ) -if(CMAKE_HOST_UNIX) +if(UNIX) set(CRYPTO_SRC ${CRYPTO_SRC} bio/b_posix.c) set(CRYPTO_SRC ${CRYPTO_SRC} bio/bss_log.c) set(CRYPTO_SRC ${CRYPTO_SRC} ui/ui_openssl.c) endif() -if(CMAKE_HOST_WIN32) +if(WIN32) set(CRYPTO_SRC ${CRYPTO_SRC} bio/b_win.c) set(CRYPTO_UNEXPORT ${CRYPTO_UNEXPORT} BIO_s_log) set(CRYPTO_SRC ${CRYPTO_SRC} ui/ui_openssl_win.c) endif() -if(CMAKE_HOST_WIN32) +if(WIN32) set(CRYPTO_SRC ${CRYPTO_SRC} compat/posix_win.c) set(EXTRA_EXPORT ${EXTRA_EXPORT} gettimeofday) set(EXTRA_EXPORT ${EXTRA_EXPORT} posix_perror) @@ -686,11 +690,6 @@ if(NOT HAVE_GETPAGESIZE) set(CRYPTO_SRC ${CRYPTO_SRC} compat/getpagesize.c) endif() -if(NOT HAVE_INET_PTON) - set(CRYPTO_SRC ${CRYPTO_SRC} compat/inet_pton.c) - set(EXTRA_EXPORT ${EXTRA_EXPORT} inet_pton) -endif() - if(NOT HAVE_REALLOCARRAY) set(CRYPTO_SRC ${CRYPTO_SRC} compat/reallocarray.c) set(EXTRA_EXPORT ${EXTRA_EXPORT} reallocarray) @@ -736,7 +735,7 @@ if(NOT HAVE_TIMEGM) endif() if(NOT HAVE_EXPLICIT_BZERO) - if(CMAKE_HOST_WIN32) + if(WIN32) set(CRYPTO_SRC ${CRYPTO_SRC} compat/explicit_bzero_win.c) else() set(CRYPTO_SRC ${CRYPTO_SRC} compat/explicit_bzero.c) @@ -753,7 +752,7 @@ if(NOT HAVE_ARC4RANDOM_BUF) set(EXTRA_EXPORT ${EXTRA_EXPORT} arc4random_uniform) if(NOT HAVE_GETENTROPY) - if(CMAKE_HOST_WIN32) + if(WIN32) set(CRYPTO_SRC ${CRYPTO_SRC} compat/getentropy_win.c) elseif(CMAKE_SYSTEM_NAME MATCHES "AIX") set(CRYPTO_SRC ${CRYPTO_SRC} compat/getentropy_aix.c) @@ -787,7 +786,7 @@ endif() if(NOT ENABLE_ASM) add_definitions(-DOPENSSL_NO_ASM) else() - if(CMAKE_HOST_WIN32) + if(WIN32) add_definitions(-DOPENSSL_NO_ASM) endif() endif() @@ -802,35 +801,33 @@ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/crypto.sym SYMS) foreach(SYM IN LISTS CRYPTO_UNEXPORT) string(REPLACE "${SYM}\n" "" SYMS ${SYMS}) endforeach() -file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/crypto_p.sym ${SYMS}) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/crypto_p.sym ${SYMS}) if(EXTRA_EXPORT) list(SORT EXTRA_EXPORT) foreach(SYM IN LISTS EXTRA_EXPORT) - file(APPEND ${CMAKE_CURRENT_SOURCE_DIR}/crypto_p.sym "${SYM}\n") + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/crypto_p.sym "${SYM}\n") endforeach() endif() -add_library(crypto-objects OBJECT ${CRYPTO_SRC}) -if (BUILD_SHARED) - add_library(crypto STATIC $) - add_library(crypto-shared SHARED $) - export_symbol(crypto-shared ${CMAKE_CURRENT_SOURCE_DIR}/crypto_p.sym) +add_library(crypto ${CRYPTO_SRC}) +if (BUILD_SHARED_LIBS) + export_symbol(crypto ${CMAKE_CURRENT_BINARY_DIR}/crypto_p.sym) if (WIN32) - target_link_libraries(crypto-shared Ws2_32.lib) + target_link_libraries(crypto Ws2_32.lib) set(CRYPTO_POSTFIX -${CRYPTO_MAJOR_VERSION}) endif() - set_target_properties(crypto-shared PROPERTIES + set_target_properties(crypto PROPERTIES OUTPUT_NAME crypto${CRYPTO_POSTFIX} ARCHIVE_OUTPUT_NAME crypto${CRYPTO_POSTFIX}) - set_target_properties(crypto-shared PROPERTIES VERSION + set_target_properties(crypto PROPERTIES VERSION ${CRYPTO_VERSION} SOVERSION ${CRYPTO_MAJOR_VERSION}) - if(ENABLE_LIBRESSL_INSTALL) - install(TARGETS crypto crypto-shared DESTINATION ${CMAKE_INSTALL_LIBDIR}) - endif(ENABLE_LIBRESSL_INSTALL) -else() - add_library(crypto STATIC ${CRYPTO_SRC}) - if(ENABLE_LIBRESSL_INSTALL) - install(TARGETS crypto DESTINATION ${CMAKE_INSTALL_LIBDIR}) - endif(ENABLE_LIBRESSL_INSTALL) endif() +if(ENABLE_LIBRESSL_INSTALL) + install( + TARGETS crypto + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) +endif(ENABLE_LIBRESSL_INSTALL) diff --git a/crypto/VERSION b/crypto/VERSION index bcd4782..80d708c 100644 --- a/crypto/VERSION +++ b/crypto/VERSION @@ -1 +1 @@ -42:0:0 +43:1:0 diff --git a/crypto/aes/aes-elf-x86_64.S b/crypto/aes/aes-elf-x86_64.S index abc9005..83c0053 100644 --- a/crypto/aes/aes-elf-x86_64.S +++ b/crypto/aes/aes-elf-x86_64.S @@ -152,7 +152,7 @@ _x86_64_AES_encrypt: xorl %r11d,%ebx xorl %r12d,%ecx xorl %r8d,%edx -.byte 0xf3,0xc3 + retq .size _x86_64_AES_encrypt,.-_x86_64_AES_encrypt .type _x86_64_AES_encrypt_compact,@function .align 16 @@ -327,7 +327,7 @@ _x86_64_AES_encrypt_compact: xorl 4(%r15),%ebx xorl 8(%r15),%ecx xorl 12(%r15),%edx -.byte 0xf3,0xc3 + retq .size _x86_64_AES_encrypt_compact,.-_x86_64_AES_encrypt_compact .globl AES_encrypt .type AES_encrypt,@function @@ -394,7 +394,7 @@ AES_encrypt: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lenc_epilogue: - .byte 0xf3,0xc3 + retq .size AES_encrypt,.-AES_encrypt .type _x86_64_AES_decrypt,@function .align 16 @@ -549,7 +549,7 @@ _x86_64_AES_decrypt: xorl %r11d,%ebx xorl %r12d,%ecx xorl %r8d,%edx -.byte 0xf3,0xc3 + retq .size _x86_64_AES_decrypt,.-_x86_64_AES_decrypt .type _x86_64_AES_decrypt_compact,@function .align 16 @@ -775,7 +775,7 @@ _x86_64_AES_decrypt_compact: xorl 4(%r15),%ebx xorl 8(%r15),%ecx xorl 12(%r15),%edx -.byte 0xf3,0xc3 + retq .size _x86_64_AES_decrypt_compact,.-_x86_64_AES_decrypt_compact .globl AES_decrypt .type AES_decrypt,@function @@ -844,7 +844,7 @@ AES_decrypt: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Ldec_epilogue: - .byte 0xf3,0xc3 + retq .size AES_decrypt,.-AES_decrypt .globl AES_set_encrypt_key .type AES_set_encrypt_key,@function @@ -869,7 +869,7 @@ AES_set_encrypt_key: movq 48(%rsp),%rbx addq $56,%rsp .Lenc_key_epilogue: - .byte 0xf3,0xc3 + retq .size AES_set_encrypt_key,.-AES_set_encrypt_key .type _x86_64_AES_set_encrypt_key,@function @@ -1109,7 +1109,7 @@ _x86_64_AES_set_encrypt_key: .Lbadpointer: movq $-1,%rax .Lexit: -.byte 0xf3,0xc3 + retq .size _x86_64_AES_set_encrypt_key,.-_x86_64_AES_set_encrypt_key .globl AES_set_decrypt_key .type AES_set_decrypt_key,@function @@ -1296,7 +1296,7 @@ AES_set_decrypt_key: movq 48(%rsp),%rbx addq $56,%rsp .Ldec_key_epilogue: - .byte 0xf3,0xc3 + retq .size AES_set_decrypt_key,.-AES_set_decrypt_key .globl AES_cbc_encrypt .type AES_cbc_encrypt,@function @@ -1754,7 +1754,7 @@ AES_cbc_encrypt: .Lcbc_popfq: popfq .Lcbc_epilogue: - .byte 0xf3,0xc3 + retq .size AES_cbc_encrypt,.-AES_cbc_encrypt .align 64 .LAES_Te: diff --git a/crypto/aes/aes-macosx-x86_64.S b/crypto/aes/aes-macosx-x86_64.S index 9d8b1f1..8a9c36e 100644 --- a/crypto/aes/aes-macosx-x86_64.S +++ b/crypto/aes/aes-macosx-x86_64.S @@ -152,7 +152,7 @@ L$enc_loop: xorl %r11d,%ebx xorl %r12d,%ecx xorl %r8d,%edx -.byte 0xf3,0xc3 + retq .p2align 4 @@ -327,7 +327,7 @@ L$enc_compact_done: xorl 4(%r15),%ebx xorl 8(%r15),%ecx xorl 12(%r15),%edx -.byte 0xf3,0xc3 + retq .globl _AES_encrypt @@ -394,7 +394,7 @@ L$enc_prologue: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$enc_epilogue: - .byte 0xf3,0xc3 + retq .p2align 4 @@ -549,7 +549,7 @@ L$dec_loop: xorl %r11d,%ebx xorl %r12d,%ecx xorl %r8d,%edx -.byte 0xf3,0xc3 + retq .p2align 4 @@ -775,7 +775,7 @@ L$dec_compact_done: xorl 4(%r15),%ebx xorl 8(%r15),%ecx xorl 12(%r15),%edx -.byte 0xf3,0xc3 + retq .globl _AES_decrypt @@ -844,7 +844,7 @@ L$dec_prologue: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$dec_epilogue: - .byte 0xf3,0xc3 + retq .globl _AES_set_encrypt_key @@ -869,7 +869,7 @@ L$enc_key_prologue: movq 48(%rsp),%rbx addq $56,%rsp L$enc_key_epilogue: - .byte 0xf3,0xc3 + retq @@ -1109,7 +1109,7 @@ L$14break: L$badpointer: movq $-1,%rax L$exit: -.byte 0xf3,0xc3 + retq .globl _AES_set_decrypt_key @@ -1296,7 +1296,7 @@ L$abort: movq 48(%rsp),%rbx addq $56,%rsp L$dec_key_epilogue: - .byte 0xf3,0xc3 + retq .globl _AES_cbc_encrypt @@ -1754,7 +1754,7 @@ L$cbc_exit: L$cbc_popfq: popfq L$cbc_epilogue: - .byte 0xf3,0xc3 + retq .p2align 6 L$AES_Te: diff --git a/crypto/aes/aesni-elf-x86_64.S b/crypto/aes/aesni-elf-x86_64.S index 613ecfa..3b3dabf 100644 --- a/crypto/aes/aesni-elf-x86_64.S +++ b/crypto/aes/aesni-elf-x86_64.S @@ -18,7 +18,7 @@ aesni_encrypt: jnz .Loop_enc1_1 aesenclast %xmm1,%xmm2 movups %xmm2,(%rsi) - .byte 0xf3,0xc3 + retq .size aesni_encrypt,.-aesni_encrypt .globl aesni_decrypt @@ -39,7 +39,7 @@ aesni_decrypt: jnz .Loop_dec1_2 aesdeclast %xmm1,%xmm2 movups %xmm2,(%rsi) - .byte 0xf3,0xc3 + retq .size aesni_decrypt, .-aesni_decrypt .type _aesni_encrypt3,@function .align 16 @@ -72,7 +72,7 @@ _aesni_encrypt3: aesenclast %xmm0,%xmm2 aesenclast %xmm0,%xmm3 aesenclast %xmm0,%xmm4 - .byte 0xf3,0xc3 + retq .size _aesni_encrypt3,.-_aesni_encrypt3 .type _aesni_decrypt3,@function .align 16 @@ -105,7 +105,7 @@ _aesni_decrypt3: aesdeclast %xmm0,%xmm2 aesdeclast %xmm0,%xmm3 aesdeclast %xmm0,%xmm4 - .byte 0xf3,0xc3 + retq .size _aesni_decrypt3,.-_aesni_decrypt3 .type _aesni_encrypt4,@function .align 16 @@ -143,7 +143,7 @@ _aesni_encrypt4: aesenclast %xmm0,%xmm3 aesenclast %xmm0,%xmm4 aesenclast %xmm0,%xmm5 - .byte 0xf3,0xc3 + retq .size _aesni_encrypt4,.-_aesni_encrypt4 .type _aesni_decrypt4,@function .align 16 @@ -181,7 +181,7 @@ _aesni_decrypt4: aesdeclast %xmm0,%xmm3 aesdeclast %xmm0,%xmm4 aesdeclast %xmm0,%xmm5 - .byte 0xf3,0xc3 + retq .size _aesni_decrypt4,.-_aesni_decrypt4 .type _aesni_encrypt6,@function .align 16 @@ -238,7 +238,7 @@ _aesni_encrypt6: aesenclast %xmm0,%xmm5 aesenclast %xmm0,%xmm6 aesenclast %xmm0,%xmm7 - .byte 0xf3,0xc3 + retq .size _aesni_encrypt6,.-_aesni_encrypt6 .type _aesni_decrypt6,@function .align 16 @@ -295,7 +295,7 @@ _aesni_decrypt6: aesdeclast %xmm0,%xmm5 aesdeclast %xmm0,%xmm6 aesdeclast %xmm0,%xmm7 - .byte 0xf3,0xc3 + retq .size _aesni_decrypt6,.-_aesni_decrypt6 .type _aesni_encrypt8,@function .align 16 @@ -365,7 +365,7 @@ _aesni_encrypt8: aesenclast %xmm0,%xmm7 aesenclast %xmm0,%xmm8 aesenclast %xmm0,%xmm9 - .byte 0xf3,0xc3 + retq .size _aesni_encrypt8,.-_aesni_encrypt8 .type _aesni_decrypt8,@function .align 16 @@ -435,7 +435,7 @@ _aesni_decrypt8: aesdeclast %xmm0,%xmm7 aesdeclast %xmm0,%xmm8 aesdeclast %xmm0,%xmm9 - .byte 0xf3,0xc3 + retq .size _aesni_decrypt8,.-_aesni_decrypt8 .globl aesni_ecb_encrypt .type aesni_ecb_encrypt,@function @@ -737,7 +737,7 @@ aesni_ecb_encrypt: movups %xmm7,80(%rsi) .Lecb_ret: - .byte 0xf3,0xc3 + retq .size aesni_ecb_encrypt,.-aesni_ecb_encrypt .globl aesni_ccm64_encrypt_blocks .type aesni_ccm64_encrypt_blocks,@function @@ -794,7 +794,7 @@ aesni_ccm64_encrypt_blocks: jnz .Lccm64_enc_outer movups %xmm3,(%r9) - .byte 0xf3,0xc3 + retq .size aesni_ccm64_encrypt_blocks,.-aesni_ccm64_encrypt_blocks .globl aesni_ccm64_decrypt_blocks .type aesni_ccm64_decrypt_blocks,@function @@ -881,7 +881,7 @@ aesni_ccm64_decrypt_blocks: jnz .Loop_enc1_6 aesenclast %xmm1,%xmm3 movups %xmm3,(%r9) - .byte 0xf3,0xc3 + retq .size aesni_ccm64_decrypt_blocks,.-aesni_ccm64_decrypt_blocks .globl aesni_ctr32_encrypt_blocks .type aesni_ctr32_encrypt_blocks,@function @@ -1129,7 +1129,7 @@ aesni_ctr32_encrypt_blocks: movups %xmm11,48(%rsi) .Lctr32_done: - .byte 0xf3,0xc3 + retq .size aesni_ctr32_encrypt_blocks,.-aesni_ctr32_encrypt_blocks .globl aesni_xts_encrypt .type aesni_xts_encrypt,@function @@ -1525,7 +1525,7 @@ aesni_xts_encrypt: .Lxts_enc_ret: leaq 104(%rsp),%rsp .Lxts_enc_epilogue: - .byte 0xf3,0xc3 + retq .size aesni_xts_encrypt,.-aesni_xts_encrypt .globl aesni_xts_decrypt .type aesni_xts_decrypt,@function @@ -1965,7 +1965,7 @@ aesni_xts_decrypt: .Lxts_dec_ret: leaq 104(%rsp),%rsp .Lxts_dec_epilogue: - .byte 0xf3,0xc3 + retq .size aesni_xts_decrypt,.-aesni_xts_decrypt .globl aesni_cbc_encrypt .type aesni_cbc_encrypt,@function @@ -2290,7 +2290,7 @@ aesni_cbc_encrypt: .Lcbc_dec_ret: .Lcbc_ret: - .byte 0xf3,0xc3 + retq .size aesni_cbc_encrypt,.-aesni_cbc_encrypt .globl aesni_set_decrypt_key .type aesni_set_decrypt_key,@function @@ -2327,7 +2327,7 @@ aesni_set_decrypt_key: movups %xmm0,(%rdi) .Ldec_key_ret: addq $8,%rsp - .byte 0xf3,0xc3 + retq .LSEH_end_set_decrypt_key: .size aesni_set_decrypt_key,.-aesni_set_decrypt_key .globl aesni_set_encrypt_key @@ -2449,7 +2449,7 @@ __aesni_set_encrypt_key: movq $-2,%rax .Lenc_key_ret: addq $8,%rsp - .byte 0xf3,0xc3 + retq .LSEH_end_set_encrypt_key: .align 16 @@ -2463,7 +2463,7 @@ __aesni_set_encrypt_key: xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 - .byte 0xf3,0xc3 + retq .align 16 .Lkey_expansion_192a: @@ -2483,7 +2483,7 @@ __aesni_set_encrypt_key: pxor %xmm1,%xmm0 pshufd $255,%xmm0,%xmm3 pxor %xmm3,%xmm2 - .byte 0xf3,0xc3 + retq .align 16 .Lkey_expansion_192b: @@ -2506,7 +2506,7 @@ __aesni_set_encrypt_key: xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 - .byte 0xf3,0xc3 + retq .align 16 .Lkey_expansion_256b: @@ -2519,7 +2519,7 @@ __aesni_set_encrypt_key: xorps %xmm4,%xmm2 shufps $170,%xmm1,%xmm1 xorps %xmm1,%xmm2 - .byte 0xf3,0xc3 + retq .size aesni_set_encrypt_key,.-aesni_set_encrypt_key .size __aesni_set_encrypt_key,.-__aesni_set_encrypt_key .align 64 diff --git a/crypto/aes/aesni-macosx-x86_64.S b/crypto/aes/aesni-macosx-x86_64.S index 581b079..6b3216b 100644 --- a/crypto/aes/aesni-macosx-x86_64.S +++ b/crypto/aes/aesni-macosx-x86_64.S @@ -18,7 +18,7 @@ L$oop_enc1_1: jnz L$oop_enc1_1 aesenclast %xmm1,%xmm2 movups %xmm2,(%rsi) - .byte 0xf3,0xc3 + retq .globl _aesni_decrypt @@ -39,7 +39,7 @@ L$oop_dec1_2: jnz L$oop_dec1_2 aesdeclast %xmm1,%xmm2 movups %xmm2,(%rsi) - .byte 0xf3,0xc3 + retq .p2align 4 @@ -72,7 +72,7 @@ L$enc_loop3: aesenclast %xmm0,%xmm2 aesenclast %xmm0,%xmm3 aesenclast %xmm0,%xmm4 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -105,7 +105,7 @@ L$dec_loop3: aesdeclast %xmm0,%xmm2 aesdeclast %xmm0,%xmm3 aesdeclast %xmm0,%xmm4 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -143,7 +143,7 @@ L$enc_loop4: aesenclast %xmm0,%xmm3 aesenclast %xmm0,%xmm4 aesenclast %xmm0,%xmm5 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -181,7 +181,7 @@ L$dec_loop4: aesdeclast %xmm0,%xmm3 aesdeclast %xmm0,%xmm4 aesdeclast %xmm0,%xmm5 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -238,7 +238,7 @@ L$enc_loop6_enter: aesenclast %xmm0,%xmm5 aesenclast %xmm0,%xmm6 aesenclast %xmm0,%xmm7 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -295,7 +295,7 @@ L$dec_loop6_enter: aesdeclast %xmm0,%xmm5 aesdeclast %xmm0,%xmm6 aesdeclast %xmm0,%xmm7 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -365,7 +365,7 @@ L$enc_loop8_enter: aesenclast %xmm0,%xmm7 aesenclast %xmm0,%xmm8 aesenclast %xmm0,%xmm9 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -435,7 +435,7 @@ L$dec_loop8_enter: aesdeclast %xmm0,%xmm7 aesdeclast %xmm0,%xmm8 aesdeclast %xmm0,%xmm9 - .byte 0xf3,0xc3 + retq .globl _aesni_ecb_encrypt @@ -737,7 +737,7 @@ L$ecb_dec_six: movups %xmm7,80(%rsi) L$ecb_ret: - .byte 0xf3,0xc3 + retq .globl _aesni_ccm64_encrypt_blocks @@ -794,7 +794,7 @@ L$ccm64_enc2_loop: jnz L$ccm64_enc_outer movups %xmm3,(%r9) - .byte 0xf3,0xc3 + retq .globl _aesni_ccm64_decrypt_blocks @@ -881,7 +881,7 @@ L$oop_enc1_6: jnz L$oop_enc1_6 aesenclast %xmm1,%xmm3 movups %xmm3,(%r9) - .byte 0xf3,0xc3 + retq .globl _aesni_ctr32_encrypt_blocks @@ -1129,7 +1129,7 @@ L$ctr32_four: movups %xmm11,48(%rsi) L$ctr32_done: - .byte 0xf3,0xc3 + retq .globl _aesni_xts_encrypt @@ -1525,7 +1525,7 @@ L$oop_enc1_10: L$xts_enc_ret: leaq 104(%rsp),%rsp L$xts_enc_epilogue: - .byte 0xf3,0xc3 + retq .globl _aesni_xts_decrypt @@ -1965,7 +1965,7 @@ L$oop_dec1_14: L$xts_dec_ret: leaq 104(%rsp),%rsp L$xts_dec_epilogue: - .byte 0xf3,0xc3 + retq .globl _aesni_cbc_encrypt @@ -2290,7 +2290,7 @@ L$cbc_dec_tail_partial: L$cbc_dec_ret: L$cbc_ret: - .byte 0xf3,0xc3 + retq .globl _aesni_set_decrypt_key @@ -2327,7 +2327,7 @@ L$dec_key_inverse: movups %xmm0,(%rdi) L$dec_key_ret: addq $8,%rsp - .byte 0xf3,0xc3 + retq L$SEH_end_set_decrypt_key: .globl _aesni_set_encrypt_key @@ -2449,7 +2449,7 @@ L$bad_keybits: movq $-2,%rax L$enc_key_ret: addq $8,%rsp - .byte 0xf3,0xc3 + retq L$SEH_end_set_encrypt_key: .p2align 4 @@ -2463,7 +2463,7 @@ L$key_expansion_128_cold: xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 - .byte 0xf3,0xc3 + retq .p2align 4 L$key_expansion_192a: @@ -2483,7 +2483,7 @@ L$key_expansion_192b_warm: pxor %xmm1,%xmm0 pshufd $255,%xmm0,%xmm3 pxor %xmm3,%xmm2 - .byte 0xf3,0xc3 + retq .p2align 4 L$key_expansion_192b: @@ -2506,7 +2506,7 @@ L$key_expansion_256a_cold: xorps %xmm4,%xmm0 shufps $255,%xmm1,%xmm1 xorps %xmm1,%xmm0 - .byte 0xf3,0xc3 + retq .p2align 4 L$key_expansion_256b: @@ -2519,7 +2519,7 @@ L$key_expansion_256b: xorps %xmm4,%xmm2 shufps $170,%xmm1,%xmm1 xorps %xmm1,%xmm2 - .byte 0xf3,0xc3 + retq .p2align 6 diff --git a/crypto/aes/aesni-sha1-elf-x86_64.S b/crypto/aes/aesni-sha1-elf-x86_64.S index a534d1d..c0b3e5f 100644 --- a/crypto/aes/aesni-sha1-elf-x86_64.S +++ b/crypto/aes/aesni-sha1-elf-x86_64.S @@ -11,7 +11,7 @@ aesni_cbc_sha1_enc: movl OPENSSL_ia32cap_P+0(%rip),%r10d movl OPENSSL_ia32cap_P+4(%rip),%r11d jmp aesni_cbc_sha1_enc_ssse3 - .byte 0xf3,0xc3 + retq .size aesni_cbc_sha1_enc,.-aesni_cbc_sha1_enc .type aesni_cbc_sha1_enc_ssse3,@function .align 16 @@ -1384,7 +1384,7 @@ aesni_cbc_sha1_enc_ssse3: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lepilogue_ssse3: - .byte 0xf3,0xc3 + retq .size aesni_cbc_sha1_enc_ssse3,.-aesni_cbc_sha1_enc_ssse3 .align 64 K_XX_XX: diff --git a/crypto/aes/aesni-sha1-macosx-x86_64.S b/crypto/aes/aesni-sha1-macosx-x86_64.S index f382d36..3e88b1a 100644 --- a/crypto/aes/aesni-sha1-macosx-x86_64.S +++ b/crypto/aes/aesni-sha1-macosx-x86_64.S @@ -11,7 +11,7 @@ _aesni_cbc_sha1_enc: movl _OPENSSL_ia32cap_P+0(%rip),%r10d movl _OPENSSL_ia32cap_P+4(%rip),%r11d jmp aesni_cbc_sha1_enc_ssse3 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -1384,7 +1384,7 @@ L$aesenclast5: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$epilogue_ssse3: - .byte 0xf3,0xc3 + retq .p2align 6 K_XX_XX: diff --git a/crypto/aes/bsaes-elf-x86_64.S b/crypto/aes/bsaes-elf-x86_64.S index 547f3ee..903e374 100644 --- a/crypto/aes/bsaes-elf-x86_64.S +++ b/crypto/aes/bsaes-elf-x86_64.S @@ -473,7 +473,7 @@ _bsaes_encrypt8_bitslice: pxor %xmm7,%xmm4 pxor %xmm7,%xmm15 pxor %xmm7,%xmm0 - .byte 0xf3,0xc3 + retq .size _bsaes_encrypt8,.-_bsaes_encrypt8 .type _bsaes_decrypt8,@function @@ -979,7 +979,7 @@ _bsaes_decrypt8: pxor %xmm7,%xmm4 pxor %xmm7,%xmm15 pxor %xmm7,%xmm0 - .byte 0xf3,0xc3 + retq .size _bsaes_decrypt8,.-_bsaes_decrypt8 .type _bsaes_key_convert,@function .align 16 @@ -1061,7 +1061,7 @@ _bsaes_key_convert: movdqa 80(%r11),%xmm7 - .byte 0xf3,0xc3 + retq .size _bsaes_key_convert,.-_bsaes_key_convert .globl bsaes_cbc_encrypt @@ -1311,7 +1311,7 @@ bsaes_cbc_encrypt: leaq 120(%rsp),%rsp movq %rax,%rbp .Lcbc_dec_epilogue: - .byte 0xf3,0xc3 + retq .size bsaes_cbc_encrypt,.-bsaes_cbc_encrypt .globl bsaes_ctr32_encrypt_blocks @@ -1511,7 +1511,7 @@ bsaes_ctr32_encrypt_blocks: leaq 120(%rsp),%rsp movq %rax,%rbp .Lctr_enc_epilogue: - .byte 0xf3,0xc3 + retq .size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks .globl bsaes_xts_encrypt .type bsaes_xts_encrypt,@function @@ -1962,7 +1962,7 @@ bsaes_xts_encrypt: leaq 120(%rsp),%rsp movq %rax,%rbp .Lxts_enc_epilogue: - .byte 0xf3,0xc3 + retq .size bsaes_xts_encrypt,.-bsaes_xts_encrypt .globl bsaes_xts_decrypt @@ -2440,7 +2440,7 @@ bsaes_xts_decrypt: leaq 120(%rsp),%rsp movq %rax,%rbp .Lxts_dec_epilogue: - .byte 0xf3,0xc3 + retq .size bsaes_xts_decrypt,.-bsaes_xts_decrypt .type _bsaes_const,@object .align 64 diff --git a/crypto/aes/bsaes-macosx-x86_64.S b/crypto/aes/bsaes-macosx-x86_64.S index 0e90b2b..5f780f0 100644 --- a/crypto/aes/bsaes-macosx-x86_64.S +++ b/crypto/aes/bsaes-macosx-x86_64.S @@ -473,7 +473,7 @@ L$enc_done: pxor %xmm7,%xmm4 pxor %xmm7,%xmm15 pxor %xmm7,%xmm0 - .byte 0xf3,0xc3 + retq @@ -979,7 +979,7 @@ L$dec_done: pxor %xmm7,%xmm4 pxor %xmm7,%xmm15 pxor %xmm7,%xmm0 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -1061,7 +1061,7 @@ L$key_loop: movdqa 80(%r11),%xmm7 - .byte 0xf3,0xc3 + retq .globl _bsaes_cbc_encrypt @@ -1311,7 +1311,7 @@ L$cbc_dec_bzero: leaq 120(%rsp),%rsp movq %rax,%rbp L$cbc_dec_epilogue: - .byte 0xf3,0xc3 + retq .globl _bsaes_ctr32_encrypt_blocks @@ -1511,7 +1511,7 @@ L$ctr_enc_bzero: leaq 120(%rsp),%rsp movq %rax,%rbp L$ctr_enc_epilogue: - .byte 0xf3,0xc3 + retq .globl _bsaes_xts_encrypt @@ -1962,7 +1962,7 @@ L$xts_enc_bzero: leaq 120(%rsp),%rsp movq %rax,%rbp L$xts_enc_epilogue: - .byte 0xf3,0xc3 + retq .globl _bsaes_xts_decrypt @@ -2440,7 +2440,7 @@ L$xts_dec_bzero: leaq 120(%rsp),%rsp movq %rax,%rbp L$xts_dec_epilogue: - .byte 0xf3,0xc3 + retq .p2align 6 diff --git a/crypto/aes/vpaes-elf-x86_64.S b/crypto/aes/vpaes-elf-x86_64.S index 90032ba..1e1a6e8 100644 --- a/crypto/aes/vpaes-elf-x86_64.S +++ b/crypto/aes/vpaes-elf-x86_64.S @@ -98,7 +98,7 @@ _vpaes_encrypt_core: movdqa 64(%r11,%r10,1),%xmm1 pxor %xmm4,%xmm0 .byte 102,15,56,0,193 - .byte 0xf3,0xc3 + retq .size _vpaes_encrypt_core,.-_vpaes_encrypt_core @@ -205,7 +205,7 @@ _vpaes_decrypt_core: .byte 102,15,56,0,195 pxor %xmm4,%xmm0 .byte 102,15,56,0,194 - .byte 0xf3,0xc3 + retq .size _vpaes_decrypt_core,.-_vpaes_decrypt_core @@ -381,7 +381,7 @@ _vpaes_schedule_core: pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 - .byte 0xf3,0xc3 + retq .size _vpaes_schedule_core,.-_vpaes_schedule_core @@ -408,7 +408,7 @@ _vpaes_schedule_192_smear: movdqa %xmm6,%xmm0 pxor %xmm1,%xmm1 movhlps %xmm1,%xmm6 - .byte 0xf3,0xc3 + retq .size _vpaes_schedule_192_smear,.-_vpaes_schedule_192_smear @@ -484,7 +484,7 @@ _vpaes_schedule_low_round: pxor %xmm7,%xmm0 movdqa %xmm0,%xmm7 - .byte 0xf3,0xc3 + retq .size _vpaes_schedule_round,.-_vpaes_schedule_round @@ -508,7 +508,7 @@ _vpaes_schedule_transform: movdqa 16(%r11),%xmm0 .byte 102,15,56,0,193 pxor %xmm2,%xmm0 - .byte 0xf3,0xc3 + retq .size _vpaes_schedule_transform,.-_vpaes_schedule_transform @@ -600,7 +600,7 @@ _vpaes_schedule_mangle: addq $-16,%r8 andq $48,%r8 movdqu %xmm3,(%rdx) - .byte 0xf3,0xc3 + retq .size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle @@ -619,7 +619,7 @@ vpaes_set_encrypt_key: movl $48,%r8d call _vpaes_schedule_core xorl %eax,%eax - .byte 0xf3,0xc3 + retq .size vpaes_set_encrypt_key,.-vpaes_set_encrypt_key .globl vpaes_set_decrypt_key @@ -640,7 +640,7 @@ vpaes_set_decrypt_key: xorl $32,%r8d call _vpaes_schedule_core xorl %eax,%eax - .byte 0xf3,0xc3 + retq .size vpaes_set_decrypt_key,.-vpaes_set_decrypt_key .globl vpaes_encrypt @@ -651,7 +651,7 @@ vpaes_encrypt: call _vpaes_preheat call _vpaes_encrypt_core movdqu %xmm0,(%rsi) - .byte 0xf3,0xc3 + retq .size vpaes_encrypt,.-vpaes_encrypt .globl vpaes_decrypt @@ -662,7 +662,7 @@ vpaes_decrypt: call _vpaes_preheat call _vpaes_decrypt_core movdqu %xmm0,(%rsi) - .byte 0xf3,0xc3 + retq .size vpaes_decrypt,.-vpaes_decrypt .globl vpaes_cbc_encrypt .type vpaes_cbc_encrypt,@function @@ -702,7 +702,7 @@ vpaes_cbc_encrypt: .Lcbc_done: movdqu %xmm6,(%r8) .Lcbc_abort: - .byte 0xf3,0xc3 + retq .size vpaes_cbc_encrypt,.-vpaes_cbc_encrypt @@ -721,7 +721,7 @@ _vpaes_preheat: movdqa 64(%r10),%xmm12 movdqa 80(%r10),%xmm15 movdqa 96(%r10),%xmm14 - .byte 0xf3,0xc3 + retq .size _vpaes_preheat,.-_vpaes_preheat diff --git a/crypto/aes/vpaes-macosx-x86_64.S b/crypto/aes/vpaes-macosx-x86_64.S index 8b49fc7..0a892a9 100644 --- a/crypto/aes/vpaes-macosx-x86_64.S +++ b/crypto/aes/vpaes-macosx-x86_64.S @@ -98,7 +98,7 @@ L$enc_entry: movdqa 64(%r11,%r10,1),%xmm1 pxor %xmm4,%xmm0 .byte 102,15,56,0,193 - .byte 0xf3,0xc3 + retq @@ -205,7 +205,7 @@ L$dec_entry: .byte 102,15,56,0,195 pxor %xmm4,%xmm0 .byte 102,15,56,0,194 - .byte 0xf3,0xc3 + retq @@ -381,7 +381,7 @@ L$schedule_mangle_last_dec: pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 - .byte 0xf3,0xc3 + retq @@ -408,7 +408,7 @@ _vpaes_schedule_192_smear: movdqa %xmm6,%xmm0 pxor %xmm1,%xmm1 movhlps %xmm1,%xmm6 - .byte 0xf3,0xc3 + retq @@ -484,7 +484,7 @@ _vpaes_schedule_low_round: pxor %xmm7,%xmm0 movdqa %xmm0,%xmm7 - .byte 0xf3,0xc3 + retq @@ -508,7 +508,7 @@ _vpaes_schedule_transform: movdqa 16(%r11),%xmm0 .byte 102,15,56,0,193 pxor %xmm2,%xmm0 - .byte 0xf3,0xc3 + retq @@ -600,7 +600,7 @@ L$schedule_mangle_both: addq $-16,%r8 andq $48,%r8 movdqu %xmm3,(%rdx) - .byte 0xf3,0xc3 + retq @@ -619,7 +619,7 @@ _vpaes_set_encrypt_key: movl $48,%r8d call _vpaes_schedule_core xorl %eax,%eax - .byte 0xf3,0xc3 + retq .globl _vpaes_set_decrypt_key @@ -640,7 +640,7 @@ _vpaes_set_decrypt_key: xorl $32,%r8d call _vpaes_schedule_core xorl %eax,%eax - .byte 0xf3,0xc3 + retq .globl _vpaes_encrypt @@ -651,7 +651,7 @@ _vpaes_encrypt: call _vpaes_preheat call _vpaes_encrypt_core movdqu %xmm0,(%rsi) - .byte 0xf3,0xc3 + retq .globl _vpaes_decrypt @@ -662,7 +662,7 @@ _vpaes_decrypt: call _vpaes_preheat call _vpaes_decrypt_core movdqu %xmm0,(%rsi) - .byte 0xf3,0xc3 + retq .globl _vpaes_cbc_encrypt @@ -702,7 +702,7 @@ L$cbc_dec_loop: L$cbc_done: movdqu %xmm6,(%r8) L$cbc_abort: - .byte 0xf3,0xc3 + retq @@ -721,7 +721,7 @@ _vpaes_preheat: movdqa 64(%r10),%xmm12 movdqa 80(%r10),%xmm15 movdqa 96(%r10),%xmm14 - .byte 0xf3,0xc3 + retq diff --git a/crypto/asn1/asn1_lib.c b/crypto/asn1/asn1_lib.c index 852644a..970102c 100644 --- a/crypto/asn1/asn1_lib.c +++ b/crypto/asn1/asn1_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asn1_lib.c,v 1.39 2017/05/02 03:59:44 deraadt Exp $ */ +/* $OpenBSD: asn1_lib.c,v 1.40 2018/02/14 16:46:04 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -484,3 +484,9 @@ ASN1_STRING_data(ASN1_STRING *x) { return (x->data); } + +const unsigned char * +ASN1_STRING_get0_data(const ASN1_STRING *x) +{ + return (x->data); +} diff --git a/crypto/asn1/evp_asn1.c b/crypto/asn1/evp_asn1.c index 83228bb..5f74da1 100644 --- a/crypto/asn1/evp_asn1.c +++ b/crypto/asn1/evp_asn1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: evp_asn1.c,v 1.19 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: evp_asn1.c,v 1.20 2017/11/28 16:51:21 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -60,7 +60,7 @@ #include #include -#include +#include #include int @@ -78,7 +78,6 @@ ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len) return (1); } -/* int max_len: for returned value */ int ASN1_TYPE_get_octetstring(ASN1_TYPE *a, unsigned char *data, int max_len) { @@ -100,101 +99,99 @@ ASN1_TYPE_get_octetstring(ASN1_TYPE *a, unsigned char *data, int max_len) return (ret); } +typedef struct { + ASN1_INTEGER *num; + ASN1_OCTET_STRING *value; +} ASN1_int_octetstring; + +static const ASN1_TEMPLATE ASN1_INT_OCTETSTRING_seq_tt[] = { + { + .offset = offsetof(ASN1_int_octetstring, num), + .field_name = "num", + .item = &ASN1_INTEGER_it, + }, + { + .offset = offsetof(ASN1_int_octetstring, value), + .field_name = "value", + .item = &ASN1_OCTET_STRING_it, + }, +}; + +const ASN1_ITEM ASN1_INT_OCTETSTRING_it = { + .itype = ASN1_ITYPE_SEQUENCE, + .utype = V_ASN1_SEQUENCE, + .templates = ASN1_INT_OCTETSTRING_seq_tt, + .tcount = sizeof(ASN1_INT_OCTETSTRING_seq_tt) / sizeof(ASN1_TEMPLATE), + .size = sizeof(ASN1_int_octetstring), + .sname = "ASN1_INT_OCTETSTRING", +}; + int -ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, unsigned char *data, +ASN1_TYPE_set_int_octetstring(ASN1_TYPE *at, long num, unsigned char *data, int len) { - int n, size; - ASN1_OCTET_STRING os, *osp; - ASN1_INTEGER in; - unsigned char *p; - unsigned char buf[32]; /* when they have 256bit longs, - * I'll be in trouble */ - in.data = buf; - in.length = 32; - os.data = data; - os.type = V_ASN1_OCTET_STRING; - os.length = len; - ASN1_INTEGER_set(&in, num); - n = i2d_ASN1_INTEGER(&in, NULL); - n += i2d_ASN1_bytes((ASN1_STRING *)&os, NULL, V_ASN1_OCTET_STRING, - V_ASN1_UNIVERSAL); + ASN1_int_octetstring *ios; + ASN1_STRING *sp = NULL; + int ret = 0; - size = ASN1_object_size(1, n, V_ASN1_SEQUENCE); + if ((ios = (ASN1_int_octetstring *)ASN1_item_new( + &ASN1_INT_OCTETSTRING_it)) == NULL) + goto err; + if ((ios->num = ASN1_INTEGER_new()) == NULL) + goto err; + if (!ASN1_INTEGER_set(ios->num, num)) + goto err; + if ((ios->value = ASN1_OCTET_STRING_new()) == NULL) + goto err; + if (!ASN1_OCTET_STRING_set(ios->value, data, len)) + goto err; - if ((osp = ASN1_STRING_new()) == NULL) - return (0); - /* Grow the 'string' */ - if (!ASN1_STRING_set(osp, NULL, size)) { - ASN1_STRING_free(osp); - return (0); - } + if ((sp = ASN1_item_pack(ios, &ASN1_INT_OCTETSTRING_it, NULL)) == NULL) + goto err; - ASN1_STRING_length_set(osp, size); - p = ASN1_STRING_data(osp); + ASN1_TYPE_set(at, V_ASN1_SEQUENCE, sp); + sp = NULL; - ASN1_put_object(&p, 1,n, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL); - i2d_ASN1_INTEGER(&in, &p); - i2d_ASN1_bytes((ASN1_STRING *)&os, &p, V_ASN1_OCTET_STRING, - V_ASN1_UNIVERSAL); + ret = 1; - ASN1_TYPE_set(a, V_ASN1_SEQUENCE, osp); - return (1); + err: + ASN1_item_free((ASN1_VALUE *)ios, &ASN1_INT_OCTETSTRING_it); + ASN1_STRING_free(sp); + + return ret; } -/* we return the actual length..., num may be missing, in which - * case, set it to zero */ -/* int max_len: for returned value */ int -ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a, long *num, unsigned char *data, +ASN1_TYPE_get_int_octetstring(ASN1_TYPE *at, long *num, unsigned char *data, int max_len) { - int ret = -1, n; - ASN1_INTEGER *ai = NULL; - ASN1_OCTET_STRING *os = NULL; - const unsigned char *p; - long length; - ASN1_const_CTX c; + ASN1_STRING *sp = at->value.sequence; + ASN1_int_octetstring *ios = NULL; + int ret = -1; + int len; - if ((a->type != V_ASN1_SEQUENCE) || (a->value.sequence == NULL)) { + if (at->type != V_ASN1_SEQUENCE || sp == NULL) goto err; - } - p = ASN1_STRING_data(a->value.sequence); - length = ASN1_STRING_length(a->value.sequence); - c.pp = &p; - c.p = p; - c.max = p + length; - c.error = ASN1_R_DATA_IS_WRONG; - - M_ASN1_D2I_start_sequence(); - c.q = c.p; - if ((ai = d2i_ASN1_INTEGER(NULL, &c.p, c.slen)) == NULL) - goto err; - c.slen -= (c.p - c.q); - c.q = c.p; - if ((os = d2i_ASN1_OCTET_STRING(NULL, &c.p, c.slen)) == NULL) - goto err; - c.slen -= (c.p - c.q); - if (!M_ASN1_D2I_end_sequence()) + if ((ios = ASN1_item_unpack(sp, &ASN1_INT_OCTETSTRING_it)) == NULL) goto err; if (num != NULL) - *num = ASN1_INTEGER_get(ai); - - ret = ASN1_STRING_length(os); - if (max_len > ret) - n = ret; - else - n = max_len; - - if (data != NULL) - memcpy(data, ASN1_STRING_data(os), n); - if (0) { -err: - ASN1error(ASN1_R_DATA_IS_WRONG); + *num = ASN1_INTEGER_get(ios->num); + if (data != NULL) { + len = ASN1_STRING_length(ios->value); + if (len > max_len) + len = max_len; + memcpy(data, ASN1_STRING_data(ios->value), len); } - ASN1_OCTET_STRING_free(os); - ASN1_INTEGER_free(ai); - return (ret); + + ret = ASN1_STRING_length(ios->value); + + err: + ASN1_item_free((ASN1_VALUE *)ios, &ASN1_INT_OCTETSTRING_it); + + if (ret == -1) + ASN1error(ASN1_R_DATA_IS_WRONG); + + return ret; } diff --git a/crypto/asn1/x_crl.c b/crypto/asn1/x_crl.c index d8f24ca..e0e6cc8 100644 --- a/crypto/asn1/x_crl.c +++ b/crypto/asn1/x_crl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x_crl.c,v 1.27 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: x_crl.c,v 1.30 2018/03/17 14:33:20 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -462,6 +462,12 @@ X509_REVOKED_free(X509_REVOKED *a) ASN1_item_free((ASN1_VALUE *)a, &X509_REVOKED_it); } +X509_REVOKED * +X509_REVOKED_dup(X509_REVOKED *a) +{ + return ASN1_item_dup(&X509_REVOKED_it, a); +} + X509_CRL_INFO * d2i_X509_CRL_INFO(X509_CRL_INFO **a, const unsigned char **in, long len) { @@ -685,3 +691,37 @@ X509_CRL_get_meth_data(X509_CRL *crl) { return crl->meth_data; } + +int +X509_CRL_get_signature_nid(const X509_CRL *crl) +{ + return OBJ_obj2nid(crl->sig_alg->algorithm); +} + +const STACK_OF(X509_EXTENSION) * +X509_CRL_get0_extensions(const X509_CRL *crl) +{ + return crl->crl->extensions; +} + +const ASN1_TIME * +X509_CRL_get0_lastUpdate(const X509_CRL *crl) +{ + return crl->crl->lastUpdate; +} + +const ASN1_TIME * +X509_CRL_get0_nextUpdate(const X509_CRL *crl) +{ + return crl->crl->nextUpdate; +} + +void +X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg) +{ + if (psig != NULL) + *psig = crl->signature; + if (palg != NULL) + *palg = crl->sig_alg; +} diff --git a/crypto/asn1/x_name.c b/crypto/asn1/x_name.c index 30fef39..4bf1842 100644 --- a/crypto/asn1/x_name.c +++ b/crypto/asn1/x_name.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x_name.c,v 1.33 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: x_name.c,v 1.34 2018/02/20 17:09:20 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -640,3 +640,16 @@ X509_NAME_set(X509_NAME **xn, X509_NAME *name) } return (*xn != NULL); } + +int +X509_NAME_get0_der(X509_NAME *nm, const unsigned char **pder, size_t *pderlen) +{ + /* Make sure encoding is valid. */ + if (i2d_X509_NAME(nm, NULL) <= 0) + return 0; + if (pder != NULL) + *pder = (unsigned char *)nm->bytes->data; + if (pderlen != NULL) + *pderlen = nm->bytes->length; + return 1; +} diff --git a/crypto/asn1/x_pubkey.c b/crypto/asn1/x_pubkey.c index 738507b..ea67419 100644 --- a/crypto/asn1/x_pubkey.c +++ b/crypto/asn1/x_pubkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x_pubkey.c,v 1.26 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: x_pubkey.c,v 1.27 2018/03/17 14:55:39 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -175,17 +175,15 @@ error: } EVP_PKEY * -X509_PUBKEY_get(X509_PUBKEY *key) +X509_PUBKEY_get0(X509_PUBKEY *key) { EVP_PKEY *ret = NULL; if (key == NULL) goto error; - if (key->pkey != NULL) { - CRYPTO_add(&key->pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); + if (key->pkey != NULL) return key->pkey; - } if (key->public_key == NULL) goto error; @@ -220,7 +218,6 @@ X509_PUBKEY_get(X509_PUBKEY *key) key->pkey = ret; CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY); } - CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY); return ret; @@ -229,6 +226,19 @@ error: return (NULL); } +EVP_PKEY * +X509_PUBKEY_get(X509_PUBKEY *key) +{ + EVP_PKEY *pkey; + + if ((pkey = X509_PUBKEY_get0(key)) == NULL) + return (NULL); + + CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); + + return pkey; +} + /* Now two pseudo ASN1 routines that take an EVP_PKEY structure * and encode or decode as X509_PUBKEY */ diff --git a/crypto/asn1/x_req.c b/crypto/asn1/x_req.c index 5ffa11e..eb5210a 100644 --- a/crypto/asn1/x_req.c +++ b/crypto/asn1/x_req.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x_req.c,v 1.15 2015/02/11 04:00:39 jsing Exp $ */ +/* $OpenBSD: x_req.c,v 1.17 2018/02/22 16:50:30 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -225,3 +225,19 @@ X509_REQ_dup(X509_REQ *x) { return ASN1_item_dup(&X509_REQ_it, x); } + +int +X509_REQ_get_signature_nid(const X509_REQ *req) +{ + return OBJ_obj2nid(req->sig_alg->algorithm); +} + +void +X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg) +{ + if (psig != NULL) + *psig = req->signature; + if (palg != NULL) + *palg = req->sig_alg; +} diff --git a/crypto/asn1/x_x509.c b/crypto/asn1/x_x509.c index 168c2c0..6a56a79 100644 --- a/crypto/asn1/x_x509.c +++ b/crypto/asn1/x_x509.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x_x509.c,v 1.24 2015/03/19 14:00:22 tedu Exp $ */ +/* $OpenBSD: x_x509.c,v 1.26 2018/02/17 15:50:42 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -344,3 +344,19 @@ i2d_X509_AUX(X509 *a, unsigned char **pp) length += i2d_X509_CERT_AUX(a->aux, pp); return length; } + +void +X509_get0_signature(const ASN1_BIT_STRING **psig, const X509_ALGOR **palg, + const X509 *x) +{ + if (psig != NULL) + *psig = x->signature; + if (palg != NULL) + *palg = x->sig_alg; +} + +int +X509_get_signature_nid(const X509 *x) +{ + return OBJ_obj2nid(x->sig_alg->algorithm); +} diff --git a/crypto/bio/b_posix.c b/crypto/bio/b_posix.c index a850bc6..aed51bd 100644 --- a/crypto/bio/b_posix.c +++ b/crypto/bio/b_posix.c @@ -1,4 +1,4 @@ -/* $OpenBSD: b_posix.c,v 1.1 2014/12/03 22:14:38 bcook Exp $ */ +/* $OpenBSD: b_posix.c,v 1.2 2018/03/17 16:20:01 beck Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -68,6 +68,8 @@ int BIO_sock_init(void) { + if (!OPENSSL_init_crypto(0, NULL)) /* XXX do we need this? */ + return (0); return (1); } diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c index 48f3983..152b080 100644 --- a/crypto/bio/b_sock.c +++ b/crypto/bio/b_sock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: b_sock.c,v 1.67 2017/04/30 17:54:11 beck Exp $ */ +/* $OpenBSD: b_sock.c,v 1.69 2018/02/07 00:52:05 bluhm Exp $ */ /* * Copyright (c) 2017 Bob Beck * @@ -134,16 +134,18 @@ BIO_get_accept_socket(char *host, int bind_mode) p = NULL; h = str; if ((p = strrchr(str, ':')) == NULL) { - BIOerror(BIO_R_NO_PORT_SPECIFIED); - goto err; - } - *p++ = '\0'; - if (*p == '\0') { - BIOerror(BIO_R_NO_PORT_SPECIFIED); - goto err; - } - if (*h == '\0' || strcmp(h, "*") == 0) + /* A string without a colon is treated as a port. */ + p = str; h = NULL; + } else { + *p++ = '\0'; + if (*p == '\0') { + BIOerror(BIO_R_NO_PORT_SPECIFIED); + goto err; + } + if (*h == '\0' || strcmp(h, "*") == 0) + h = NULL; + } if ((error = getaddrinfo(h, p, &hints, &res)) != 0) { ERR_asprintf_error_data("getaddrinfo: '%s:%s': %s'", h, p, @@ -184,7 +186,8 @@ BIO_get_accept_socket(char *host, int bind_mode) err: free(str); - freeaddrinfo(res); + if (res != NULL) + freeaddrinfo(res); if ((ret == 0) && (s != -1)) { close(s); s = -1; diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c index 86ccbdc..ddab542 100644 --- a/crypto/bio/bio_lib.c +++ b/crypto/bio/bio_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bio_lib.c,v 1.23 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: bio_lib.c,v 1.27 2018/02/22 16:38:43 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -64,6 +64,20 @@ #include #include +int +BIO_get_new_index(void) +{ + static int bio_type_index = BIO_TYPE_START; + int index; + + /* The index will collide with the BIO flag bits if it exceeds 255. */ + index = CRYPTO_add(&bio_type_index, 1, CRYPTO_LOCK_BIO); + if (index > 255) + return -1; + + return index; +} + BIO * BIO_new(BIO_METHOD *method) { @@ -137,6 +151,43 @@ BIO_vfree(BIO *a) BIO_free(a); } +int +BIO_up_ref(BIO *bio) +{ + int refs = CRYPTO_add(&bio->references, 1, CRYPTO_LOCK_BIO); + return (refs > 1) ? 1 : 0; +} + +void * +BIO_get_data(BIO *a) +{ + return (a->ptr); +} + +void +BIO_set_data(BIO *a, void *ptr) +{ + a->ptr = ptr; +} + +void +BIO_set_init(BIO *a, int init) +{ + a->init = init; +} + +int +BIO_get_shutdown(BIO *a) +{ + return (a->shutdown); +} + +void +BIO_set_shutdown(BIO *a, int shut) +{ + a->shutdown = shut; +} + void BIO_clear_flags(BIO *b, int flags) { diff --git a/crypto/bio/bio_meth.c b/crypto/bio/bio_meth.c new file mode 100644 index 0000000..c795c3f --- /dev/null +++ b/crypto/bio/bio_meth.c @@ -0,0 +1,147 @@ +/* $OpenBSD: bio_meth.c,v 1.5 2018/02/20 18:51:35 tb Exp $ */ +/* + * Copyright (c) 2018 Theo Buehler + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include + +BIO_METHOD * +BIO_meth_new(int type, const char *name) +{ + BIO_METHOD *biom; + + if ((biom = calloc(1, sizeof(*biom))) == NULL) + return NULL; + + biom->type = type; + biom->name = name; + + return biom; +} + +void +BIO_meth_free(BIO_METHOD *biom) +{ + free(biom); +} + +int +(*BIO_meth_get_write(BIO_METHOD *biom))(BIO *, const char *, int) +{ + return biom->bwrite; +} + +int +BIO_meth_set_write(BIO_METHOD *biom, int (*write)(BIO *, const char *, int)) +{ + biom->bwrite = write; + return 1; +} + +int +(*BIO_meth_get_read(BIO_METHOD *biom))(BIO *, char *, int) +{ + return biom->bread; +} + +int +BIO_meth_set_read(BIO_METHOD *biom, int (*read)(BIO *, char *, int)) +{ + biom->bread = read; + return 1; +} + +int +(*BIO_meth_get_puts(BIO_METHOD *biom))(BIO *, const char *) +{ + return biom->bputs; +} + +int +BIO_meth_set_puts(BIO_METHOD *biom, int (*puts)(BIO *, const char *)) +{ + biom->bputs = puts; + return 1; +} + +int +(*BIO_meth_get_gets(BIO_METHOD *biom))(BIO *, char *, int) +{ + return biom->bgets; +} + +int +BIO_meth_set_gets(BIO_METHOD *biom, int (*gets)(BIO *, char *, int)) +{ + biom->bgets = gets; + return 1; +} + +long +(*BIO_meth_get_ctrl(BIO_METHOD *biom))(BIO *, int, long, void *) +{ + return biom->ctrl; +} + +int +BIO_meth_set_ctrl(BIO_METHOD *biom, long (*ctrl)(BIO *, int, long, void *)) +{ + biom->ctrl = ctrl; + return 1; +} + +int +(*BIO_meth_get_create(BIO_METHOD *biom))(BIO *) +{ + return biom->create; +} + +int +BIO_meth_set_create(BIO_METHOD *biom, int (*create)(BIO *)) +{ + biom->create = create; + return 1; +} + +int +(*BIO_meth_get_destroy(BIO_METHOD *biom))(BIO *) +{ + return biom->destroy; +} + +int +BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy)(BIO *)) +{ + biom->destroy = destroy; + return 1; +} + +long +(*BIO_meth_get_callback_ctrl(BIO_METHOD *biom))(BIO *, int, BIO_info_cb *) +{ + return + (long (*)(BIO *, int, BIO_info_cb *))biom->callback_ctrl; /* XXX */ +} + +int +BIO_meth_set_callback_ctrl(BIO_METHOD *biom, + long (*callback_ctrl)(BIO *, int, BIO_info_cb *)) +{ + biom->callback_ctrl = + (long (*)(BIO *, int, bio_info_cb *))callback_ctrl; /* XXX */ + return 1; +} diff --git a/crypto/bn/bn_const.c b/crypto/bn/bn_const.c index 4be9f4f..0ceff91 100644 --- a/crypto/bn/bn_const.c +++ b/crypto/bn/bn_const.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bn_const.c,v 1.4 2014/06/12 15:49:28 deraadt Exp $ */ +/* $OpenBSD: bn_const.c,v 1.5 2018/02/20 17:02:30 jsing Exp $ */ /* Insert boilerplate */ #include @@ -27,6 +27,12 @@ get_rfc2409_prime_768(BIGNUM *bn) return BN_bin2bn(RFC2409_PRIME_768, sizeof(RFC2409_PRIME_768), bn); } +BIGNUM * +BN_get_rfc2409_prime_768(BIGNUM *bn) +{ + return get_rfc2409_prime_768(bn); +} + /* "Second Oakley Default Group" from RFC2409, section 6.2. * * The prime is: 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }. @@ -54,6 +60,12 @@ get_rfc2409_prime_1024(BIGNUM *bn) return BN_bin2bn(RFC2409_PRIME_1024, sizeof(RFC2409_PRIME_1024), bn); } +BIGNUM * +BN_get_rfc2409_prime_1024(BIGNUM *bn) +{ + return get_rfc2409_prime_1024(bn); +} + /* "1536-bit MODP Group" from RFC3526, Section 2. * * The prime is: 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 } @@ -86,6 +98,12 @@ get_rfc3526_prime_1536(BIGNUM *bn) return BN_bin2bn(RFC3526_PRIME_1536, sizeof(RFC3526_PRIME_1536), bn); } +BIGNUM * +BN_get_rfc3526_prime_1536(BIGNUM *bn) +{ + return get_rfc3526_prime_1536(bn); +} + /* "2048-bit MODP Group" from RFC3526, Section 3. * * The prime is: 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 } @@ -123,6 +141,12 @@ get_rfc3526_prime_2048(BIGNUM *bn) return BN_bin2bn(RFC3526_PRIME_2048, sizeof(RFC3526_PRIME_2048), bn); } +BIGNUM * +BN_get_rfc3526_prime_2048(BIGNUM *bn) +{ + return get_rfc3526_prime_2048(bn); +} + /* "3072-bit MODP Group" from RFC3526, Section 4. * * The prime is: 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 } @@ -170,6 +194,12 @@ get_rfc3526_prime_3072(BIGNUM *bn) return BN_bin2bn(RFC3526_PRIME_3072, sizeof(RFC3526_PRIME_3072), bn); } +BIGNUM * +BN_get_rfc3526_prime_3072(BIGNUM *bn) +{ + return get_rfc3526_prime_3072(bn); +} + /* "4096-bit MODP Group" from RFC3526, Section 5. * * The prime is: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 } @@ -228,6 +258,12 @@ get_rfc3526_prime_4096(BIGNUM *bn) return BN_bin2bn(RFC3526_PRIME_4096, sizeof(RFC3526_PRIME_4096), bn); } +BIGNUM * +BN_get_rfc3526_prime_4096(BIGNUM *bn) +{ + return get_rfc3526_prime_4096(bn); +} + /* "6144-bit MODP Group" from RFC3526, Section 6. * * The prime is: 2^6144 - 2^6080 - 1 + 2^64 * { [2^6014 pi] + 929484 } @@ -307,6 +343,12 @@ get_rfc3526_prime_6144(BIGNUM *bn) return BN_bin2bn(RFC3526_PRIME_6144, sizeof(RFC3526_PRIME_6144), bn); } +BIGNUM * +BN_get_rfc3526_prime_6144(BIGNUM *bn) +{ + return get_rfc3526_prime_6144(bn); +} + /* "8192-bit MODP Group" from RFC3526, Section 7. * * The prime is: 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 } @@ -407,3 +449,9 @@ get_rfc3526_prime_8192(BIGNUM *bn) }; return BN_bin2bn(RFC3526_PRIME_8192, sizeof(RFC3526_PRIME_8192), bn); } + +BIGNUM * +BN_get_rfc3526_prime_8192(BIGNUM *bn) +{ + return get_rfc3526_prime_8192(bn); +} diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index 8aeeb53..ffb5ee7 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bn_lib.c,v 1.38 2017/05/02 03:59:44 deraadt Exp $ */ +/* $OpenBSD: bn_lib.c,v 1.39 2018/02/20 17:13:14 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -888,3 +888,28 @@ BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords) } #undef BN_CONSTTIME_SWAP } + +BN_GENCB * +BN_GENCB_new(void) +{ + BN_GENCB *cb; + + if ((cb = calloc(1, sizeof(*cb))) == NULL) + return NULL; + + return cb; +} + +void +BN_GENCB_free(BN_GENCB *cb) +{ + if (cb == NULL) + return; + free(cb); +} + +void * +BN_GENCB_get_arg(BN_GENCB *cb) +{ + return cb->arg; +} diff --git a/crypto/bn/gf2m-elf-x86_64.S b/crypto/bn/gf2m-elf-x86_64.S index 018182d..c53a2c0 100644 --- a/crypto/bn/gf2m-elf-x86_64.S +++ b/crypto/bn/gf2m-elf-x86_64.S @@ -194,7 +194,7 @@ _mul_1x1: xorq %rdi,%rdx addq $128+8,%rsp - .byte 0xf3,0xc3 + retq .Lend_mul_1x1: .size _mul_1x1,.-_mul_1x1 @@ -227,7 +227,7 @@ bn_GF2m_mul_2x2: pxor %xmm5,%xmm0 movdqu %xmm2,0(%rdi) movdqu %xmm0,16(%rdi) - .byte 0xf3,0xc3 + retq .align 16 .Lvanilla_mul_2x2: @@ -286,7 +286,7 @@ bn_GF2m_mul_2x2: movq 104(%rsp),%rbp movq 112(%rsp),%rbx leaq 136(%rsp),%rsp - .byte 0xf3,0xc3 + retq .Lend_mul_2x2: .size bn_GF2m_mul_2x2,.-bn_GF2m_mul_2x2 .byte 71,70,40,50,94,109,41,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 diff --git a/crypto/bn/gf2m-macosx-x86_64.S b/crypto/bn/gf2m-macosx-x86_64.S index 6e3c44f..693e159 100644 --- a/crypto/bn/gf2m-macosx-x86_64.S +++ b/crypto/bn/gf2m-macosx-x86_64.S @@ -194,7 +194,7 @@ _mul_1x1: xorq %rdi,%rdx addq $128+8,%rsp - .byte 0xf3,0xc3 + retq L$end_mul_1x1: @@ -227,7 +227,7 @@ _bn_GF2m_mul_2x2: pxor %xmm5,%xmm0 movdqu %xmm2,0(%rdi) movdqu %xmm0,16(%rdi) - .byte 0xf3,0xc3 + retq .p2align 4 L$vanilla_mul_2x2: @@ -286,7 +286,7 @@ L$body_mul_2x2: movq 104(%rsp),%rbp movq 112(%rsp),%rbx leaq 136(%rsp),%rsp - .byte 0xf3,0xc3 + retq L$end_mul_2x2: .byte 71,70,40,50,94,109,41,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 diff --git a/crypto/bn/modexp512-elf-x86_64.S b/crypto/bn/modexp512-elf-x86_64.S index d2932a3..76baefe 100644 --- a/crypto/bn/modexp512-elf-x86_64.S +++ b/crypto/bn/modexp512-elf-x86_64.S @@ -129,7 +129,7 @@ MULADD_128x512: addq %rbx,%r8 adcq $0,%rdx movq %rdx,%r9 - .byte 0xf3,0xc3 + retq .size MULADD_128x512,.-MULADD_128x512 .type mont_reduce,@function .align 16 @@ -572,7 +572,7 @@ mont_reduce: movq %r8,48(%rsi) movq %r9,56(%rsi) - .byte 0xf3,0xc3 + retq .size mont_reduce,.-mont_reduce .type mont_mul_a3b,@function .align 16 @@ -1770,7 +1770,7 @@ end_main_loop_a3b: movq 40(%rsi),%rbp leaq 48(%rsi),%rsp .Lepilogue: - .byte 0xf3,0xc3 + retq .size mod_exp_512, . - mod_exp_512 #if defined(HAVE_GNU_STACK) .section .note.GNU-stack,"",%progbits diff --git a/crypto/bn/modexp512-macosx-x86_64.S b/crypto/bn/modexp512-macosx-x86_64.S index df263dc..4d7b0b8 100644 --- a/crypto/bn/modexp512-macosx-x86_64.S +++ b/crypto/bn/modexp512-macosx-x86_64.S @@ -129,7 +129,7 @@ MULADD_128x512: addq %rbx,%r8 adcq $0,%rdx movq %rdx,%r9 - .byte 0xf3,0xc3 + retq .p2align 4 @@ -572,7 +572,7 @@ mont_reduce: movq %r8,48(%rsi) movq %r9,56(%rsi) - .byte 0xf3,0xc3 + retq .p2align 4 @@ -1770,5 +1770,5 @@ end_main_loop_a3b: movq 40(%rsi),%rbp leaq 48(%rsi),%rsp L$epilogue: - .byte 0xf3,0xc3 + retq diff --git a/crypto/bn/mont-elf-x86_64.S b/crypto/bn/mont-elf-x86_64.S index 4f6ed10..3576545 100644 --- a/crypto/bn/mont-elf-x86_64.S +++ b/crypto/bn/mont-elf-x86_64.S @@ -206,7 +206,7 @@ bn_mul_mont: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lmul_epilogue: - .byte 0xf3,0xc3 + retq .size bn_mul_mont,.-bn_mul_mont .type bn_mul4x_mont,@function .align 16 @@ -604,7 +604,7 @@ bn_mul4x_mont: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lmul4x_epilogue: - .byte 0xf3,0xc3 + retq .size bn_mul4x_mont,.-bn_mul4x_mont .type bn_sqr4x_mont,@function .align 16 @@ -1369,7 +1369,7 @@ bn_sqr4x_mont: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lsqr4x_epilogue: - .byte 0xf3,0xc3 + retq .size bn_sqr4x_mont,.-bn_sqr4x_mont .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 16 diff --git a/crypto/bn/mont-macosx-x86_64.S b/crypto/bn/mont-macosx-x86_64.S index 4352074..7de69d9 100644 --- a/crypto/bn/mont-macosx-x86_64.S +++ b/crypto/bn/mont-macosx-x86_64.S @@ -206,7 +206,7 @@ L$copy: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$mul_epilogue: - .byte 0xf3,0xc3 + retq .p2align 4 @@ -604,7 +604,7 @@ L$copy4x: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$mul4x_epilogue: - .byte 0xf3,0xc3 + retq .p2align 4 @@ -1369,7 +1369,7 @@ L$sqr4x_copy: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$sqr4x_epilogue: - .byte 0xf3,0xc3 + retq .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 4 diff --git a/crypto/bn/mont5-elf-x86_64.S b/crypto/bn/mont5-elf-x86_64.S index 5b7338e..48cc771 100644 --- a/crypto/bn/mont5-elf-x86_64.S +++ b/crypto/bn/mont5-elf-x86_64.S @@ -395,7 +395,7 @@ bn_mul_mont_gather5: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lmul_epilogue: - .byte 0xf3,0xc3 + retq .size bn_mul_mont_gather5,.-bn_mul_mont_gather5 .type bn_mul4x_mont_gather5,@function .align 16 @@ -984,7 +984,7 @@ bn_mul4x_mont_gather5: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lmul4x_epilogue: - .byte 0xf3,0xc3 + retq .size bn_mul4x_mont_gather5,.-bn_mul4x_mont_gather5 .globl bn_scatter5 .type bn_scatter5,@function @@ -1001,7 +1001,7 @@ bn_scatter5: subq $1,%rsi jnz .Lscatter .Lscatter_epilogue: - .byte 0xf3,0xc3 + retq .size bn_scatter5,.-bn_scatter5 .globl bn_gather5 @@ -1164,7 +1164,7 @@ bn_gather5: jnz .Lgather leaq (%r10),%rsp - .byte 0xf3,0xc3 + retq .LSEH_end_bn_gather5: .size bn_gather5,.-bn_gather5 .align 64 diff --git a/crypto/bn/mont5-macosx-x86_64.S b/crypto/bn/mont5-macosx-x86_64.S index 2da6520..039229f 100644 --- a/crypto/bn/mont5-macosx-x86_64.S +++ b/crypto/bn/mont5-macosx-x86_64.S @@ -395,7 +395,7 @@ L$copy: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$mul_epilogue: - .byte 0xf3,0xc3 + retq .p2align 4 @@ -984,7 +984,7 @@ L$copy4x: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$mul4x_epilogue: - .byte 0xf3,0xc3 + retq .globl _bn_scatter5 @@ -1001,7 +1001,7 @@ L$scatter: subq $1,%rsi jnz L$scatter L$scatter_epilogue: - .byte 0xf3,0xc3 + retq .globl _bn_gather5 @@ -1164,7 +1164,7 @@ L$gather: jnz L$gather leaq (%r10),%rsp - .byte 0xf3,0xc3 + retq L$SEH_end_bn_gather5: .p2align 6 diff --git a/crypto/camellia/cmll-elf-x86_64.S b/crypto/camellia/cmll-elf-x86_64.S index 48f4f48..64a1af0 100644 --- a/crypto/camellia/cmll-elf-x86_64.S +++ b/crypto/camellia/cmll-elf-x86_64.S @@ -60,7 +60,7 @@ Camellia_EncryptBlock_Rounds: movq 32(%rsp),%rbx leaq 40(%rsp),%rsp .Lenc_epilogue: - .byte 0xf3,0xc3 + retq .size Camellia_EncryptBlock_Rounds,.-Camellia_EncryptBlock_Rounds .type _x86_64_Camellia_encrypt,@function @@ -267,7 +267,7 @@ _x86_64_Camellia_encrypt: movl %ecx,%r10d movl %edx,%r11d -.byte 0xf3,0xc3 + retq .size _x86_64_Camellia_encrypt,.-_x86_64_Camellia_encrypt @@ -329,7 +329,7 @@ Camellia_DecryptBlock_Rounds: movq 32(%rsp),%rbx leaq 40(%rsp),%rsp .Ldec_epilogue: - .byte 0xf3,0xc3 + retq .size Camellia_DecryptBlock_Rounds,.-Camellia_DecryptBlock_Rounds .type _x86_64_Camellia_decrypt,@function @@ -537,7 +537,7 @@ _x86_64_Camellia_decrypt: movl %eax,%r10d movl %ebx,%r11d -.byte 0xf3,0xc3 + retq .size _x86_64_Camellia_decrypt,.-_x86_64_Camellia_decrypt .globl Camellia_Ekeygen .type Camellia_Ekeygen,@function @@ -1081,7 +1081,7 @@ Camellia_Ekeygen: movq 32(%rsp),%rbx leaq 40(%rsp),%rsp .Lkey_epilogue: - .byte 0xf3,0xc3 + retq .size Camellia_Ekeygen,.-Camellia_Ekeygen .align 64 .LCamellia_SIGMA: @@ -1833,7 +1833,7 @@ Camellia_cbc_encrypt: movq 40(%rcx),%rbx leaq 48(%rcx),%rsp .Lcbc_abort: - .byte 0xf3,0xc3 + retq .size Camellia_cbc_encrypt,.-Camellia_cbc_encrypt .byte 67,97,109,101,108,108,105,97,32,102,111,114,32,120,56,54,95,54,52,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 diff --git a/crypto/camellia/cmll-macosx-x86_64.S b/crypto/camellia/cmll-macosx-x86_64.S index b4ca0ab..5e7a1b7 100644 --- a/crypto/camellia/cmll-macosx-x86_64.S +++ b/crypto/camellia/cmll-macosx-x86_64.S @@ -60,7 +60,7 @@ L$enc_prologue: movq 32(%rsp),%rbx leaq 40(%rsp),%rsp L$enc_epilogue: - .byte 0xf3,0xc3 + retq @@ -267,7 +267,7 @@ L$edone: movl %ecx,%r10d movl %edx,%r11d -.byte 0xf3,0xc3 + retq @@ -329,7 +329,7 @@ L$dec_prologue: movq 32(%rsp),%rbx leaq 40(%rsp),%rsp L$dec_epilogue: - .byte 0xf3,0xc3 + retq @@ -537,7 +537,7 @@ L$ddone: movl %eax,%r10d movl %ebx,%r11d -.byte 0xf3,0xc3 + retq .globl _Camellia_Ekeygen @@ -1081,7 +1081,7 @@ L$done: movq 32(%rsp),%rbx leaq 40(%rsp),%rsp L$key_epilogue: - .byte 0xf3,0xc3 + retq .p2align 6 L$Camellia_SIGMA: @@ -1833,7 +1833,7 @@ L$cbc_done: movq 40(%rcx),%rbx leaq 48(%rcx),%rsp L$cbc_abort: - .byte 0xf3,0xc3 + retq .byte 67,97,109,101,108,108,105,97,32,102,111,114,32,120,56,54,95,54,52,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 diff --git a/crypto/comp/c_zlib.c b/crypto/comp/c_zlib.c index 1802cff..0cdbb20 100644 --- a/crypto/comp/c_zlib.c +++ b/crypto/comp/c_zlib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: c_zlib.c,v 1.19 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: c_zlib.c,v 1.20 2018/03/17 16:20:01 beck Exp $ */ #include #include #include @@ -191,6 +191,8 @@ COMP_zlib(void) if (zlib_stateful_ex_idx == -1) goto err; } + if (!OPENSSL_init_crypto(0, NULL)) + goto err; meth = &zlib_stateful_method; } diff --git a/crypto/compat/getentropy_linux.c b/crypto/compat/getentropy_linux.c index a845239..408d7fd 100644 --- a/crypto/compat/getentropy_linux.c +++ b/crypto/compat/getentropy_linux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getentropy_linux.c,v 1.44 2017/04/29 18:43:31 beck Exp $ */ +/* $OpenBSD: getentropy_linux.c,v 1.45 2018/03/13 22:53:28 bcook Exp $ */ /* * Copyright (c) 2014 Theo de Raadt @@ -74,7 +74,7 @@ int getentropy(void *buf, size_t len); static int gotdata(char *buf, size_t len); -#ifdef SYS_getrandom +#if defined(SYS_getrandom) && defined(GRND_NONBLOCK) static int getentropy_getrandom(void *buf, size_t len); #endif static int getentropy_urandom(void *buf, size_t len); @@ -94,7 +94,7 @@ getentropy(void *buf, size_t len) return (-1); } -#ifdef SYS_getrandom +#if defined(SYS_getrandom) && defined(GRND_NONBLOCK) /* * Try descriptor-less getrandom(), in non-blocking mode. * @@ -193,7 +193,7 @@ gotdata(char *buf, size_t len) return (0); } -#ifdef SYS_getrandom +#if defined(SYS_getrandom) && defined(GRND_NONBLOCK) static int getentropy_getrandom(void *buf, size_t len) { diff --git a/crypto/compat/inet_pton.c b/crypto/compat/inet_pton.c deleted file mode 100644 index c923b38..0000000 --- a/crypto/compat/inet_pton.c +++ /dev/null @@ -1,212 +0,0 @@ -/* $OpenBSD: inet_pton.c,v 1.10 2015/09/13 21:36:08 guenther Exp $ */ - -/* Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include -#include - -/* - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -static int inet_pton4(const char *src, u_char *dst); -static int inet_pton6(const char *src, u_char *dst); - -/* int - * inet_pton(af, src, dst) - * convert from presentation format (which usually means ASCII printable) - * to network format (which is usually some kind of binary format). - * return: - * 1 if the address was valid for the specified address family - * 0 if the address wasn't valid (`dst' is untouched in this case) - * -1 if some other error occurred (`dst' is untouched in this case, too) - * author: - * Paul Vixie, 1996. - */ -int -inet_pton(int af, const char *src, void *dst) -{ - switch (af) { - case AF_INET: - return (inet_pton4(src, dst)); - case AF_INET6: - return (inet_pton6(src, dst)); - default: - errno = EAFNOSUPPORT; - return (-1); - } - /* NOTREACHED */ -} - -/* int - * inet_pton4(src, dst) - * like inet_aton() but without all the hexadecimal and shorthand. - * return: - * 1 if `src' is a valid dotted quad, else 0. - * notice: - * does not touch `dst' unless it's returning 1. - * author: - * Paul Vixie, 1996. - */ -static int -inet_pton4(const char *src, u_char *dst) -{ - static const char digits[] = "0123456789"; - int saw_digit, octets, ch; - u_char tmp[INADDRSZ], *tp; - - saw_digit = 0; - octets = 0; - *(tp = tmp) = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr(digits, ch)) != NULL) { - u_int new = *tp * 10 + (pch - digits); - - if (new > 255) - return (0); - if (! saw_digit) { - if (++octets > 4) - return (0); - saw_digit = 1; - } - *tp = new; - } else if (ch == '.' && saw_digit) { - if (octets == 4) - return (0); - *++tp = 0; - saw_digit = 0; - } else - return (0); - } - if (octets < 4) - return (0); - - memcpy(dst, tmp, INADDRSZ); - return (1); -} - -/* int - * inet_pton6(src, dst) - * convert presentation level address to network order binary form. - * return: - * 1 if `src' is a valid [RFC1884 2.2] address, else 0. - * notice: - * does not touch `dst' unless it's returning 1. - * credit: - * inspired by Mark Andrews. - * author: - * Paul Vixie, 1996. - */ -static int -inet_pton6(const char *src, u_char *dst) -{ - static const char xdigits_l[] = "0123456789abcdef", - xdigits_u[] = "0123456789ABCDEF"; - u_char tmp[IN6ADDRSZ], *tp, *endp, *colonp; - const char *xdigits, *curtok; - int ch, saw_xdigit, count_xdigit; - u_int val; - - memset((tp = tmp), '\0', IN6ADDRSZ); - endp = tp + IN6ADDRSZ; - colonp = NULL; - /* Leading :: requires some special handling. */ - if (*src == ':') - if (*++src != ':') - return (0); - curtok = src; - saw_xdigit = count_xdigit = 0; - val = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) - pch = strchr((xdigits = xdigits_u), ch); - if (pch != NULL) { - if (count_xdigit >= 4) - return (0); - val <<= 4; - val |= (pch - xdigits); - if (val > 0xffff) - return (0); - saw_xdigit = 1; - count_xdigit++; - continue; - } - if (ch == ':') { - curtok = src; - if (!saw_xdigit) { - if (colonp) - return (0); - colonp = tp; - continue; - } else if (*src == '\0') { - return (0); - } - if (tp + INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - saw_xdigit = 0; - count_xdigit = 0; - val = 0; - continue; - } - if (ch == '.' && ((tp + INADDRSZ) <= endp) && - inet_pton4(curtok, tp) > 0) { - tp += INADDRSZ; - saw_xdigit = 0; - count_xdigit = 0; - break; /* '\0' was seen by inet_pton4(). */ - } - return (0); - } - if (saw_xdigit) { - if (tp + INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - } - if (colonp != NULL) { - /* - * Since some memmove()'s erroneously fail to handle - * overlapping regions, we'll do the shift by hand. - */ - const int n = tp - colonp; - int i; - - if (tp == endp) - return (0); - for (i = 1; i <= n; i++) { - endp[- i] = colonp[n - i]; - colonp[n - i] = 0; - } - tp = endp; - } - if (tp != endp) - return (0); - memcpy(dst, tmp, IN6ADDRSZ); - return (1); -} diff --git a/crypto/conf/conf_sap.c b/crypto/conf/conf_sap.c index a29acea..827cf96 100644 --- a/crypto/conf/conf_sap.c +++ b/crypto/conf/conf_sap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: conf_sap.c,v 1.11 2015/02/11 03:19:37 doug Exp $ */ +/* $OpenBSD: conf_sap.c,v 1.14 2018/03/19 03:56:08 beck Exp $ */ /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL * project 2001. */ @@ -56,6 +56,7 @@ * */ +#include #include #include @@ -75,14 +76,13 @@ * unless this is overridden by calling OPENSSL_no_config() */ -static int openssl_configured = 0; +static pthread_once_t openssl_configured = PTHREAD_ONCE_INIT; -void -OPENSSL_config(const char *config_name) +static const char *openssl_config_name; + +static void +OPENSSL_config_internal(void) { - if (openssl_configured) - return; - OPENSSL_load_builtin_modules(); #ifndef OPENSSL_NO_ENGINE /* Need to load ENGINEs */ @@ -91,7 +91,7 @@ OPENSSL_config(const char *config_name) /* Add others here? */ ERR_clear_error(); - if (CONF_modules_load_file(NULL, config_name, + if (CONF_modules_load_file(NULL, openssl_config_name, CONF_MFLAGS_DEFAULT_SECTION|CONF_MFLAGS_IGNORE_MISSING_FILE) <= 0) { BIO *bio_err; ERR_load_crypto_strings(); @@ -106,8 +106,49 @@ OPENSSL_config(const char *config_name) return; } +int +OpenSSL_config(const char *config_name) +{ + /* Don't override if NULL */ + /* + * Note - multiple threads calling this with *different* config names + * is probably not advisable. One thread will win, but you don't know + * if it will be the same thread as wins the pthread_once. + */ + if (config_name != NULL) + openssl_config_name = config_name; + + if (OPENSSL_init_crypto(0, NULL) == 0) + return 0; + + if (pthread_once(&openssl_configured, OPENSSL_config_internal) != 0) + return 0; + + return 1; +} + +void +OPENSSL_config(const char *config_name) +{ + (void) OpenSSL_config(config_name); +} + +static void +OPENSSL_no_config_internal(void) +{ +} + +int +OpenSSL_no_config(void) +{ + if (pthread_once(&openssl_configured, OPENSSL_no_config_internal) != 0) + return 0; + + return 1; +} + void OPENSSL_no_config(void) { - openssl_configured = 1; + (void) OpenSSL_no_config(); } diff --git a/crypto/cpuid-elf-x86_64.S b/crypto/cpuid-elf-x86_64.S index edc2f4d..c0e1366 100644 --- a/crypto/cpuid-elf-x86_64.S +++ b/crypto/cpuid-elf-x86_64.S @@ -20,7 +20,7 @@ OPENSSL_atomic_add: jne .Lspin movl %r8d,%eax .byte 0x48,0x98 - .byte 0xf3,0xc3 + retq .size OPENSSL_atomic_add,.-OPENSSL_atomic_add .globl OPENSSL_ia32_cpuid @@ -145,7 +145,7 @@ OPENSSL_ia32_cpuid: movl %r10d,%eax movq %r8,%rbx orq %r9,%rax - .byte 0xf3,0xc3 + retq .size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid .globl OPENSSL_wipe_cpu .type OPENSSL_wipe_cpu,@function @@ -176,7 +176,7 @@ OPENSSL_wipe_cpu: xorq %r10,%r10 xorq %r11,%r11 leaq 8(%rsp),%rax - .byte 0xf3,0xc3 + retq .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu #if defined(HAVE_GNU_STACK) .section .note.GNU-stack,"",%progbits diff --git a/crypto/cpuid-macosx-x86_64.S b/crypto/cpuid-macosx-x86_64.S index 0337d2d..7531770 100644 --- a/crypto/cpuid-macosx-x86_64.S +++ b/crypto/cpuid-macosx-x86_64.S @@ -21,7 +21,7 @@ L$spin: leaq (%rsi,%rax,1),%r8 jne L$spin movl %r8d,%eax .byte 0x48,0x98 - .byte 0xf3,0xc3 + retq .globl _OPENSSL_ia32_cpuid @@ -146,7 +146,7 @@ L$done: movl %r10d,%eax movq %r8,%rbx orq %r9,%rax - .byte 0xf3,0xc3 + retq .globl _OPENSSL_wipe_cpu @@ -177,5 +177,5 @@ _OPENSSL_wipe_cpu: xorq %r10,%r10 xorq %r11,%r11 leaq 8(%rsp),%rax - .byte 0xf3,0xc3 + retq diff --git a/crypto/crypto.sym b/crypto/crypto.sym index b8ea33b..78ffb85 100644 --- a/crypto/crypto.sym +++ b/crypto/crypto.sym @@ -104,6 +104,7 @@ ASN1_STRING_copy ASN1_STRING_data ASN1_STRING_dup ASN1_STRING_free +ASN1_STRING_get0_data ASN1_STRING_get_default_mask ASN1_STRING_length ASN1_STRING_length_set @@ -275,16 +276,37 @@ BIO_free_all BIO_get_accept_socket BIO_get_callback BIO_get_callback_arg +BIO_get_data BIO_get_ex_data BIO_get_ex_new_index BIO_get_host_ip +BIO_get_new_index BIO_get_port BIO_get_retry_BIO BIO_get_retry_reason +BIO_get_shutdown BIO_gethostbyname BIO_gets BIO_indent BIO_int_ctrl +BIO_meth_free +BIO_meth_get_callback_ctrl +BIO_meth_get_create +BIO_meth_get_ctrl +BIO_meth_get_destroy +BIO_meth_get_gets +BIO_meth_get_puts +BIO_meth_get_read +BIO_meth_get_write +BIO_meth_new +BIO_meth_set_callback_ctrl +BIO_meth_set_create +BIO_meth_set_ctrl +BIO_meth_set_destroy +BIO_meth_set_gets +BIO_meth_set_puts +BIO_meth_set_read +BIO_meth_set_write BIO_method_name BIO_method_type BIO_new @@ -326,8 +348,11 @@ BIO_set BIO_set_callback BIO_set_callback_arg BIO_set_cipher +BIO_set_data BIO_set_ex_data BIO_set_flags +BIO_set_init +BIO_set_shutdown BIO_set_tcp_ndelay BIO_snprintf BIO_sock_cleanup @@ -338,6 +363,7 @@ BIO_sock_should_retry BIO_socket_ioctl BIO_socket_nbio BIO_test_flags +BIO_up_ref BIO_vfree BIO_vprintf BIO_vsnprintf @@ -362,6 +388,9 @@ BN_CTX_init BN_CTX_new BN_CTX_start BN_GENCB_call +BN_GENCB_free +BN_GENCB_get_arg +BN_GENCB_new BN_GF2m_add BN_GF2m_arr2poly BN_GF2m_mod @@ -425,6 +454,14 @@ BN_get0_nist_prime_256 BN_get0_nist_prime_384 BN_get0_nist_prime_521 BN_get_params +BN_get_rfc2409_prime_1024 +BN_get_rfc2409_prime_768 +BN_get_rfc3526_prime_1536 +BN_get_rfc3526_prime_2048 +BN_get_rfc3526_prime_3072 +BN_get_rfc3526_prime_4096 +BN_get_rfc3526_prime_6144 +BN_get_rfc3526_prime_8192 BN_get_word BN_hex2bn BN_init @@ -728,22 +765,32 @@ DES_string_to_2keys DES_string_to_key DES_xcbc_encrypt DH_OpenSSL +DH_bits DH_check DH_check_pub_key +DH_clear_flags DH_compute_key DH_free DH_generate_key DH_generate_parameters DH_generate_parameters_ex +DH_get0_engine +DH_get0_key +DH_get0_pqg DH_get_default_method DH_get_ex_data DH_get_ex_new_index DH_new DH_new_method +DH_set0_key +DH_set0_pqg DH_set_default_method DH_set_ex_data +DH_set_flags +DH_set_length DH_set_method DH_size +DH_test_flags DH_up_ref DHparams_dup DHparams_it @@ -766,8 +813,11 @@ DSAPrivateKey_it DSAPublicKey_it DSA_OpenSSL DSA_SIG_free +DSA_SIG_get0 DSA_SIG_it DSA_SIG_new +DSA_SIG_set0 +DSA_clear_flags DSA_do_sign DSA_do_verify DSA_dup_DH @@ -775,19 +825,31 @@ DSA_free DSA_generate_key DSA_generate_parameters DSA_generate_parameters_ex +DSA_get0_engine +DSA_get0_key +DSA_get0_pqg DSA_get_default_method DSA_get_ex_data DSA_get_ex_new_index +DSA_meth_dup +DSA_meth_free +DSA_meth_new +DSA_meth_set_finish +DSA_meth_set_sign DSA_new DSA_new_method DSA_print DSA_print_fp +DSA_set0_key +DSA_set0_pqg DSA_set_default_method DSA_set_ex_data +DSA_set_flags DSA_set_method DSA_sign DSA_sign_setup DSA_size +DSA_test_flags DSA_up_ref DSA_verify DSAparams_dup @@ -829,8 +891,10 @@ ECDH_set_method ECDH_size ECDSA_OpenSSL ECDSA_SIG_free +ECDSA_SIG_get0 ECDSA_SIG_it ECDSA_SIG_new +ECDSA_SIG_set0 ECDSA_do_sign ECDSA_do_sign_ex ECDSA_do_verify @@ -1203,6 +1267,7 @@ EVP_CIPHER_CTX_key_length EVP_CIPHER_CTX_new EVP_CIPHER_CTX_nid EVP_CIPHER_CTX_rand_key +EVP_CIPHER_CTX_reset EVP_CIPHER_CTX_set_app_data EVP_CIPHER_CTX_set_flags EVP_CIPHER_CTX_set_key_length @@ -1261,8 +1326,11 @@ EVP_MD_CTX_copy_ex EVP_MD_CTX_create EVP_MD_CTX_ctrl EVP_MD_CTX_destroy +EVP_MD_CTX_free EVP_MD_CTX_init EVP_MD_CTX_md +EVP_MD_CTX_new +EVP_MD_CTX_reset EVP_MD_CTX_set_flags EVP_MD_CTX_test_flags EVP_MD_block_size @@ -1336,6 +1404,10 @@ EVP_PKEY_encrypt_init EVP_PKEY_encrypt_old EVP_PKEY_free EVP_PKEY_get0 +EVP_PKEY_get0_DH +EVP_PKEY_get0_DSA +EVP_PKEY_get0_EC_KEY +EVP_PKEY_get0_RSA EVP_PKEY_get0_asn1 EVP_PKEY_get1_DH EVP_PKEY_get1_DSA @@ -1388,6 +1460,7 @@ EVP_PKEY_sign EVP_PKEY_sign_init EVP_PKEY_size EVP_PKEY_type +EVP_PKEY_up_ref EVP_PKEY_verify EVP_PKEY_verify_init EVP_PKEY_verify_recover @@ -1587,7 +1660,11 @@ HKDF_extract HMAC HMAC_CTX_cleanup HMAC_CTX_copy +HMAC_CTX_free +HMAC_CTX_get_md HMAC_CTX_init +HMAC_CTX_new +HMAC_CTX_reset HMAC_CTX_set_flags HMAC_Final HMAC_Init @@ -1761,6 +1838,7 @@ OCSP_SINGLERESP_add1_ext_i2d OCSP_SINGLERESP_add_ext OCSP_SINGLERESP_delete_ext OCSP_SINGLERESP_free +OCSP_SINGLERESP_get0_id OCSP_SINGLERESP_get1_ext_d2i OCSP_SINGLERESP_get_ext OCSP_SINGLERESP_get_ext_by_NID @@ -1819,6 +1897,7 @@ OPENSSL_config OPENSSL_cpu_caps OPENSSL_cpuid_setup OPENSSL_init +OPENSSL_init_crypto OPENSSL_load_builtin_modules OPENSSL_no_config OPENSSL_strcasecmp @@ -1831,6 +1910,8 @@ OTHERNAME_new OpenSSLDie OpenSSL_add_all_ciphers OpenSSL_add_all_digests +OpenSSL_version +OpenSSL_version_num PBE2PARAM_free PBE2PARAM_it PBE2PARAM_new @@ -2173,17 +2254,28 @@ RSA_PSS_PARAMS_free RSA_PSS_PARAMS_it RSA_PSS_PARAMS_new RSA_X931_hash_id +RSA_bits RSA_blinding_off RSA_blinding_on RSA_check_key +RSA_clear_flags RSA_flags RSA_free RSA_generate_key RSA_generate_key_ex +RSA_get0_crt_params +RSA_get0_factors +RSA_get0_key RSA_get_default_method RSA_get_ex_data RSA_get_ex_new_index RSA_get_method +RSA_meth_dup +RSA_meth_free +RSA_meth_new +RSA_meth_set_finish +RSA_meth_set_priv_dec +RSA_meth_set_priv_enc RSA_new RSA_new_method RSA_padding_add_PKCS1_OAEP @@ -2204,13 +2296,18 @@ RSA_private_decrypt RSA_private_encrypt RSA_public_decrypt RSA_public_encrypt +RSA_set0_crt_params +RSA_set0_factors +RSA_set0_key RSA_set_default_method RSA_set_ex_data +RSA_set_flags RSA_set_method RSA_setup_blinding RSA_sign RSA_sign_ASN1_OCTET_STRING RSA_size +RSA_test_flags RSA_up_ref RSA_verify RSA_verify_ASN1_OCTET_STRING @@ -2569,6 +2666,10 @@ X509_CRL_dup X509_CRL_free X509_CRL_get0_by_cert X509_CRL_get0_by_serial +X509_CRL_get0_extensions +X509_CRL_get0_lastUpdate +X509_CRL_get0_nextUpdate +X509_CRL_get0_signature X509_CRL_get_ext X509_CRL_get_ext_by_NID X509_CRL_get_ext_by_OBJ @@ -2576,11 +2677,14 @@ X509_CRL_get_ext_by_critical X509_CRL_get_ext_count X509_CRL_get_ext_d2i X509_CRL_get_meth_data +X509_CRL_get_signature_nid X509_CRL_it X509_CRL_match X509_CRL_new X509_CRL_print X509_CRL_print_fp +X509_CRL_set1_lastUpdate +X509_CRL_set1_nextUpdate X509_CRL_set_default_method X509_CRL_set_issuer_name X509_CRL_set_lastUpdate @@ -2590,6 +2694,7 @@ X509_CRL_set_version X509_CRL_sign X509_CRL_sign_ctx X509_CRL_sort +X509_CRL_up_ref X509_CRL_verify X509_EXTENSIONS_it X509_EXTENSION_create_by_NID @@ -2628,6 +2733,7 @@ X509_NAME_ENTRY_get_data X509_NAME_ENTRY_get_object X509_NAME_ENTRY_it X509_NAME_ENTRY_new +X509_NAME_ENTRY_set X509_NAME_ENTRY_set_data X509_NAME_ENTRY_set_object X509_NAME_INTERNAL_it @@ -2641,6 +2747,7 @@ X509_NAME_digest X509_NAME_dup X509_NAME_entry_count X509_NAME_free +X509_NAME_get0_der X509_NAME_get_entry X509_NAME_get_index_by_NID X509_NAME_get_index_by_OBJ @@ -2656,6 +2763,9 @@ X509_NAME_print_ex X509_NAME_print_ex_fp X509_NAME_set X509_OBJECT_free_contents +X509_OBJECT_get0_X509 +X509_OBJECT_get0_X509_CRL +X509_OBJECT_get_type X509_OBJECT_idx_by_subject X509_OBJECT_retrieve_by_subject X509_OBJECT_retrieve_match @@ -2665,6 +2775,7 @@ X509_PKEY_new X509_POLICY_NODE_print X509_PUBKEY_free X509_PUBKEY_get +X509_PUBKEY_get0 X509_PUBKEY_get0_param X509_PUBKEY_it X509_PUBKEY_new @@ -2696,6 +2807,7 @@ X509_REQ_digest X509_REQ_dup X509_REQ_extension_nid X509_REQ_free +X509_REQ_get0_signature X509_REQ_get1_email X509_REQ_get_attr X509_REQ_get_attr_by_NID @@ -2704,6 +2816,7 @@ X509_REQ_get_attr_count X509_REQ_get_extension_nids X509_REQ_get_extensions X509_REQ_get_pubkey +X509_REQ_get_signature_nid X509_REQ_it X509_REQ_new X509_REQ_print @@ -2720,7 +2833,11 @@ X509_REQ_verify X509_REVOKED_add1_ext_i2d X509_REVOKED_add_ext X509_REVOKED_delete_ext +X509_REVOKED_dup X509_REVOKED_free +X509_REVOKED_get0_extensions +X509_REVOKED_get0_revocationDate +X509_REVOKED_get0_serialNumber X509_REVOKED_get_ext X509_REVOKED_get_ext_by_NID X509_REVOKED_get_ext_by_OBJ @@ -2736,11 +2853,15 @@ X509_SIG_it X509_SIG_new X509_STORE_CTX_cleanup X509_STORE_CTX_free +X509_STORE_CTX_get0_cert +X509_STORE_CTX_get0_chain X509_STORE_CTX_get0_current_crl X509_STORE_CTX_get0_current_issuer X509_STORE_CTX_get0_param X509_STORE_CTX_get0_parent_ctx X509_STORE_CTX_get0_policy_tree +X509_STORE_CTX_get0_store +X509_STORE_CTX_get0_untrusted X509_STORE_CTX_get1_chain X509_STORE_CTX_get1_issuer X509_STORE_CTX_get_chain @@ -2755,6 +2876,8 @@ X509_STORE_CTX_new X509_STORE_CTX_purpose_inherit X509_STORE_CTX_set0_crls X509_STORE_CTX_set0_param +X509_STORE_CTX_set0_trusted_stack +X509_STORE_CTX_set0_untrusted X509_STORE_CTX_set_cert X509_STORE_CTX_set_chain X509_STORE_CTX_set_default @@ -2771,19 +2894,24 @@ X509_STORE_add_cert X509_STORE_add_crl X509_STORE_add_lookup X509_STORE_free +X509_STORE_get0_objects +X509_STORE_get0_param X509_STORE_get1_certs X509_STORE_get1_crls X509_STORE_get_by_subject +X509_STORE_get_ex_data X509_STORE_load_locations X509_STORE_load_mem X509_STORE_new X509_STORE_set1_param X509_STORE_set_default_paths X509_STORE_set_depth +X509_STORE_set_ex_data X509_STORE_set_flags X509_STORE_set_purpose X509_STORE_set_trust X509_STORE_set_verify_cb +X509_STORE_up_ref X509_TRUST_add X509_TRUST_cleanup X509_TRUST_get0 @@ -2799,18 +2927,28 @@ X509_VAL_it X509_VAL_new X509_VERIFY_PARAM_add0_policy X509_VERIFY_PARAM_add0_table +X509_VERIFY_PARAM_add1_host X509_VERIFY_PARAM_clear_flags X509_VERIFY_PARAM_free +X509_VERIFY_PARAM_get0 +X509_VERIFY_PARAM_get0_name +X509_VERIFY_PARAM_get0_peername +X509_VERIFY_PARAM_get_count X509_VERIFY_PARAM_get_depth X509_VERIFY_PARAM_get_flags X509_VERIFY_PARAM_inherit X509_VERIFY_PARAM_lookup X509_VERIFY_PARAM_new X509_VERIFY_PARAM_set1 +X509_VERIFY_PARAM_set1_email +X509_VERIFY_PARAM_set1_host +X509_VERIFY_PARAM_set1_ip +X509_VERIFY_PARAM_set1_ip_asc X509_VERIFY_PARAM_set1_name X509_VERIFY_PARAM_set1_policies X509_VERIFY_PARAM_set_depth X509_VERIFY_PARAM_set_flags +X509_VERIFY_PARAM_set_hostflags X509_VERIFY_PARAM_set_purpose X509_VERIFY_PARAM_set_time X509_VERIFY_PARAM_set_trust @@ -2822,6 +2960,7 @@ X509_add_ext X509_alias_get0 X509_alias_set1 X509_certificate_type +X509_chain_up_ref X509_check_akid X509_check_ca X509_check_email @@ -2842,7 +2981,13 @@ X509_email_free X509_find_by_issuer_and_serial X509_find_by_subject X509_free +X509_get0_extensions +X509_get0_notAfter +X509_get0_notBefore +X509_get0_pubkey X509_get0_pubkey_bitstr +X509_get0_signature +X509_get0_tbs_sigalg X509_get1_email X509_get1_ocsp X509_get_default_cert_area @@ -2863,7 +3008,10 @@ X509_get_issuer_name X509_get_pubkey X509_get_pubkey_parameters X509_get_serialNumber +X509_get_signature_nid X509_get_subject_name +X509_getm_notAfter +X509_getm_notBefore X509_gmtime_adj X509_issuer_and_serial_cmp X509_issuer_and_serial_hash @@ -2895,6 +3043,8 @@ X509_print_ex_fp X509_print_fp X509_pubkey_digest X509_reject_clear +X509_set1_notAfter +X509_set1_notBefore X509_set_ex_data X509_set_issuer_name X509_set_notAfter diff --git a/crypto/crypto_init.c b/crypto/crypto_init.c new file mode 100644 index 0000000..08fb55f --- /dev/null +++ b/crypto/crypto_init.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018 Bob Beck + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* OpenSSL style init */ + +#include +#include + +#include +#include +#include +#include +#include "cryptlib.h" + +int OpenSSL_config(const char *); +int OpenSSL_no_config(void); + +static pthread_t crypto_init_thread; + +static void +OPENSSL_init_crypto_internal(void) +{ + crypto_init_thread = pthread_self(); + OPENSSL_cpuid_setup(); + ERR_load_crypto_strings(); + OpenSSL_add_all_ciphers(); + OpenSSL_add_all_digests(); +} + +int +OPENSSL_init_crypto(uint64_t opts, const void *settings) +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + + if (pthread_equal(pthread_self(), crypto_init_thread)) + return 1; /* don't recurse */ + + if (pthread_once(&once, OPENSSL_init_crypto_internal) != 0) + return 0; + + if ((opts & OPENSSL_INIT_NO_LOAD_CONFIG) && + (OpenSSL_no_config() == 0)) + return 0; + + if ((opts & OPENSSL_INIT_LOAD_CONFIG) && + (OpenSSL_config(NULL) == 0)) + return 0; + + return 1; +} diff --git a/crypto/cversion.c b/crypto/cversion.c index 7ffa80e..2d4460d 100644 --- a/crypto/cversion.c +++ b/crypto/cversion.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cversion.c,v 1.15 2014/07/11 11:42:28 jsing Exp $ */ +/* $OpenBSD: cversion.c,v 1.17 2018/02/17 06:56:12 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -84,3 +84,29 @@ SSLeay(void) { return (SSLEAY_VERSION_NUMBER); } + +const char * +OpenSSL_version(int t) +{ + switch (t) { + case OPENSSL_VERSION: + return OPENSSL_VERSION_TEXT; + case OPENSSL_BUILT_ON: + return("built on: date not available"); + case OPENSSL_CFLAGS: + return("compiler: information not available"); + case OPENSSL_PLATFORM: + return("platform: information not available"); + case OPENSSL_DIR: + return "OPENSSLDIR: \"" OPENSSLDIR "\""; + case OPENSSL_ENGINES_DIR: + return "ENGINESDIR: N/A"; + } + return("not available"); +} + +unsigned long +OpenSSL_version_num(void) +{ + return SSLeay(); +} diff --git a/crypto/dh/dh_lib.c b/crypto/dh/dh_lib.c index d45dc17..e02ce74 100644 --- a/crypto/dh/dh_lib.c +++ b/crypto/dh/dh_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dh_lib.c,v 1.22 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: dh_lib.c,v 1.30 2018/02/22 16:41:04 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -56,6 +56,7 @@ * [including the GNU Public Licence.] */ +#include #include #include @@ -239,3 +240,104 @@ DH_size(const DH *dh) { return BN_num_bytes(dh->p); } + +int +DH_bits(const DH *dh) +{ + return BN_num_bits(dh->p); +} + +ENGINE * +DH_get0_engine(DH *dh) +{ + return dh->engine; +} + +void +DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g) +{ + if (p != NULL) + *p = dh->p; + if (q != NULL) + *q = dh->q; + if (g != NULL) + *g = dh->g; +} + +int +DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g) +{ + if ((dh->p == NULL && p == NULL) || (dh->g == NULL && g == NULL)) + return 0; + + if (p != NULL) { + BN_free(dh->p); + dh->p = p; + } + if (q != NULL) { + BN_free(dh->q); + dh->q = q; + } + if (g != NULL) { + BN_free(dh->g); + dh->g = g; + } + + return 1; +} + +void +DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key) +{ + if (pub_key != NULL) + *pub_key = dh->pub_key; + if (priv_key != NULL) + *priv_key = dh->priv_key; +} + +int +DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key) +{ + if ((dh->pub_key == NULL && pub_key == NULL) || + (dh->priv_key == NULL && priv_key == NULL)) + return 0; + + if (pub_key != NULL) { + BN_free(dh->pub_key); + dh->pub_key = pub_key; + } + if (priv_key != NULL) { + BN_free(dh->priv_key); + dh->priv_key = priv_key; + } + + return 1; +} + +void +DH_clear_flags(DH *dh, int flags) +{ + dh->flags &= ~flags; +} + +int +DH_test_flags(const DH *dh, int flags) +{ + return dh->flags & flags; +} + +void +DH_set_flags(DH *dh, int flags) +{ + dh->flags |= flags; +} + +int +DH_set_length(DH *dh, long length) +{ + if (length < 0 || length > INT_MAX) + return 0; + + dh->length = length; + return 1; +} diff --git a/crypto/dsa/dsa_asn1.c b/crypto/dsa/dsa_asn1.c index f7dfaf1..aac67db 100644 --- a/crypto/dsa/dsa_asn1.c +++ b/crypto/dsa/dsa_asn1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsa_asn1.c,v 1.20 2017/05/02 03:59:44 deraadt Exp $ */ +/* $OpenBSD: dsa_asn1.c,v 1.21 2018/02/20 17:48:35 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2000. */ @@ -133,6 +133,29 @@ i2d_DSA_SIG(const DSA_SIG *a, unsigned char **out) return ASN1_item_i2d((ASN1_VALUE *)a, out, &DSA_SIG_it); } +void +DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps) +{ + if (pr != NULL) + *pr = sig->r; + if (ps != NULL) + *ps = sig->s; +} + +int +DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s) +{ + if (r == NULL || s == NULL) + return 0; + + BN_clear_free(sig->r); + sig->r = r; + BN_clear_free(sig->s); + sig->s = s; + + return 1; +} + /* Override the default free and new methods */ static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg) diff --git a/crypto/dsa/dsa_lib.c b/crypto/dsa/dsa_lib.c index 58af748..8190d07 100644 --- a/crypto/dsa/dsa_lib.c +++ b/crypto/dsa/dsa_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsa_lib.c,v 1.23 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: dsa_lib.c,v 1.28 2018/02/20 17:52:27 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -303,3 +303,88 @@ err: return NULL; } #endif + +void +DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g) +{ + if (p != NULL) + *p = d->p; + if (q != NULL) + *q = d->q; + if (g != NULL) + *g = d->g; +} + +int +DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g) +{ + if ((d->p == NULL && p == NULL) || (d->q == NULL && q == NULL) || + (d->g == NULL && g == NULL)) + return 0; + + if (p != NULL) { + BN_free(d->p); + d->p = p; + } + if (q != NULL) { + BN_free(d->q); + d->q = q; + } + if (g != NULL) { + BN_free(d->g); + d->g = g; + } + + return 1; +} + +void +DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key) +{ + if (pub_key != NULL) + *pub_key = d->pub_key; + if (priv_key != NULL) + *priv_key = d->priv_key; +} + +int +DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key) +{ + if (d->pub_key == NULL && pub_key == NULL) + return 0; + + if (pub_key != NULL) { + BN_free(d->pub_key); + d->pub_key = pub_key; + } + if (priv_key != NULL) { + BN_free(d->priv_key); + d->priv_key = priv_key; + } + + return 1; +} + +void +DSA_clear_flags(DSA *d, int flags) +{ + d->flags &= ~flags; +} + +int +DSA_test_flags(const DSA *d, int flags) +{ + return d->flags & flags; +} + +void +DSA_set_flags(DSA *d, int flags) +{ + d->flags |= flags; +} + +ENGINE * +DSA_get0_engine(DSA *d) +{ + return d->engine; +} diff --git a/crypto/dsa/dsa_meth.c b/crypto/dsa/dsa_meth.c new file mode 100644 index 0000000..e6f043f --- /dev/null +++ b/crypto/dsa/dsa_meth.c @@ -0,0 +1,78 @@ +/* $OpenBSD: dsa_meth.c,v 1.1 2018/03/17 15:19:12 tb Exp $ */ +/* + * Copyright (c) 2018 Theo Buehler + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +#include +#include + +DSA_METHOD * +DSA_meth_new(const char *name, int flags) +{ + DSA_METHOD *meth; + + if ((meth = calloc(1, sizeof(*meth))) == NULL) + return NULL; + if ((meth->name = strdup(name)) == NULL) { + free(meth); + return NULL; + } + meth->flags = flags; + + return meth; +} + +void +DSA_meth_free(DSA_METHOD *meth) +{ + if (meth != NULL) { + free((char *)meth->name); + free(meth); + } +} + +DSA_METHOD * +DSA_meth_dup(const DSA_METHOD *meth) +{ + DSA_METHOD *copy; + + if ((copy = calloc(1, sizeof(*copy))) == NULL) + return NULL; + memcpy(copy, meth, sizeof(*copy)); + if ((copy->name = strdup(meth->name)) == NULL) { + free(copy); + return NULL; + } + + return copy; +} + +int +DSA_meth_set_sign(DSA_METHOD *meth, + DSA_SIG *(*sign)(const unsigned char *, int, DSA *)) +{ + meth->dsa_do_sign = sign; + return 1; +} + +int +DSA_meth_set_finish(DSA_METHOD *meth, int (*finish)(DSA *)) +{ + meth->finish = finish; + return 1; +} diff --git a/crypto/ec/ec_ameth.c b/crypto/ec/ec_ameth.c index 8d0cdb7..0932f1e 100644 --- a/crypto/ec/ec_ameth.c +++ b/crypto/ec/ec_ameth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_ameth.c,v 1.18 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: ec_ameth.c,v 1.19 2018/03/12 13:14:21 inoguchi Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2006. */ @@ -433,13 +433,15 @@ do_EC_KEY_print(BIO * bp, const EC_KEY * x, int off, int ktype) } if (ktype > 0) { public_key = EC_KEY_get0_public_key(x); - if ((pub_key = EC_POINT_point2bn(group, public_key, + if (public_key != NULL) { + if ((pub_key = EC_POINT_point2bn(group, public_key, EC_KEY_get_conv_form(x), NULL, ctx)) == NULL) { - reason = ERR_R_EC_LIB; - goto err; + reason = ERR_R_EC_LIB; + goto err; + } + if (pub_key) + buf_len = (size_t) BN_num_bytes(pub_key); } - if (pub_key) - buf_len = (size_t) BN_num_bytes(pub_key); } if (ktype == 2) { priv_key = EC_KEY_get0_private_key(x); diff --git a/crypto/ec/ec_asn1.c b/crypto/ec/ec_asn1.c index b64b7e1..381addf 100644 --- a/crypto/ec/ec_asn1.c +++ b/crypto/ec/ec_asn1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_asn1.c,v 1.24 2017/05/26 16:32:14 jsing Exp $ */ +/* $OpenBSD: ec_asn1.c,v 1.25 2018/03/12 13:14:21 inoguchi Exp $ */ /* * Written by Nils Larsch for the OpenSSL project. */ @@ -1380,17 +1380,18 @@ d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) goto err; } + if (ret->pub_key) + EC_POINT_clear_free(ret->pub_key); + ret->pub_key = EC_POINT_new(ret->group); + if (ret->pub_key == NULL) { + ECerror(ERR_R_EC_LIB); + goto err; + } + if (priv_key->publicKey) { const unsigned char *pub_oct; size_t pub_oct_len; - EC_POINT_clear_free(ret->pub_key); - ret->pub_key = EC_POINT_new(ret->group); - if (ret->pub_key == NULL) { - ECerror(ERR_R_EC_LIB); - goto err; - } - pub_oct = ASN1_STRING_data(priv_key->publicKey); pub_oct_len = ASN1_STRING_length(priv_key->publicKey); if (pub_oct == NULL || pub_oct_len <= 0) { @@ -1405,6 +1406,14 @@ d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) ECerror(ERR_R_EC_LIB); goto err; } + } else { + if (!EC_POINT_mul(ret->group, ret->pub_key, ret->priv_key, + NULL, NULL, NULL)) { + ECerror(ERR_R_EC_LIB); + goto err; + } + /* Remember the original private-key-only encoding. */ + ret->enc_flag |= EC_PKEY_NO_PUBKEY; } EC_PRIVATEKEY_free(priv_key); @@ -1429,7 +1438,8 @@ i2d_ECPrivateKey(EC_KEY * a, unsigned char **out) size_t buf_len = 0, tmp_len; EC_PRIVATEKEY *priv_key = NULL; - if (a == NULL || a->group == NULL || a->priv_key == NULL) { + if (a == NULL || a->group == NULL || a->priv_key == NULL || + (!(a->enc_flag & EC_PKEY_NO_PUBKEY) && a->pub_key == NULL)) { ECerror(ERR_R_PASSED_NULL_PARAMETER); goto err; } diff --git a/crypto/ec/ec_curve.c b/crypto/ec/ec_curve.c index 1ee2a7c..d4f6c28 100644 --- a/crypto/ec/ec_curve.c +++ b/crypto/ec/ec_curve.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_curve.c,v 1.15 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: ec_curve.c,v 1.16 2018/03/16 12:31:09 mpi Exp $ */ /* * Written by Nils Larsch for the OpenSSL project. */ @@ -2135,7 +2135,7 @@ static const struct { } }; -/* IPSec curves */ +/* IPsec curves */ /* NOTE: The of curves over a extension field of non prime degree * is not recommended (Weil-descent). * As the group order is not a prime this curve is not suitable diff --git a/crypto/ecdsa/ecs_asn1.c b/crypto/ecdsa/ecs_asn1.c index 725fe44..e463858 100644 --- a/crypto/ecdsa/ecs_asn1.c +++ b/crypto/ecdsa/ecs_asn1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ecs_asn1.c,v 1.8 2015/10/16 15:15:39 jsing Exp $ */ +/* $OpenBSD: ecs_asn1.c,v 1.9 2018/03/17 15:24:44 tb Exp $ */ /* ==================================================================== * Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. * @@ -113,3 +113,25 @@ ECDSA_SIG_free(ECDSA_SIG *a) { ASN1_item_free((ASN1_VALUE *)a, &ECDSA_SIG_it); } + +void +ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps) +{ + if (pr != NULL) + *pr = sig->r; + if (ps != NULL) + *ps = sig->s; +} + +int +ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s) +{ + if (r == NULL || s == NULL) + return 0; + + BN_clear_free(sig->r); + BN_clear_free(sig->s); + sig->r = r; + sig->s = s; + return 1; +} diff --git a/crypto/engine/eng_all.c b/crypto/engine/eng_all.c index 7640cf7..403ca68 100644 --- a/crypto/engine/eng_all.c +++ b/crypto/engine/eng_all.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eng_all.c,v 1.29 2015/07/19 22:34:27 doug Exp $ */ +/* $OpenBSD: eng_all.c,v 1.30 2018/03/17 16:20:01 beck Exp $ */ /* Written by Richard Levitte for the OpenSSL * project 2000. */ @@ -56,17 +56,16 @@ * */ +#include + #include #include "cryptlib.h" #include "eng_int.h" void -ENGINE_load_builtin_engines(void) +ENGINE_load_builtin_engines_internal(void) { - /* Some ENGINEs need this */ - OPENSSL_cpuid_setup(); - #ifndef OPENSSL_NO_STATIC_ENGINE #ifndef OPENSSL_NO_HW #ifndef OPENSSL_NO_HW_PADLOCK @@ -76,3 +75,14 @@ ENGINE_load_builtin_engines(void) #endif ENGINE_register_all_complete(); } + +void +ENGINE_load_builtin_engines(void) +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + + /* Prayer and clean living lets you ignore errors, OpenSSL style */ + (void) OPENSSL_init_crypto(0, NULL); + + (void) pthread_once(&once, ENGINE_load_builtin_engines_internal); +} diff --git a/crypto/engine/eng_lib.c b/crypto/engine/eng_lib.c index d2da29f..11ad771 100644 --- a/crypto/engine/eng_lib.c +++ b/crypto/engine/eng_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eng_lib.c,v 1.12 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: eng_lib.c,v 1.13 2018/03/17 16:20:01 beck Exp $ */ /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL * project 2000. */ @@ -70,6 +70,9 @@ ENGINE_new(void) { ENGINE *ret; + if (!OPENSSL_init_crypto(0, NULL)) + return NULL; + ret = malloc(sizeof(ENGINE)); if (ret == NULL) { ENGINEerror(ERR_R_MALLOC_FAILURE); diff --git a/crypto/err/err.c b/crypto/err/err.c index ffe25bf..320078d 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -1,4 +1,4 @@ -/* $OpenBSD: err.c,v 1.45 2017/02/20 23:21:19 beck Exp $ */ +/* $OpenBSD: err.c,v 1.46 2018/03/17 16:20:01 beck Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -109,6 +109,7 @@ * */ +#include #include #include #include @@ -282,6 +283,8 @@ static LHASH_OF(ERR_STATE) *int_thread_hash = NULL; static int int_thread_hash_references = 0; static int int_err_library_number = ERR_LIB_USER; +static pthread_t err_init_thread; + /* Internal function that checks whether "err_fns" is set and if not, sets it to * the defaults. */ static void @@ -650,8 +653,9 @@ ERR_STATE_free(ERR_STATE *s) } void -ERR_load_ERR_strings(void) +ERR_load_ERR_strings_internal(void) { + err_init_thread = pthread_self(); err_fns_check(); #ifndef OPENSSL_NO_ERR err_load_strings(0, ERR_str_libraries); @@ -662,6 +666,21 @@ ERR_load_ERR_strings(void) #endif } + +void +ERR_load_ERR_strings(void) +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + + if (pthread_equal(pthread_self(), err_init_thread)) + return; /* don't recurse */ + + /* Prayer and clean living lets you ignore errors, OpenSSL style */ + (void) OPENSSL_init_crypto(0, NULL); + + (void) pthread_once(&once, ERR_load_ERR_strings_internal); +} + static void err_load_strings(int lib, ERR_STRING_DATA *str) { @@ -683,6 +702,9 @@ ERR_load_strings(int lib, ERR_STRING_DATA *str) void ERR_unload_strings(int lib, ERR_STRING_DATA *str) { + /* Prayer and clean living lets you ignore errors, OpenSSL style */ + (void) OPENSSL_init_crypto(0, NULL); + while (str->error) { if (lib) str->error |= ERR_PACK(lib, 0, 0); @@ -694,6 +716,9 @@ ERR_unload_strings(int lib, ERR_STRING_DATA *str) void ERR_free_strings(void) { + /* Prayer and clean living lets you ignore errors, OpenSSL style */ + (void) OPENSSL_init_crypto(0, NULL); + err_fns_check(); ERRFN(err_del)(); } @@ -953,6 +978,9 @@ ERR_lib_error_string(unsigned long e) ERR_STRING_DATA d, *p; unsigned long l; + if (!OPENSSL_init_crypto(0, NULL)) + return NULL; + err_fns_check(); l = ERR_GET_LIB(e); d.error = ERR_PACK(l, 0, 0); diff --git a/crypto/err/err_all.c b/crypto/err/err_all.c index 40009cb..24de3c9 100644 --- a/crypto/err/err_all.c +++ b/crypto/err/err_all.c @@ -1,4 +1,4 @@ -/* $OpenBSD: err_all.c,v 1.23 2016/10/19 16:49:11 jsing Exp $ */ +/* $OpenBSD: err_all.c,v 1.24 2018/03/17 16:20:01 beck Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -56,6 +56,7 @@ * [including the GNU Public Licence.] */ +#include #include #include @@ -103,11 +104,13 @@ #include #endif -void -ERR_load_crypto_strings(void) +void ERR_load_ERR_strings_internal(void); + +static void +ERR_load_crypto_strings_internal(void) { #ifndef OPENSSL_NO_ERR - ERR_load_ERR_strings(); /* include error strings for SYSerr */ + ERR_load_ERR_strings_internal(); /* include error strings for SYSerr */ ERR_load_BN_strings(); #ifndef OPENSSL_NO_RSA ERR_load_RSA_strings(); @@ -153,3 +156,10 @@ ERR_load_crypto_strings(void) #endif #endif } + +void +ERR_load_crypto_strings(void) +{ + static pthread_once_t loaded = PTHREAD_ONCE_INIT; + (void) pthread_once(&loaded, ERR_load_crypto_strings_internal); +} diff --git a/crypto/evp/c_all.c b/crypto/evp/c_all.c index 8ab93fe..87657ed 100644 --- a/crypto/evp/c_all.c +++ b/crypto/evp/c_all.c @@ -1,4 +1,4 @@ -/* $OpenBSD: c_all.c,v 1.21 2017/03/01 13:53:58 jsing Exp $ */ +/* $OpenBSD: c_all.c,v 1.22 2018/03/17 16:20:01 beck Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -57,6 +57,7 @@ */ #include +#include #include @@ -66,8 +67,8 @@ #include "cryptlib.h" -void -OpenSSL_add_all_ciphers(void) +static void +OpenSSL_add_all_ciphers_internal(void) { #ifndef OPENSSL_NO_DES EVP_add_cipher(EVP_des_cfb()); @@ -226,7 +227,14 @@ OpenSSL_add_all_ciphers(void) } void -OpenSSL_add_all_digests(void) +OpenSSL_add_all_ciphers(void) +{ + static pthread_once_t add_all_ciphers_once = PTHREAD_ONCE_INIT; + (void) pthread_once(&add_all_ciphers_once, OpenSSL_add_all_ciphers_internal); +} + +static void +OpenSSL_add_all_digests_internal(void) { #ifndef OPENSSL_NO_MD4 EVP_add_digest(EVP_md4()); @@ -283,6 +291,13 @@ OpenSSL_add_all_digests(void) #endif } +void +OpenSSL_add_all_digests(void) +{ + static pthread_once_t add_all_digests_once = PTHREAD_ONCE_INIT; + (void) pthread_once(&add_all_digests_once, OpenSSL_add_all_digests_internal); +} + void OPENSSL_add_all_algorithms_noconf(void) { diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c index 7471c1e..b69a928 100644 --- a/crypto/evp/digest.c +++ b/crypto/evp/digest.c @@ -1,4 +1,4 @@ -/* $OpenBSD: digest.c,v 1.28 2017/05/02 03:59:44 deraadt Exp $ */ +/* $OpenBSD: digest.c,v 1.29 2018/02/17 14:55:31 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -122,18 +122,6 @@ #include #endif -void -EVP_MD_CTX_init(EVP_MD_CTX *ctx) -{ - memset(ctx, 0, sizeof *ctx); -} - -EVP_MD_CTX * -EVP_MD_CTX_create(void) -{ - return calloc(1, sizeof(EVP_MD_CTX)); -} - int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type) { @@ -339,20 +327,53 @@ EVP_Digest(const void *data, size_t count, return ret; } +EVP_MD_CTX * +EVP_MD_CTX_new(void) +{ + return calloc(1, sizeof(EVP_MD_CTX)); +} + +void +EVP_MD_CTX_free(EVP_MD_CTX *ctx) +{ + if (ctx == NULL) + return; + + EVP_MD_CTX_cleanup(ctx); + + free(ctx); +} + +void +EVP_MD_CTX_init(EVP_MD_CTX *ctx) +{ + memset(ctx, 0, sizeof(*ctx)); +} + +int +EVP_MD_CTX_reset(EVP_MD_CTX *ctx) +{ + return EVP_MD_CTX_cleanup(ctx); +} + +EVP_MD_CTX * +EVP_MD_CTX_create(void) +{ + return EVP_MD_CTX_new(); +} + void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx) { - if (ctx) { - EVP_MD_CTX_cleanup(ctx); - free(ctx); - } + EVP_MD_CTX_free(ctx); } /* This call frees resources associated with the context */ int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) { - /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final, + /* + * Don't assume ctx->md_data was cleaned in EVP_Digest_Final, * because sometimes only copies of the context are ever finalised. */ if (ctx->digest && ctx->digest->cleanup && @@ -368,7 +389,7 @@ EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) * functional reference we held for this reason. */ ENGINE_finish(ctx->engine); #endif - memset(ctx, 0, sizeof *ctx); + memset(ctx, 0, sizeof(*ctx)); return 1; } diff --git a/crypto/evp/evp_enc.c b/crypto/evp/evp_enc.c index d0a5eb2..de7c690 100644 --- a/crypto/evp/evp_enc.c +++ b/crypto/evp/evp_enc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: evp_enc.c,v 1.36 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: evp_enc.c,v 1.38 2018/02/17 16:54:08 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -75,18 +75,6 @@ #define M_do_cipher(ctx, out, in, inl) ctx->cipher->do_cipher(ctx, out, in, inl) -void -EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx) -{ - memset(ctx, 0, sizeof(EVP_CIPHER_CTX)); -} - -EVP_CIPHER_CTX * -EVP_CIPHER_CTX_new(void) -{ - return calloc(1, sizeof(EVP_CIPHER_CTX)); -} - int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv, int enc) @@ -258,7 +246,7 @@ EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) } __warn_references(EVP_CipherFinal, - "warning: EVP_CipherFinal is often misused, please use EVP_CipherFinal_ex and EVP_CIPHER_CTX_cleanup"); + "EVP_CipherFinal is often misused, please use EVP_CipherFinal_ex and EVP_CIPHER_CTX_cleanup"); int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) @@ -368,7 +356,7 @@ EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, } __warn_references(EVP_EncryptFinal, - "warning: EVP_EncryptFinal is often misused, please use EVP_EncryptFinal_ex and EVP_CIPHER_CTX_cleanup"); + "EVP_EncryptFinal is often misused, please use EVP_EncryptFinal_ex and EVP_CIPHER_CTX_cleanup"); int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) @@ -483,7 +471,7 @@ EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, } __warn_references(EVP_DecryptFinal, - "warning: EVP_DecryptFinal is often misused, please use EVP_DecryptFinal_ex and EVP_CIPHER_CTX_cleanup"); + "EVP_DecryptFinal is often misused, please use EVP_DecryptFinal_ex and EVP_CIPHER_CTX_cleanup"); int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) @@ -548,13 +536,33 @@ EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) return (1); } +EVP_CIPHER_CTX * +EVP_CIPHER_CTX_new(void) +{ + return calloc(1, sizeof(EVP_CIPHER_CTX)); +} + void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx) { - if (ctx) { - EVP_CIPHER_CTX_cleanup(ctx); - free(ctx); - } + if (ctx == NULL) + return; + + EVP_CIPHER_CTX_cleanup(ctx); + + free(ctx); +} + +void +EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx) +{ + memset(ctx, 0, sizeof(EVP_CIPHER_CTX)); +} + +int +EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *a) +{ + return EVP_CIPHER_CTX_cleanup(a); } int diff --git a/crypto/evp/names.c b/crypto/evp/names.c index ebaa3a2..dfcf9ee 100644 --- a/crypto/evp/names.c +++ b/crypto/evp/names.c @@ -1,4 +1,4 @@ -/* $OpenBSD: names.c,v 1.13 2017/04/29 21:48:44 jsing Exp $ */ +/* $OpenBSD: names.c,v 1.14 2018/03/17 16:20:01 beck Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -113,6 +113,9 @@ EVP_get_cipherbyname(const char *name) { const EVP_CIPHER *cp; + if (!OPENSSL_init_crypto(0, NULL)) + return NULL; + cp = (const EVP_CIPHER *)OBJ_NAME_get(name, OBJ_NAME_TYPE_CIPHER_METH); return (cp); } @@ -122,6 +125,9 @@ EVP_get_digestbyname(const char *name) { const EVP_MD *cp; + if (!OPENSSL_init_crypto(0, NULL)) + return NULL; + cp = (const EVP_MD *)OBJ_NAME_get(name, OBJ_NAME_TYPE_MD_METH); return (cp); } @@ -167,6 +173,9 @@ EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, const char *from, { struct doall_cipher dc; + /* Prayer and clean living lets you ignore errors, OpenSSL style */ + (void) OPENSSL_init_crypto(0, NULL); + dc.fn = fn; dc.arg = arg; OBJ_NAME_do_all(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn, &dc); @@ -178,6 +187,9 @@ EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, const char *from, { struct doall_cipher dc; + /* Prayer and clean living lets you ignore errors, OpenSSL style */ + (void) OPENSSL_init_crypto(0, NULL); + dc.fn = fn; dc.arg = arg; OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, @@ -207,6 +219,9 @@ EVP_MD_do_all(void (*fn)(const EVP_MD *md, const char *from, const char *to, { struct doall_md dc; + /* Prayer and clean living lets you ignore errors, OpenSSL style */ + (void) OPENSSL_init_crypto(0, NULL); + dc.fn = fn; dc.arg = arg; OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); @@ -218,6 +233,9 @@ EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md, { struct doall_md dc; + /* Prayer and clean living lets you ignore errors, OpenSSL style */ + (void) OPENSSL_init_crypto(0, NULL); + dc.fn = fn; dc.arg = arg; OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); diff --git a/crypto/evp/p_lib.c b/crypto/evp/p_lib.c index 0d4cd26..811fe0c 100644 --- a/crypto/evp/p_lib.c +++ b/crypto/evp/p_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: p_lib.c,v 1.17 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: p_lib.c,v 1.20 2018/02/20 18:05:28 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -204,6 +204,13 @@ EVP_PKEY_new(void) return (ret); } +int +EVP_PKEY_up_ref(EVP_PKEY *pkey) +{ + int refs = CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); + return ((refs > 1) ? 1 : 0); +} + /* Setup a public key ASN1 method and ENGINE from a NID or a string. * If pkey is NULL just return 1 or 0 if the algorithm exists. */ @@ -279,13 +286,14 @@ EVP_PKEY_get0(EVP_PKEY *pkey) } #ifndef OPENSSL_NO_RSA -int -EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key) +RSA * +EVP_PKEY_get0_RSA(EVP_PKEY *pkey) { - int ret = EVP_PKEY_assign_RSA(pkey, key); - if (ret) - RSA_up_ref(key); - return ret; + if (pkey->type != EVP_PKEY_RSA) { + EVPerror(EVP_R_EXPECTING_AN_RSA_KEY); + return NULL; + } + return pkey->pkey.rsa; } RSA * @@ -298,16 +306,26 @@ EVP_PKEY_get1_RSA(EVP_PKEY *pkey) RSA_up_ref(pkey->pkey.rsa); return pkey->pkey.rsa; } + +int +EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key) +{ + int ret = EVP_PKEY_assign_RSA(pkey, key); + if (ret != 0) + RSA_up_ref(key); + return ret; +} #endif #ifndef OPENSSL_NO_DSA -int -EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key) +DSA * +EVP_PKEY_get0_DSA(EVP_PKEY *pkey) { - int ret = EVP_PKEY_assign_DSA(pkey, key); - if (ret) - DSA_up_ref(key); - return ret; + if (pkey->type != EVP_PKEY_DSA) { + EVPerror(EVP_R_EXPECTING_A_DSA_KEY); + return NULL; + } + return pkey->pkey.dsa; } DSA * @@ -320,17 +338,26 @@ EVP_PKEY_get1_DSA(EVP_PKEY *pkey) DSA_up_ref(pkey->pkey.dsa); return pkey->pkey.dsa; } + +int +EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key) +{ + int ret = EVP_PKEY_assign_DSA(pkey, key); + if (ret != 0) + DSA_up_ref(key); + return ret; +} #endif #ifndef OPENSSL_NO_EC - -int -EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key) +EC_KEY * +EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey) { - int ret = EVP_PKEY_assign_EC_KEY(pkey, key); - if (ret) - EC_KEY_up_ref(key); - return ret; + if (pkey->type != EVP_PKEY_EC) { + EVPerror(EVP_R_EXPECTING_A_EC_KEY); + return NULL; + } + return pkey->pkey.ec; } EC_KEY * @@ -343,18 +370,27 @@ EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey) EC_KEY_up_ref(pkey->pkey.ec); return pkey->pkey.ec; } + +int +EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key) +{ + int ret = EVP_PKEY_assign_EC_KEY(pkey, key); + if (ret != 0) + EC_KEY_up_ref(key); + return ret; +} #endif #ifndef OPENSSL_NO_DH - -int -EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key) +DH * +EVP_PKEY_get0_DH(EVP_PKEY *pkey) { - int ret = EVP_PKEY_assign_DH(pkey, key); - if (ret) - DH_up_ref(key); - return ret; + if (pkey->type != EVP_PKEY_DH) { + EVPerror(EVP_R_EXPECTING_A_DH_KEY); + return NULL; + } + return pkey->pkey.dh; } DH * @@ -367,6 +403,15 @@ EVP_PKEY_get1_DH(EVP_PKEY *pkey) DH_up_ref(pkey->pkey.dh); return pkey->pkey.dh; } + +int +EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key) +{ + int ret = EVP_PKEY_assign_DH(pkey, key); + if (ret != 0) + DH_up_ref(key); + return ret; +} #endif int diff --git a/crypto/ex_data.c b/crypto/ex_data.c index 63885af..b1e3913 100644 --- a/crypto/ex_data.c +++ b/crypto/ex_data.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ex_data.c,v 1.19 2017/01/29 17:49:22 beck Exp $ */ +/* $OpenBSD: ex_data.c,v 1.20 2018/03/17 16:20:01 beck Exp $ */ /* * Overhaul notes; @@ -312,6 +312,8 @@ def_get_class(int class_index) EX_CLASS_ITEM d, *p, *gen; EX_DATA_CHECK(return NULL;) d.class_index = class_index; + if (!OPENSSL_init_crypto(0, NULL)) + return NULL; CRYPTO_w_lock(CRYPTO_LOCK_EX_DATA); p = lh_EX_CLASS_ITEM_retrieve(ex_data, &d); if (!p) { @@ -500,6 +502,7 @@ int_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad) EX_CLASS_ITEM *item; void *ptr; CRYPTO_EX_DATA_FUNCS **storage = NULL; + if ((item = def_get_class(class_index)) == NULL) return; CRYPTO_r_lock(CRYPTO_LOCK_EX_DATA); diff --git a/crypto/hmac/hmac.c b/crypto/hmac/hmac.c index 8491766..7bf17ee 100644 --- a/crypto/hmac/hmac.c +++ b/crypto/hmac/hmac.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hmac.c,v 1.24 2017/03/03 10:39:07 inoguchi Exp $ */ +/* $OpenBSD: hmac.c,v 1.25 2018/02/17 14:53:58 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -171,6 +171,38 @@ err: return 0; } +HMAC_CTX * +HMAC_CTX_new(void) +{ + HMAC_CTX *ctx; + + if ((ctx = calloc(1, sizeof(*ctx))) == NULL) + return NULL; + + HMAC_CTX_init(ctx); + + return ctx; +} + +void +HMAC_CTX_free(HMAC_CTX *ctx) +{ + if (ctx == NULL) + return; + + HMAC_CTX_cleanup(ctx); + + free(ctx); +} + +int +HMAC_CTX_reset(HMAC_CTX *ctx) +{ + HMAC_CTX_cleanup(ctx); + HMAC_CTX_init(ctx); + return 1; +} + void HMAC_CTX_init(HMAC_CTX *ctx) { @@ -206,6 +238,20 @@ HMAC_CTX_cleanup(HMAC_CTX *ctx) explicit_bzero(ctx, sizeof(*ctx)); } +void +HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags) +{ + EVP_MD_CTX_set_flags(&ctx->i_ctx, flags); + EVP_MD_CTX_set_flags(&ctx->o_ctx, flags); + EVP_MD_CTX_set_flags(&ctx->md_ctx, flags); +} + +const EVP_MD * +HMAC_CTX_get_md(const HMAC_CTX *ctx) +{ + return ctx->md; +} + unsigned char * HMAC(const EVP_MD *evp_md, const void *key, int key_len, const unsigned char *d, size_t n, unsigned char *md, unsigned int *md_len) @@ -228,11 +274,3 @@ err: HMAC_CTX_cleanup(&c); return NULL; } - -void -HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags) -{ - EVP_MD_CTX_set_flags(&ctx->i_ctx, flags); - EVP_MD_CTX_set_flags(&ctx->o_ctx, flags); - EVP_MD_CTX_set_flags(&ctx->md_ctx, flags); -} diff --git a/crypto/md5/md5-elf-x86_64.S b/crypto/md5/md5-elf-x86_64.S index 5c16d83..2b73d72 100644 --- a/crypto/md5/md5-elf-x86_64.S +++ b/crypto/md5/md5-elf-x86_64.S @@ -665,7 +665,7 @@ md5_block_asm_data_order: movq 32(%rsp),%rbp addq $40,%rsp .Lepilogue: - .byte 0xf3,0xc3 + retq .size md5_block_asm_data_order,.-md5_block_asm_data_order #if defined(HAVE_GNU_STACK) .section .note.GNU-stack,"",%progbits diff --git a/crypto/md5/md5-macosx-x86_64.S b/crypto/md5/md5-macosx-x86_64.S index d50d90b..b4fcd18 100644 --- a/crypto/md5/md5-macosx-x86_64.S +++ b/crypto/md5/md5-macosx-x86_64.S @@ -665,5 +665,5 @@ L$end: movq 32(%rsp),%rbp addq $40,%rsp L$epilogue: - .byte 0xf3,0xc3 + retq diff --git a/crypto/modes/gcm128.c b/crypto/modes/gcm128.c index 69b1dd4..74362e6 100644 --- a/crypto/modes/gcm128.c +++ b/crypto/modes/gcm128.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gcm128.c,v 1.20 2017/09/03 13:07:34 inoguchi Exp $ */ +/* $OpenBSD: gcm128.c,v 1.22 2018/01/24 23:03:37 kettenis Exp $ */ /* ==================================================================== * Copyright (c) 2010 The OpenSSL Project. All rights reserved. * @@ -661,7 +661,7 @@ void gcm_ghash_4bit_x86(u64 Xi[2],const u128 Htable[16],const u8 *inp,size_t len # endif # elif defined(__arm__) || defined(__arm) # include "arm_arch.h" -# if __ARM_ARCH__>=7 +# if __ARM_ARCH__>=7 && !defined(__STRICT_ALIGNMENT) # define GHASH_ASM_ARM # define GCM_FUNCREF_4BIT void gcm_gmult_neon(u64 Xi[2],const u128 Htable[16]); @@ -1515,13 +1515,15 @@ int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx,const unsigned char *tag, alen = BSWAP8(alen); clen = BSWAP8(clen); #else - u8 *p = ctx->len.c; + { + u8 *p = ctx->len.c; - ctx->len.u[0] = alen; - ctx->len.u[1] = clen; + ctx->len.u[0] = alen; + ctx->len.u[1] = clen; - alen = (u64)GETU32(p) <<32|GETU32(p+4); - clen = (u64)GETU32(p+8)<<32|GETU32(p+12); + alen = (u64)GETU32(p) <<32|GETU32(p+4); + clen = (u64)GETU32(p+8)<<32|GETU32(p+12); + } #endif #endif diff --git a/crypto/modes/ghash-elf-x86_64.S b/crypto/modes/ghash-elf-x86_64.S index 1ca097e..5f31626 100644 --- a/crypto/modes/ghash-elf-x86_64.S +++ b/crypto/modes/ghash-elf-x86_64.S @@ -87,7 +87,7 @@ gcm_gmult_4bit: movq 16(%rsp),%rbx leaq 24(%rsp),%rsp .Lgmult_epilogue: - .byte 0xf3,0xc3 + retq .size gcm_gmult_4bit,.-gcm_gmult_4bit .globl gcm_ghash_4bit .type gcm_ghash_4bit,@function @@ -653,7 +653,7 @@ gcm_ghash_4bit: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lghash_epilogue: - .byte 0xf3,0xc3 + retq .size gcm_ghash_4bit,.-gcm_ghash_4bit .globl gcm_init_clmul .type gcm_init_clmul,@function @@ -718,7 +718,7 @@ gcm_init_clmul: pxor %xmm4,%xmm0 movdqu %xmm2,(%rdi) movdqu %xmm0,16(%rdi) - .byte 0xf3,0xc3 + retq .size gcm_init_clmul,.-gcm_init_clmul .globl gcm_gmult_clmul .type gcm_gmult_clmul,@function @@ -768,7 +768,7 @@ gcm_gmult_clmul: pxor %xmm4,%xmm0 .byte 102,15,56,0,197 movdqu %xmm0,(%rdi) - .byte 0xf3,0xc3 + retq .size gcm_gmult_clmul,.-gcm_gmult_clmul .globl gcm_ghash_clmul .type gcm_ghash_clmul,@function @@ -973,7 +973,7 @@ gcm_ghash_clmul: .Ldone: .byte 102,15,56,0,197 movdqu %xmm0,(%rdi) - .byte 0xf3,0xc3 + retq .LSEH_end_gcm_ghash_clmul: .size gcm_ghash_clmul,.-gcm_ghash_clmul .align 64 diff --git a/crypto/modes/ghash-macosx-x86_64.S b/crypto/modes/ghash-macosx-x86_64.S index 16cc828..e6840a7 100644 --- a/crypto/modes/ghash-macosx-x86_64.S +++ b/crypto/modes/ghash-macosx-x86_64.S @@ -87,7 +87,7 @@ L$break1: movq 16(%rsp),%rbx leaq 24(%rsp),%rsp L$gmult_epilogue: - .byte 0xf3,0xc3 + retq .globl _gcm_ghash_4bit @@ -653,7 +653,7 @@ L$outer_loop: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$ghash_epilogue: - .byte 0xf3,0xc3 + retq .globl _gcm_init_clmul @@ -718,7 +718,7 @@ _gcm_init_clmul: pxor %xmm4,%xmm0 movdqu %xmm2,(%rdi) movdqu %xmm0,16(%rdi) - .byte 0xf3,0xc3 + retq .globl _gcm_gmult_clmul @@ -768,7 +768,7 @@ _gcm_gmult_clmul: pxor %xmm4,%xmm0 .byte 102,15,56,0,197 movdqu %xmm0,(%rdi) - .byte 0xf3,0xc3 + retq .globl _gcm_ghash_clmul @@ -973,7 +973,7 @@ L$odd_tail: L$done: .byte 102,15,56,0,197 movdqu %xmm0,(%rdi) - .byte 0xf3,0xc3 + retq L$SEH_end_gcm_ghash_clmul: .p2align 6 diff --git a/crypto/objects/obj_dat.h b/crypto/objects/obj_dat.h index 605952f..c9ac73e 100644 --- a/crypto/objects/obj_dat.h +++ b/crypto/objects/obj_dat.h @@ -62,9 +62,9 @@ * [including the GNU Public Licence.] */ -#define NUM_NID 959 -#define NUM_SN 952 -#define NUM_LN 952 +#define NUM_NID 968 +#define NUM_SN 961 +#define NUM_LN 961 #define NUM_OBJ 893 static const unsigned char lvalues[6250]={ @@ -2504,6 +2504,15 @@ static const ASN1_OBJECT nid_objs[NUM_NID]={ NID_jurisdictionStateOrProvinceName,11,&(lvalues[6227]),0}, {"jurisdictionCountryName","jurisdictionCountryName", NID_jurisdictionCountryName,11,&(lvalues[6238]),0}, +{"KxRSA","kx-rsa",NID_kx_rsa,0,NULL,0}, +{"KxECDHE","kx-ecdhe",NID_kx_ecdhe,0,NULL,0}, +{"KxDHE","kx-dhe",NID_kx_dhe,0,NULL,0}, +{"KxGOST","kx-gost",NID_kx_gost,0,NULL,0}, +{"AuthRSA","auth-rsa",NID_auth_rsa,0,NULL,0}, +{"AuthECDSA","auth-ecdsa",NID_auth_ecdsa,0,NULL,0}, +{"AuthGOST01","auth-gost01",NID_auth_gost01,0,NULL,0}, +{"AuthNULL","auth-null",NID_auth_null,0,NULL,0}, +{"ChaCha20-Poly1305","chacha20-poly1305",NID_chacha20_poly1305,0,NULL,0}, }; static const unsigned int sn_objs[NUM_SN]={ @@ -2534,6 +2543,10 @@ static const unsigned int sn_objs[NUM_SN]={ 426, /* "AES-256-ECB" */ 428, /* "AES-256-OFB" */ 914, /* "AES-256-XTS" */ +964, /* "AuthECDSA" */ +965, /* "AuthGOST01" */ +966, /* "AuthNULL" */ +963, /* "AuthRSA" */ 91, /* "BF-CBC" */ 93, /* "BF-CFB" */ 92, /* "BF-ECB" */ @@ -2566,6 +2579,7 @@ static const unsigned int sn_objs[NUM_SN]={ 141, /* "CRLReason" */ 417, /* "CSPName" */ 937, /* "ChaCha" */ +967, /* "ChaCha20-Poly1305" */ 367, /* "CrlID" */ 391, /* "DC" */ 31, /* "DES-CBC" */ @@ -2612,6 +2626,10 @@ static const unsigned int sn_objs[NUM_SN]={ 645, /* "ITU-T" */ 646, /* "JOINT-ISO-ITU-T" */ 773, /* "KISA" */ +961, /* "KxDHE" */ +960, /* "KxECDHE" */ +962, /* "KxGOST" */ +959, /* "KxRSA" */ 15, /* "L" */ 856, /* "LocalKeySet" */ 3, /* "MD2" */ @@ -3654,6 +3672,10 @@ static const unsigned int ln_objs[NUM_LN]={ 484, /* "associatedDomain" */ 485, /* "associatedName" */ 501, /* "audio" */ +964, /* "auth-ecdsa" */ +965, /* "auth-gost01" */ +966, /* "auth-null" */ +963, /* "auth-rsa" */ 882, /* "authorityRevocationList" */ 91, /* "bf-cbc" */ 93, /* "bf-cfb" */ @@ -3726,6 +3748,7 @@ static const unsigned int ln_objs[NUM_LN]={ 517, /* "certificate extensions" */ 883, /* "certificateRevocationList" */ 937, /* "chacha" */ +967, /* "chacha20-poly1305" */ 54, /* "challengePassword" */ 407, /* "characteristic-two-field" */ 395, /* "clearance" */ @@ -4064,6 +4087,10 @@ static const unsigned int ln_objs[NUM_LN]={ 957, /* "jurisdictionStateOrProvinceName" */ 150, /* "keyBag" */ 773, /* "kisa" */ +961, /* "kx-dhe" */ +960, /* "kx-ecdhe" */ +962, /* "kx-gost" */ +959, /* "kx-rsa" */ 477, /* "lastModifiedBy" */ 476, /* "lastModifiedTime" */ 157, /* "localKeyID" */ diff --git a/crypto/ocsp/ocsp_cl.c b/crypto/ocsp/ocsp_cl.c index 04ea686..c2cd9da 100644 --- a/crypto/ocsp/ocsp_cl.c +++ b/crypto/ocsp/ocsp_cl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ocsp_cl.c,v 1.14 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: ocsp_cl.c,v 1.15 2018/03/17 14:44:34 jsing Exp $ */ /* Written by Tom Titchener for the OpenSSL * project. */ @@ -390,3 +390,9 @@ OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, return 1; } + +const OCSP_CERTID * +OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *single) +{ + return single->certId; +} diff --git a/crypto/rc4/rc4-elf-x86_64.S b/crypto/rc4/rc4-elf-x86_64.S index 3062b3a..4f90dd5 100644 --- a/crypto/rc4/rc4-elf-x86_64.S +++ b/crypto/rc4/rc4-elf-x86_64.S @@ -8,7 +8,7 @@ .align 16 RC4: orq %rsi,%rsi jne .Lentry - .byte 0xf3,0xc3 + retq .Lentry: pushq %rbx pushq %r12 @@ -517,7 +517,7 @@ RC4: orq %rsi,%rsi movq 16(%rsp),%rbx addq $24,%rsp .Lepilogue: - .byte 0xf3,0xc3 + retq .size RC4,.-RC4 .globl RC4_set_key .type RC4_set_key,@function @@ -588,7 +588,7 @@ RC4_set_key: xorl %eax,%eax movl %eax,-8(%rdi) movl %eax,-4(%rdi) - .byte 0xf3,0xc3 + retq .size RC4_set_key,.-RC4_set_key .globl RC4_options @@ -602,11 +602,11 @@ RC4_options: btl $IA32CAP_BIT0_INTEL,%edx jnc .Ldone addq $25,%rax - .byte 0xf3,0xc3 + retq .L8xchar: addq $12,%rax .Ldone: - .byte 0xf3,0xc3 + retq .align 64 .Lopts: .byte 114,99,52,40,56,120,44,105,110,116,41,0 diff --git a/crypto/rc4/rc4-macosx-x86_64.S b/crypto/rc4/rc4-macosx-x86_64.S index c060a12..ce58e4a 100644 --- a/crypto/rc4/rc4-macosx-x86_64.S +++ b/crypto/rc4/rc4-macosx-x86_64.S @@ -8,7 +8,7 @@ .p2align 4 _RC4: orq %rsi,%rsi jne L$entry - .byte 0xf3,0xc3 + retq L$entry: pushq %rbx pushq %r12 @@ -517,7 +517,7 @@ L$exit: movq 16(%rsp),%rbx addq $24,%rsp L$epilogue: - .byte 0xf3,0xc3 + retq .globl _RC4_set_key @@ -588,7 +588,7 @@ L$exit_key: xorl %eax,%eax movl %eax,-8(%rdi) movl %eax,-4(%rdi) - .byte 0xf3,0xc3 + retq .globl _RC4_options @@ -602,11 +602,11 @@ _RC4_options: btl $IA32CAP_BIT0_INTEL,%edx jnc L$done addq $25,%rax - .byte 0xf3,0xc3 + retq L$8xchar: addq $12,%rax L$done: - .byte 0xf3,0xc3 + retq .p2align 6 L$opts: .byte 114,99,52,40,56,120,44,105,110,116,41,0 diff --git a/crypto/rc4/rc4-md5-elf-x86_64.S b/crypto/rc4/rc4-md5-elf-x86_64.S index c4fbfdc..52b50fe 100644 --- a/crypto/rc4/rc4-md5-elf-x86_64.S +++ b/crypto/rc4/rc4-md5-elf-x86_64.S @@ -1256,7 +1256,7 @@ rc4_md5_enc: leaq 88(%rsp),%rsp .Lepilogue: .Labort: - .byte 0xf3,0xc3 + retq .size rc4_md5_enc,.-rc4_md5_enc #if defined(HAVE_GNU_STACK) .section .note.GNU-stack,"",%progbits diff --git a/crypto/rc4/rc4-md5-macosx-x86_64.S b/crypto/rc4/rc4-md5-macosx-x86_64.S index 4903918..a8f6955 100644 --- a/crypto/rc4/rc4-md5-macosx-x86_64.S +++ b/crypto/rc4/rc4-md5-macosx-x86_64.S @@ -1256,5 +1256,5 @@ L$oop: leaq 88(%rsp),%rsp L$epilogue: L$abort: - .byte 0xf3,0xc3 + retq diff --git a/crypto/rsa/rsa_crpt.c b/crypto/rsa/rsa_crpt.c index f0c9256..a646ded 100644 --- a/crypto/rsa/rsa_crpt.c +++ b/crypto/rsa/rsa_crpt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rsa_crpt.c,v 1.18 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: rsa_crpt.c,v 1.19 2018/02/18 12:52:13 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -72,6 +72,12 @@ #include #endif +int +RSA_bits(const RSA *r) +{ + return BN_num_bits(r->n); +} + int RSA_size(const RSA *r) { diff --git a/crypto/rsa/rsa_lib.c b/crypto/rsa/rsa_lib.c index 31ea418..544846f 100644 --- a/crypto/rsa/rsa_lib.c +++ b/crypto/rsa/rsa_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rsa_lib.c,v 1.31 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: rsa_lib.c,v 1.36 2018/02/20 17:42:32 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -256,3 +256,117 @@ RSA_get_ex_data(const RSA *r, int idx) { return CRYPTO_get_ex_data(&r->ex_data, idx); } + +void +RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) +{ + if (n != NULL) + *n = r->n; + if (e != NULL) + *e = r->e; + if (d != NULL) + *d = r->d; +} + +int +RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) +{ + if ((r->n == NULL && n == NULL) || (r->e == NULL && e == NULL)) + return 0; + + if (n != NULL) { + BN_free(r->n); + r->n = n; + } + if (e != NULL) { + BN_free(r->e); + r->e = e; + } + if (d != NULL) { + BN_free(r->d); + r->d = d; + } + + return 1; +} + +void +RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, + const BIGNUM **iqmp) +{ + if (dmp1 != NULL) + *dmp1 = r->dmp1; + if (dmq1 != NULL) + *dmq1 = r->dmq1; + if (iqmp != NULL) + *iqmp = r->iqmp; +} + +int +RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp) +{ + if ((r->dmp1 == NULL && dmp1 == NULL) || + (r->dmq1 == NULL && dmq1 == NULL) || + (r->iqmp == NULL && iqmp == NULL)) + return 0; + + if (dmp1 != NULL) { + BN_free(r->dmp1); + r->dmp1 = dmp1; + } + if (dmq1 != NULL) { + BN_free(r->dmq1); + r->dmq1 = dmq1; + } + if (iqmp != NULL) { + BN_free(r->iqmp); + r->iqmp = iqmp; + } + + return 1; +} + +void +RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q) +{ + if (p != NULL) + *p = r->p; + if (q != NULL) + *q = r->q; +} + +int +RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q) +{ + if ((r->p == NULL && p == NULL) || (r->q == NULL && q == NULL)) + return 0; + + if (p != NULL) { + BN_free(r->p); + r->p = p; + } + if (q != NULL) { + BN_free(r->q); + r->q = q; + } + + return 1; +} + +void +RSA_clear_flags(RSA *r, int flags) +{ + r->flags &= ~flags; +} + +int +RSA_test_flags(const RSA *r, int flags) +{ + return r->flags & flags; +} + +void +RSA_set_flags(RSA *r, int flags) +{ + r->flags |= flags; +} diff --git a/crypto/rsa/rsa_meth.c b/crypto/rsa/rsa_meth.c new file mode 100644 index 0000000..0e52799 --- /dev/null +++ b/crypto/rsa/rsa_meth.c @@ -0,0 +1,86 @@ +/* $OpenBSD: rsa_meth.c,v 1.1 2018/03/17 15:12:56 tb Exp $ */ +/* + * Copyright (c) 2018 Theo Buehler + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +#include +#include + +RSA_METHOD * +RSA_meth_new(const char *name, int flags) +{ + RSA_METHOD *meth; + + if ((meth = calloc(1, sizeof(*meth))) == NULL) + return NULL; + if ((meth->name = strdup(name)) == NULL) { + free(meth); + return NULL; + } + meth->flags = flags; + + return meth; +} + +void +RSA_meth_free(RSA_METHOD *meth) +{ + if (meth != NULL) { + free((char *)meth->name); + free(meth); + } +} + +RSA_METHOD * +RSA_meth_dup(const RSA_METHOD *meth) +{ + RSA_METHOD *copy; + + if ((copy = calloc(1, sizeof(*copy))) == NULL) + return NULL; + memcpy(copy, meth, sizeof(*copy)); + if ((copy->name = strdup(meth->name)) == NULL) { + free(copy); + return NULL; + } + + return copy; +} + +int +RSA_meth_set_priv_enc(RSA_METHOD *meth, int (*priv_enc)(int flen, + const unsigned char *from, unsigned char *to, RSA *rsa, int padding)) +{ + meth->rsa_priv_enc = priv_enc; + return 1; +} + +int +RSA_meth_set_priv_dec(RSA_METHOD *meth, int (*priv_dec)(int flen, + const unsigned char *from, unsigned char *to, RSA *rsa, int padding)) +{ + meth->rsa_priv_dec = priv_dec; + return 1; +} + +int +RSA_meth_set_finish(RSA_METHOD *meth, int (*finish)(RSA *rsa)) +{ + meth->finish = finish; + return 1; +} diff --git a/crypto/sha/sha1-elf-x86_64.S b/crypto/sha/sha1-elf-x86_64.S index d7ef2bf..5a37019 100644 --- a/crypto/sha/sha1-elf-x86_64.S +++ b/crypto/sha/sha1-elf-x86_64.S @@ -1288,7 +1288,7 @@ sha1_block_data_order: movq 24(%rsi),%rbx leaq 32(%rsi),%rsp .Lepilogue: - .byte 0xf3,0xc3 + retq .size sha1_block_data_order,.-sha1_block_data_order .type sha1_block_data_order_ssse3,@function .align 16 @@ -2475,7 +2475,7 @@ _ssse3_shortcut: movq 16(%rsi),%rbx leaq 24(%rsi),%rsp .Lepilogue_ssse3: - .byte 0xf3,0xc3 + retq .size sha1_block_data_order_ssse3,.-sha1_block_data_order_ssse3 .align 64 K_XX_XX: diff --git a/crypto/sha/sha1-macosx-x86_64.S b/crypto/sha/sha1-macosx-x86_64.S index f5c2c36..04a8aff 100644 --- a/crypto/sha/sha1-macosx-x86_64.S +++ b/crypto/sha/sha1-macosx-x86_64.S @@ -1288,7 +1288,7 @@ L$loop: movq 24(%rsi),%rbx leaq 32(%rsi),%rsp L$epilogue: - .byte 0xf3,0xc3 + retq .p2align 4 @@ -2475,7 +2475,7 @@ L$done_ssse3: movq 16(%rsi),%rbx leaq 24(%rsi),%rsp L$epilogue_ssse3: - .byte 0xf3,0xc3 + retq .p2align 6 K_XX_XX: diff --git a/crypto/sha/sha256-elf-x86_64.S b/crypto/sha/sha256-elf-x86_64.S index 599a5cb..9eea6a7 100644 --- a/crypto/sha/sha256-elf-x86_64.S +++ b/crypto/sha/sha256-elf-x86_64.S @@ -1756,7 +1756,7 @@ sha256_block_data_order: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lepilogue: - .byte 0xf3,0xc3 + retq .size sha256_block_data_order,.-sha256_block_data_order .align 64 .type K256,@object diff --git a/crypto/sha/sha256-macosx-x86_64.S b/crypto/sha/sha256-macosx-x86_64.S index 3ecafca..4b468b7 100644 --- a/crypto/sha/sha256-macosx-x86_64.S +++ b/crypto/sha/sha256-macosx-x86_64.S @@ -1756,7 +1756,7 @@ L$rounds_16_xx: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$epilogue: - .byte 0xf3,0xc3 + retq .p2align 6 diff --git a/crypto/sha/sha512-elf-x86_64.S b/crypto/sha/sha512-elf-x86_64.S index d218304..1173407 100644 --- a/crypto/sha/sha512-elf-x86_64.S +++ b/crypto/sha/sha512-elf-x86_64.S @@ -1756,7 +1756,7 @@ sha512_block_data_order: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lepilogue: - .byte 0xf3,0xc3 + retq .size sha512_block_data_order,.-sha512_block_data_order .align 64 .type K512,@object diff --git a/crypto/sha/sha512-macosx-x86_64.S b/crypto/sha/sha512-macosx-x86_64.S index 4a51d14..7581da4 100644 --- a/crypto/sha/sha512-macosx-x86_64.S +++ b/crypto/sha/sha512-macosx-x86_64.S @@ -1756,7 +1756,7 @@ L$rounds_16_xx: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$epilogue: - .byte 0xf3,0xc3 + retq .p2align 6 diff --git a/crypto/whrlpool/wp-elf-x86_64.S b/crypto/whrlpool/wp-elf-x86_64.S index 5c1ad95..2b37a98 100644 --- a/crypto/whrlpool/wp-elf-x86_64.S +++ b/crypto/whrlpool/wp-elf-x86_64.S @@ -585,7 +585,7 @@ whirlpool_block: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp .Lepilogue: - .byte 0xf3,0xc3 + retq .size whirlpool_block,.-whirlpool_block .align 64 diff --git a/crypto/whrlpool/wp-macosx-x86_64.S b/crypto/whrlpool/wp-macosx-x86_64.S index f0025d4..6df325a 100644 --- a/crypto/whrlpool/wp-macosx-x86_64.S +++ b/crypto/whrlpool/wp-macosx-x86_64.S @@ -585,7 +585,7 @@ L$alldone: movq 40(%rsi),%rbx leaq 48(%rsi),%rsp L$epilogue: - .byte 0xf3,0xc3 + retq .p2align 6 diff --git a/crypto/x509/x509_cmp.c b/crypto/x509/x509_cmp.c index 72fbef1..ab0dbcb 100644 --- a/crypto/x509/x509_cmp.c +++ b/crypto/x509/x509_cmp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_cmp.c,v 1.27 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: x509_cmp.c,v 1.30 2018/03/17 14:57:23 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -321,11 +321,19 @@ X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name) EVP_PKEY * X509_get_pubkey(X509 *x) { - if ((x == NULL) || (x->cert_info == NULL)) + if (x == NULL || x->cert_info == NULL) return (NULL); return (X509_PUBKEY_get(x->cert_info->key)); } +EVP_PKEY * +X509_get0_pubkey(X509 *x) +{ + if (x == NULL || x->cert_info == NULL) + return (NULL); + return (X509_PUBKEY_get0(x->cert_info->key)); +} + ASN1_BIT_STRING * X509_get0_pubkey_bitstr(const X509 *x) { @@ -364,3 +372,21 @@ X509_check_private_key(X509 *x, EVP_PKEY *k) return 1; return 0; } + +/* + * Not strictly speaking an "up_ref" as a STACK doesn't have a reference + * count but it has the same effect by duping the STACK and upping the ref of + * each X509 structure. + */ +STACK_OF(X509) * +X509_chain_up_ref(STACK_OF(X509) *chain) +{ + STACK_OF(X509) *ret; + size_t i; + + ret = sk_X509_dup(chain); + for (i = 0; i < sk_X509_num(ret); i++) + X509_up_ref(sk_X509_value(ret, i)); + + return ret; +} diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c index 6cde29f..742eb4d 100644 --- a/crypto/x509/x509_lu.c +++ b/crypto/x509/x509_lu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_lu.c,v 1.23 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: x509_lu.c,v 1.28 2018/03/17 15:43:32 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -268,6 +268,13 @@ X509_STORE_free(X509_STORE *vfy) free(vfy); } +int +X509_STORE_up_ref(X509_STORE *x) +{ + int refs = CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509_STORE); + return (refs > 1) ? 1 : 0; +} + X509_LOOKUP * X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m) { @@ -451,6 +458,12 @@ X509_OBJECT_up_ref_count(X509_OBJECT *a) } } +int +X509_OBJECT_get_type(const X509_OBJECT *a) +{ + return a->type; +} + void X509_OBJECT_free_contents(X509_OBJECT *a) { @@ -526,6 +539,22 @@ X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, int type, return sk_X509_OBJECT_value(h, idx); } +X509 * +X509_OBJECT_get0_X509(const X509_OBJECT *xo) +{ + if (xo != NULL && xo->type == X509_LU_X509) + return xo->data.x509; + return NULL; +} + +X509_CRL * +X509_OBJECT_get0_X509_CRL(X509_OBJECT *xo) +{ + if (xo != NULL && xo->type == X509_LU_CRL) + return xo->data.crl; + return NULL; +} + STACK_OF(X509) * X509_STORE_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm) { @@ -649,7 +678,6 @@ X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x) return NULL; } - /* Try to get issuer certificate from store. Due to limitations * of the API this can only retrieve a single certificate matching * a given subject name. However it will fill the cache with all @@ -726,6 +754,24 @@ X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) return ret; } +STACK_OF(X509_OBJECT) * +X509_STORE_get0_objects(X509_STORE *xs) +{ + return xs->objs; +} + +void * +X509_STORE_get_ex_data(X509_STORE *xs, int idx) +{ + return CRYPTO_get_ex_data(&xs->ex_data, idx); +} + +int +X509_STORE_set_ex_data(X509_STORE *xs, int idx, void *data) +{ + return CRYPTO_set_ex_data(&xs->ex_data, idx, data); +} + int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags) { @@ -757,6 +803,12 @@ X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *param) return X509_VERIFY_PARAM_set1(ctx->param, param); } +X509_VERIFY_PARAM * +X509_STORE_get0_param(X509_STORE *ctx) +{ + return ctx->param; +} + void X509_STORE_set_verify_cb(X509_STORE *ctx, int (*verify_cb)(int, X509_STORE_CTX *)) diff --git a/crypto/x509/x509_set.c b/crypto/x509/x509_set.c index aeaf161..becdaf6 100644 --- a/crypto/x509/x509_set.c +++ b/crypto/x509/x509_set.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_set.c,v 1.12 2015/09/30 17:49:59 jsing Exp $ */ +/* $OpenBSD: x509_set.c,v 1.16 2018/02/22 17:09:28 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -63,6 +63,18 @@ #include #include +const STACK_OF(X509_EXTENSION) * +X509_get0_extensions(const X509 *x) +{ + return x->cert_info->extensions; +} + +const X509_ALGOR * +X509_get0_tbs_sigalg(const X509 *x) +{ + return x->cert_info->signature; +} + int X509_set_version(X509 *x, long version) { @@ -104,17 +116,31 @@ X509_set_issuer_name(X509 *x, X509_NAME *name) int X509_set_subject_name(X509 *x, X509_NAME *name) { - if ((x == NULL) || (x->cert_info == NULL)) + if (x == NULL || x->cert_info == NULL) return (0); return (X509_NAME_set(&x->cert_info->subject, name)); } +const ASN1_TIME * +X509_get0_notBefore(const X509 *x) +{ + return X509_getm_notBefore(x); +} + +ASN1_TIME * +X509_getm_notBefore(const X509 *x) +{ + if (x == NULL || x->cert_info == NULL || x->cert_info->validity == NULL) + return (NULL); + return x->cert_info->validity->notBefore; +} + int X509_set_notBefore(X509 *x, const ASN1_TIME *tm) { ASN1_TIME *in; - if ((x == NULL) || (x->cert_info->validity == NULL)) + if (x == NULL || x->cert_info->validity == NULL) return (0); in = x->cert_info->validity->notBefore; if (in != tm) { @@ -127,12 +153,32 @@ X509_set_notBefore(X509 *x, const ASN1_TIME *tm) return (in != NULL); } +int +X509_set1_notBefore(X509 *x, const ASN1_TIME *tm) +{ + return X509_set_notBefore(x, tm); +} + +const ASN1_TIME * +X509_get0_notAfter(const X509 *x) +{ + return X509_getm_notAfter(x); +} + +ASN1_TIME * +X509_getm_notAfter(const X509 *x) +{ + if (x == NULL || x->cert_info == NULL || x->cert_info->validity == NULL) + return (NULL); + return x->cert_info->validity->notAfter; +} + int X509_set_notAfter(X509 *x, const ASN1_TIME *tm) { ASN1_TIME *in; - if ((x == NULL) || (x->cert_info->validity == NULL)) + if (x == NULL || x->cert_info->validity == NULL) return (0); in = x->cert_info->validity->notAfter; if (in != tm) { @@ -145,6 +191,12 @@ X509_set_notAfter(X509 *x, const ASN1_TIME *tm) return (in != NULL); } +int +X509_set1_notAfter(X509 *x, const ASN1_TIME *tm) +{ + return X509_set_notAfter(x, tm); +} + int X509_set_pubkey(X509 *x, EVP_PKEY *pkey) { diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c index 8efff68..c8ccae5 100644 --- a/crypto/x509/x509_vfy.c +++ b/crypto/x509/x509_vfy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_vfy.c,v 1.66 2017/08/27 01:39:26 beck Exp $ */ +/* $OpenBSD: x509_vfy.c,v 1.68 2018/02/22 17:11:30 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -2023,12 +2023,20 @@ X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx) return ctx->current_cert; } -STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx) +STACK_OF(X509) * +X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx) { return ctx->chain; } -STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx) +STACK_OF(X509) * +X509_STORE_CTX_get0_chain(X509_STORE_CTX *xs) +{ + return xs->chain; +} + +STACK_OF(X509) * +X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx) { int i; X509 *x; @@ -2061,6 +2069,12 @@ X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx) return ctx->parent; } +X509_STORE * +X509_STORE_CTX_get0_store(X509_STORE_CTX *xs) +{ + return xs->ctx; +} + void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *x) { @@ -2301,6 +2315,12 @@ X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) ctx->get_issuer = get_issuer_sk; } +void +X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) +{ + X509_STORE_CTX_trusted_stack(ctx, sk); +} + void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx) { @@ -2349,6 +2369,24 @@ X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, ctx->verify_cb = verify_cb; } +X509 * +X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx) +{ + return ctx->cert; +} + +STACK_OF(X509) * +X509_STORE_CTX_get0_untrusted(X509_STORE_CTX *ctx) +{ + return ctx->untrusted; +} + +void +X509_STORE_CTX_set0_untrusted(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) +{ + ctx->untrusted = sk; +} + X509_POLICY_TREE * X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx) { diff --git a/crypto/x509/x509_vpm.c b/crypto/x509/x509_vpm.c index 3482227..0897137 100644 --- a/crypto/x509/x509_vpm.c +++ b/crypto/x509/x509_vpm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_vpm.c,v 1.15 2016/12/21 15:15:45 jsing Exp $ */ +/* $OpenBSD: x509_vpm.c,v 1.17 2018/03/22 15:54:46 beck Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2004. */ @@ -101,11 +101,11 @@ sk_deep_copy(void *sk_void, void *copy_func_void, void *free_func_void) void *(*copy_func)(void *) = copy_func_void; void (*free_func)(void *) = free_func_void; _STACK *ret = sk_dup(sk); + size_t i; if (ret == NULL) return NULL; - size_t i; for (i = 0; i < ret->num; i++) { if (ret->data[i] == NULL) continue; @@ -130,6 +130,8 @@ int_x509_param_set_hosts(X509_VERIFY_PARAM_ID *id, int mode, { char *copy; + if (name != NULL && namelen == 0) + namelen = strlen(name); /* * Refuse names with embedded NUL bytes. * XXX: Do we need to push an error onto the error stack? diff --git a/crypto/x509/x509cset.c b/crypto/x509/x509cset.c index afc1f0f..182dd8a 100644 --- a/crypto/x509/x509cset.c +++ b/crypto/x509/x509cset.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509cset.c,v 1.11 2015/09/30 17:49:59 jsing Exp $ */ +/* $OpenBSD: x509cset.c,v 1.14 2018/02/22 17:01:44 jsing Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2001. */ @@ -63,6 +63,13 @@ #include #include +int +X509_CRL_up_ref(X509_CRL *x) +{ + int refs = CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509_CRL); + return (refs > 1) ? 1 : 0; +} + int X509_CRL_set_version(X509_CRL *x, long version) { @@ -101,6 +108,12 @@ X509_CRL_set_lastUpdate(X509_CRL *x, const ASN1_TIME *tm) return (in != NULL); } +int +X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm) +{ + return X509_CRL_set_lastUpdate(x, tm); +} + int X509_CRL_set_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) { @@ -119,6 +132,12 @@ X509_CRL_set_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) return (in != NULL); } +int +X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) +{ + return X509_CRL_set_nextUpdate(x, tm); +} + int X509_CRL_sort(X509_CRL *c) { @@ -136,6 +155,24 @@ X509_CRL_sort(X509_CRL *c) return 1; } +const STACK_OF(X509_EXTENSION) * +X509_REVOKED_get0_extensions(const X509_REVOKED *x) +{ + return x->extensions; +} + +const ASN1_TIME * +X509_REVOKED_get0_revocationDate(const X509_REVOKED *x) +{ + return x->revocationDate; +} + +const ASN1_INTEGER * +X509_REVOKED_get0_serialNumber(const X509_REVOKED *x) +{ + return x->serialNumber; +} + int X509_REVOKED_set_revocationDate(X509_REVOKED *x, ASN1_TIME *tm) { diff --git a/crypto/x509/x509name.c b/crypto/x509/x509name.c index ef242ce..2ca1a76 100644 --- a/crypto/x509/x509name.c +++ b/crypto/x509/x509name.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509name.c,v 1.14 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: x509name.c,v 1.15 2018/03/17 15:28:27 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -405,3 +405,9 @@ X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne) return (NULL); return (ne->value); } + +int +X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne) +{ + return (ne->set); +} diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index 04c7899..67ecc81 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: v3_utl.c,v 1.26 2017/01/29 17:49:23 beck Exp $ */ +/* $OpenBSD: v3_utl.c,v 1.27 2018/03/20 16:16:59 jsing Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. */ @@ -1015,7 +1015,9 @@ int X509_check_host(X509 *x, const char *chk, size_t chklen, { if (chk == NULL) return -2; - if (memchr(chk, '\0', chklen)) + if (chklen == 0) + chklen = strlen(chk); + else if (memchr(chk, '\0', chklen)) return -2; return do_x509_check(x, chk, chklen, flags, GEN_DNS, peername); } @@ -1025,7 +1027,9 @@ int X509_check_email(X509 *x, const char *chk, size_t chklen, { if (chk == NULL) return -2; - if (memchr(chk, '\0', chklen)) + if (chklen == 0) + chklen = strlen(chk); + else if (memchr(chk, '\0', chklen)) return -2; return do_x509_check(x, chk, chklen, flags, GEN_EMAIL, NULL); } diff --git a/include/Makefile.am b/include/Makefile.am deleted file mode 100644 index 728d921..0000000 --- a/include/Makefile.am +++ /dev/null @@ -1,43 +0,0 @@ -include $(top_srcdir)/Makefile.am.common - -EXTRA_DIST = CMakeLists.txt - -SUBDIRS = openssl - -noinst_HEADERS = pqueue.h -noinst_HEADERS += compat/dirent.h -noinst_HEADERS += compat/dirent_msvc.h -noinst_HEADERS += compat/err.h -noinst_HEADERS += compat/fcntl.h -noinst_HEADERS += compat/limits.h -noinst_HEADERS += compat/netdb.h -noinst_HEADERS += compat/poll.h -noinst_HEADERS += compat/readpassphrase.h -noinst_HEADERS += compat/resolv.h -noinst_HEADERS += compat/stdio.h -noinst_HEADERS += compat/stdlib.h -noinst_HEADERS += compat/string.h -noinst_HEADERS += compat/time.h -noinst_HEADERS += compat/unistd.h -noinst_HEADERS += compat/win32netcompat.h - -noinst_HEADERS += compat/arpa/inet.h -noinst_HEADERS += compat/arpa/nameser.h - -noinst_HEADERS += compat/machine/endian.h - -noinst_HEADERS += compat/netinet/in.h -noinst_HEADERS += compat/netinet/ip.h -noinst_HEADERS += compat/netinet/tcp.h - -noinst_HEADERS += compat/sys/ioctl.h -noinst_HEADERS += compat/sys/mman.h -noinst_HEADERS += compat/sys/param.h -noinst_HEADERS += compat/sys/select.h -noinst_HEADERS += compat/sys/socket.h -noinst_HEADERS += compat/sys/stat.h -noinst_HEADERS += compat/sys/time.h -noinst_HEADERS += compat/sys/types.h -noinst_HEADERS += compat/sys/uio.h - -include_HEADERS = tls.h diff --git a/include/Makefile.in b/include/Makefile.in deleted file mode 100644 index bac88b1..0000000 --- a/include/Makefile.in +++ /dev/null @@ -1,699 +0,0 @@ -# Makefile.in generated by automake 1.15.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2017 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = include -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/check-hardening-options.m4 \ - $(top_srcdir)/m4/check-libc.m4 \ - $(top_srcdir)/m4/check-os-options.m4 \ - $(top_srcdir)/m4/disable-compiler-warnings.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ - $(noinst_HEADERS) $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(includedir)" -HEADERS = $(include_HEADERS) $(noinst_HEADERS) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -am__DIST_COMMON = $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASDEPMODE = @CCASDEPMODE@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBCRYPTO_VERSION = @LIBCRYPTO_VERSION@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBSSL_VERSION = @LIBSSL_VERSION@ -LIBTLS_VERSION = @LIBTLS_VERSION@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OPENSSLDIR = @OPENSSLDIR@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PLATFORM_LDADD = @PLATFORM_LDADD@ -PROG_LDADD = @PROG_LDADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AM_CFLAGS = -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/include/compat \ - -DLIBRESSL_INTERNAL -D__BEGIN_HIDDEN_DECLS= \ - -D__END_HIDDEN_DECLS= -EXTRA_DIST = CMakeLists.txt -SUBDIRS = openssl -noinst_HEADERS = pqueue.h compat/dirent.h compat/dirent_msvc.h \ - compat/err.h compat/fcntl.h compat/limits.h compat/netdb.h \ - compat/poll.h compat/readpassphrase.h compat/resolv.h \ - compat/stdio.h compat/stdlib.h compat/string.h compat/time.h \ - compat/unistd.h compat/win32netcompat.h compat/arpa/inet.h \ - compat/arpa/nameser.h compat/machine/endian.h \ - compat/netinet/in.h compat/netinet/ip.h compat/netinet/tcp.h \ - compat/sys/ioctl.h compat/sys/mman.h compat/sys/param.h \ - compat/sys/select.h compat/sys/socket.h compat/sys/stat.h \ - compat/sys/time.h compat/sys/types.h compat/sys/uio.h -include_HEADERS = tls.h -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; -$(top_srcdir)/Makefile.am.common $(am__empty): - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-includeHEADERS: $(include_HEADERS) - @$(NORMAL_INSTALL) - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ - done - -uninstall-includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) - -# This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile $(HEADERS) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(includedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: install-includeHEADERS - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-includeHEADERS - -.MAKE: $(am__recursive_targets) install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-libtool cscopelist-am ctags \ - ctags-am distclean distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-includeHEADERS install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-includeHEADERS - -.PRECIOUS: Makefile - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/include/compat/arpa/inet.h b/include/compat/arpa/inet.h index f14ffde..4422f41 100644 --- a/include/compat/arpa/inet.h +++ b/include/compat/arpa/inet.h @@ -13,11 +13,3 @@ #endif #endif - -#ifndef HAVE_INET_NTOP -const char * inet_ntop(int af, const void *src, char *dst, socklen_t size); -#endif - -#ifndef HAVE_INET_PTON -int inet_pton(int af, const char * src, void * dst); -#endif diff --git a/include/compat/err.h b/include/compat/err.h index 3a5e01f..8b5b635 100644 --- a/include/compat/err.h +++ b/include/compat/err.h @@ -34,9 +34,9 @@ err(int eval, const char *fmt, ...) vfprintf(stderr, fmt, ap); fprintf(stderr, ": "); } + va_end(ap); fprintf(stderr, "%s\n", strerror(sverrno)); exit(eval); - va_end(ap); } #if defined(_MSC_VER) @@ -52,9 +52,9 @@ errx(int eval, const char *fmt, ...) va_start(ap, fmt); if (fmt != NULL) vfprintf(stderr, fmt, ap); + va_end(ap); fprintf(stderr, "\n"); exit(eval); - va_end(ap); } static inline void @@ -68,8 +68,8 @@ warn(const char *fmt, ...) vfprintf(stderr, fmt, ap); fprintf(stderr, ": "); } - fprintf(stderr, "%s\n", strerror(sverrno)); va_end(ap); + fprintf(stderr, "%s\n", strerror(sverrno)); } static inline void @@ -80,8 +80,8 @@ warnx(const char *fmt, ...) va_start(ap, fmt); if (fmt != NULL) vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n"); va_end(ap); + fprintf(stderr, "\n"); } #endif diff --git a/include/compat/pthread.h b/include/compat/pthread.h new file mode 100644 index 0000000..b2db760 --- /dev/null +++ b/include/compat/pthread.h @@ -0,0 +1,62 @@ +/* + * Public domain + * pthread.h compatibility shim + */ + +#ifdef _WIN32 + +#include + +/* + * Static once initialization values. + */ +#define PTHREAD_ONCE_INIT { INIT_ONCE_STATIC_INIT } + +/* + * Once definitions. + */ +struct pthread_once { + INIT_ONCE once; +}; +typedef struct pthread_once pthread_once_t; + +static inline BOOL CALLBACK +_pthread_once_win32_cb(PINIT_ONCE once, PVOID param, PVOID *context) +{ + void (*cb) (void) = param; + cb(); + return TRUE; +} + +static inline int +pthread_once(pthread_once_t *once, void (*cb) (void)) +{ + BOOL rc = InitOnceExecuteOnce(&once->once, _pthread_once_win32_cb, cb, NULL); + if (rc == 0) + return -1; + else + return 0; +} + +struct pthread { + HANDLE handle; +}; +typedef struct pthread pthread_t; + +static inline pthread_t +pthread_self(void) +{ + pthread_t self; + self.handle = GetCurrentThread(); + return self; +} + +static inline int +pthread_equal(pthread_t t1, pthread_t t2) +{ + return t1.handle == t2.handle; +} + +#else +#include_next +#endif diff --git a/include/compat/sys/stat.h b/include/compat/sys/stat.h index 629c7fe..b88da1d 100644 --- a/include/compat/sys/stat.h +++ b/include/compat/sys/stat.h @@ -10,9 +10,18 @@ #include_next /* for old MinGW */ +#ifndef S_IRWXU +#define S_IRWXU 0 +#endif +#ifndef S_IRWXG +#define S_IRWXG 0 +#endif #ifndef S_IRGRP #define S_IRGRP 0 #endif +#ifndef S_IRWXO +#define S_IRWXO 0 +#endif #ifndef S_IROTH #define S_IROTH 0 #endif @@ -65,12 +74,15 @@ #endif #if defined(_MSC_VER) +# define S_IRWXU 0 /* RWX user */ # define S_IRUSR S_IREAD /* Read user */ # define S_IWUSR S_IWRITE /* Write user */ # define S_IXUSR 0 /* Execute user */ +# define S_IRWXG 0 /* RWX group */ # define S_IRGRP 0 /* Read group */ # define S_IWGRP 0 /* Write group */ # define S_IXGRP 0 /* Execute group */ +# define S_IRWXO 0 /* RWX others */ # define S_IROTH 0 /* Read others */ # define S_IWOTH 0 /* Write others */ # define S_IXOTH 0 /* Execute others */ diff --git a/include/compat/sys/time.h b/include/compat/sys/time.h index 235bc6e..76428c1 100644 --- a/include/compat/sys/time.h +++ b/include/compat/sys/time.h @@ -13,4 +13,16 @@ int gettimeofday(struct timeval *tp, void *tzp); #include_next #endif +#ifndef timersub +#define timersub(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ + if ((vvp)->tv_usec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_usec += 1000000; \ + } \ + } while (0) +#endif + #endif diff --git a/include/compat/sys/types.h b/include/compat/sys/types.h index 701b77a..2107119 100644 --- a/include/compat/sys/types.h +++ b/include/compat/sys/types.h @@ -21,6 +21,7 @@ #ifdef __MINGW32__ #include <_bsd_types.h> typedef uint32_t in_addr_t; +typedef uint32_t uid_t; #endif #ifdef _MSC_VER @@ -28,6 +29,8 @@ typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef uint32_t in_addr_t; +typedef uint32_t mode_t; +typedef uint32_t uid_t; #include typedef SSIZE_T ssize_t; diff --git a/include/compat/time.h b/include/compat/time.h index 99a2001..dc460ef 100644 --- a/include/compat/time.h +++ b/include/compat/time.h @@ -13,6 +13,9 @@ #include_next #endif +#ifndef LIBCRYPTOCOMPAT_TIME_H +#define LIBCRYPTOCOMPAT_TIME_H + #ifdef _WIN32 struct tm *__gmtime_r(const time_t * t, struct tm * tm); #define gmtime_r(tp, tm) __gmtime_r(tp, tm) @@ -21,3 +24,30 @@ struct tm *__gmtime_r(const time_t * t, struct tm * tm); #ifndef HAVE_TIMEGM time_t timegm(struct tm *tm); #endif + +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC CLOCK_REALTIME +#endif + +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME 0 +#endif + +#ifndef HAVE_CLOCK_GETTIME +typedef int clockid_t; +int clock_gettime(clockid_t clock_id, struct timespec *tp); +#endif + +#ifndef timespecsub +#define timespecsub(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \ + if ((vsp)->tv_nsec < 0) { \ + (vsp)->tv_sec--; \ + (vsp)->tv_nsec += 1000000000L; \ + } \ + } while (0) +#endif + +#endif diff --git a/include/compat/unistd.h b/include/compat/unistd.h index d596043..e70a390 100644 --- a/include/compat/unistd.h +++ b/include/compat/unistd.h @@ -7,7 +7,16 @@ #define LIBCRYPTOCOMPAT_UNISTD_H #ifndef _MSC_VER + #include_next + +#ifdef __MINGW32__ +int ftruncate(int fd, off_t length); +uid_t getuid(void); +ssize_t pread(int d, void *buf, size_t nbytes, off_t offset); +ssize_t pwrite(int d, const void *buf, size_t nbytes, off_t offset); +#endif + #else #include @@ -22,10 +31,19 @@ #define X_OK 0 #define F_OK 0 +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + #define access _access unsigned int sleep(unsigned int seconds); +int ftruncate(int fd, off_t length); +uid_t getuid(void); +ssize_t pread(int d, void *buf, size_t nbytes, off_t offset); +ssize_t pwrite(int d, const void *buf, size_t nbytes, off_t offset); + #endif #ifndef HAVE_GETENTROPY diff --git a/include/openssl/Makefile.am b/include/openssl/Makefile.am deleted file mode 100644 index 9abcc0b..0000000 --- a/include/openssl/Makefile.am +++ /dev/null @@ -1,75 +0,0 @@ -include $(top_srcdir)/Makefile.am.common - -opensslincludedir=$(includedir)/openssl - -opensslinclude_HEADERS = -opensslinclude_HEADERS += aes.h -opensslinclude_HEADERS += asn1.h -opensslinclude_HEADERS += asn1_mac.h -opensslinclude_HEADERS += asn1t.h -opensslinclude_HEADERS += bio.h -opensslinclude_HEADERS += blowfish.h -opensslinclude_HEADERS += bn.h -opensslinclude_HEADERS += buffer.h -opensslinclude_HEADERS += camellia.h -opensslinclude_HEADERS += cast.h -opensslinclude_HEADERS += chacha.h -opensslinclude_HEADERS += cmac.h -opensslinclude_HEADERS += comp.h -opensslinclude_HEADERS += conf.h -opensslinclude_HEADERS += conf_api.h -opensslinclude_HEADERS += crypto.h -opensslinclude_HEADERS += curve25519.h -opensslinclude_HEADERS += des.h -opensslinclude_HEADERS += dh.h -opensslinclude_HEADERS += dsa.h -opensslinclude_HEADERS += dso.h -opensslinclude_HEADERS += dtls1.h -opensslinclude_HEADERS += ec.h -opensslinclude_HEADERS += ecdh.h -opensslinclude_HEADERS += ecdsa.h -opensslinclude_HEADERS += engine.h -opensslinclude_HEADERS += err.h -opensslinclude_HEADERS += evp.h -opensslinclude_HEADERS += gost.h -opensslinclude_HEADERS += hkdf.h -opensslinclude_HEADERS += hmac.h -opensslinclude_HEADERS += idea.h -opensslinclude_HEADERS += lhash.h -opensslinclude_HEADERS += md4.h -opensslinclude_HEADERS += md5.h -opensslinclude_HEADERS += modes.h -opensslinclude_HEADERS += obj_mac.h -opensslinclude_HEADERS += objects.h -opensslinclude_HEADERS += ocsp.h -opensslinclude_HEADERS += opensslconf.h -opensslinclude_HEADERS += opensslfeatures.h -opensslinclude_HEADERS += opensslv.h -opensslinclude_HEADERS += ossl_typ.h -opensslinclude_HEADERS += pem.h -opensslinclude_HEADERS += pem2.h -opensslinclude_HEADERS += pkcs12.h -opensslinclude_HEADERS += pkcs7.h -opensslinclude_HEADERS += poly1305.h -opensslinclude_HEADERS += rand.h -opensslinclude_HEADERS += rc2.h -opensslinclude_HEADERS += rc4.h -opensslinclude_HEADERS += ripemd.h -opensslinclude_HEADERS += rsa.h -opensslinclude_HEADERS += safestack.h -opensslinclude_HEADERS += sha.h -opensslinclude_HEADERS += srtp.h -opensslinclude_HEADERS += ssl.h -opensslinclude_HEADERS += ssl2.h -opensslinclude_HEADERS += ssl23.h -opensslinclude_HEADERS += ssl3.h -opensslinclude_HEADERS += stack.h -opensslinclude_HEADERS += tls1.h -opensslinclude_HEADERS += ts.h -opensslinclude_HEADERS += txt_db.h -opensslinclude_HEADERS += ui.h -opensslinclude_HEADERS += ui_compat.h -opensslinclude_HEADERS += whrlpool.h -opensslinclude_HEADERS += x509.h -opensslinclude_HEADERS += x509_vfy.h -opensslinclude_HEADERS += x509v3.h diff --git a/include/openssl/Makefile.in b/include/openssl/Makefile.in deleted file mode 100644 index b4621d2..0000000 --- a/include/openssl/Makefile.in +++ /dev/null @@ -1,582 +0,0 @@ -# Makefile.in generated by automake 1.15.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2017 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = include/openssl -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/check-hardening-options.m4 \ - $(top_srcdir)/m4/check-libc.m4 \ - $(top_srcdir)/m4/check-os-options.m4 \ - $(top_srcdir)/m4/disable-compiler-warnings.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(opensslinclude_HEADERS) \ - $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(opensslincludedir)" -HEADERS = $(opensslinclude_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -am__DIST_COMMON = $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCAS = @CCAS@ -CCASDEPMODE = @CCASDEPMODE@ -CCASFLAGS = @CCASFLAGS@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBCRYPTO_VERSION = @LIBCRYPTO_VERSION@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBSSL_VERSION = @LIBSSL_VERSION@ -LIBTLS_VERSION = @LIBTLS_VERSION@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OPENSSLDIR = @OPENSSLDIR@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PLATFORM_LDADD = @PLATFORM_LDADD@ -PROG_LDADD = @PROG_LDADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AM_CFLAGS = -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/include/compat \ - -DLIBRESSL_INTERNAL -D__BEGIN_HIDDEN_DECLS= \ - -D__END_HIDDEN_DECLS= -opensslincludedir = $(includedir)/openssl -opensslinclude_HEADERS = aes.h asn1.h asn1_mac.h asn1t.h bio.h \ - blowfish.h bn.h buffer.h camellia.h cast.h chacha.h cmac.h \ - comp.h conf.h conf_api.h crypto.h curve25519.h des.h dh.h \ - dsa.h dso.h dtls1.h ec.h ecdh.h ecdsa.h engine.h err.h evp.h \ - gost.h hkdf.h hmac.h idea.h lhash.h md4.h md5.h modes.h \ - obj_mac.h objects.h ocsp.h opensslconf.h opensslfeatures.h \ - opensslv.h ossl_typ.h pem.h pem2.h pkcs12.h pkcs7.h poly1305.h \ - rand.h rc2.h rc4.h ripemd.h rsa.h safestack.h sha.h srtp.h \ - ssl.h ssl2.h ssl23.h ssl3.h stack.h tls1.h ts.h txt_db.h ui.h \ - ui_compat.h whrlpool.h x509.h x509_vfy.h x509v3.h -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/openssl/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/openssl/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; -$(top_srcdir)/Makefile.am.common $(am__empty): - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-opensslincludeHEADERS: $(opensslinclude_HEADERS) - @$(NORMAL_INSTALL) - @list='$(opensslinclude_HEADERS)'; test -n "$(opensslincludedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(opensslincludedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(opensslincludedir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(opensslincludedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(opensslincludedir)" || exit $$?; \ - done - -uninstall-opensslincludeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(opensslinclude_HEADERS)'; test -n "$(opensslincludedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(opensslincludedir)'; $(am__uninstall_files_from_dir) - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(opensslincludedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-opensslincludeHEADERS - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-opensslincludeHEADERS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool cscopelist-am ctags ctags-am distclean \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man \ - install-opensslincludeHEADERS install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-opensslincludeHEADERS - -.PRECIOUS: Makefile - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index da16d5c..6fc4cd7 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -1,4 +1,4 @@ -/* $OpenBSD: asn1.h,v 1.43 2017/05/06 17:12:59 beck Exp $ */ +/* $OpenBSD: asn1.h,v 1.44 2018/02/14 16:46:04 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -784,7 +784,8 @@ void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); int ASN1_STRING_length(const ASN1_STRING *x); void ASN1_STRING_length_set(ASN1_STRING *x, int n); int ASN1_STRING_type(ASN1_STRING *x); -unsigned char * ASN1_STRING_data(ASN1_STRING *x); +unsigned char *ASN1_STRING_data(ASN1_STRING *x); +const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x); ASN1_BIT_STRING *ASN1_BIT_STRING_new(void); void ASN1_BIT_STRING_free(ASN1_BIT_STRING *a); diff --git a/include/openssl/bio.h b/include/openssl/bio.h index b753596..c4d3b23 100644 --- a/include/openssl/bio.h +++ b/include/openssl/bio.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bio.h,v 1.30 2017/04/06 18:25:38 deraadt Exp $ */ +/* $OpenBSD: bio.h,v 1.40 2018/03/17 15:05:55 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -103,6 +103,12 @@ extern "C" { #define BIO_TYPE_FILTER 0x0200 #define BIO_TYPE_SOURCE_SINK 0x0400 +/* + * BIO_TYPE_START is the first user-allocated BIO type. No pre-defined type, + * flag bits aside, may exceed this value. + */ +#define BIO_TYPE_START 128 + /* BIO_FILENAME_READ|BIO_CLOSE to open or close on free. * BIO_set_fp(in,stdin,BIO_NOCLOSE); */ #define BIO_NOCLOSE 0x00 @@ -264,6 +270,7 @@ const char * BIO_method_name(const BIO *b); int BIO_method_type(const BIO *b); typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long); +typedef int BIO_info_cb(BIO *, int, int); typedef struct bio_method_st { int type; @@ -327,6 +334,27 @@ typedef struct bio_f_buffer_ctx_struct { /* Prefix and suffix callback in ASN1 BIO */ typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg); +/* BIO_METHOD accessors */ +BIO_METHOD *BIO_meth_new(int type, const char *name); +void BIO_meth_free(BIO_METHOD *biom); +int (*BIO_meth_get_write(BIO_METHOD *biom))(BIO *, const char *, int); +int BIO_meth_set_write(BIO_METHOD *biom, + int (*write)(BIO *, const char *, int)); +int (*BIO_meth_get_read(BIO_METHOD *biom))(BIO *, char *, int); +int BIO_meth_set_read(BIO_METHOD *biom, int (*read)(BIO *, char *, int)); +int (*BIO_meth_get_puts(BIO_METHOD *biom))(BIO *, const char *); +int BIO_meth_set_puts(BIO_METHOD *biom, int (*puts)(BIO *, const char *)); +int (*BIO_meth_get_gets(BIO_METHOD *biom))(BIO *, char *, int); +int BIO_meth_set_gets(BIO_METHOD *biom, int (*gets)(BIO *, char *, int)); +long (*BIO_meth_get_ctrl(BIO_METHOD *biom))(BIO *, int, long, void *); +int BIO_meth_set_ctrl(BIO_METHOD *biom, long (*ctrl)(BIO *, int, long, void *)); +int (*BIO_meth_get_create(BIO_METHOD *biom))(BIO *); +int BIO_meth_set_create(BIO_METHOD *biom, int (*create)(BIO *)); +int (*BIO_meth_get_destroy(BIO_METHOD *biom))(BIO *); +int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy)(BIO *)); +long (*BIO_meth_get_callback_ctrl(BIO_METHOD *biom))(BIO *, int, BIO_info_cb *); +int BIO_meth_set_callback_ctrl(BIO_METHOD *biom, + long (*callback_ctrl)(BIO *, int, BIO_info_cb *)); /* connect BIO stuff */ #define BIO_CONN_S_BEFORE 1 @@ -568,6 +596,7 @@ int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, asn1_ps_func **psuffix_free); +int BIO_get_new_index(void); BIO_METHOD *BIO_s_file(void ); BIO *BIO_new_file(const char *filename, const char *mode); BIO *BIO_new_fp(FILE *stream, int close_flag); @@ -575,6 +604,12 @@ BIO *BIO_new_fp(FILE *stream, int close_flag); BIO * BIO_new(BIO_METHOD *type); int BIO_set(BIO *a, BIO_METHOD *type); int BIO_free(BIO *a); +int BIO_up_ref(BIO *bio); +void *BIO_get_data(BIO *a); +void BIO_set_data(BIO *a, void *ptr); +void BIO_set_init(BIO *a, int init); +int BIO_get_shutdown(BIO *a); +void BIO_set_shutdown(BIO *a, int shut); void BIO_vfree(BIO *a); int BIO_read(BIO *b, void *data, int len) __attribute__((__bounded__(__buffer__,2,3))); diff --git a/include/openssl/bn.h b/include/openssl/bn.h index 0dde08a..cd94e39 100644 --- a/include/openssl/bn.h +++ b/include/openssl/bn.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bn.h,v 1.36 2017/01/25 06:15:44 beck Exp $ */ +/* $OpenBSD: bn.h,v 1.38 2018/02/20 17:13:14 jsing Exp $ */ /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -285,6 +285,11 @@ struct bn_gencb_st { int (*cb_2)(int, int, BN_GENCB *); } cb; }; + +BN_GENCB *BN_GENCB_new(void); +void BN_GENCB_free(BN_GENCB *cb); +void *BN_GENCB_get_arg(BN_GENCB *cb); + /* Wrapper function to make using BN_GENCB easier, */ int BN_GENCB_call(BN_GENCB *cb, int a, int b); /* Macro to populate a BN_GENCB structure with an "old"-style callback */ @@ -628,6 +633,8 @@ const BIGNUM *BN_get0_nist_prime_521(void); /* Primes from RFC 2409 */ BIGNUM *get_rfc2409_prime_768(BIGNUM *bn); BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn); +BIGNUM *BN_get_rfc2409_prime_768(BIGNUM *bn); +BIGNUM *BN_get_rfc2409_prime_1024(BIGNUM *bn); /* Primes from RFC 3526 */ BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn); @@ -636,6 +643,12 @@ BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn); BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn); BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn); BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *bn); /* BEGIN ERROR CODES */ /* The following lines are auto generated by the script mkerr.pl. Any changes diff --git a/include/openssl/crypto.h b/include/openssl/crypto.h index 068415f..67e06a1 100644 --- a/include/openssl/crypto.h +++ b/include/openssl/crypto.h @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto.h,v 1.41 2017/04/29 21:48:43 jsing Exp $ */ +/* $OpenBSD: crypto.h,v 1.45 2018/03/19 03:35:38 beck Exp $ */ /* ==================================================================== * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. * @@ -330,6 +330,14 @@ int CRYPTO_is_mem_check_on(void); CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) #define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr) +const char *OpenSSL_version(int type); +#define OPENSSL_VERSION 0 +#define OPENSSL_CFLAGS 1 +#define OPENSSL_BUILT_ON 2 +#define OPENSSL_PLATFORM 3 +#define OPENSSL_DIR 4 +#define OPENSSL_ENGINES_DIR 5 +unsigned long OpenSSL_version_num(void); const char *SSLeay_version(int type); unsigned long SSLeay(void); @@ -534,6 +542,40 @@ void ERR_load_CRYPTO_strings(void); #define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED 101 #define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK 100 +/* + * OpenSSL compatible OPENSSL_INIT options. + */ + +#define OPENSSL_INIT_NO_LOAD_CONFIG 0x00000001L +#define OPENSSL_INIT_LOAD_CONFIG 0x00000002L + +/* LibreSSL specific */ +#define _OPENSSL_INIT_FLAG_NOOP 0x80000000L + +/* + * These are provided for compatibiliy, but have no effect + * on how LibreSSL is initialized. + */ +#define OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_LOAD_CRYPTO_STRINGS _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ADD_ALL_CIPHERS _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ADD_ALL_DIGESTS _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_NO_ADD_ALL_CIPHERS _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_NO_ADD_ALL_DIGESTS _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ASYNC _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ENGINE_RDRAND _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ENGINE_DYNAMIC _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ENGINE_OPENSSL _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ENGINE_CRYPTODEV _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ENGINE_CAPI _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ENGINE_PADLOCK _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ENGINE_AFALG _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_reserved_internal _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ATFORK _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_ENGINE_ALL_BUILTIN _OPENSSL_INIT_FLAG_NOOP + +int OPENSSL_init_crypto(uint64_t opts, const void *settings); + #ifdef __cplusplus } #endif diff --git a/include/openssl/dh.h b/include/openssl/dh.h index 920af3b..082b502 100644 --- a/include/openssl/dh.h +++ b/include/openssl/dh.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dh.h,v 1.18 2016/11/04 18:35:30 jsing Exp $ */ +/* $OpenBSD: dh.h,v 1.25 2018/02/22 16:41:04 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -183,11 +183,23 @@ DH * DH_new(void); void DH_free(DH *dh); int DH_up_ref(DH *dh); int DH_size(const DH *dh); +int DH_bits(const DH *dh); int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); int DH_set_ex_data(DH *d, int idx, void *arg); void *DH_get_ex_data(DH *d, int idx); +ENGINE *DH_get0_engine(DH *d); +void DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, + const BIGNUM **g); +int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g); +void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key); +int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key); +void DH_clear_flags(DH *dh, int flags); +int DH_test_flags(const DH *dh, int flags); +void DH_set_flags(DH *dh, int flags); +int DH_set_length(DH *dh, long length); + /* Deprecated version */ #ifndef OPENSSL_NO_DEPRECATED DH * DH_generate_parameters(int prime_len,int generator, diff --git a/include/openssl/dsa.h b/include/openssl/dsa.h index 6ddd4c3..61bfc2b 100644 --- a/include/openssl/dsa.h +++ b/include/openssl/dsa.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dsa.h,v 1.22 2016/11/04 18:35:30 jsing Exp $ */ +/* $OpenBSD: dsa.h,v 1.30 2018/03/17 15:19:12 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -183,6 +183,8 @@ DSA_SIG * DSA_SIG_new(void); void DSA_SIG_free(DSA_SIG *a); int i2d_DSA_SIG(const DSA_SIG *a, unsigned char **pp); DSA_SIG * d2i_DSA_SIG(DSA_SIG **v, const unsigned char **pp, long length); +void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); +int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s); DSA_SIG * DSA_do_sign(const unsigned char *dgst,int dlen,DSA *dsa); int DSA_do_verify(const unsigned char *dgst,int dgst_len, @@ -257,6 +259,23 @@ int DSA_print_fp(FILE *bp, const DSA *x, int off); DH *DSA_dup_DH(const DSA *r); #endif +void DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, + const BIGNUM **g); +int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g); +void DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key); +int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key); +void DSA_clear_flags(DSA *d, int flags); +int DSA_test_flags(const DSA *d, int flags); +void DSA_set_flags(DSA *d, int flags); +ENGINE *DSA_get0_engine(DSA *d); + +DSA_METHOD *DSA_meth_new(const char *name, int flags); +void DSA_meth_free(DSA_METHOD *meth); +DSA_METHOD *DSA_meth_dup(const DSA_METHOD *meth); +int DSA_meth_set_sign(DSA_METHOD *meth, + DSA_SIG *(*sign)(const unsigned char *, int, DSA *)); +int DSA_meth_set_finish(DSA_METHOD *meth, int (*finish)(DSA *)); + #define EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, nbits) \ EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \ EVP_PKEY_CTRL_DSA_PARAMGEN_BITS, nbits, NULL) diff --git a/include/openssl/ecdsa.h b/include/openssl/ecdsa.h index 530ab26..9c53230 100644 --- a/include/openssl/ecdsa.h +++ b/include/openssl/ecdsa.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ecdsa.h,v 1.4 2015/02/08 13:35:06 jsing Exp $ */ +/* $OpenBSD: ecdsa.h,v 1.5 2018/03/17 15:24:44 tb Exp $ */ /** * \file crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions * \author Written by Nils Larsch for the OpenSSL project @@ -133,6 +133,20 @@ int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp); */ ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len); +/** Accessor for r and s fields of ECDSA_SIG + * \param sig pointer to ECDSA_SIG pointer + * \param pr pointer to BIGNUM pointer for r (may be NULL) + * \param ps pointer to BIGNUM pointer for s (may be NULL) + */ +void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); + +/** Setter for r and s fields of ECDSA_SIG + * \param sig pointer to ECDSA_SIG pointer + * \param r pointer to BIGNUM for r (may be NULL) + * \param s pointer to BIGNUM for s (may be NULL) + */ +int ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s); + /** Computes the ECDSA signature of the given hash value using * the supplied private key and returns the created signature. * \param dgst pointer to the hash value diff --git a/include/openssl/evp.h b/include/openssl/evp.h index 853abe6..e12e771 100644 --- a/include/openssl/evp.h +++ b/include/openssl/evp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: evp.h,v 1.53 2017/08/28 17:48:02 jsing Exp $ */ +/* $OpenBSD: evp.h,v 1.58 2018/02/20 18:05:28 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -535,15 +535,19 @@ int EVP_Cipher(EVP_CIPHER_CTX *c, unsigned char *out, const unsigned char *in, #define EVP_delete_digest_alias(alias) \ OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS); +EVP_MD_CTX *EVP_MD_CTX_new(void); +void EVP_MD_CTX_free(EVP_MD_CTX *ctx); void EVP_MD_CTX_init(EVP_MD_CTX *ctx); -int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx); +int EVP_MD_CTX_reset(EVP_MD_CTX *ctx); EVP_MD_CTX *EVP_MD_CTX_create(void); void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx); +int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx); int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in); void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr); int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags); + int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); @@ -640,6 +644,7 @@ void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a); int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a); EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a); +int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *a); int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); @@ -870,23 +875,27 @@ void *EVP_PKEY_get0(EVP_PKEY *pkey); #ifndef OPENSSL_NO_RSA struct rsa_st; -int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); +struct rsa_st *EVP_PKEY_get0_RSA(EVP_PKEY *pkey); struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey); +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); #endif #ifndef OPENSSL_NO_DSA struct dsa_st; -int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key); +struct dsa_st *EVP_PKEY_get0_DSA(EVP_PKEY *pkey); struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey); +int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key); #endif #ifndef OPENSSL_NO_DH struct dh_st; -int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key); +struct dh_st *EVP_PKEY_get0_DH(EVP_PKEY *pkey); struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey); +int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key); #endif #ifndef OPENSSL_NO_EC struct ec_key_st; -int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key); +struct ec_key_st *EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey); struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key); #endif #ifndef OPENSSL_NO_GOST struct gost_key_st; @@ -894,6 +903,7 @@ struct gost_key_st; EVP_PKEY *EVP_PKEY_new(void); void EVP_PKEY_free(EVP_PKEY *pkey); +int EVP_PKEY_up_ref(EVP_PKEY *pkey); EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp, long length); diff --git a/include/openssl/hmac.h b/include/openssl/hmac.h index f3418b3..e787c62 100644 --- a/include/openssl/hmac.h +++ b/include/openssl/hmac.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hmac.h,v 1.12 2014/06/21 13:39:46 jsing Exp $ */ +/* $OpenBSD: hmac.h,v 1.13 2018/02/17 14:53:59 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -83,8 +83,10 @@ typedef struct hmac_ctx_st { #define HMAC_size(e) (EVP_MD_size((e)->md)) - +HMAC_CTX *HMAC_CTX_new(void); +void HMAC_CTX_free(HMAC_CTX *ctx); void HMAC_CTX_init(HMAC_CTX *ctx); +int HMAC_CTX_reset(HMAC_CTX *ctx); void HMAC_CTX_cleanup(HMAC_CTX *ctx); #define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) /* deprecated */ @@ -100,6 +102,7 @@ unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); +const EVP_MD *HMAC_CTX_get_md(const HMAC_CTX *ctx); #ifdef __cplusplus } diff --git a/include/openssl/obj_mac.h b/include/openssl/obj_mac.h index 753ef10..2f7b6a9 100644 --- a/include/openssl/obj_mac.h +++ b/include/openssl/obj_mac.h @@ -4116,6 +4116,10 @@ #define LN_chacha20 "chacha" #define NID_chacha20 937 +#define SN_chacha20_poly1305 "ChaCha20-Poly1305" +#define LN_chacha20_poly1305 "chacha20-poly1305" +#define NID_chacha20_poly1305 967 + #define SN_gost89_ecb "gost89-ecb" #define NID_gost89_ecb 938 @@ -4192,3 +4196,35 @@ #define NID_Ed448ph 955 #define OBJ_Ed448ph 1L,3L,101L,115L +#define SN_kx_rsa "KxRSA" +#define LN_kx_rsa "kx-rsa" +#define NID_kx_rsa 959 + +#define SN_kx_ecdhe "KxECDHE" +#define LN_kx_ecdhe "kx-ecdhe" +#define NID_kx_ecdhe 960 + +#define SN_kx_dhe "KxDHE" +#define LN_kx_dhe "kx-dhe" +#define NID_kx_dhe 961 + +#define SN_kx_gost "KxGOST" +#define LN_kx_gost "kx-gost" +#define NID_kx_gost 962 + +#define SN_auth_rsa "AuthRSA" +#define LN_auth_rsa "auth-rsa" +#define NID_auth_rsa 963 + +#define SN_auth_ecdsa "AuthECDSA" +#define LN_auth_ecdsa "auth-ecdsa" +#define NID_auth_ecdsa 964 + +#define SN_auth_gost01 "AuthGOST01" +#define LN_auth_gost01 "auth-gost01" +#define NID_auth_gost01 965 + +#define SN_auth_null "AuthNULL" +#define LN_auth_null "auth-null" +#define NID_auth_null 966 + diff --git a/include/openssl/ocsp.h b/include/openssl/ocsp.h index e3fa6f5..b2c4367 100644 --- a/include/openssl/ocsp.h +++ b/include/openssl/ocsp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ocsp.h,v 1.11 2016/12/30 16:19:04 jsing Exp $ */ +/* $OpenBSD: ocsp.h,v 1.12 2018/03/17 14:44:34 jsing Exp $ */ /* Written by Tom Titchener for the OpenSSL * project. */ @@ -511,6 +511,7 @@ int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit, unsigned long flags); int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); +const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *x); OCSP_SINGLERESP *OCSP_SINGLERESP_new(void); void OCSP_SINGLERESP_free(OCSP_SINGLERESP *a); diff --git a/include/openssl/opensslv.h b/include/openssl/opensslv.h index c8dd39d..68c6e77 100644 --- a/include/openssl/opensslv.h +++ b/include/openssl/opensslv.h @@ -1,10 +1,11 @@ -/* $OpenBSD: opensslv.h,v 1.43.4.1 2017/12/11 10:50:37 bcook Exp $ */ +/* $OpenBSD: opensslv.h,v 1.46 2018/03/24 13:51:27 bcook Exp $ */ #ifndef HEADER_OPENSSLV_H #define HEADER_OPENSSLV_H /* These will change with each release of LibreSSL-portable */ -#define LIBRESSL_VERSION_NUMBER 0x2060400fL -#define LIBRESSL_VERSION_TEXT "LibreSSL 2.6.4" +#define LIBRESSL_VERSION_NUMBER 0x2070200fL +/* ^ Patch starts here */ +#define LIBRESSL_VERSION_TEXT "LibreSSL 2.7.2" /* These will never change */ #define OPENSSL_VERSION_NUMBER 0x20000000L diff --git a/include/openssl/rsa.h b/include/openssl/rsa.h index 7476a11..23929aa 100644 --- a/include/openssl/rsa.h +++ b/include/openssl/rsa.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rsa.h,v 1.31 2017/08/30 16:07:35 jsing Exp $ */ +/* $OpenBSD: rsa.h,v 1.38 2018/03/17 15:12:56 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -256,6 +256,7 @@ struct rsa_st { RSA *RSA_new(void); RSA *RSA_new_method(ENGINE *engine); +int RSA_bits(const RSA *rsa); int RSA_size(const RSA *rsa); /* Deprecated version */ @@ -395,6 +396,18 @@ int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, int RSA_set_ex_data(RSA *r, int idx, void *arg); void *RSA_get_ex_data(const RSA *r, int idx); +void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, + const BIGNUM **d); +int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d); +void RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, + const BIGNUM **iqmp); +int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp); +void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q); +int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q); +void RSA_clear_flags(RSA *r, int flags); +int RSA_test_flags(const RSA *r, int flags); +void RSA_set_flags(RSA *r, int flags); + RSA *RSAPublicKey_dup(RSA *rsa); RSA *RSAPrivateKey_dup(RSA *rsa); @@ -417,6 +430,15 @@ RSA *RSAPrivateKey_dup(RSA *rsa); */ #define RSA_FLAG_CHECKED 0x0800 +RSA_METHOD *RSA_meth_new(const char *name, int flags); +void RSA_meth_free(RSA_METHOD *meth); +RSA_METHOD *RSA_meth_dup(const RSA_METHOD *meth); +int RSA_meth_set_priv_enc(RSA_METHOD *meth, int (*priv_enc)(int flen, + const unsigned char *from, unsigned char *to, RSA *rsa, int padding)); +int RSA_meth_set_priv_dec(RSA_METHOD *meth, int (*priv_dec)(int flen, + const unsigned char *from, unsigned char *to, RSA *rsa, int padding)); +int RSA_meth_set_finish(RSA_METHOD *meth, int (*finish)(RSA *rsa)); + /* BEGIN ERROR CODES */ /* The following lines are auto generated by the script mkerr.pl. Any changes * made after this point may be overwritten when the script is next run. diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h index d431b17..78a6787 100644 --- a/include/openssl/ssl.h +++ b/include/openssl/ssl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl.h,v 1.134 2017/08/30 16:24:21 jsing Exp $ */ +/* $OpenBSD: ssl.h,v 1.154 2018/03/20 15:28:12 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -1080,7 +1080,9 @@ int PEM_write_SSL_SESSION(FILE *fp, SSL_SESSION *x); #define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 #define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 #define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB 128 #define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG 129 #define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 #define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 #define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 @@ -1123,6 +1125,8 @@ int PEM_write_SSL_SESSION(FILE *fp, SSL_SESSION *x); #define SSL_CTRL_SET_MIN_PROTO_VERSION 123 #define SSL_CTRL_SET_MAX_PROTO_VERSION 124 +#define SSL_CTRL_GET_MIN_PROTO_VERSION 130 +#define SSL_CTRL_GET_MAX_PROTO_VERSION 131 #define DTLSv1_get_timeout(ssl, arg) \ SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg) @@ -1172,9 +1176,13 @@ int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups); int SSL_set1_groups(SSL *ssl, const int *groups, size_t groups_len); int SSL_set1_groups_list(SSL *ssl, const char *groups); +int SSL_CTX_get_min_proto_version(SSL_CTX *ctx); +int SSL_CTX_get_max_proto_version(SSL_CTX *ctx); int SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version); int SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version); +int SSL_get_min_proto_version(SSL *ssl); +int SSL_get_max_proto_version(SSL *ssl); int SSL_set_min_proto_version(SSL *ssl, uint16_t version); int SSL_set_max_proto_version(SSL *ssl, uint16_t version); @@ -1198,6 +1206,25 @@ int SSL_set_max_proto_version(SSL *ssl, uint16_t version); #define SSL_get_server_tmp_key(s, pk) \ SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk) +#ifndef LIBRESSL_INTERNAL +/* + * Also provide those functions as macros for compatibility with + * existing users. + */ +#define SSL_CTX_set1_groups SSL_CTX_set1_groups +#define SSL_CTX_set1_groups_list SSL_CTX_set1_groups_list +#define SSL_set1_groups SSL_set1_groups +#define SSL_set1_groups_list SSL_set1_groups_list +#define SSL_CTX_get_min_proto_version SSL_CTX_get_min_proto_version +#define SSL_CTX_get_max_proto_version SSL_CTX_get_max_proto_version +#define SSL_CTX_set_min_proto_version SSL_CTX_set_min_proto_version +#define SSL_CTX_set_max_proto_version SSL_CTX_set_max_proto_version +#define SSL_get_min_proto_version SSL_get_min_proto_version +#define SSL_get_max_proto_version SSL_get_max_proto_version +#define SSL_set_min_proto_version SSL_set_min_proto_version +#define SSL_set_max_proto_version SSL_set_max_proto_version +#endif + BIO_METHOD *BIO_f_ssl(void); BIO *BIO_new_ssl(SSL_CTX *ctx, int client); BIO *BIO_new_ssl_connect(SSL_CTX *ctx); @@ -1205,13 +1232,16 @@ BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); int BIO_ssl_copy_session_id(BIO *to, BIO *from); void BIO_ssl_shutdown(BIO *ssl_bio); +STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx); int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); void SSL_CTX_free(SSL_CTX *); +int SSL_CTX_up_ref(SSL_CTX *ctx); long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); long SSL_CTX_get_timeout(const SSL_CTX *ctx); X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); int SSL_want(const SSL *s); int SSL_clear(SSL *s); @@ -1225,6 +1255,11 @@ char * SSL_CIPHER_get_version(const SSL_CIPHER *c); const char * SSL_CIPHER_get_name(const SSL_CIPHER *c); unsigned long SSL_CIPHER_get_id(const SSL_CIPHER *c); uint16_t SSL_CIPHER_get_value(const SSL_CIPHER *c); +int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c); +int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c); +int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c); +int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c); +int SSL_CIPHER_is_aead(const SSL_CIPHER *c); int SSL_get_fd(const SSL *s); int SSL_get_rfd(const SSL *s); @@ -1273,22 +1308,32 @@ const char *SSL_state_string(const SSL *s); const char *SSL_rstate_string(const SSL *s); const char *SSL_state_string_long(const SSL *s); const char *SSL_rstate_string_long(const SSL *s); +size_t SSL_SESSION_get_master_key(const SSL_SESSION *ss, + unsigned char *out, size_t max_out); +int SSL_SESSION_get_protocol_version(const SSL_SESSION *s); long SSL_SESSION_get_time(const SSL_SESSION *s); long SSL_SESSION_set_time(SSL_SESSION *s, long t); long SSL_SESSION_get_timeout(const SSL_SESSION *s); long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); void SSL_copy_session_id(SSL *to, const SSL *from); X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid, + unsigned int sid_len); int SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len); SSL_SESSION *SSL_SESSION_new(void); -const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, +void SSL_SESSION_free(SSL_SESSION *ses); +int SSL_SESSION_up_ref(SSL_SESSION *ss); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *ss, unsigned int *len); -unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *ss, + unsigned int *len); +unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s); +int SSL_SESSION_has_ticket(const SSL_SESSION *s); +unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *ss); int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); -void SSL_SESSION_free(SSL_SESSION *ses); int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp); int SSL_set_session(SSL *to, SSL_SESSION *session); int SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c); @@ -1320,7 +1365,9 @@ int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, const unsigned char *d, lo int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, const unsigned char *d); +pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx); void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx); void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); int SSL_CTX_check_private_key(const SSL_CTX *ctx); @@ -1328,7 +1375,6 @@ int SSL_check_private_key(const SSL *ctx); int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, unsigned int sid_ctx_len); -SSL *SSL_new(SSL_CTX *ctx); int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, unsigned int sid_ctx_len); int SSL_CTX_set_purpose(SSL_CTX *s, int purpose); @@ -1336,13 +1382,17 @@ int SSL_set_purpose(SSL *s, int purpose); int SSL_CTX_set_trust(SSL_CTX *s, int trust); int SSL_set_trust(SSL *s, int trust); +X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); - +SSL *SSL_new(SSL_CTX *ctx); void SSL_free(SSL *ssl); +int SSL_up_ref(SSL *ssl); int SSL_accept(SSL *ssl); int SSL_connect(SSL *ssl); +int SSL_is_server(const SSL *s); int SSL_read(SSL *ssl, void *buf, int num); int SSL_peek(SSL *ssl, void *buf, int num); int SSL_write(SSL *ssl, const void *buf, int num); @@ -1505,6 +1555,9 @@ void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, void SSL_set_tmp_ecdh_callback(SSL *ssl, EC_KEY *(*ecdh)(SSL *ssl, int is_export, int keylength)); +size_t SSL_get_client_random(const SSL *s, unsigned char *out, size_t max_out); +size_t SSL_get_server_random(const SSL *s, unsigned char *out, size_t max_out); + const void *SSL_get_current_compression(SSL *s); const void *SSL_get_current_expansion(SSL *s); @@ -1988,6 +2041,7 @@ void ERR_load_SSL_strings(void); #define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273 #define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 303 #define SSL_R_SSL_SESSION_ID_IS_DIFFERENT 231 +#define SSL_R_SSL_SESSION_ID_TOO_LONG 408 #define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 #define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 #define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 @@ -2061,6 +2115,19 @@ void ERR_load_SSL_strings(void); #define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 #define SSL_R_PEER_BEHAVING_BADLY 666 +/* + * OpenSSL compatible OPENSSL_INIT options + */ + +/* + * These are provided for compatibiliy, but have no effect + * on how LibreSSL is initialized. + */ +#define OPENSSL_INIT_LOAD_SSL_STRINGS _OPENSSL_INIT_FLAG_NOOP +#define OPENSSL_INIT_SSL_DEFAULT _OPENSSL_INIT_FLAG_NOOP + +int OPENSSL_init_ssl(uint64_t opts, const void *settings); + #ifdef __cplusplus } #endif diff --git a/include/openssl/tls1.h b/include/openssl/tls1.h index 8e369c7..0474bb7 100644 --- a/include/openssl/tls1.h +++ b/include/openssl/tls1.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tls1.h,v 1.31 2017/08/28 17:36:58 jsing Exp $ */ +/* $OpenBSD: tls1.h,v 1.32 2018/02/17 15:08:21 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -354,11 +354,15 @@ SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0, (void *)arg) #define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \ SSL_CTX_ctrl((ctx),SSL_CTRL_SET_TLSEXT_TICKET_KEYS,(keylen),(keys)) +#define SSL_CTX_get_tlsext_status_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB,(void (*)(void))cb) #define SSL_CTX_set_tlsext_status_cb(ssl, cb) \ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,(void (*)(void))cb) +#define SSL_CTX_get_tlsext_status_arg(ssl, arg) \ +SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG,0,(void *)arg) #define SSL_CTX_set_tlsext_status_arg(ssl, arg) \ -SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0, (void *)arg) +SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0,(void *)arg) #define SSL_CTX_set_tlsext_ticket_key_cb(ssl, cb) \ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb) diff --git a/include/openssl/x509.h b/include/openssl/x509.h index 2949325..3f7239b 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -1,4 +1,4 @@ -/* $OpenBSD: x509.h,v 1.26 2016/12/27 16:05:57 jsing Exp $ */ +/* $OpenBSD: x509.h,v 1.44 2018/03/17 15:28:27 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -619,6 +619,20 @@ extern "C" { #define X509_CRL_get_issuer(x) ((x)->crl->issuer) #define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) +int X509_CRL_up_ref(X509_CRL *x); +int X509_CRL_get_signature_nid(const X509_CRL *crl); + +const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl); +void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); + +int X509_REQ_get_signature_nid(const X509_REQ *req); + +void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); + void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); X509_CRL_METHOD *X509_CRL_METHOD_new( int (*crl_init)(X509_CRL *crl), @@ -763,6 +777,7 @@ void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); X509_NAME *X509_NAME_dup(X509_NAME *xn); +int X509_NAME_get0_der(X509_NAME *nm, const unsigned char **pder, size_t *pderlen); X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); int X509_cmp_time(const ASN1_TIME *s, time_t *t); @@ -804,6 +819,7 @@ extern const ASN1_ITEM X509_PUBKEY_it; int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); EVP_PKEY * X509_PUBKEY_get(X509_PUBKEY *key); +EVP_PKEY * X509_PUBKEY_get0(X509_PUBKEY *key); int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); int i2d_PUBKEY(EVP_PKEY *a,unsigned char **pp); @@ -900,6 +916,9 @@ int X509_set_ex_data(X509 *r, int idx, void *arg); void *X509_get_ex_data(X509 *r, int idx); int i2d_X509_AUX(X509 *a,unsigned char **pp); X509 * d2i_X509_AUX(X509 **a,const unsigned char **pp,long length); +void X509_get0_signature(const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg, const X509 *x); +int X509_get_signature_nid(const X509 *x); int X509_alias_set1(X509 *x, unsigned char *name, int len); int X509_keyid_set1(X509 *x, unsigned char *id, int len); @@ -914,14 +933,17 @@ void X509_reject_clear(X509 *x); X509_REVOKED *X509_REVOKED_new(void); void X509_REVOKED_free(X509_REVOKED *a); +X509_REVOKED *X509_REVOKED_dup(X509_REVOKED *a); X509_REVOKED *d2i_X509_REVOKED(X509_REVOKED **a, const unsigned char **in, long len); int i2d_X509_REVOKED(X509_REVOKED *a, unsigned char **out); extern const ASN1_ITEM X509_REVOKED_it; + X509_CRL_INFO *X509_CRL_INFO_new(void); void X509_CRL_INFO_free(X509_CRL_INFO *a); X509_CRL_INFO *d2i_X509_CRL_INFO(X509_CRL_INFO **a, const unsigned char **in, long len); int i2d_X509_CRL_INFO(X509_CRL_INFO *a, unsigned char **out); extern const ASN1_ITEM X509_CRL_INFO_it; + X509_CRL *X509_CRL_new(void); void X509_CRL_free(X509_CRL *a); X509_CRL *d2i_X509_CRL(X509_CRL **a, const unsigned char **in, long len); @@ -971,7 +993,9 @@ int ASN1_item_sign_ctx(const ASN1_ITEM *it, ASN1_BIT_STRING *signature, void *asn, EVP_MD_CTX *ctx); #endif -int X509_set_version(X509 *x,long version); +const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x); +const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x); +int X509_set_version(X509 *x, long version); int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); ASN1_INTEGER * X509_get_serialNumber(X509 *x); int X509_set_issuer_name(X509 *x, X509_NAME *name); @@ -979,10 +1003,17 @@ X509_NAME * X509_get_issuer_name(X509 *a); int X509_set_subject_name(X509 *x, X509_NAME *name); X509_NAME * X509_get_subject_name(X509 *a); int X509_set_notBefore(X509 *x, const ASN1_TIME *tm); +int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm); int X509_set_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm); +const ASN1_TIME *X509_get0_notBefore(const X509 *x); +ASN1_TIME *X509_getm_notBefore(const X509 *x); +const ASN1_TIME *X509_get0_notAfter(const X509 *x); +ASN1_TIME *X509_getm_notAfter(const X509 *x); int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); EVP_PKEY * X509_get_pubkey(X509 *x); -ASN1_BIT_STRING * X509_get0_pubkey_bitstr(const X509 *x); +EVP_PKEY * X509_get0_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); int X509_certificate_type(X509 *x,EVP_PKEY *pubkey /* optional */); int X509_REQ_set_version(X509_REQ *x,long version); @@ -1017,11 +1048,16 @@ int X509_REQ_add1_attr_by_txt(X509_REQ *req, int X509_CRL_set_version(X509_CRL *x, long version); int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name); int X509_CRL_set_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); int X509_CRL_set_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); int X509_CRL_sort(X509_CRL *crl); -int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions(const X509_REVOKED *x); +const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x); +const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x); int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); int X509_REQ_check_private_key(X509_REQ *x509,EVP_PKEY *pkey); @@ -1100,6 +1136,7 @@ int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, const unsigned char *bytes, int len); ASN1_OBJECT * X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); ASN1_STRING * X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); +int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne); int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, @@ -1288,6 +1325,7 @@ char *X509_TRUST_get0_name(X509_TRUST *xp); int X509_TRUST_get_trust(X509_TRUST *xp); int X509_up_ref(X509 *x); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); /* BEGIN ERROR CODES */ /* The following lines are auto generated by the script mkerr.pl. Any changes diff --git a/include/openssl/x509_vfy.h b/include/openssl/x509_vfy.h index b58d49d..9e0730b 100644 --- a/include/openssl/x509_vfy.h +++ b/include/openssl/x509_vfy.h @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_vfy.h,v 1.18 2016/12/21 15:15:45 jsing Exp $ */ +/* $OpenBSD: x509_vfy.h,v 1.27 2018/03/20 15:26:22 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -425,16 +425,29 @@ int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,int type,X509_NAME *name); X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x); void X509_OBJECT_up_ref_count(X509_OBJECT *a); +int X509_OBJECT_get_type(const X509_OBJECT *a); void X509_OBJECT_free_contents(X509_OBJECT *a); -X509_STORE *X509_STORE_new(void ); -void X509_STORE_free(X509_STORE *v); +X509 *X509_OBJECT_get0_X509(const X509_OBJECT *xo); +X509_CRL *X509_OBJECT_get0_X509_CRL(X509_OBJECT *xo); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *v); +int X509_STORE_up_ref(X509_STORE *x); STACK_OF(X509)* X509_STORE_get1_certs(X509_STORE_CTX *st, X509_NAME *nm); STACK_OF(X509_CRL)* X509_STORE_get1_crls(X509_STORE_CTX *st, X509_NAME *nm); +STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *xs); +void *X509_STORE_get_ex_data(X509_STORE *xs, int idx); +int X509_STORE_set_ex_data(X509_STORE *xs, int idx, void *data); + +#define X509_STORE_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE, (l), (p), \ + (newf), (dupf), (freef)) + int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags); int X509_STORE_set_purpose(X509_STORE *ctx, int purpose); int X509_STORE_set_trust(X509_STORE *ctx, int trust); int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm); +X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *ctx); void X509_STORE_set_verify_cb(X509_STORE *ctx, int (*verify_cb)(int, X509_STORE_CTX *)); @@ -446,7 +459,13 @@ int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); void X509_STORE_CTX_free(X509_STORE_CTX *ctx); int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) *chain); +X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get0_chain(X509_STORE_CTX *xs); +X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *xs); +STACK_OF(X509) *X509_STORE_CTX_get0_untrusted(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_untrusted(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m); @@ -512,7 +531,7 @@ void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, time_t t); void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, int (*verify_cb)(int, X509_STORE_CTX *)); - + X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx); int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx); @@ -542,6 +561,21 @@ int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, STACK_OF(ASN1_OBJECT) *policies); int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, const char *name, + size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, const char *name, + size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, const char *email, + size_t emaillen); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, const unsigned char *ip, + size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, const char *ipasc); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +int X509_VERIFY_PARAM_get_count(void); int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); diff --git a/include/tls.h b/include/tls.h index 3c83acd..32efd94 100644 --- a/include/tls.h +++ b/include/tls.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tls.h,v 1.51 2017/08/10 18:18:30 jsing Exp $ */ +/* $OpenBSD: tls.h,v 1.53 2018/02/10 04:58:08 jsing Exp $ */ /* * Copyright (c) 2014 Joel Sing * @@ -34,7 +34,7 @@ typedef SSIZE_T ssize_t; #include #include -#define TLS_API 20170126 +#define TLS_API 20180210 #define TLS_PROTOCOL_TLSv1_0 (1 << 1) #define TLS_PROTOCOL_TLSv1_1 (1 << 2) @@ -135,6 +135,7 @@ int tls_config_set_ocsp_staple_mem(struct tls_config *_config, int tls_config_set_ocsp_staple_file(struct tls_config *_config, const char *_staple_file); int tls_config_set_protocols(struct tls_config *_config, uint32_t _protocols); +int tls_config_set_session_fd(struct tls_config *_config, int _session_fd); int tls_config_set_verify_depth(struct tls_config *_config, int _verify_depth); void tls_config_prefer_ciphers_client(struct tls_config *_config); @@ -195,6 +196,7 @@ const uint8_t *tls_peer_cert_chain_pem(struct tls *_ctx, size_t *_len); const char *tls_conn_alpn_selected(struct tls *_ctx); const char *tls_conn_cipher(struct tls *_ctx); const char *tls_conn_servername(struct tls *_ctx); +int tls_conn_session_resumed(struct tls *_ctx); const char *tls_conn_version(struct tls *_ctx); uint8_t *tls_load_file(const char *_file, size_t *_len, char *_password); diff --git a/ssl/CMakeLists.txt b/ssl/CMakeLists.txt index 3ea16a8..e87e0f6 100644 --- a/ssl/CMakeLists.txt +++ b/ssl/CMakeLists.txt @@ -28,6 +28,7 @@ set( ssl_ciph.c ssl_clnt.c ssl_err.c + ssl_init.c ssl_lib.c ssl_packet.c ssl_pkt.c @@ -46,27 +47,26 @@ set( t1_srvr.c ) -add_library(ssl-objects OBJECT ${SSL_SRC}) -if (BUILD_SHARED) - add_library(ssl STATIC $) - add_library(ssl-shared SHARED $) - export_symbol(ssl-shared ${CMAKE_CURRENT_SOURCE_DIR}/ssl.sym) - target_link_libraries(ssl-shared crypto-shared) +add_library(ssl ${SSL_SRC}) +if (BUILD_SHARED_LIBS) + export_symbol(ssl ${CMAKE_CURRENT_SOURCE_DIR}/ssl.sym) + target_link_libraries(ssl crypto) if (WIN32) - target_link_libraries(ssl-shared Ws2_32.lib) + target_link_libraries(ssl Ws2_32.lib) set(SSL_POSTFIX -${SSL_MAJOR_VERSION}) endif() - set_target_properties(ssl-shared PROPERTIES + set_target_properties(ssl PROPERTIES OUTPUT_NAME ssl${SSL_POSTFIX} ARCHIVE_OUTPUT_NAME ssl${SSL_POSTFIX}) - set_target_properties(ssl-shared PROPERTIES VERSION ${SSL_VERSION} + set_target_properties(ssl PROPERTIES VERSION ${SSL_VERSION} SOVERSION ${SSL_MAJOR_VERSION}) - if(ENABLE_LIBRESSL_INSTALL) - install(TARGETS ssl ssl-shared DESTINATION ${CMAKE_INSTALL_LIBDIR}) - endif(ENABLE_LIBRESSL_INSTALL) -else() - add_library(ssl STATIC ${SSL_SRC}) - if(ENABLE_LIBRESSL_INSTALL) - install(TARGETS ssl DESTINATION ${CMAKE_INSTALL_LIBDIR}) - endif(ENABLE_LIBRESSL_INSTALL) endif() + +if(ENABLE_LIBRESSL_INSTALL) + install( + TARGETS ssl + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) +endif(ENABLE_LIBRESSL_INSTALL) diff --git a/ssl/VERSION b/ssl/VERSION index 420d641..fec7de8 100644 --- a/ssl/VERSION +++ b/ssl/VERSION @@ -1 +1 @@ -44:1:0 +45:1:0 diff --git a/ssl/bs_cbb.c b/ssl/bs_cbb.c index 1c02eaf..bf7de3f 100644 --- a/ssl/bs_cbb.c +++ b/ssl/bs_cbb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bs_cbb.c,v 1.17.4.1 2017/12/09 13:43:25 jsing Exp $ */ +/* $OpenBSD: bs_cbb.c,v 1.18 2017/11/28 16:34:20 jsing Exp $ */ /* * Copyright (c) 2014, Google Inc. * diff --git a/ssl/bytestring.h b/ssl/bytestring.h index 42d3d5d..2e89a57 100644 --- a/ssl/bytestring.h +++ b/ssl/bytestring.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bytestring.h,v 1.15.6.1 2017/12/09 13:43:25 jsing Exp $ */ +/* $OpenBSD: bytestring.h,v 1.16 2017/11/28 16:34:20 jsing Exp $ */ /* * Copyright (c) 2014, Google Inc. * diff --git a/ssl/d1_both.c b/ssl/d1_both.c index 6b86cfc..42f8cbd 100644 --- a/ssl/d1_both.c +++ b/ssl/d1_both.c @@ -1,4 +1,4 @@ -/* $OpenBSD: d1_both.c,v 1.51 2017/05/07 04:22:24 beck Exp $ */ +/* $OpenBSD: d1_both.c,v 1.52 2017/10/08 16:24:02 jsing Exp $ */ /* * DTLS implementation written by Nagendra Modadugu * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. @@ -162,9 +162,6 @@ static unsigned int dtls1_guess_mtu(unsigned int curr_mtu); static void dtls1_fix_message_header(SSL *s, unsigned long frag_off, unsigned long frag_len); static unsigned char *dtls1_write_message_header(SSL *s, unsigned char *p); -static void dtls1_set_message_header_int(SSL *s, unsigned char mt, - unsigned long len, unsigned short seq_num, unsigned long frag_off, - unsigned long frag_len); static long dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok); @@ -895,40 +892,6 @@ f_err: return (-1); } -/* - * for these 2 messages, we need to - * ssl->enc_read_ctx re-init - * ssl->s3->internal->read_sequence zero - * ssl->s3->internal->read_mac_secret re-init - * ssl->session->read_sym_enc assign - * ssl->session->read_hash assign - */ -int -dtls1_send_change_cipher_spec(SSL *s, int a, int b) -{ - unsigned char *p; - - if (S3I(s)->hs.state == a) { - p = (unsigned char *)s->internal->init_buf->data; - *p++=SSL3_MT_CCS; - D1I(s)->handshake_write_seq = D1I(s)->next_handshake_write_seq; - s->internal->init_num = DTLS1_CCS_HEADER_LENGTH; - - s->internal->init_off = 0; - - dtls1_set_message_header_int(s, SSL3_MT_CCS, 0, - D1I(s)->handshake_write_seq, 0, 0); - - /* buffer the message to handle re-xmits */ - dtls1_buffer_message(s, 1); - - S3I(s)->hs.state = b; - } - - /* SSL3_ST_CW_CHANGE_B */ - return (dtls1_do_write(s, SSL3_RT_CHANGE_CIPHER_SPEC)); -} - int dtls1_read_failed(SSL *s, int code) { @@ -1182,7 +1145,7 @@ dtls1_set_message_header(SSL *s, unsigned char mt, unsigned long len, } /* don't actually do the writing, wait till the MTU has been retrieved */ -static void +void dtls1_set_message_header_int(SSL *s, unsigned char mt, unsigned long len, unsigned short seq_num, unsigned long frag_off, unsigned long frag_len) { diff --git a/ssl/d1_clnt.c b/ssl/d1_clnt.c index 3eebf98..f3a7e5f 100644 --- a/ssl/d1_clnt.c +++ b/ssl/d1_clnt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: d1_clnt.c,v 1.76 2017/05/07 04:22:24 beck Exp $ */ +/* $OpenBSD: d1_clnt.c,v 1.79 2017/10/10 15:13:26 jsing Exp $ */ /* * DTLS implementation written by Nagendra Modadugu * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. @@ -127,8 +127,6 @@ #include "bytestring.h" -static int dtls1_get_hello_verify(SSL *s); - static const SSL_METHOD_INTERNAL DTLSv1_client_method_internal_data = { .version = DTLS1_VERSION, .min_version = DTLS1_VERSION, @@ -137,7 +135,7 @@ static const SSL_METHOD_INTERNAL DTLSv1_client_method_internal_data = { .ssl_clear = dtls1_clear, .ssl_free = dtls1_free, .ssl_accept = ssl_undefined_function, - .ssl_connect = dtls1_connect, + .ssl_connect = ssl3_connect, .ssl_read = ssl3_read, .ssl_peek = ssl3_peek, .ssl_write = ssl3_write, @@ -178,430 +176,6 @@ dtls1_get_client_method(int ver) } int -dtls1_connect(SSL *s) -{ - void (*cb)(const SSL *ssl, int type, int val) = NULL; - int ret = -1; - int new_state, state, skip = 0; - - ERR_clear_error(); - errno = 0; - - if (s->internal->info_callback != NULL) - cb = s->internal->info_callback; - else if (s->ctx->internal->info_callback != NULL) - cb = s->ctx->internal->info_callback; - - s->internal->in_handshake++; - if (!SSL_in_init(s) || SSL_in_before(s)) - SSL_clear(s); - - - for (;;) { - state = S3I(s)->hs.state; - - switch (S3I(s)->hs.state) { - case SSL_ST_RENEGOTIATE: - s->internal->renegotiate = 1; - S3I(s)->hs.state = SSL_ST_CONNECT; - s->ctx->internal->stats.sess_connect_renegotiate++; - /* break */ - case SSL_ST_BEFORE: - case SSL_ST_CONNECT: - case SSL_ST_BEFORE|SSL_ST_CONNECT: - case SSL_ST_OK|SSL_ST_CONNECT: - - s->server = 0; - if (cb != NULL) - cb(s, SSL_CB_HANDSHAKE_START, 1); - - if ((s->version & 0xff00 ) != (DTLS1_VERSION & 0xff00)) { - SSLerror(s, ERR_R_INTERNAL_ERROR); - ret = -1; - goto end; - } - - /* s->version=SSL3_VERSION; */ - s->internal->type = SSL_ST_CONNECT; - - if (!ssl3_setup_init_buffer(s)) { - ret = -1; - goto end; - } - if (!ssl3_setup_buffers(s)) { - ret = -1; - goto end; - } - if (!ssl_init_wbio_buffer(s, 0)) { - ret = -1; - goto end; - } - - /* don't push the buffering BIO quite yet */ - - S3I(s)->hs.state = SSL3_ST_CW_CLNT_HELLO_A; - s->ctx->internal->stats.sess_connect++; - s->internal->init_num = 0; - /* mark client_random uninitialized */ - memset(s->s3->client_random, 0, - sizeof(s->s3->client_random)); - D1I(s)->send_cookie = 0; - s->internal->hit = 0; - break; - - - case SSL3_ST_CW_CLNT_HELLO_A: - case SSL3_ST_CW_CLNT_HELLO_B: - - s->internal->shutdown = 0; - - /* every DTLS ClientHello resets Finished MAC */ - if (!tls1_init_finished_mac(s)) { - ret = -1; - goto end; - } - - dtls1_start_timer(s); - ret = ssl3_client_hello(s); - if (ret <= 0) - goto end; - - if (D1I(s)->send_cookie) { - S3I(s)->hs.state = SSL3_ST_CW_FLUSH; - S3I(s)->hs.next_state = SSL3_ST_CR_SRVR_HELLO_A; - } else - S3I(s)->hs.state = SSL3_ST_CR_SRVR_HELLO_A; - - s->internal->init_num = 0; - - /* turn on buffering for the next lot of output */ - if (s->bbio != s->wbio) - s->wbio = BIO_push(s->bbio, s->wbio); - - break; - - case SSL3_ST_CR_SRVR_HELLO_A: - case SSL3_ST_CR_SRVR_HELLO_B: - ret = ssl3_get_server_hello(s); - if (ret <= 0) - goto end; - else { - if (s->internal->hit) { - - S3I(s)->hs.state = SSL3_ST_CR_FINISHED_A; - } else - S3I(s)->hs.state = DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A; - } - s->internal->init_num = 0; - break; - - case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A: - case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B: - - ret = dtls1_get_hello_verify(s); - if (ret <= 0) - goto end; - dtls1_stop_timer(s); - if ( D1I(s)->send_cookie) /* start again, with a cookie */ - S3I(s)->hs.state = SSL3_ST_CW_CLNT_HELLO_A; - else - S3I(s)->hs.state = SSL3_ST_CR_CERT_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_CR_CERT_A: - case SSL3_ST_CR_CERT_B: - ret = ssl3_check_finished(s); - if (ret <= 0) - goto end; - if (ret == 2) { - s->internal->hit = 1; - if (s->internal->tlsext_ticket_expected) - S3I(s)->hs.state = SSL3_ST_CR_SESSION_TICKET_A; - else - S3I(s)->hs.state = SSL3_ST_CR_FINISHED_A; - s->internal->init_num = 0; - break; - } - /* Check if it is anon DH. */ - if (!(S3I(s)->hs.new_cipher->algorithm_auth & - SSL_aNULL)) { - ret = ssl3_get_server_certificate(s); - if (ret <= 0) - goto end; - if (s->internal->tlsext_status_expected) - S3I(s)->hs.state = SSL3_ST_CR_CERT_STATUS_A; - else - S3I(s)->hs.state = SSL3_ST_CR_KEY_EXCH_A; - } else { - skip = 1; - S3I(s)->hs.state = SSL3_ST_CR_KEY_EXCH_A; - } - s->internal->init_num = 0; - break; - - case SSL3_ST_CR_KEY_EXCH_A: - case SSL3_ST_CR_KEY_EXCH_B: - ret = ssl3_get_server_key_exchange(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_CR_CERT_REQ_A; - s->internal->init_num = 0; - - /* at this point we check that we have the - * required stuff from the server */ - if (!ssl3_check_cert_and_algorithm(s)) { - ret = -1; - goto end; - } - break; - - case SSL3_ST_CR_CERT_REQ_A: - case SSL3_ST_CR_CERT_REQ_B: - ret = ssl3_get_certificate_request(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_CR_SRVR_DONE_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_CR_SRVR_DONE_A: - case SSL3_ST_CR_SRVR_DONE_B: - ret = ssl3_get_server_done(s); - if (ret <= 0) - goto end; - dtls1_stop_timer(s); - if (S3I(s)->tmp.cert_req) - S3I(s)->hs.next_state = SSL3_ST_CW_CERT_A; - else - S3I(s)->hs.next_state = SSL3_ST_CW_KEY_EXCH_A; - s->internal->init_num = 0; - S3I(s)->hs.state = S3I(s)->hs.next_state; - break; - - case SSL3_ST_CW_CERT_A: - case SSL3_ST_CW_CERT_B: - case SSL3_ST_CW_CERT_C: - case SSL3_ST_CW_CERT_D: - dtls1_start_timer(s); - ret = ssl3_send_client_certificate(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_CW_KEY_EXCH_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_CW_KEY_EXCH_A: - case SSL3_ST_CW_KEY_EXCH_B: - dtls1_start_timer(s); - ret = ssl3_send_client_key_exchange(s); - if (ret <= 0) - goto end; - - /* EAY EAY EAY need to check for DH fix cert - * sent back */ - /* For TLS, cert_req is set to 2, so a cert chain - * of nothing is sent, but no verify packet is sent */ - if (S3I(s)->tmp.cert_req == 1) { - S3I(s)->hs.state = SSL3_ST_CW_CERT_VRFY_A; - } else { - S3I(s)->hs.state = SSL3_ST_CW_CHANGE_A; - S3I(s)->change_cipher_spec = 0; - } - - s->internal->init_num = 0; - break; - - case SSL3_ST_CW_CERT_VRFY_A: - case SSL3_ST_CW_CERT_VRFY_B: - dtls1_start_timer(s); - ret = ssl3_send_client_verify(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_CW_CHANGE_A; - s->internal->init_num = 0; - S3I(s)->change_cipher_spec = 0; - break; - - case SSL3_ST_CW_CHANGE_A: - case SSL3_ST_CW_CHANGE_B: - if (!s->internal->hit) - dtls1_start_timer(s); - ret = dtls1_send_change_cipher_spec(s, - SSL3_ST_CW_CHANGE_A, SSL3_ST_CW_CHANGE_B); - if (ret <= 0) - goto end; - - S3I(s)->hs.state = SSL3_ST_CW_FINISHED_A; - s->internal->init_num = 0; - - s->session->cipher = S3I(s)->hs.new_cipher; - if (!tls1_setup_key_block(s)) { - ret = -1; - goto end; - } - - if (!tls1_change_cipher_state(s, - SSL3_CHANGE_CIPHER_CLIENT_WRITE)) { - ret = -1; - goto end; - } - - - dtls1_reset_seq_numbers(s, SSL3_CC_WRITE); - break; - - case SSL3_ST_CW_FINISHED_A: - case SSL3_ST_CW_FINISHED_B: - if (!s->internal->hit) - dtls1_start_timer(s); - ret = ssl3_send_finished(s, - SSL3_ST_CW_FINISHED_A, SSL3_ST_CW_FINISHED_B, - TLS_MD_CLIENT_FINISH_CONST, - TLS_MD_CLIENT_FINISH_CONST_SIZE); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_CW_FLUSH; - - /* clear flags */ - s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER; - if (s->internal->hit) { - S3I(s)->hs.next_state = SSL_ST_OK; - if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED) { - S3I(s)->hs.state = SSL_ST_OK; - s->s3->flags |= SSL3_FLAGS_POP_BUFFER; - S3I(s)->delay_buf_pop_ret = 0; - } - } else { - - /* Allow NewSessionTicket if ticket expected */ - if (s->internal->tlsext_ticket_expected) - S3I(s)->hs.next_state = - SSL3_ST_CR_SESSION_TICKET_A; - else - S3I(s)->hs.next_state = - SSL3_ST_CR_FINISHED_A; - } - s->internal->init_num = 0; - break; - - case SSL3_ST_CR_SESSION_TICKET_A: - case SSL3_ST_CR_SESSION_TICKET_B: - ret = ssl3_get_new_session_ticket(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_CR_FINISHED_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_CR_CERT_STATUS_A: - case SSL3_ST_CR_CERT_STATUS_B: - ret = ssl3_get_cert_status(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_CR_KEY_EXCH_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_CR_FINISHED_A: - case SSL3_ST_CR_FINISHED_B: - D1I(s)->change_cipher_spec_ok = 1; - ret = ssl3_get_finished(s, SSL3_ST_CR_FINISHED_A, - SSL3_ST_CR_FINISHED_B); - if (ret <= 0) - goto end; - dtls1_stop_timer(s); - - if (s->internal->hit) - S3I(s)->hs.state = SSL3_ST_CW_CHANGE_A; - else - S3I(s)->hs.state = SSL_ST_OK; - - - s->internal->init_num = 0; - break; - - case SSL3_ST_CW_FLUSH: - s->internal->rwstate = SSL_WRITING; - if (BIO_flush(s->wbio) <= 0) { - /* If the write error was fatal, stop trying */ - if (!BIO_should_retry(s->wbio)) { - s->internal->rwstate = SSL_NOTHING; - S3I(s)->hs.state = S3I(s)->hs.next_state; - } - - ret = -1; - goto end; - } - s->internal->rwstate = SSL_NOTHING; - S3I(s)->hs.state = S3I(s)->hs.next_state; - break; - - case SSL_ST_OK: - /* clean a few things up */ - tls1_cleanup_key_block(s); - - /* If we are not 'joining' the last two packets, - * remove the buffering now */ - if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER)) - ssl_free_wbio_buffer(s); - /* else do it later in ssl3_write */ - - s->internal->init_num = 0; - s->internal->renegotiate = 0; - s->internal->new_session = 0; - - ssl_update_cache(s, SSL_SESS_CACHE_CLIENT); - if (s->internal->hit) - s->ctx->internal->stats.sess_hit++; - - ret = 1; - /* s->server=0; */ - s->internal->handshake_func = dtls1_connect; - s->ctx->internal->stats.sess_connect_good++; - - if (cb != NULL) - cb(s, SSL_CB_HANDSHAKE_DONE, 1); - - /* done with handshaking */ - D1I(s)->handshake_read_seq = 0; - D1I(s)->next_handshake_write_seq = 0; - goto end; - /* break; */ - - default: - SSLerror(s, SSL_R_UNKNOWN_STATE); - ret = -1; - goto end; - /* break; */ - } - - /* did we do anything */ - if (!S3I(s)->tmp.reuse_message && !skip) { - if (s->internal->debug) { - if ((ret = BIO_flush(s->wbio)) <= 0) - goto end; - } - - if ((cb != NULL) && (S3I(s)->hs.state != state)) { - new_state = S3I(s)->hs.state; - S3I(s)->hs.state = state; - cb(s, SSL_CB_CONNECT_LOOP, 1); - S3I(s)->hs.state = new_state; - } - } - skip = 0; - } - -end: - s->internal->in_handshake--; - if (cb != NULL) - cb(s, SSL_CB_CONNECT_EXIT, ret); - - return (ret); -} - -static int dtls1_get_hello_verify(SSL *s) { long n; diff --git a/ssl/d1_meth.c b/ssl/d1_meth.c index fcd8906..9ecca00 100644 --- a/ssl/d1_meth.c +++ b/ssl/d1_meth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: d1_meth.c,v 1.13 2017/01/23 13:36:13 jsing Exp $ */ +/* $OpenBSD: d1_meth.c,v 1.15 2017/10/12 15:52:50 jsing Exp $ */ /* * DTLS implementation written by Nagendra Modadugu * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. @@ -72,8 +72,8 @@ static const SSL_METHOD_INTERNAL DTLSv1_method_internal_data = { .ssl_new = dtls1_new, .ssl_clear = dtls1_clear, .ssl_free = dtls1_free, - .ssl_accept = dtls1_accept, - .ssl_connect = dtls1_connect, + .ssl_accept = ssl3_accept, + .ssl_connect = ssl3_connect, .ssl_read = ssl3_read, .ssl_peek = ssl3_peek, .ssl_write = ssl3_write, diff --git a/ssl/d1_srvr.c b/ssl/d1_srvr.c index ae90ee2..57b8ea0 100644 --- a/ssl/d1_srvr.c +++ b/ssl/d1_srvr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: d1_srvr.c,v 1.88 2017/05/07 04:22:24 beck Exp $ */ +/* $OpenBSD: d1_srvr.c,v 1.91 2017/10/12 15:52:50 jsing Exp $ */ /* * DTLS implementation written by Nagendra Modadugu * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. @@ -125,8 +125,6 @@ #include #include -static int dtls1_send_hello_verify_request(SSL *s); - static const SSL_METHOD_INTERNAL DTLSv1_server_method_internal_data = { .version = DTLS1_VERSION, .min_version = DTLS1_VERSION, @@ -134,7 +132,7 @@ static const SSL_METHOD_INTERNAL DTLSv1_server_method_internal_data = { .ssl_new = dtls1_new, .ssl_clear = dtls1_clear, .ssl_free = dtls1_free, - .ssl_accept = dtls1_accept, + .ssl_accept = ssl3_accept, .ssl_connect = ssl_undefined_function, .ssl_read = ssl3_read, .ssl_peek = ssl3_peek, @@ -175,531 +173,6 @@ dtls1_get_server_method(int ver) return (NULL); } -int -dtls1_accept(SSL *s) -{ - void (*cb)(const SSL *ssl, int type, int val) = NULL; - unsigned long alg_k; - int ret = -1; - int new_state, state, skip = 0; - int listen; - - ERR_clear_error(); - errno = 0; - - if (s->internal->info_callback != NULL) - cb = s->internal->info_callback; - else if (s->ctx->internal->info_callback != NULL) - cb = s->ctx->internal->info_callback; - - listen = D1I(s)->listen; - - /* init things to blank */ - s->internal->in_handshake++; - if (!SSL_in_init(s) || SSL_in_before(s)) - SSL_clear(s); - - D1I(s)->listen = listen; - - if (s->cert == NULL) { - SSLerror(s, SSL_R_NO_CERTIFICATE_SET); - ret = -1; - goto end; - } - - for (;;) { - state = S3I(s)->hs.state; - - switch (S3I(s)->hs.state) { - case SSL_ST_RENEGOTIATE: - s->internal->renegotiate = 1; - /* S3I(s)->hs.state=SSL_ST_ACCEPT; */ - - case SSL_ST_BEFORE: - case SSL_ST_ACCEPT: - case SSL_ST_BEFORE|SSL_ST_ACCEPT: - case SSL_ST_OK|SSL_ST_ACCEPT: - - s->server = 1; - if (cb != NULL) - cb(s, SSL_CB_HANDSHAKE_START, 1); - - if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00)) { - SSLerror(s, ERR_R_INTERNAL_ERROR); - ret = -1; - goto end; - } - s->internal->type = SSL_ST_ACCEPT; - - if (!ssl3_setup_init_buffer(s)) { - ret = -1; - goto end; - } - if (!ssl3_setup_buffers(s)) { - ret = -1; - goto end; - } - - s->internal->init_num = 0; - - if (S3I(s)->hs.state != SSL_ST_RENEGOTIATE) { - /* Ok, we now need to push on a buffering BIO so that - * the output is sent in a way that TCP likes :-) - * ...but not with SCTP :-) - */ - if (!ssl_init_wbio_buffer(s, 1)) { - ret = -1; - goto end; - } - - if (!tls1_init_finished_mac(s)) { - ret = -1; - goto end; - } - - S3I(s)->hs.state = SSL3_ST_SR_CLNT_HELLO_A; - s->ctx->internal->stats.sess_accept++; - } else { - /* S3I(s)->hs.state == SSL_ST_RENEGOTIATE, - * we will just send a HelloRequest */ - s->ctx->internal->stats.sess_accept_renegotiate++; - S3I(s)->hs.state = SSL3_ST_SW_HELLO_REQ_A; - } - - break; - - case SSL3_ST_SW_HELLO_REQ_A: - case SSL3_ST_SW_HELLO_REQ_B: - - s->internal->shutdown = 0; - dtls1_clear_record_buffer(s); - dtls1_start_timer(s); - ret = ssl3_send_hello_request(s); - if (ret <= 0) - goto end; - S3I(s)->hs.next_state = SSL3_ST_SR_CLNT_HELLO_A; - S3I(s)->hs.state = SSL3_ST_SW_FLUSH; - s->internal->init_num = 0; - - if (!tls1_init_finished_mac(s)) { - ret = -1; - goto end; - } - break; - - case SSL3_ST_SW_HELLO_REQ_C: - S3I(s)->hs.state = SSL_ST_OK; - break; - - case SSL3_ST_SR_CLNT_HELLO_A: - case SSL3_ST_SR_CLNT_HELLO_B: - case SSL3_ST_SR_CLNT_HELLO_C: - - s->internal->shutdown = 0; - ret = ssl3_get_client_hello(s); - if (ret <= 0) - goto end; - dtls1_stop_timer(s); - - if (ret == 1 && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE)) - S3I(s)->hs.state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A; - else - S3I(s)->hs.state = SSL3_ST_SW_SRVR_HELLO_A; - - s->internal->init_num = 0; - - /* Reflect ClientHello sequence to remain stateless while listening */ - if (listen) { - memcpy(S3I(s)->write_sequence, S3I(s)->read_sequence, sizeof(S3I(s)->write_sequence)); - } - - /* If we're just listening, stop here */ - if (listen && S3I(s)->hs.state == SSL3_ST_SW_SRVR_HELLO_A) { - ret = 2; - D1I(s)->listen = 0; - /* Set expected sequence numbers - * to continue the handshake. - */ - D1I(s)->handshake_read_seq = 2; - D1I(s)->handshake_write_seq = 1; - D1I(s)->next_handshake_write_seq = 1; - goto end; - } - - break; - - case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A: - case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B: - - ret = dtls1_send_hello_verify_request(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_SW_FLUSH; - S3I(s)->hs.next_state = SSL3_ST_SR_CLNT_HELLO_A; - - /* HelloVerifyRequest resets Finished MAC */ - if (!tls1_init_finished_mac(s)) { - ret = -1; - goto end; - } - break; - - - case SSL3_ST_SW_SRVR_HELLO_A: - case SSL3_ST_SW_SRVR_HELLO_B: - s->internal->renegotiate = 2; - dtls1_start_timer(s); - ret = ssl3_send_server_hello(s); - if (ret <= 0) - goto end; - - if (s->internal->hit) { - if (s->internal->tlsext_ticket_expected) - S3I(s)->hs.state = SSL3_ST_SW_SESSION_TICKET_A; - else - S3I(s)->hs.state = SSL3_ST_SW_CHANGE_A; - } else - S3I(s)->hs.state = SSL3_ST_SW_CERT_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_SW_CERT_A: - case SSL3_ST_SW_CERT_B: - /* Check if it is anon DH. */ - if (!(S3I(s)->hs.new_cipher->algorithm_auth & - SSL_aNULL)) { - dtls1_start_timer(s); - ret = ssl3_send_server_certificate(s); - if (ret <= 0) - goto end; - if (s->internal->tlsext_status_expected) - S3I(s)->hs.state = SSL3_ST_SW_CERT_STATUS_A; - else - S3I(s)->hs.state = SSL3_ST_SW_KEY_EXCH_A; - } else { - skip = 1; - S3I(s)->hs.state = SSL3_ST_SW_KEY_EXCH_A; - } - s->internal->init_num = 0; - break; - - case SSL3_ST_SW_KEY_EXCH_A: - case SSL3_ST_SW_KEY_EXCH_B: - alg_k = S3I(s)->hs.new_cipher->algorithm_mkey; - - /* Only send if using a DH key exchange. */ - if (alg_k & (SSL_kDHE|SSL_kECDHE)) { - dtls1_start_timer(s); - ret = ssl3_send_server_key_exchange(s); - if (ret <= 0) - goto end; - } else - skip = 1; - - S3I(s)->hs.state = SSL3_ST_SW_CERT_REQ_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_SW_CERT_REQ_A: - case SSL3_ST_SW_CERT_REQ_B: - /* - * Determine whether or not we need to request a - * certificate. - * - * Do not request a certificate if: - * - * - We did not ask for it (SSL_VERIFY_PEER is unset). - * - * - SSL_VERIFY_CLIENT_ONCE is set and we are - * renegotiating. - * - * - We are using an anonymous ciphersuites - * (see section "Certificate request" in SSL 3 drafts - * and in RFC 2246) ... except when the application - * insists on verification (against the specs, but - * s3_clnt.c accepts this for SSL 3). - */ - if (!(s->verify_mode & SSL_VERIFY_PEER) || - ((s->session->peer != NULL) && - (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) || - ((S3I(s)->hs.new_cipher->algorithm_auth & - SSL_aNULL) && !(s->verify_mode & - SSL_VERIFY_FAIL_IF_NO_PEER_CERT))) { - /* no cert request */ - skip = 1; - S3I(s)->tmp.cert_request = 0; - S3I(s)->hs.state = SSL3_ST_SW_SRVR_DONE_A; - } else { - S3I(s)->tmp.cert_request = 1; - dtls1_start_timer(s); - ret = ssl3_send_certificate_request(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_SW_SRVR_DONE_A; - s->internal->init_num = 0; - } - break; - - case SSL3_ST_SW_SRVR_DONE_A: - case SSL3_ST_SW_SRVR_DONE_B: - dtls1_start_timer(s); - ret = ssl3_send_server_done(s); - if (ret <= 0) - goto end; - S3I(s)->hs.next_state = SSL3_ST_SR_CERT_A; - S3I(s)->hs.state = SSL3_ST_SW_FLUSH; - s->internal->init_num = 0; - break; - - case SSL3_ST_SW_FLUSH: - s->internal->rwstate = SSL_WRITING; - if (BIO_flush(s->wbio) <= 0) { - /* If the write error was fatal, stop trying */ - if (!BIO_should_retry(s->wbio)) { - s->internal->rwstate = SSL_NOTHING; - S3I(s)->hs.state = S3I(s)->hs.next_state; - } - - ret = -1; - goto end; - } - s->internal->rwstate = SSL_NOTHING; - S3I(s)->hs.state = S3I(s)->hs.next_state; - break; - - case SSL3_ST_SR_CERT_A: - case SSL3_ST_SR_CERT_B: - if (S3I(s)->tmp.cert_request) { - ret = ssl3_get_client_certificate(s); - if (ret <= 0) - goto end; - } - s->internal->init_num = 0; - S3I(s)->hs.state = SSL3_ST_SR_KEY_EXCH_A; - break; - - case SSL3_ST_SR_KEY_EXCH_A: - case SSL3_ST_SR_KEY_EXCH_B: - ret = ssl3_get_client_key_exchange(s); - if (ret <= 0) - goto end; - - S3I(s)->hs.state = SSL3_ST_SR_CERT_VRFY_A; - s->internal->init_num = 0; - - if (ret == 2) { - /* For the ECDH ciphersuites when - * the client sends its ECDH pub key in - * a certificate, the CertificateVerify - * message is not sent. - */ - S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; - s->internal->init_num = 0; - } else if (SSL_USE_SIGALGS(s)) { - S3I(s)->hs.state = SSL3_ST_SR_CERT_VRFY_A; - s->internal->init_num = 0; - if (!s->session->peer) - break; - - /* - * For sigalgs freeze the handshake buffer - * at this point and digest cached records. - */ - if (!S3I(s)->handshake_buffer) { - SSLerror(s, ERR_R_INTERNAL_ERROR); - ret = -1; - goto end; - } - s->s3->flags |= TLS1_FLAGS_KEEP_HANDSHAKE; - if (!tls1_digest_cached_records(s)) { - ret = -1; - goto end; - } - } else { - S3I(s)->hs.state = SSL3_ST_SR_CERT_VRFY_A; - s->internal->init_num = 0; - - /* - * We need to get hashes here so if there is - * a client cert, it can be verified. - */ - if (S3I(s)->handshake_buffer) { - if (!tls1_digest_cached_records(s)) { - ret = -1; - goto end; - } - } - if (!tls1_handshake_hash_value(s, - S3I(s)->tmp.cert_verify_md, - sizeof(S3I(s)->tmp.cert_verify_md), - NULL)) { - ret = -1; - goto end; - } - } - break; - - case SSL3_ST_SR_CERT_VRFY_A: - case SSL3_ST_SR_CERT_VRFY_B: - - D1I(s)->change_cipher_spec_ok = 1; - /* we should decide if we expected this one */ - ret = ssl3_get_cert_verify(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_SR_FINISHED_A: - case SSL3_ST_SR_FINISHED_B: - D1I(s)->change_cipher_spec_ok = 1; - ret = ssl3_get_finished(s, SSL3_ST_SR_FINISHED_A, - SSL3_ST_SR_FINISHED_B); - if (ret <= 0) - goto end; - dtls1_stop_timer(s); - if (s->internal->hit) - S3I(s)->hs.state = SSL_ST_OK; - else if (s->internal->tlsext_ticket_expected) - S3I(s)->hs.state = SSL3_ST_SW_SESSION_TICKET_A; - else - S3I(s)->hs.state = SSL3_ST_SW_CHANGE_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_SW_SESSION_TICKET_A: - case SSL3_ST_SW_SESSION_TICKET_B: - ret = ssl3_send_newsession_ticket(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_SW_CHANGE_A; - s->internal->init_num = 0; - break; - - case SSL3_ST_SW_CERT_STATUS_A: - case SSL3_ST_SW_CERT_STATUS_B: - ret = ssl3_send_cert_status(s); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_SW_KEY_EXCH_A; - s->internal->init_num = 0; - break; - - - case SSL3_ST_SW_CHANGE_A: - case SSL3_ST_SW_CHANGE_B: - - s->session->cipher = S3I(s)->hs.new_cipher; - if (!tls1_setup_key_block(s)) { - ret = -1; - goto end; - } - - ret = dtls1_send_change_cipher_spec(s, - SSL3_ST_SW_CHANGE_A, SSL3_ST_SW_CHANGE_B); - - if (ret <= 0) - goto end; - - - S3I(s)->hs.state = SSL3_ST_SW_FINISHED_A; - s->internal->init_num = 0; - - if (!tls1_change_cipher_state(s, - SSL3_CHANGE_CIPHER_SERVER_WRITE)) { - ret = -1; - goto end; - } - - dtls1_reset_seq_numbers(s, SSL3_CC_WRITE); - break; - - case SSL3_ST_SW_FINISHED_A: - case SSL3_ST_SW_FINISHED_B: - ret = ssl3_send_finished(s, - SSL3_ST_SW_FINISHED_A, SSL3_ST_SW_FINISHED_B, - TLS_MD_SERVER_FINISH_CONST, - TLS_MD_SERVER_FINISH_CONST_SIZE); - if (ret <= 0) - goto end; - S3I(s)->hs.state = SSL3_ST_SW_FLUSH; - if (s->internal->hit) { - S3I(s)->hs.next_state = SSL3_ST_SR_FINISHED_A; - - } else { - S3I(s)->hs.next_state = SSL_ST_OK; - } - s->internal->init_num = 0; - break; - - case SSL_ST_OK: - /* clean a few things up */ - tls1_cleanup_key_block(s); - - /* remove buffering on output */ - ssl_free_wbio_buffer(s); - - s->internal->init_num = 0; - - if (s->internal->renegotiate == 2) /* skipped if we just sent a HelloRequest */ - { - s->internal->renegotiate = 0; - s->internal->new_session = 0; - - ssl_update_cache(s, SSL_SESS_CACHE_SERVER); - - s->ctx->internal->stats.sess_accept_good++; - /* s->server=1; */ - s->internal->handshake_func = dtls1_accept; - - if (cb != NULL) - cb(s, SSL_CB_HANDSHAKE_DONE, 1); - } - - ret = 1; - - /* done handshaking, next message is client hello */ - D1I(s)->handshake_read_seq = 0; - /* next message is server hello */ - D1I(s)->handshake_write_seq = 0; - D1I(s)->next_handshake_write_seq = 0; - goto end; - /* break; */ - - default: - SSLerror(s, SSL_R_UNKNOWN_STATE); - ret = -1; - goto end; - /* break; */ - } - - if (!S3I(s)->tmp.reuse_message && !skip) { - if (s->internal->debug) { - if ((ret = BIO_flush(s->wbio)) <= 0) - goto end; - } - - if ((cb != NULL) && (S3I(s)->hs.state != state)) { - new_state = S3I(s)->hs.state; - S3I(s)->hs.state = state; - cb(s, SSL_CB_ACCEPT_LOOP, 1); - S3I(s)->hs.state = new_state; - } - } - skip = 0; - } -end: - /* BIO_flush(s->wbio); */ - - s->internal->in_handshake--; - - if (cb != NULL) - cb(s, SSL_CB_ACCEPT_EXIT, ret); - - return (ret); -} - int dtls1_send_hello_verify_request(SSL *s) { diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c index a05116c..52e0c52 100644 --- a/ssl/s3_lib.c +++ b/ssl/s3_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: s3_lib.c,v 1.161 2017/09/25 18:04:08 jsing Exp $ */ +/* $OpenBSD: s3_lib.c,v 1.165 2018/03/15 12:27:00 jca Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -1553,10 +1553,16 @@ ssl3_handshake_msg_finish_cbb(SSL *s, CBB *handshake) int ssl3_handshake_write(SSL *s) { - if (SSL_IS_DTLS(s)) - return dtls1_do_write(s, SSL3_RT_HANDSHAKE); + return ssl3_record_write(s, SSL3_RT_HANDSHAKE); +} - return ssl3_do_write(s, SSL3_RT_HANDSHAKE); +int +ssl3_record_write(SSL *s, int type) +{ + if (SSL_IS_DTLS(s)) + return dtls1_do_write(s, type); + + return ssl3_do_write(s, type); } int @@ -1978,6 +1984,12 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) case SSL_CTRL_GET_SERVER_TMP_KEY: return ssl_ctrl_get_server_tmp_key(s, parg); + case SSL_CTRL_GET_MIN_PROTO_VERSION: + return SSL_get_min_proto_version(s); + + case SSL_CTRL_GET_MAX_PROTO_VERSION: + return SSL_get_max_proto_version(s); + case SSL_CTRL_SET_MIN_PROTO_VERSION: if (larg < 0 || larg > UINT16_MAX) return 0; @@ -2127,6 +2139,13 @@ _SSL_CTX_set_tlsext_ticket_keys(SSL_CTX *ctx, unsigned char *keys, int keys_len) return 1; } +static int +_SSL_CTX_get_tlsext_status_arg(SSL_CTX *ctx, void **arg) +{ + *arg = ctx->internal->tlsext_status_arg; + return 1; +} + static int _SSL_CTX_set_tlsext_status_arg(SSL_CTX *ctx, void *arg) { @@ -2209,6 +2228,9 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) case SSL_CTRL_SET_TLSEXT_TICKET_KEYS: return _SSL_CTX_set_tlsext_ticket_keys(ctx, parg, larg); + case SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG: + return _SSL_CTX_get_tlsext_status_arg(ctx, parg); + case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG: return _SSL_CTX_set_tlsext_status_arg(ctx, parg); @@ -2227,6 +2249,12 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) case SSL_CTRL_SET_GROUPS_LIST: return SSL_CTX_set1_groups_list(ctx, parg); + case SSL_CTRL_GET_MIN_PROTO_VERSION: + return SSL_CTX_get_min_proto_version(ctx); + + case SSL_CTRL_GET_MAX_PROTO_VERSION: + return SSL_CTX_get_max_proto_version(ctx); + case SSL_CTRL_SET_MIN_PROTO_VERSION: if (larg < 0 || larg > UINT16_MAX) return 0; @@ -2273,6 +2301,10 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) (int (*)(SSL *, int *, void *))fp; return 1; + case SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB: + *(int (**)(SSL *, void *))fp = ctx->internal->tlsext_status_cb; + return 1; + case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB: ctx->internal->tlsext_status_cb = (int (*)(SSL *, void *))fp; return 1; @@ -2292,12 +2324,12 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) const SSL_CIPHER * ssl3_get_cipher_by_char(const unsigned char *p) { - CBS cipher; uint16_t cipher_value; + CBS cbs; /* We have to assume it is at least 2 bytes due to existing API. */ - CBS_init(&cipher, p, 2); - if (!CBS_get_u16(&cipher, &cipher_value)) + CBS_init(&cbs, p, 2); + if (!CBS_get_u16(&cbs, &cipher_value)) return NULL; return ssl3_get_cipher_by_value(cipher_value); @@ -2306,12 +2338,29 @@ ssl3_get_cipher_by_char(const unsigned char *p) int ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) { - if (p != NULL) { - if ((c->id & ~SSL3_CK_VALUE_MASK) != SSL3_CK_ID) - return (0); - s2n(ssl3_cipher_get_value(c), p); - } + CBB cbb; + + if (p == NULL) + return (2); + + if ((c->id & ~SSL3_CK_VALUE_MASK) != SSL3_CK_ID) + return (0); + + memset(&cbb, 0, sizeof(cbb)); + + /* We have to assume it is at least 2 bytes due to existing API. */ + if (!CBB_init_fixed(&cbb, p, 2)) + goto err; + if (!CBB_add_u16(&cbb, ssl3_cipher_get_value(c))) + goto err; + if (!CBB_finish(&cbb, NULL, NULL)) + goto err; + return (2); + + err: + CBB_cleanup(&cbb); + return (0); } SSL_CIPHER * diff --git a/ssl/ssl.sym b/ssl/ssl.sym index 94f9c53..2e12ff9 100644 --- a/ssl/ssl.sym +++ b/ssl/ssl.sym @@ -30,13 +30,18 @@ d2i_SSL_SESSION i2d_SSL_SESSION ERR_load_SSL_strings SSL_CIPHER_description +SSL_CIPHER_get_auth_nid SSL_CIPHER_get_bits SSL_CIPHER_get_by_id SSL_CIPHER_get_by_value +SSL_CIPHER_get_cipher_nid +SSL_CIPHER_get_digest_nid SSL_CIPHER_get_id +SSL_CIPHER_get_kx_nid SSL_CIPHER_get_name SSL_CIPHER_get_value SSL_CIPHER_get_version +SSL_CIPHER_is_aead SSL_COMP_add_compression_method SSL_COMP_get_compression_methods SSL_COMP_get_name @@ -47,12 +52,19 @@ SSL_CTX_check_private_key SSL_CTX_ctrl SSL_CTX_flush_sessions SSL_CTX_free +SSL_CTX_get0_certificate +SSL_CTX_get0_param SSL_CTX_get_cert_store +SSL_CTX_get_ciphers SSL_CTX_get_client_CA_list SSL_CTX_get_client_cert_cb +SSL_CTX_get_default_passwd_cb +SSL_CTX_get_default_passwd_cb_userdata SSL_CTX_get_ex_data SSL_CTX_get_ex_new_index SSL_CTX_get_info_callback +SSL_CTX_get_max_proto_version +SSL_CTX_get_min_proto_version SSL_CTX_get_quiet_shutdown SSL_CTX_get_timeout SSL_CTX_get_verify_callback @@ -88,8 +100,8 @@ SSL_CTX_set_default_verify_paths SSL_CTX_set_ex_data SSL_CTX_set_generate_session_id SSL_CTX_set_info_callback -SSL_CTX_set_min_proto_version SSL_CTX_set_max_proto_version +SSL_CTX_set_min_proto_version SSL_CTX_set_msg_callback SSL_CTX_set_next_proto_select_cb SSL_CTX_set_next_protos_advertised_cb @@ -105,6 +117,7 @@ SSL_CTX_set_tmp_rsa_callback SSL_CTX_set_trust SSL_CTX_set_verify SSL_CTX_set_verify_depth +SSL_CTX_up_ref SSL_CTX_use_PrivateKey SSL_CTX_use_PrivateKey_ASN1 SSL_CTX_use_PrivateKey_file @@ -117,20 +130,27 @@ SSL_CTX_use_certificate_chain_file SSL_CTX_use_certificate_chain_mem SSL_CTX_use_certificate_file SSL_SESSION_free +SSL_SESSION_get0_id_context SSL_SESSION_get0_peer SSL_SESSION_get_compress_id SSL_SESSION_get_ex_data SSL_SESSION_get_ex_new_index SSL_SESSION_get_id +SSL_SESSION_get_master_key +SSL_SESSION_get_protocol_version +SSL_SESSION_get_ticket_lifetime_hint SSL_SESSION_get_time SSL_SESSION_get_timeout +SSL_SESSION_has_ticket SSL_SESSION_new SSL_SESSION_print SSL_SESSION_print_fp +SSL_SESSION_set1_id SSL_SESSION_set1_id_context SSL_SESSION_set_ex_data SSL_SESSION_set_time SSL_SESSION_set_timeout +SSL_SESSION_up_ref SSL_accept SSL_add_client_CA SSL_add_dir_cert_subjects_to_stack @@ -153,12 +173,14 @@ SSL_export_keying_material SSL_free SSL_get0_alpn_selected SSL_get0_next_proto_negotiated +SSL_get0_param SSL_get1_session SSL_get_SSL_CTX SSL_get_certificate SSL_get_cipher_list SSL_get_ciphers SSL_get_client_CA_list +SSL_get_client_random SSL_get_current_cipher SSL_get_current_compression SSL_get_current_expansion @@ -170,6 +192,8 @@ SSL_get_ex_new_index SSL_get_fd SSL_get_finished SSL_get_info_callback +SSL_get_max_proto_version +SSL_get_min_proto_version SSL_get_peer_cert_chain SSL_get_peer_certificate SSL_get_peer_finished @@ -179,6 +203,7 @@ SSL_get_rbio SSL_get_read_ahead SSL_get_rfd SSL_get_selected_srtp_profile +SSL_get_server_random SSL_get_servername SSL_get_servername_type SSL_get_session @@ -194,6 +219,7 @@ SSL_get_version SSL_get_wbio SSL_get_wfd SSL_has_matching_session_id +SSL_is_server SSL_library_init SSL_load_client_CA_file SSL_load_error_strings @@ -222,8 +248,8 @@ SSL_set_ex_data SSL_set_fd SSL_set_generate_session_id SSL_set_info_callback -SSL_set_min_proto_version SSL_set_max_proto_version +SSL_set_min_proto_version SSL_set_msg_callback SSL_set_purpose SSL_set_quiet_shutdown @@ -250,6 +276,7 @@ SSL_shutdown SSL_state SSL_state_string SSL_state_string_long +SSL_up_ref SSL_use_PrivateKey SSL_use_PrivateKey_ASN1 SSL_use_PrivateKey_file @@ -263,3 +290,4 @@ SSL_version SSL_version_str SSL_want SSL_write +OPENSSL_init_ssl diff --git a/ssl/ssl_asn1.c b/ssl/ssl_asn1.c index 95d3693..0ca442f 100644 --- a/ssl/ssl_asn1.c +++ b/ssl/ssl_asn1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_asn1.c,v 1.55 2017/05/06 16:18:36 jsing Exp $ */ +/* $OpenBSD: ssl_asn1.c,v 1.56 2018/03/20 16:10:57 jsing Exp $ */ /* * Copyright (c) 2016 Joel Sing * @@ -204,7 +204,7 @@ i2d_SSL_SESSION(SSL_SESSION *s, unsigned char **pp) rv = (int)data_len; err: - CBB_cleanup(&session); + CBB_cleanup(&cbb); freezero(data, data_len); free(peer_cert_bytes); diff --git a/ssl/ssl_both.c b/ssl/ssl_both.c index 17f93f5..03f9597 100644 --- a/ssl/ssl_both.c +++ b/ssl/ssl_both.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_both.c,v 1.10 2017/08/12 02:55:22 jsing Exp $ */ +/* $OpenBSD: ssl_both.c,v 1.11 2017/10/08 16:24:02 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -311,19 +311,44 @@ f_err: int ssl3_send_change_cipher_spec(SSL *s, int a, int b) { - unsigned char *p; + size_t outlen; + CBB cbb; + + memset(&cbb, 0, sizeof(cbb)); if (S3I(s)->hs.state == a) { - p = (unsigned char *)s->internal->init_buf->data; - *p = SSL3_MT_CCS; - s->internal->init_num = 1; + if (!CBB_init_fixed(&cbb, s->internal->init_buf->data, + s->internal->init_buf->length)) + goto err; + if (!CBB_add_u8(&cbb, SSL3_MT_CCS)) + goto err; + if (!CBB_finish(&cbb, NULL, &outlen)) + goto err; + + if (outlen > INT_MAX) + goto err; + + s->internal->init_num = (int)outlen; s->internal->init_off = 0; + if (SSL_IS_DTLS(s)) { + D1I(s)->handshake_write_seq = + D1I(s)->next_handshake_write_seq; + dtls1_set_message_header_int(s, SSL3_MT_CCS, 0, + D1I(s)->handshake_write_seq, 0, 0); + dtls1_buffer_message(s, 1); + } + S3I(s)->hs.state = b; } /* SSL3_ST_CW_CHANGE_B */ - return (ssl3_do_write(s, SSL3_RT_CHANGE_CIPHER_SPEC)); + return ssl3_record_write(s, SSL3_RT_CHANGE_CIPHER_SPEC); + + err: + CBB_cleanup(&cbb); + + return -1; } static int diff --git a/ssl/ssl_ciph.c b/ssl/ssl_ciph.c index f30ffea..271d77f 100644 --- a/ssl/ssl_ciph.c +++ b/ssl/ssl_ciph.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_ciph.c,v 1.97 2017/08/28 16:37:04 jsing Exp $ */ +/* $OpenBSD: ssl_ciph.c,v 1.98 2018/03/17 14:40:45 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -1720,6 +1720,104 @@ SSL_CIPHER_get_value(const SSL_CIPHER *c) return ssl3_cipher_get_value(c); } +int +SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c) +{ + switch (c->algorithm_enc) { + case SSL_eNULL: + return NID_undef; + case SSL_3DES: + return NID_des_ede3_cbc; + case SSL_AES128: + return NID_aes_128_cbc; + case SSL_AES128GCM: + return NID_aes_128_gcm; + case SSL_AES256: + return NID_aes_256_cbc; + case SSL_AES256GCM: + return NID_aes_256_gcm; + case SSL_CAMELLIA128: + return NID_camellia_128_cbc; + case SSL_CAMELLIA256: + return NID_camellia_256_cbc; + case SSL_CHACHA20POLY1305: + return NID_chacha20_poly1305; + case SSL_DES: + return NID_des_cbc; + case SSL_RC4: + return NID_rc4; + case SSL_eGOST2814789CNT: + return NID_gost89_cnt; + default: + return NID_undef; + } +} + +int +SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c) +{ + switch (c->algorithm_mac) { + case SSL_AEAD: + return NID_undef; + case SSL_GOST89MAC: + return NID_id_Gost28147_89_MAC; + case SSL_GOST94: + return NID_id_GostR3411_94; + case SSL_MD5: + return NID_md5; + case SSL_SHA1: + return NID_sha1; + case SSL_SHA256: + return NID_sha256; + case SSL_SHA384: + return NID_sha384; + case SSL_STREEBOG256: + return NID_id_tc26_gost3411_2012_256; + default: + return NID_undef; + } +} + +int +SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c) +{ + switch (c->algorithm_mkey) { + case SSL_kDHE: + return NID_kx_dhe; + case SSL_kECDHE: + return NID_kx_ecdhe; + case SSL_kGOST: + return NID_kx_gost; + case SSL_kRSA: + return NID_kx_rsa; + default: + return NID_undef; + } +} + +int +SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c) +{ + switch (c->algorithm_auth) { + case SSL_aNULL: + return NID_auth_null; + case SSL_aECDSA: + return NID_auth_ecdsa; + case SSL_aGOST01: + return NID_auth_gost01; + case SSL_aRSA: + return NID_auth_rsa; + default: + return NID_undef; + } +} + +int +SSL_CIPHER_is_aead(const SSL_CIPHER *c) +{ + return (c->algorithm_mac & SSL_AEAD) == SSL_AEAD; +} + void * SSL_COMP_get_compression_methods(void) { diff --git a/ssl/ssl_clnt.c b/ssl/ssl_clnt.c index 2370ce0..10dbe83 100644 --- a/ssl/ssl_clnt.c +++ b/ssl/ssl_clnt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_clnt.c,v 1.17 2017/08/12 21:47:59 jsing Exp $ */ +/* $OpenBSD: ssl_clnt.c,v 1.23 2018/02/08 11:30:30 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -170,15 +170,16 @@ #endif #include "bytestring.h" +#include "ssl_tlsext.h" static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b); int ssl3_connect(SSL *s) { - void (*cb)(const SSL *ssl, int type, int val) = NULL; - int ret = -1; - int new_state, state, skip = 0; + void (*cb)(const SSL *ssl, int type, int val) = NULL; + int ret = -1; + int new_state, state, skip = 0; ERR_clear_error(); errno = 0; @@ -210,10 +211,18 @@ ssl3_connect(SSL *s) if (cb != NULL) cb(s, SSL_CB_HANDSHAKE_START, 1); - if ((s->version & 0xff00 ) != 0x0300) { - SSLerror(s, ERR_R_INTERNAL_ERROR); - ret = -1; - goto end; + if (SSL_IS_DTLS(s)) { + if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00)) { + SSLerror(s, ERR_R_INTERNAL_ERROR); + ret = -1; + goto end; + } + } else { + if ((s->version & 0xff00) != 0x0300) { + SSLerror(s, ERR_R_INTERNAL_ERROR); + ret = -1; + goto end; + } } /* s->version=SSL3_VERSION; */ @@ -234,24 +243,50 @@ ssl3_connect(SSL *s) /* don't push the buffering BIO quite yet */ - if (!tls1_init_finished_mac(s)) { - ret = -1; - goto end; + if (!SSL_IS_DTLS(s)) { + if (!tls1_init_finished_mac(s)) { + ret = -1; + goto end; + } } S3I(s)->hs.state = SSL3_ST_CW_CLNT_HELLO_A; s->ctx->internal->stats.sess_connect++; s->internal->init_num = 0; + + if (SSL_IS_DTLS(s)) { + /* mark client_random uninitialized */ + memset(s->s3->client_random, 0, + sizeof(s->s3->client_random)); + D1I(s)->send_cookie = 0; + s->internal->hit = 0; + } break; case SSL3_ST_CW_CLNT_HELLO_A: case SSL3_ST_CW_CLNT_HELLO_B: - s->internal->shutdown = 0; - ret = ssl3_client_hello(s); + + if (SSL_IS_DTLS(s)) { + /* every DTLS ClientHello resets Finished MAC */ + if (!tls1_init_finished_mac(s)) { + ret = -1; + goto end; + } + + dtls1_start_timer(s); + } + + ret = ssl3_send_client_hello(s); if (ret <= 0) goto end; - S3I(s)->hs.state = SSL3_ST_CR_SRVR_HELLO_A; + + if (SSL_IS_DTLS(s) && D1I(s)->send_cookie) { + S3I(s)->hs.state = SSL3_ST_CW_FLUSH; + S3I(s)->hs.next_state = SSL3_ST_CR_SRVR_HELLO_A; + } else + S3I(s)->hs.state = SSL3_ST_CR_SRVR_HELLO_A; + s->internal->init_num = 0; /* turn on buffering for the next lot of output */ @@ -268,11 +303,29 @@ ssl3_connect(SSL *s) if (s->internal->hit) { S3I(s)->hs.state = SSL3_ST_CR_FINISHED_A; - if (s->internal->tlsext_ticket_expected) { - /* receive renewed session ticket */ - S3I(s)->hs.state = SSL3_ST_CR_SESSION_TICKET_A; + if (!SSL_IS_DTLS(s)) { + if (s->internal->tlsext_ticket_expected) { + /* receive renewed session ticket */ + S3I(s)->hs.state = SSL3_ST_CR_SESSION_TICKET_A; + } } - } else + } else if (SSL_IS_DTLS(s)) { + S3I(s)->hs.state = DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A; + } else { + S3I(s)->hs.state = SSL3_ST_CR_CERT_A; + } + s->internal->init_num = 0; + break; + + case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A: + case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B: + ret = dtls1_get_hello_verify(s); + if (ret <= 0) + goto end; + dtls1_stop_timer(s); + if (D1I(s)->send_cookie) /* start again, with a cookie */ + S3I(s)->hs.state = SSL3_ST_CW_CLNT_HELLO_A; + else S3I(s)->hs.state = SSL3_ST_CR_CERT_A; s->internal->init_num = 0; break; @@ -340,6 +393,8 @@ ssl3_connect(SSL *s) ret = ssl3_get_server_done(s); if (ret <= 0) goto end; + if (SSL_IS_DTLS(s)) + dtls1_stop_timer(s); if (S3I(s)->tmp.cert_req) S3I(s)->hs.state = SSL3_ST_CW_CERT_A; else @@ -352,6 +407,8 @@ ssl3_connect(SSL *s) case SSL3_ST_CW_CERT_B: case SSL3_ST_CW_CERT_C: case SSL3_ST_CW_CERT_D: + if (SSL_IS_DTLS(s)) + dtls1_start_timer(s); ret = ssl3_send_client_certificate(s); if (ret <= 0) goto end; @@ -361,6 +418,8 @@ ssl3_connect(SSL *s) case SSL3_ST_CW_KEY_EXCH_A: case SSL3_ST_CW_KEY_EXCH_B: + if (SSL_IS_DTLS(s)) + dtls1_start_timer(s); ret = ssl3_send_client_key_exchange(s); if (ret <= 0) goto end; @@ -386,9 +445,11 @@ ssl3_connect(SSL *s) S3I(s)->hs.state = SSL3_ST_CW_CHANGE_A; S3I(s)->change_cipher_spec = 0; } - if (s->s3->flags & TLS1_FLAGS_SKIP_CERT_VERIFY) { - S3I(s)->hs.state = SSL3_ST_CW_CHANGE_A; - S3I(s)->change_cipher_spec = 0; + if (!SSL_IS_DTLS(s)) { + if (s->s3->flags & TLS1_FLAGS_SKIP_CERT_VERIFY) { + S3I(s)->hs.state = SSL3_ST_CW_CHANGE_A; + S3I(s)->change_cipher_spec = 0; + } } s->internal->init_num = 0; @@ -396,6 +457,8 @@ ssl3_connect(SSL *s) case SSL3_ST_CW_CERT_VRFY_A: case SSL3_ST_CW_CERT_VRFY_B: + if (SSL_IS_DTLS(s)) + dtls1_start_timer(s); ret = ssl3_send_client_verify(s); if (ret <= 0) goto end; @@ -406,6 +469,8 @@ ssl3_connect(SSL *s) case SSL3_ST_CW_CHANGE_A: case SSL3_ST_CW_CHANGE_B: + if (SSL_IS_DTLS(s) && !s->internal->hit) + dtls1_start_timer(s); ret = ssl3_send_change_cipher_spec(s, SSL3_ST_CW_CHANGE_A, SSL3_ST_CW_CHANGE_B); if (ret <= 0) @@ -426,17 +491,22 @@ ssl3_connect(SSL *s) goto end; } + if (SSL_IS_DTLS(s)) + dtls1_reset_seq_numbers(s, SSL3_CC_WRITE); + break; case SSL3_ST_CW_FINISHED_A: case SSL3_ST_CW_FINISHED_B: + if (SSL_IS_DTLS(s) && !s->internal->hit) + dtls1_start_timer(s); ret = ssl3_send_finished(s, SSL3_ST_CW_FINISHED_A, - SSL3_ST_CW_FINISHED_B, - TLS_MD_CLIENT_FINISH_CONST, + SSL3_ST_CW_FINISHED_B, TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE); if (ret <= 0) goto end; - s->s3->flags |= SSL3_FLAGS_CCS_OK; + if (!SSL_IS_DTLS(s)) + s->s3->flags |= SSL3_FLAGS_CCS_OK; S3I(s)->hs.state = SSL3_ST_CW_FLUSH; /* clear flags */ @@ -446,7 +516,7 @@ ssl3_connect(SSL *s) if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED) { S3I(s)->hs.state = SSL_ST_OK; - s->s3->flags|=SSL3_FLAGS_POP_BUFFER; + s->s3->flags |= SSL3_FLAGS_POP_BUFFER; S3I(s)->delay_buf_pop_ret = 0; } } else { @@ -455,8 +525,8 @@ ssl3_connect(SSL *s) S3I(s)->hs.next_state = SSL3_ST_CR_SESSION_TICKET_A; else - - S3I(s)->hs.next_state = SSL3_ST_CR_FINISHED_A; + S3I(s)->hs.next_state = + SSL3_ST_CR_FINISHED_A; } s->internal->init_num = 0; break; @@ -481,11 +551,16 @@ ssl3_connect(SSL *s) case SSL3_ST_CR_FINISHED_A: case SSL3_ST_CR_FINISHED_B: - s->s3->flags |= SSL3_FLAGS_CCS_OK; + if (SSL_IS_DTLS(s)) + D1I(s)->change_cipher_spec_ok = 1; + else + s->s3->flags |= SSL3_FLAGS_CCS_OK; ret = ssl3_get_finished(s, SSL3_ST_CR_FINISHED_A, SSL3_ST_CR_FINISHED_B); if (ret <= 0) goto end; + if (SSL_IS_DTLS(s)) + dtls1_stop_timer(s); if (s->internal->hit) S3I(s)->hs.state = SSL3_ST_CW_CHANGE_A; @@ -497,6 +572,13 @@ ssl3_connect(SSL *s) case SSL3_ST_CW_FLUSH: s->internal->rwstate = SSL_WRITING; if (BIO_flush(s->wbio) <= 0) { + if (SSL_IS_DTLS(s)) { + /* If the write error was fatal, stop trying */ + if (!BIO_should_retry(s->wbio)) { + s->internal->rwstate = SSL_NOTHING; + S3I(s)->hs.state = S3I(s)->hs.next_state; + } + } ret = -1; goto end; } @@ -508,8 +590,10 @@ ssl3_connect(SSL *s) /* clean a few things up */ tls1_cleanup_key_block(s); - BUF_MEM_free(s->internal->init_buf); - s->internal->init_buf = NULL; + if (!SSL_IS_DTLS(s)) { + BUF_MEM_free(s->internal->init_buf); + s->internal->init_buf = NULL; + } /* * If we are not 'joining' the last two packets, @@ -535,6 +619,12 @@ ssl3_connect(SSL *s) if (cb != NULL) cb(s, SSL_CB_HANDSHAKE_DONE, 1); + if (SSL_IS_DTLS(s)) { + /* done with handshaking */ + D1I(s)->handshake_read_seq = 0; + D1I(s)->next_handshake_write_seq = 0; + } + goto end; /* break; */ @@ -571,14 +661,14 @@ end: } int -ssl3_client_hello(SSL *s) +ssl3_send_client_hello(SSL *s) { - unsigned char *bufend, *p, *d; - uint16_t max_version; - size_t outlen; - int i; + CBB cbb, client_hello, session_id, cookie, cipher_suites; + CBB compression_methods; + uint16_t max_version; + size_t sl; - bufend = (unsigned char *)s->internal->init_buf->data + SSL3_RT_MAX_PLAIN_LENGTH; + memset(&cbb, 0, sizeof(cbb)); if (S3I(s)->hs.state == SSL3_ST_CW_CLNT_HELLO_A) { SSL_SESSION *sess = s->session; @@ -589,10 +679,10 @@ ssl3_client_hello(SSL *s) } s->client_version = s->version = max_version; - if ((sess == NULL) || - (sess->ssl_version != s->version) || + if (sess == NULL || + sess->ssl_version != s->version || (!sess->session_id_length && !sess->tlsext_tick) || - (sess->internal->not_resumable)) { + sess->internal->not_resumable) { if (!ssl_get_new_session(s, 0)) goto err; } @@ -606,7 +696,9 @@ ssl3_client_hello(SSL *s) if (!SSL_IS_DTLS(s) || D1I(s)->send_cookie == 0) arc4random_buf(s->s3->client_random, SSL3_RANDOM_SIZE); - d = p = ssl3_handshake_msg_start(s, SSL3_MT_CLIENT_HELLO); + if (!ssl3_handshake_msg_start_cbb(s, &cbb, &client_hello, + SSL3_MT_CLIENT_HELLO)) + goto err; /* * Version indicates the negotiated version: for example from @@ -638,27 +730,27 @@ ssl3_client_hello(SSL *s) * client_version in client hello and not resetting it to * the negotiated version. */ - - *(p++) = s->client_version >> 8; - *(p++) = s->client_version & 0xff; + if (!CBB_add_u16(&client_hello, s->client_version)) + goto err; /* Random stuff */ - memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE); - p += SSL3_RANDOM_SIZE; + if (!CBB_add_bytes(&client_hello, s->s3->client_random, + sizeof(s->s3->client_random))) + goto err; /* Session ID */ - if (s->internal->new_session) - i = 0; - else - i = s->session->session_id_length; - *(p++) = i; - if (i != 0) { - if (i > (int)sizeof(s->session->session_id)) { + if (!CBB_add_u8_length_prefixed(&client_hello, &session_id)) + goto err; + if (!s->internal->new_session && + s->session->session_id_length > 0) { + sl = s->session->session_id_length; + if (sl > sizeof(s->session->session_id)) { SSLerror(s, ERR_R_INTERNAL_ERROR); goto err; } - memcpy(p, s->session->session_id, i); - p += i; + if (!CBB_add_bytes(&session_id, + s->session->session_id, sl)) + goto err; } /* DTLS Cookie. */ @@ -667,33 +759,37 @@ ssl3_client_hello(SSL *s) SSLerror(s, ERR_R_INTERNAL_ERROR); goto err; } - *(p++) = D1I(s)->cookie_len; - memcpy(p, D1I(s)->cookie, D1I(s)->cookie_len); - p += D1I(s)->cookie_len; + if (!CBB_add_u8_length_prefixed(&client_hello, &cookie)) + goto err; + if (!CBB_add_bytes(&cookie, D1I(s)->cookie, + D1I(s)->cookie_len)) + goto err; } /* Ciphers supported */ - if (!ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &p[2], - bufend - &p[2], &outlen)) - goto err; - if (outlen == 0) { + if (!CBB_add_u16_length_prefixed(&client_hello, &cipher_suites)) + return 0; + if (!ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), + &cipher_suites)) { SSLerror(s, SSL_R_NO_CIPHERS_AVAILABLE); goto err; } - s2n(outlen, p); - p += outlen; - /* add in (no) COMPRESSION */ - *(p++) = 1; - *(p++) = 0; /* Add the NULL method */ + /* Add in compression methods (null) */ + if (!CBB_add_u8_length_prefixed(&client_hello, + &compression_methods)) + goto err; + if (!CBB_add_u8(&compression_methods, 0)) + goto err; - /* TLS extensions*/ - if ((p = ssl_add_clienthello_tlsext(s, p, bufend)) == NULL) { + /* TLS extensions */ + if (!tlsext_clienthello_build(s, &client_hello)) { SSLerror(s, ERR_R_INTERNAL_ERROR); goto err; } - ssl3_handshake_msg_finish(s, p - d); + if (!ssl3_handshake_msg_finish_cbb(s, &cbb)) + goto err; S3I(s)->hs.state = SSL3_ST_CW_CLNT_HELLO_B; } @@ -702,6 +798,8 @@ ssl3_client_hello(SSL *s) return (ssl3_handshake_write(s)); err: + CBB_cleanup(&cbb); + return (-1); } @@ -715,7 +813,6 @@ ssl3_get_server_hello(SSL *s) STACK_OF(SSL_CIPHER) *sk; const SSL_CIPHER *cipher; const SSL_METHOD *method; - unsigned char *p; unsigned long alg_k; size_t outlen; int i, al, ok; @@ -913,22 +1010,31 @@ ssl3_get_server_hello(SSL *s) goto f_err; } - /* TLS extensions. */ - p = (unsigned char *)CBS_data(&cbs); - if (!ssl_parse_serverhello_tlsext(s, &p, CBS_len(&cbs), &al)) { - /* 'al' set by ssl_parse_serverhello_tlsext */ + if (!tlsext_serverhello_parse(s, &cbs, &al)) { SSLerror(s, SSL_R_PARSE_TLSEXT); goto f_err; } + + /* + * Determine if we need to see RI. Strictly speaking if we want to + * avoid an attack we should *always* see RI even on initial server + * hello because the client doesn't see any renegotiation during an + * attack. However this would mean we could not connect to any server + * which doesn't support RI so for the immediate future tolerate RI + * absence on initial connect only. + */ + if (!S3I(s)->renegotiate_seen && + !(s->internal->options & SSL_OP_LEGACY_SERVER_CONNECT)) { + al = SSL_AD_HANDSHAKE_FAILURE; + SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); + goto f_err; + } + if (ssl_check_serverhello_tlsext(s) <= 0) { SSLerror(s, SSL_R_SERVERHELLO_TLSEXT); goto err; } - /* See if any data remains... */ - if (p - CBS_data(&cbs) != CBS_len(&cbs)) - goto truncated; - return (1); truncated: diff --git a/ssl/ssl_err.c b/ssl/ssl_err.c index db3c1a0..250a9ee 100644 --- a/ssl/ssl_err.c +++ b/ssl/ssl_err.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_err.c,v 1.35 2017/08/28 17:36:58 jsing Exp $ */ +/* $OpenBSD: ssl_err.c,v 1.36 2018/03/20 15:28:12 tb Exp $ */ /* ==================================================================== * Copyright (c) 1999-2011 The OpenSSL Project. All rights reserved. * @@ -390,6 +390,7 @@ static ERR_STRING_DATA SSL_str_reasons[]= { {ERR_REASON(SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG), "ssl session id context too long"}, {ERR_REASON(SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH), "ssl session id has bad length"}, {ERR_REASON(SSL_R_SSL_SESSION_ID_IS_DIFFERENT), "ssl session id is different"}, + {ERR_REASON(SSL_R_SSL_SESSION_ID_TOO_LONG), "ssl session id is too long"}, {ERR_REASON(SSL_R_TLSV1_ALERT_ACCESS_DENIED), "tlsv1 alert access denied"}, {ERR_REASON(SSL_R_TLSV1_ALERT_DECODE_ERROR), "tlsv1 alert decode error"}, {ERR_REASON(SSL_R_TLSV1_ALERT_DECRYPTION_FAILED), "tlsv1 alert decryption failed"}, diff --git a/ssl/ssl_init.c b/ssl/ssl_init.c new file mode 100644 index 0000000..0ef8095 --- /dev/null +++ b/ssl/ssl_init.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018 Bob Beck + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* OpenSSL style init */ + +#include +#include + +#include + +#include "ssl_locl.h" + +static pthread_t ssl_init_thread; + +static void +OPENSSL_init_ssl_internal(void) +{ + ssl_init_thread = pthread_self(); + SSL_load_error_strings(); + SSL_library_init(); +} + +int +OPENSSL_init_ssl(uint64_t opts, const void *settings) +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + + if (pthread_equal(pthread_self(), ssl_init_thread)) + return 1; /* don't recurse */ + + OPENSSL_init_crypto(opts, settings); + + if (pthread_once(&once, OPENSSL_init_ssl_internal) != 0) + return 0; + + return 1; +} diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index 471fd70..573e63c 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_lib.c,v 1.170 2017/08/30 16:24:21 jsing Exp $ */ +/* $OpenBSD: ssl_lib.c,v 1.182 2018/03/17 16:20:01 beck Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -469,12 +469,24 @@ SSL_set_trust(SSL *s, int trust) return (X509_VERIFY_PARAM_set_trust(s->param, trust)); } +X509_VERIFY_PARAM * +SSL_CTX_get0_param(SSL_CTX *ctx) +{ + return (ctx->param); +} + int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm) { return (X509_VERIFY_PARAM_set1(ctx->param, vpm)); } +X509_VERIFY_PARAM * +SSL_get0_param(SSL *ssl) +{ + return (ssl->param); +} + int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm) { @@ -556,6 +568,13 @@ SSL_free(SSL *s) free(s); } +int +SSL_up_ref(SSL *s) +{ + int refs = CRYPTO_add(&s->references, 1, CRYPTO_LOCK_SSL); + return (refs > 1) ? 1 : 0; +} + void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio) { @@ -746,7 +765,8 @@ SSL_CTX_get_verify_depth(const SSL_CTX *ctx) return (X509_VERIFY_PARAM_get_depth(ctx->param)); } -int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int, X509_STORE_CTX *) +int +(*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int, X509_STORE_CTX *) { return (ctx->internal->default_verify_callback); } @@ -920,6 +940,12 @@ SSL_connect(SSL *s) return (s->method->internal->ssl_connect(s)); } +int +SSL_is_server(const SSL *s) +{ + return s->server; +} + long SSL_get_default_timeout(const SSL *s) { @@ -1301,6 +1327,12 @@ SSL_get_cipher_list(const SSL *s, int n) return (c->name); } +STACK_OF(SSL_CIPHER) * +SSL_CTX_get_ciphers(const SSL_CTX *ctx) +{ + return ctx->cipher_list; +} + /* Specify the ciphers to be used by default by the SSL_CTX. */ int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) @@ -1380,81 +1412,60 @@ SSL_get_shared_ciphers(const SSL *s, char *buf, int len) } int -ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, - size_t maxlen, size_t *outlen) +ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *ciphers, CBB *cbb) { SSL_CIPHER *cipher; - int ciphers = 0; - CBB cbb; + int num_ciphers = 0; int i; - *outlen = 0; + if (ciphers == NULL) + return 0; - if (sk == NULL) - return (0); - - if (!CBB_init_fixed(&cbb, p, maxlen)) - goto err; - - for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { - cipher = sk_SSL_CIPHER_value(sk, i); + for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { + if ((cipher = sk_SSL_CIPHER_value(ciphers, i)) == NULL) + return 0; /* Skip TLS v1.2 only ciphersuites if lower than v1.2 */ if ((cipher->algorithm_ssl & SSL_TLSV1_2) && (TLS1_get_client_version(s) < TLS1_2_VERSION)) continue; - if (!CBB_add_u16(&cbb, ssl3_cipher_get_value(cipher))) - goto err; + if (!CBB_add_u16(cbb, ssl3_cipher_get_value(cipher))) + return 0; - ciphers++; + num_ciphers++; } /* Add SCSV if there are other ciphers and we're not renegotiating. */ - if (ciphers > 0 && !s->internal->renegotiate) { - if (!CBB_add_u16(&cbb, SSL3_CK_SCSV & SSL3_CK_VALUE_MASK)) - goto err; + if (num_ciphers > 0 && !s->internal->renegotiate) { + if (!CBB_add_u16(cbb, SSL3_CK_SCSV & SSL3_CK_VALUE_MASK)) + return 0; } - if (!CBB_finish(&cbb, NULL, outlen)) - goto err; + if (!CBB_flush(cbb)) + return 0; return 1; - - err: - CBB_cleanup(&cbb); - - return 0; } STACK_OF(SSL_CIPHER) * -ssl_bytes_to_cipher_list(SSL *s, const unsigned char *p, int num) +ssl_bytes_to_cipher_list(SSL *s, CBS *cbs) { - CBS cbs; - const SSL_CIPHER *c; - STACK_OF(SSL_CIPHER) *sk = NULL; - unsigned long cipher_id; - uint16_t cipher_value, max_version; + STACK_OF(SSL_CIPHER) *ciphers = NULL; + const SSL_CIPHER *cipher; + uint16_t cipher_value, max_version; + unsigned long cipher_id; - if (s->s3) + if (s->s3 != NULL) S3I(s)->send_connection_binding = 0; - /* - * RFC 5246 section 7.4.1.2 defines the interval as [2,2^16-2]. - */ - if (num < 2 || num > 0x10000 - 2) { - SSLerror(s, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); - return (NULL); - } - - if ((sk = sk_SSL_CIPHER_new_null()) == NULL) { + if ((ciphers = sk_SSL_CIPHER_new_null()) == NULL) { SSLerror(s, ERR_R_MALLOC_FAILURE); goto err; } - CBS_init(&cbs, p, num); - while (CBS_len(&cbs) > 0) { - if (!CBS_get_u16(&cbs, &cipher_value)) { + while (CBS_len(cbs) > 0) { + if (!CBS_get_u16(cbs, &cipher_value)) { SSLerror(s, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); goto err; } @@ -1495,18 +1506,18 @@ ssl_bytes_to_cipher_list(SSL *s, const unsigned char *p, int num) continue; } - if ((c = ssl3_get_cipher_by_value(cipher_value)) != NULL) { - if (!sk_SSL_CIPHER_push(sk, c)) { + if ((cipher = ssl3_get_cipher_by_value(cipher_value)) != NULL) { + if (!sk_SSL_CIPHER_push(ciphers, cipher)) { SSLerror(s, ERR_R_MALLOC_FAILURE); goto err; } } } - return (sk); + return (ciphers); err: - sk_SSL_CIPHER_free(sk); + sk_SSL_CIPHER_free(ciphers); return (NULL); } @@ -1780,6 +1791,11 @@ SSL_CTX_new(const SSL_METHOD *meth) { SSL_CTX *ret; + if (!OPENSSL_init_ssl(0, NULL)) { + SSLerrorx(SSL_R_LIBRARY_BUG); + return (NULL); + } + if (meth == NULL) { SSLerrorx(SSL_R_NULL_SSL_METHOD_PASSED); return (NULL); @@ -1973,12 +1989,31 @@ SSL_CTX_free(SSL_CTX *ctx) free(ctx); } +int +SSL_CTX_up_ref(SSL_CTX *ctx) +{ + int refs = CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); + return ((refs > 1) ? 1 : 0); +} + +pem_password_cb * +SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx) +{ + return (ctx->default_passwd_callback); +} + void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb) { ctx->default_passwd_callback = cb; } +void * +SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx) +{ + return ctx->default_passwd_callback_userdata; +} + void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u) { @@ -2647,6 +2682,38 @@ SSL_get_current_expansion(SSL *s) return (NULL); } +size_t +SSL_get_client_random(const SSL *s, unsigned char *out, size_t max_out) +{ + size_t len = sizeof(s->s3->client_random); + + if (out == NULL) + return len; + + if (len > max_out) + len = max_out; + + memcpy(out, s->s3->client_random, len); + + return len; +} + +size_t +SSL_get_server_random(const SSL *s, unsigned char *out, size_t max_out) +{ + size_t len = sizeof(s->s3->server_random); + + if (out == NULL) + return len; + + if (len > max_out) + len = max_out; + + memcpy(out, s->s3->server_random, len); + + return len; +} + int ssl_init_wbio_buffer(SSL *s, int push) { @@ -2879,6 +2946,15 @@ SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store) ctx->cert_store = store; } +X509 * +SSL_CTX_get0_certificate(const SSL_CTX *ctx) +{ + if (ctx->internal->cert == NULL) + return NULL; + + return ctx->internal->cert->key->x509; +} + int SSL_want(const SSL *s) { @@ -2964,6 +3040,12 @@ SSL_cache_hit(SSL *s) return (s->internal->hit); } +int +SSL_CTX_get_min_proto_version(SSL_CTX *ctx) +{ + return ctx->internal->min_version; +} + int SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version) { @@ -2971,6 +3053,12 @@ SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version) ctx->internal->max_version, &ctx->internal->min_version); } +int +SSL_CTX_get_max_proto_version(SSL_CTX *ctx) +{ + return ctx->internal->max_version; +} + int SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version) { @@ -2978,12 +3066,23 @@ SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version) ctx->internal->min_version, &ctx->internal->max_version); } +int +SSL_get_min_proto_version(SSL *ssl) +{ + return ssl->internal->min_version; +} + int SSL_set_min_proto_version(SSL *ssl, uint16_t version) { return ssl_version_set_min(ssl->method, version, ssl->internal->max_version, &ssl->internal->min_version); } +int +SSL_get_max_proto_version(SSL *ssl) +{ + return ssl->internal->max_version; +} int SSL_set_max_proto_version(SSL *ssl, uint16_t version) diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h index 17a4a0d..d2a99af 100644 --- a/ssl/ssl_locl.h +++ b/ssl/ssl_locl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_locl.h,v 1.193 2017/08/28 16:37:04 jsing Exp $ */ +/* $OpenBSD: ssl_locl.h,v 1.202 2018/01/27 15:30:05 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -164,6 +164,9 @@ __BEGIN_HIDDEN_DECLS +#define CTASSERT(x) extern char _ctassert[(x) ? 1 : -1 ] \ + __attribute__((__unused__)) + #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \ *((c)++)=(unsigned char)(((l)>>16)&0xff), \ *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ @@ -1064,10 +1067,8 @@ int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b); SSL_CIPHER *OBJ_bsearch_ssl_cipher_id(SSL_CIPHER *key, SSL_CIPHER const *base, int num); int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, const SSL_CIPHER * const *bp); -STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s, const unsigned char *p, - int num); -int ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, - unsigned char *p, size_t maxlen, size_t *outlen); +int ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *ciphers, CBB *cbb); +STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s, CBS *cbs); STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *meth, STACK_OF(SSL_CIPHER) **pref, STACK_OF(SSL_CIPHER) **sorted, const char *rule_str); @@ -1147,15 +1148,11 @@ int ssl3_handshake_msg_start_cbb(SSL *s, CBB *handshake, CBB *body, uint8_t msg_type); int ssl3_handshake_msg_finish_cbb(SSL *s, CBB *handshake); int ssl3_handshake_write(SSL *s); +int ssl3_record_write(SSL *s, int type); void tls1_record_sequence_increment(unsigned char *seq); int ssl3_do_change_cipher_spec(SSL *ssl); -int ssl23_read(SSL *s, void *buf, int len); -int ssl23_peek(SSL *s, void *buf, int len); -int ssl23_write(SSL *s, const void *buf, int len); -long ssl23_default_timeout(void); - long tls1_default_timeout(void); int dtls1_do_write(SSL *s, int type); int ssl3_packet_read(SSL *s, int plen); @@ -1166,12 +1163,13 @@ int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, unsigned int len); void dtls1_set_message_header(SSL *s, unsigned char mt, unsigned long len, unsigned long frag_off, unsigned long frag_len); +void dtls1_set_message_header_int(SSL *s, unsigned char mt, + unsigned long len, unsigned short seq_num, unsigned long frag_off, + unsigned long frag_len); int dtls1_write_app_data_bytes(SSL *s, int type, const void *buf, int len); int dtls1_write_bytes(SSL *s, int type, const void *buf, int len); -int dtls1_send_change_cipher_spec(SSL *s, int a, int b); -unsigned long dtls1_output_cert_chain(SSL *s, X509 *x); int dtls1_read_failed(SSL *s, int code); int dtls1_buffer_message(SSL *s, int ccs); int dtls1_retransmit_message(SSL *s, unsigned short seq, @@ -1197,7 +1195,8 @@ void dtls1_double_timeout(SSL *s); unsigned int dtls1_min_mtu(void); /* some client-only functions */ -int ssl3_client_hello(SSL *s); +int dtls1_get_hello_verify(SSL *s); +int ssl3_send_client_hello(SSL *s); int ssl3_get_server_hello(SSL *s); int ssl3_get_certificate_request(SSL *s); int ssl3_get_new_session_ticket(SSL *s); @@ -1213,6 +1212,7 @@ int ssl3_check_cert_and_algorithm(SSL *s); int ssl3_check_finished(SSL *s); /* some server-only functions */ +int dtls1_send_hello_verify_request(SSL *s); int ssl3_get_client_hello(SSL *s); int ssl3_send_server_hello(SSL *s); int ssl3_send_hello_request(SSL *s); @@ -1223,18 +1223,11 @@ int ssl3_get_client_certificate(SSL *s); int ssl3_get_client_key_exchange(SSL *s); int ssl3_get_cert_verify(SSL *s); -int ssl23_accept(SSL *s); -int ssl23_connect(SSL *s); -int ssl23_read_bytes(SSL *s, int n); -int ssl23_write_bytes(SSL *s); - int tls1_new(SSL *s); void tls1_free(SSL *s); void tls1_clear(SSL *s); int dtls1_new(SSL *s); -int dtls1_accept(SSL *s); -int dtls1_connect(SSL *s); void dtls1_free(SSL *s); void dtls1_clear(SSL *s); long dtls1_ctrl(SSL *s, int cmd, long larg, void *parg); @@ -1285,14 +1278,6 @@ uint16_t tls1_ec_nid2curve_id(const int nid); int tls1_check_curve(SSL *s, const uint16_t curve_id); int tls1_get_shared_curve(SSL *s); -unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, - unsigned char *limit); - -unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, - unsigned char *limit); - -int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **data, - unsigned char *d, int n, int *al); int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data, size_t n, int *al); int ssl_check_clienthello_tlsext_early(SSL *s); diff --git a/ssl/ssl_sess.c b/ssl/ssl_sess.c index 59d7d9e..b3ee7ef 100644 --- a/ssl/ssl_sess.c +++ b/ssl/ssl_sess.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_sess.c,v 1.71 2017/04/10 17:27:33 jsing Exp $ */ +/* $OpenBSD: ssl_sess.c,v 1.79 2018/03/20 15:28:12 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -199,6 +199,11 @@ SSL_SESSION_new(void) { SSL_SESSION *ss; + if (!OPENSSL_init_ssl(0, NULL)) { + SSLerrorx(SSL_R_LIBRARY_BUG); + return(NULL); + } + if ((ss = calloc(1, sizeof(*ss))) == NULL) { SSLerrorx(ERR_R_MALLOC_FAILURE); return (NULL); @@ -228,19 +233,39 @@ SSL_SESSION_new(void) } const unsigned char * -SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len) +SSL_SESSION_get_id(const SSL_SESSION *ss, unsigned int *len) { - if (len) - *len = s->session_id_length; - return s->session_id; + if (len != NULL) + *len = ss->session_id_length; + return ss->session_id; +} + +const unsigned char * +SSL_SESSION_get0_id_context(const SSL_SESSION *ss, unsigned int *len) +{ + if (len != NULL) + *len = (unsigned int)ss->sid_ctx_length; + return ss->sid_ctx; } unsigned int -SSL_SESSION_get_compress_id(const SSL_SESSION *s) +SSL_SESSION_get_compress_id(const SSL_SESSION *ss) { return 0; } +unsigned long +SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s) +{ + return s->tlsext_tick_lifetime_hint; +} + +int +SSL_SESSION_has_ticket(const SSL_SESSION *s) +{ + return (s->tlsext_ticklen > 0) ? 1 : 0; +} + /* * SSLv3/TLSv1 has 32 bytes (256 bits) of session ID space. As such, filling * the ID with random gunk repeatedly until we have no conflict is going to @@ -709,6 +734,13 @@ SSL_SESSION_free(SSL_SESSION *ss) freezero(ss, sizeof(*ss)); } +int +SSL_SESSION_up_ref(SSL_SESSION *ss) +{ + int refs = CRYPTO_add(&ss->references, 1, CRYPTO_LOCK_SSL_SESSION); + return (refs > 1) ? 1 : 0; +} + int SSL_set_session(SSL *s, SSL_SESSION *session) { @@ -753,6 +785,23 @@ SSL_set_session(SSL *s, SSL_SESSION *session) return (ret); } +size_t +SSL_SESSION_get_master_key(const SSL_SESSION *ss, unsigned char *out, + size_t max_out) +{ + size_t len = ss->master_key_length; + + if (out == NULL) + return len; + + if (len > max_out) + len = max_out; + + memcpy(out, ss->master_key, len); + + return len; +} + long SSL_SESSION_set_timeout(SSL_SESSION *s, long t) { @@ -789,12 +838,31 @@ SSL_SESSION_set_time(SSL_SESSION *s, long t) return (t); } +int +SSL_SESSION_get_protocol_version(const SSL_SESSION *s) +{ + return s->ssl_version; +} + X509 * SSL_SESSION_get0_peer(SSL_SESSION *s) { return s->peer; } +int +SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid, + unsigned int sid_len) +{ + if (sid_len > SSL_MAX_SSL_SESSION_ID_LENGTH) { + SSLerrorx(SSL_R_SSL_SESSION_ID_TOO_LONG); + return 0; + } + s->session_id_length = sid_len; + memmove(s->session_id, sid, sid_len); + return 1; +} + int SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len) diff --git a/ssl/ssl_srvr.c b/ssl/ssl_srvr.c index c43d63d..f1a0c9a 100644 --- a/ssl/ssl_srvr.c +++ b/ssl/ssl_srvr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_srvr.c,v 1.22 2017/08/12 21:47:59 jsing Exp $ */ +/* $OpenBSD: ssl_srvr.c,v 1.28 2018/01/28 09:21:34 inoguchi Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -166,14 +166,16 @@ #include #include "bytestring.h" +#include "ssl_tlsext.h" int ssl3_accept(SSL *s) { - unsigned long alg_k; void (*cb)(const SSL *ssl, int type, int val) = NULL; + unsigned long alg_k; int ret = -1; int new_state, state, skip = 0; + int listen = 0; ERR_clear_error(); errno = 0; @@ -183,11 +185,17 @@ ssl3_accept(SSL *s) else if (s->ctx->internal->info_callback != NULL) cb = s->ctx->internal->info_callback; + if (SSL_IS_DTLS(s)) + listen = D1I(s)->listen; + /* init things to blank */ s->internal->in_handshake++; if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); + if (SSL_IS_DTLS(s)) + D1I(s)->listen = listen; + if (s->cert == NULL) { SSLerror(s, SSL_R_NO_CERTIFICATE_SET); ret = -1; @@ -206,15 +214,22 @@ ssl3_accept(SSL *s) case SSL_ST_ACCEPT: case SSL_ST_BEFORE|SSL_ST_ACCEPT: case SSL_ST_OK|SSL_ST_ACCEPT: - s->server = 1; if (cb != NULL) cb(s, SSL_CB_HANDSHAKE_START, 1); - if ((s->version >> 8) != 3) { - SSLerror(s, ERR_R_INTERNAL_ERROR); - ret = -1; - goto end; + if (SSL_IS_DTLS(s)) { + if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00)) { + SSLerror(s, ERR_R_INTERNAL_ERROR); + ret = -1; + goto end; + } + } else { + if ((s->version >> 8) != 3) { + SSLerror(s, ERR_R_INTERNAL_ERROR); + ret = -1; + goto end; + } } s->internal->type = SSL_ST_ACCEPT; @@ -239,7 +254,6 @@ ssl3_accept(SSL *s) ret = -1; goto end; } - if (!tls1_init_finished_mac(s)) { ret = -1; goto end; @@ -247,7 +261,7 @@ ssl3_accept(SSL *s) S3I(s)->hs.state = SSL3_ST_SR_CLNT_HELLO_A; s->ctx->internal->stats.sess_accept++; - } else if (!S3I(s)->send_connection_binding) { + } else if (!SSL_IS_DTLS(s) && !S3I(s)->send_connection_binding) { /* * Server attempting to renegotiate with * client that doesn't support secure @@ -261,7 +275,7 @@ ssl3_accept(SSL *s) } else { /* * S3I(s)->hs.state == SSL_ST_RENEGOTIATE, - * we will just send a HelloRequest + * we will just send a HelloRequest. */ s->ctx->internal->stats.sess_accept_renegotiate++; S3I(s)->hs.state = SSL3_ST_SW_HELLO_REQ_A; @@ -270,12 +284,18 @@ ssl3_accept(SSL *s) case SSL3_ST_SW_HELLO_REQ_A: case SSL3_ST_SW_HELLO_REQ_B: - s->internal->shutdown = 0; + if (SSL_IS_DTLS(s)) { + dtls1_clear_record_buffer(s); + dtls1_start_timer(s); + } ret = ssl3_send_hello_request(s); if (ret <= 0) goto end; - S3I(s)->hs.next_state = SSL3_ST_SW_HELLO_REQ_C; + if (SSL_IS_DTLS(s)) + S3I(s)->hs.next_state = SSL3_ST_SR_CLNT_HELLO_A; + else + S3I(s)->hs.next_state = SSL3_ST_SW_HELLO_REQ_C; S3I(s)->hs.state = SSL3_ST_SW_FLUSH; s->internal->init_num = 0; @@ -292,21 +312,78 @@ ssl3_accept(SSL *s) case SSL3_ST_SR_CLNT_HELLO_A: case SSL3_ST_SR_CLNT_HELLO_B: case SSL3_ST_SR_CLNT_HELLO_C: - s->internal->shutdown = 0; - if (s->internal->rwstate != SSL_X509_LOOKUP) { + if (SSL_IS_DTLS(s)) { ret = ssl3_get_client_hello(s); if (ret <= 0) goto end; - } + dtls1_stop_timer(s); - s->internal->renegotiate = 2; - S3I(s)->hs.state = SSL3_ST_SW_SRVR_HELLO_A; - s->internal->init_num = 0; + if (ret == 1 && + (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE)) + S3I(s)->hs.state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A; + else + S3I(s)->hs.state = SSL3_ST_SW_SRVR_HELLO_A; + + s->internal->init_num = 0; + + /* + * Reflect ClientHello sequence to remain + * stateless while listening. + */ + if (listen) { + memcpy(S3I(s)->write_sequence, + S3I(s)->read_sequence, + sizeof(S3I(s)->write_sequence)); + } + + /* If we're just listening, stop here */ + if (listen && S3I(s)->hs.state == SSL3_ST_SW_SRVR_HELLO_A) { + ret = 2; + D1I(s)->listen = 0; + /* + * Set expected sequence numbers to + * continue the handshake. + */ + D1I(s)->handshake_read_seq = 2; + D1I(s)->handshake_write_seq = 1; + D1I(s)->next_handshake_write_seq = 1; + goto end; + } + } else { + if (s->internal->rwstate != SSL_X509_LOOKUP) { + ret = ssl3_get_client_hello(s); + if (ret <= 0) + goto end; + } + + s->internal->renegotiate = 2; + S3I(s)->hs.state = SSL3_ST_SW_SRVR_HELLO_A; + s->internal->init_num = 0; + } + break; + + case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A: + case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B: + ret = dtls1_send_hello_verify_request(s); + if (ret <= 0) + goto end; + S3I(s)->hs.state = SSL3_ST_SW_FLUSH; + S3I(s)->hs.next_state = SSL3_ST_SR_CLNT_HELLO_A; + + /* HelloVerifyRequest resets Finished MAC. */ + if (!tls1_init_finished_mac(s)) { + ret = -1; + goto end; + } break; case SSL3_ST_SW_SRVR_HELLO_A: case SSL3_ST_SW_SRVR_HELLO_B: + if (SSL_IS_DTLS(s)) { + s->internal->renegotiate = 2; + dtls1_start_timer(s); + } ret = ssl3_send_server_hello(s); if (ret <= 0) goto end; @@ -315,9 +392,9 @@ ssl3_accept(SSL *s) S3I(s)->hs.state = SSL3_ST_SW_SESSION_TICKET_A; else S3I(s)->hs.state = SSL3_ST_SW_CHANGE_A; - } - else + } else { S3I(s)->hs.state = SSL3_ST_SW_CERT_A; + } s->internal->init_num = 0; break; @@ -326,6 +403,8 @@ ssl3_accept(SSL *s) /* Check if it is anon DH or anon ECDH. */ if (!(S3I(s)->hs.new_cipher->algorithm_auth & SSL_aNULL)) { + if (SSL_IS_DTLS(s)) + dtls1_start_timer(s); ret = ssl3_send_server_certificate(s); if (ret <= 0) goto end; @@ -353,6 +432,8 @@ ssl3_accept(SSL *s) * public key for key exchange. */ if (alg_k & (SSL_kDHE|SSL_kECDHE)) { + if (SSL_IS_DTLS(s)) + dtls1_start_timer(s); ret = ssl3_send_server_key_exchange(s); if (ret <= 0) goto end; @@ -388,11 +469,11 @@ ssl3_accept(SSL *s) ((S3I(s)->hs.new_cipher->algorithm_auth & SSL_aNULL) && !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))) { - /* No cert request */ + /* No cert request. */ skip = 1; S3I(s)->tmp.cert_request = 0; S3I(s)->hs.state = SSL3_ST_SW_SRVR_DONE_A; - if (S3I(s)->handshake_buffer) { + if (!SSL_IS_DTLS(s) && S3I(s)->handshake_buffer) { if (!tls1_digest_cached_records(s)) { ret = -1; goto end; @@ -400,6 +481,8 @@ ssl3_accept(SSL *s) } } else { S3I(s)->tmp.cert_request = 1; + if (SSL_IS_DTLS(s)) + dtls1_start_timer(s); ret = ssl3_send_certificate_request(s); if (ret <= 0) goto end; @@ -410,6 +493,8 @@ ssl3_accept(SSL *s) case SSL3_ST_SW_SRVR_DONE_A: case SSL3_ST_SW_SRVR_DONE_B: + if (SSL_IS_DTLS(s)) + dtls1_start_timer(s); ret = ssl3_send_server_done(s); if (ret <= 0) goto end; @@ -419,7 +504,6 @@ ssl3_accept(SSL *s) break; case SSL3_ST_SW_FLUSH: - /* * This code originally checked to see if * any data was pending using BIO_CTRL_INFO @@ -430,14 +514,19 @@ ssl3_accept(SSL *s) * still exist. So instead we just flush * unconditionally. */ - s->internal->rwstate = SSL_WRITING; if (BIO_flush(s->wbio) <= 0) { + if (SSL_IS_DTLS(s)) { + /* If the write error was fatal, stop trying. */ + if (!BIO_should_retry(s->wbio)) { + s->internal->rwstate = SSL_NOTHING; + S3I(s)->hs.state = S3I(s)->hs.next_state; + } + } ret = -1; goto end; } s->internal->rwstate = SSL_NOTHING; - S3I(s)->hs.state = S3I(s)->hs.next_state; break; @@ -457,6 +546,12 @@ ssl3_accept(SSL *s) ret = ssl3_get_client_key_exchange(s); if (ret <= 0) goto end; + + if (SSL_IS_DTLS(s)) { + S3I(s)->hs.state = SSL3_ST_SR_CERT_VRFY_A; + s->internal->init_num = 0; + } + alg_k = S3I(s)->hs.new_cipher->algorithm_mkey; if (ret == 2) { /* @@ -507,7 +602,7 @@ ssl3_accept(SSL *s) S3I(s)->tmp.cert_verify_md, sizeof(S3I(s)->tmp.cert_verify_md), NULL)) { - ret = -1; + ret = -1; goto end; } } @@ -515,24 +610,31 @@ ssl3_accept(SSL *s) case SSL3_ST_SR_CERT_VRFY_A: case SSL3_ST_SR_CERT_VRFY_B: - s->s3->flags |= SSL3_FLAGS_CCS_OK; + if (SSL_IS_DTLS(s)) + D1I(s)->change_cipher_spec_ok = 1; + else + s->s3->flags |= SSL3_FLAGS_CCS_OK; /* we should decide if we expected this one */ ret = ssl3_get_cert_verify(s); if (ret <= 0) goto end; - S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; s->internal->init_num = 0; break; case SSL3_ST_SR_FINISHED_A: case SSL3_ST_SR_FINISHED_B: - s->s3->flags |= SSL3_FLAGS_CCS_OK; + if (SSL_IS_DTLS(s)) + D1I(s)->change_cipher_spec_ok = 1; + else + s->s3->flags |= SSL3_FLAGS_CCS_OK; ret = ssl3_get_finished(s, SSL3_ST_SR_FINISHED_A, SSL3_ST_SR_FINISHED_B); if (ret <= 0) goto end; + if (SSL_IS_DTLS(s)) + dtls1_stop_timer(s); if (s->internal->hit) S3I(s)->hs.state = SSL_ST_OK; else if (s->internal->tlsext_ticket_expected) @@ -560,10 +662,8 @@ ssl3_accept(SSL *s) s->internal->init_num = 0; break; - case SSL3_ST_SW_CHANGE_A: case SSL3_ST_SW_CHANGE_B: - s->session->cipher = S3I(s)->hs.new_cipher; if (!tls1_setup_key_block(s)) { ret = -1; @@ -572,26 +672,27 @@ ssl3_accept(SSL *s) ret = ssl3_send_change_cipher_spec(s, SSL3_ST_SW_CHANGE_A, SSL3_ST_SW_CHANGE_B); - if (ret <= 0) goto end; S3I(s)->hs.state = SSL3_ST_SW_FINISHED_A; s->internal->init_num = 0; - if (!tls1_change_cipher_state( - s, SSL3_CHANGE_CIPHER_SERVER_WRITE)) { + if (!tls1_change_cipher_state(s, + SSL3_CHANGE_CIPHER_SERVER_WRITE)) { ret = -1; goto end; } + if (SSL_IS_DTLS(s)) + dtls1_reset_seq_numbers(s, SSL3_CC_WRITE); break; case SSL3_ST_SW_FINISHED_A: case SSL3_ST_SW_FINISHED_B: ret = ssl3_send_finished(s, - SSL3_ST_SW_FINISHED_A, SSL3_ST_SW_FINISHED_B, - TLS_MD_SERVER_FINISH_CONST, - TLS_MD_SERVER_FINISH_CONST_SIZE); + SSL3_ST_SW_FINISHED_A, SSL3_ST_SW_FINISHED_B, + TLS_MD_SERVER_FINISH_CONST, + TLS_MD_SERVER_FINISH_CONST_SIZE); if (ret <= 0) goto end; S3I(s)->hs.state = SSL3_ST_SW_FLUSH; @@ -606,15 +707,17 @@ ssl3_accept(SSL *s) /* clean a few things up */ tls1_cleanup_key_block(s); - BUF_MEM_free(s->internal->init_buf); - s->internal->init_buf = NULL; + if (!SSL_IS_DTLS(s)) { + BUF_MEM_free(s->internal->init_buf); + s->internal->init_buf = NULL; + } /* remove buffering on output */ ssl_free_wbio_buffer(s); s->internal->init_num = 0; - /* skipped if we just sent a HelloRequest */ + /* Skipped if we just sent a HelloRequest. */ if (s->internal->renegotiate == 2) { s->internal->renegotiate = 0; s->internal->new_session = 0; @@ -630,6 +733,14 @@ ssl3_accept(SSL *s) } ret = 1; + + if (SSL_IS_DTLS(s)) { + /* Done handshaking, next message is client hello. */ + D1I(s)->handshake_read_seq = 0; + /* Next message is server hello. */ + D1I(s)->handshake_write_seq = 0; + D1I(s)->next_handshake_write_seq = 0; + } goto end; /* break; */ @@ -658,10 +769,10 @@ ssl3_accept(SSL *s) } end: /* BIO_flush(s->wbio); */ - s->internal->in_handshake--; if (cb != NULL) cb(s, SSL_CB_ACCEPT_EXIT, ret); + return (ret); } @@ -702,7 +813,6 @@ ssl3_get_client_hello(SSL *s) int i, j, ok, al, ret = -1, cookie_valid = 0; long n; unsigned long id; - unsigned char *p, *d; SSL_CIPHER *c; STACK_OF(SSL_CIPHER) *ciphers = NULL; unsigned long alg_k; @@ -732,8 +842,7 @@ ssl3_get_client_hello(SSL *s) if (n < 0) goto err; - d = p = (unsigned char *)s->internal->init_msg; - end = d + n; + end = (unsigned char *)s->internal->init_msg + n; CBS_init(&cbs, s->internal->init_msg, n); @@ -883,11 +992,12 @@ ssl3_get_client_hello(SSL *s) if (CBS_len(&cipher_suites) > 0) { if ((ciphers = ssl_bytes_to_cipher_list(s, - CBS_data(&cipher_suites), CBS_len(&cipher_suites))) == NULL) + &cipher_suites)) == NULL) goto err; } /* If it is a hit, check that the cipher is in the list */ + /* XXX - CBS_len(&cipher_suites) will always be zero here... */ if (s->internal->hit && CBS_len(&cipher_suites) > 0) { j = 0; id = s->session->cipher->id; @@ -926,14 +1036,17 @@ ssl3_get_client_hello(SSL *s) goto f_err; } - p = (unsigned char *)CBS_data(&cbs); - - /* TLS extensions*/ - if (!ssl_parse_clienthello_tlsext(s, &p, d, n, &al)) { - /* 'al' set by ssl_parse_clienthello_tlsext */ + if (!tlsext_clienthello_parse(s, &cbs, &al)) { SSLerror(s, SSL_R_PARSE_TLSEXT); goto f_err; } + + if (!S3I(s)->renegotiate_seen && s->internal->renegotiate) { + al = SSL_AD_HANDSHAKE_FAILURE; + SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); + goto f_err; + } + if (ssl_check_clienthello_tlsext_early(s) <= 0) { SSLerror(s, SSL_R_CLIENTHELLO_TLSEXT); goto err; @@ -1056,25 +1169,19 @@ err: int ssl3_send_server_hello(SSL *s) { - unsigned char *bufend; - unsigned char *p, *d; - CBB cbb, session_id; - size_t outlen; - int sl; + CBB cbb, server_hello, session_id; + size_t sl; memset(&cbb, 0, sizeof(cbb)); - bufend = (unsigned char *)s->internal->init_buf->data + SSL3_RT_MAX_PLAIN_LENGTH; - if (S3I(s)->hs.state == SSL3_ST_SW_SRVR_HELLO_A) { - d = p = ssl3_handshake_msg_start(s, SSL3_MT_SERVER_HELLO); - - if (!CBB_init_fixed(&cbb, p, bufend - p)) + if (!ssl3_handshake_msg_start_cbb(s, &cbb, &server_hello, + SSL3_MT_SERVER_HELLO)) goto err; - if (!CBB_add_u16(&cbb, s->version)) + if (!CBB_add_u16(&server_hello, s->version)) goto err; - if (!CBB_add_bytes(&cbb, s->s3->server_random, + if (!CBB_add_bytes(&server_hello, s->s3->server_random, sizeof(s->s3->server_random))) goto err; @@ -1101,35 +1208,32 @@ ssl3_send_server_hello(SSL *s) s->session->session_id_length = 0; sl = s->session->session_id_length; - if (sl > (int)sizeof(s->session->session_id)) { + if (sl > sizeof(s->session->session_id)) { SSLerror(s, ERR_R_INTERNAL_ERROR); goto err; } - - if (!CBB_add_u8_length_prefixed(&cbb, &session_id)) + if (!CBB_add_u8_length_prefixed(&server_hello, &session_id)) goto err; if (!CBB_add_bytes(&session_id, s->session->session_id, sl)) goto err; /* Cipher suite. */ - if (!CBB_add_u16(&cbb, + if (!CBB_add_u16(&server_hello, ssl3_cipher_get_value(S3I(s)->hs.new_cipher))) goto err; - /* Compression method. */ - if (!CBB_add_u8(&cbb, 0)) + /* Compression method (null). */ + if (!CBB_add_u8(&server_hello, 0)) goto err; - if (!CBB_finish(&cbb, NULL, &outlen)) - goto err; - - if ((p = ssl_add_serverhello_tlsext(s, p + outlen, - bufend)) == NULL) { + /* TLS extensions */ + if (!tlsext_serverhello_build(s, &server_hello)) { SSLerror(s, ERR_R_INTERNAL_ERROR); goto err; } - ssl3_handshake_msg_finish(s, p - d); + if (!ssl3_handshake_msg_finish_cbb(s, &cbb)) + goto err; } /* SSL3_ST_SW_SRVR_HELLO_B */ diff --git a/ssl/ssl_tlsext.c b/ssl/ssl_tlsext.c index 2abfa72..3735b71 100644 --- a/ssl/ssl_tlsext.c +++ b/ssl/ssl_tlsext.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_tlsext.c,v 1.17.4.1 2017/12/09 13:43:25 jsing Exp $ */ +/* $OpenBSD: ssl_tlsext.c,v 1.21 2018/02/08 11:30:30 jsing Exp $ */ /* * Copyright (c) 2016, 2017 Joel Sing * Copyright (c) 2017 Doug Hogan @@ -271,11 +271,12 @@ tlsext_ec_serverhello_parse(SSL *s, CBS *cbs, int *alert) /* * Servers should not send this extension per the RFC. * - * However, F5 sends it by mistake (case ID 492780) so we need to skip - * over it. This bug is from at least 2014 but as of 2017, there - * are still large sites with this bug in production. + * However, certain F5 BIG-IP systems incorrectly send it. This bug is + * from at least 2014 but as of 2017, there are still large sites with + * this unpatched in production. As a result, we need to currently skip + * over the extension and ignore its content: * - * https://devcentral.f5.com/questions/disable-supported-elliptic-curves-extension-from-server + * https://support.f5.com/csp/article/K37345003 */ if (!CBS_skip(cbs, CBS_len(cbs))) { *alert = TLS1_AD_INTERNAL_ERROR; @@ -1291,8 +1292,52 @@ static struct tls_extension tls_extensions[] = { #define N_TLS_EXTENSIONS (sizeof(tls_extensions) / sizeof(*tls_extensions)) -int -tlsext_clienthello_build(SSL *s, CBB *cbb) +/* Ensure that extensions fit in a uint32_t bitmask. */ +CTASSERT(N_TLS_EXTENSIONS <= (sizeof(uint32_t) * 8)); + +static struct tls_extension * +tls_extension_find(uint16_t type, size_t *tls_extensions_idx) +{ + size_t i; + + for (i = 0; i < N_TLS_EXTENSIONS; i++) { + if (tls_extensions[i].type == type) { + *tls_extensions_idx = i; + return &tls_extensions[i]; + } + } + + return NULL; +} + +static int +tls_extension_needs(struct tls_extension *tlsext, int is_serverhello, SSL *s) +{ + if (is_serverhello) + return tlsext->serverhello_needs(s); + return tlsext->clienthello_needs(s); +} + +static int +tls_extension_build(struct tls_extension *tlsext, int is_serverhello, SSL *s, + CBB *cbb) +{ + if (is_serverhello) + return tlsext->serverhello_build(s, cbb); + return tlsext->clienthello_build(s, cbb); +} + +static int +tls_extension_parse(struct tls_extension *tlsext, int is_serverhello, SSL *s, + CBS *cbs, int *alert) +{ + if (is_serverhello) + return tlsext->serverhello_parse(s, cbs, alert); + return tlsext->clienthello_parse(s, cbs, alert); +} + +static int +tlsext_build(SSL *s, CBB *cbb, int is_serverhello) { CBB extensions, extension_data; struct tls_extension *tlsext; @@ -1305,14 +1350,16 @@ tlsext_clienthello_build(SSL *s, CBB *cbb) for (i = 0; i < N_TLS_EXTENSIONS; i++) { tlsext = &tls_extensions[i]; - if (!tlsext->clienthello_needs(s)) + if (!tls_extension_needs(tlsext, is_serverhello, s)) continue; if (!CBB_add_u16(&extensions, tlsext->type)) return 0; if (!CBB_add_u16_length_prefixed(&extensions, &extension_data)) return 0; - if (!tls_extensions[i].clienthello_build(s, &extension_data)) + + if (!tls_extension_build(tlsext, is_serverhello, s, + &extension_data)) return 0; extensions_present = 1; @@ -1327,88 +1374,101 @@ tlsext_clienthello_build(SSL *s, CBB *cbb) return 1; } -int -tlsext_clienthello_parse_one(SSL *s, CBS *cbs, uint16_t type, int *alert) +static int +tlsext_parse(SSL *s, CBS *cbs, int *alert, int is_serverhello) { + CBS extensions, extension_data; struct tls_extension *tlsext; - size_t i; - - for (i = 0; i < N_TLS_EXTENSIONS; i++) { - tlsext = &tls_extensions[i]; - - if (tlsext->type != type) - continue; - if (!tlsext->clienthello_parse(s, cbs, alert)) - return 0; - if (CBS_len(cbs) != 0) { - *alert = SSL_AD_DECODE_ERROR; - return 0; - } + uint32_t extensions_seen = 0; + uint16_t type; + size_t idx; + /* An empty extensions block is valid. */ + if (CBS_len(cbs) == 0) return 1; + + *alert = SSL_AD_DECODE_ERROR; + + if (!CBS_get_u16_length_prefixed(cbs, &extensions)) + return 0; + + while (CBS_len(&extensions) > 0) { + if (!CBS_get_u16(&extensions, &type)) + return 0; + if (!CBS_get_u16_length_prefixed(&extensions, &extension_data)) + return 0; + + if (s->internal->tlsext_debug_cb != NULL) + s->internal->tlsext_debug_cb(s, is_serverhello, type, + (unsigned char *)CBS_data(&extension_data), + CBS_len(&extension_data), + s->internal->tlsext_debug_arg); + + /* Unknown extensions are ignored. */ + if ((tlsext = tls_extension_find(type, &idx)) == NULL) + continue; + + /* Check for duplicate known extensions. */ + if ((extensions_seen & (1 << idx)) != 0) + return 0; + extensions_seen |= (1 << idx); + + if (!tls_extension_parse(tlsext, is_serverhello, s, + &extension_data, alert)) + return 0; + + if (CBS_len(&extension_data) != 0) + return 0; } - /* Not found. */ - return 2; + return 1; +} + +static void +tlsext_clienthello_reset_state(SSL *s) +{ + s->internal->servername_done = 0; + s->tlsext_status_type = -1; + S3I(s)->renegotiate_seen = 0; + free(S3I(s)->alpn_selected); + S3I(s)->alpn_selected = NULL; + s->internal->srtp_profile = NULL; +} + +int +tlsext_clienthello_build(SSL *s, CBB *cbb) +{ + return tlsext_build(s, cbb, 0); +} + +int +tlsext_clienthello_parse(SSL *s, CBS *cbs, int *alert) +{ + /* XXX - this possibly should be done by the caller... */ + tlsext_clienthello_reset_state(s); + + return tlsext_parse(s, cbs, alert, 0); +} + +static void +tlsext_serverhello_reset_state(SSL *s) +{ + S3I(s)->renegotiate_seen = 0; + free(S3I(s)->alpn_selected); + S3I(s)->alpn_selected = NULL; } int tlsext_serverhello_build(SSL *s, CBB *cbb) { - CBB extensions, extension_data; - struct tls_extension *tlsext; - int extensions_present = 0; - size_t i; - - if (!CBB_add_u16_length_prefixed(cbb, &extensions)) - return 0; - - for (i = 0; i < N_TLS_EXTENSIONS; i++) { - tlsext = &tls_extensions[i]; - - if (!tlsext->serverhello_needs(s)) - continue; - - if (!CBB_add_u16(&extensions, tlsext->type)) - return 0; - if (!CBB_add_u16_length_prefixed(&extensions, &extension_data)) - return 0; - if (!tlsext->serverhello_build(s, &extension_data)) - return 0; - - extensions_present = 1; - } - - if (!extensions_present) - CBB_discard_child(cbb); - - if (!CBB_flush(cbb)) - return 0; - - return 1; + return tlsext_build(s, cbb, 1); } int -tlsext_serverhello_parse_one(SSL *s, CBS *cbs, uint16_t type, int *alert) +tlsext_serverhello_parse(SSL *s, CBS *cbs, int *alert) { - struct tls_extension *tlsext; - size_t i; + /* XXX - this possibly should be done by the caller... */ + tlsext_serverhello_reset_state(s); - for (i = 0; i < N_TLS_EXTENSIONS; i++) { - tlsext = &tls_extensions[i]; - - if (tlsext->type != type) - continue; - if (!tlsext->serverhello_parse(s, cbs, alert)) - return 0; - if (CBS_len(cbs) != 0) { - *alert = SSL_AD_DECODE_ERROR; - return 0; - } - - return 1; - } - - /* Not found. */ - return 2; + return tlsext_parse(s, cbs, alert, 1); } diff --git a/ssl/ssl_tlsext.h b/ssl/ssl_tlsext.h index 7c6250a..4248932 100644 --- a/ssl/ssl_tlsext.h +++ b/ssl/ssl_tlsext.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_tlsext.h,v 1.10 2017/08/27 02:58:04 doug Exp $ */ +/* $OpenBSD: ssl_tlsext.h,v 1.12 2018/02/08 11:30:30 jsing Exp $ */ /* * Copyright (c) 2016, 2017 Joel Sing * Copyright (c) 2017 Doug Hogan @@ -82,9 +82,7 @@ int tlsext_srtp_serverhello_parse(SSL *s, CBS *cbs, int *alert); #endif int tlsext_clienthello_build(SSL *s, CBB *cbb); -int tlsext_clienthello_parse_one(SSL *s, CBS *cbs, uint16_t tlsext_type, - int *alert); +int tlsext_clienthello_parse(SSL *s, CBS *cbs, int *alert); int tlsext_serverhello_build(SSL *s, CBB *cbb); -int tlsext_serverhello_parse_one(SSL *s, CBS *cbs, uint16_t tlsext_type, - int *alert); +int tlsext_serverhello_parse(SSL *s, CBS *cbs, int *alert); diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c index 0d03b45..d92fd70 100644 --- a/ssl/t1_lib.c +++ b/ssl/t1_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: t1_lib.c,v 1.137 2017/08/30 16:44:37 jsing Exp $ */ +/* $OpenBSD: t1_lib.c,v 1.141 2018/02/08 11:30:30 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -661,194 +661,6 @@ tls12_get_req_sig_algs(SSL *s, unsigned char **sigalgs, size_t *sigalgs_len) *sigalgs_len = sizeof(tls12_sigalgs); } -unsigned char * -ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit) -{ - size_t len; - CBB cbb; - - if (p >= limit) - return NULL; - - if (!CBB_init_fixed(&cbb, p, limit - p)) - return NULL; - if (!tlsext_clienthello_build(s, &cbb)) { - CBB_cleanup(&cbb); - return NULL; - } - if (!CBB_finish(&cbb, NULL, &len)) { - CBB_cleanup(&cbb); - return NULL; - } - - return (p + len); -} - -unsigned char * -ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit) -{ - size_t len; - CBB cbb; - - if (p >= limit) - return NULL; - - if (!CBB_init_fixed(&cbb, p, limit - p)) - return NULL; - if (!tlsext_serverhello_build(s, &cbb)) { - CBB_cleanup(&cbb); - return NULL; - } - if (!CBB_finish(&cbb, NULL, &len)) { - CBB_cleanup(&cbb); - return NULL; - } - - return (p + len); -} - -int -ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, - int n, int *al) -{ - unsigned short type; - unsigned short size; - unsigned short len; - unsigned char *data = *p; - unsigned char *end = d + n; - CBS cbs; - - s->internal->servername_done = 0; - s->tlsext_status_type = -1; - S3I(s)->renegotiate_seen = 0; - free(S3I(s)->alpn_selected); - S3I(s)->alpn_selected = NULL; - s->internal->srtp_profile = NULL; - - if (data == end) - goto ri_check; - - if (end - data < 2) - goto err; - n2s(data, len); - - if (end - data != len) - goto err; - - while (end - data >= 4) { - n2s(data, type); - n2s(data, size); - - if (end - data < size) - goto err; - - if (s->internal->tlsext_debug_cb) - s->internal->tlsext_debug_cb(s, 0, type, data, size, - s->internal->tlsext_debug_arg); - - CBS_init(&cbs, data, size); - if (!tlsext_clienthello_parse_one(s, &cbs, type, al)) - return 0; - - data += size; - } - - /* Spurious data on the end */ - if (data != end) - goto err; - - *p = data; - -ri_check: - - /* Need RI if renegotiating */ - - if (!S3I(s)->renegotiate_seen && s->internal->renegotiate) { - *al = SSL_AD_HANDSHAKE_FAILURE; - SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); - return 0; - } - - return 1; - -err: - *al = SSL_AD_DECODE_ERROR; - return 0; -} - -int -ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al) -{ - unsigned short type; - unsigned short size; - unsigned short len; - unsigned char *data = *p; - unsigned char *end = *p + n; - CBS cbs; - - S3I(s)->renegotiate_seen = 0; - free(S3I(s)->alpn_selected); - S3I(s)->alpn_selected = NULL; - - if (data == end) - goto ri_check; - - if (end - data < 2) - goto err; - n2s(data, len); - - if (end - data != len) - goto err; - - while (end - data >= 4) { - n2s(data, type); - n2s(data, size); - - if (end - data < size) - goto err; - - if (s->internal->tlsext_debug_cb) - s->internal->tlsext_debug_cb(s, 1, type, data, size, - s->internal->tlsext_debug_arg); - - CBS_init(&cbs, data, size); - if (!tlsext_serverhello_parse_one(s, &cbs, type, al)) - return 0; - - data += size; - - } - - if (data != end) { - *al = SSL_AD_DECODE_ERROR; - return 0; - } - - *p = data; - -ri_check: - - /* Determine if we need to see RI. Strictly speaking if we want to - * avoid an attack we should *always* see RI even on initial server - * hello because the client doesn't see any renegotiation during an - * attack. However this would mean we could not connect to any server - * which doesn't support RI so for the immediate future tolerate RI - * absence on initial connect only. - */ - if (!S3I(s)->renegotiate_seen && - !(s->internal->options & SSL_OP_LEGACY_SERVER_CONNECT)) { - *al = SSL_AD_HANDSHAKE_FAILURE; - SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); - return 0; - } - - return 1; - -err: - *al = SSL_AD_DECODE_ERROR; - return 0; -} - int ssl_check_clienthello_tlsext_early(SSL *s) { diff --git a/tls/CMakeLists.txt b/tls/CMakeLists.txt index fbe6693..6c5303c 100644 --- a/tls/CMakeLists.txt +++ b/tls/CMakeLists.txt @@ -11,6 +11,7 @@ set( tls_client.c tls_config.c tls_conninfo.c + tls_keypair.c tls_server.c tls_ocsp.c tls_peer.c @@ -18,6 +19,16 @@ set( tls_verify.c ) +if(WIN32) + set( + TLS_SRC + ${TLS_SRC} + compat/ftruncate.c + compat/getuid.c + compat/pread.c + compat/pwrite.c + ) +endif() if(NOT "${OPENSSLDIR}" STREQUAL "") add_definitions(-D_PATH_SSL_CA_FILE=\"${OPENSSLDIR}/cert.pem\") @@ -25,28 +36,26 @@ else() add_definitions(-D_PATH_SSL_CA_FILE=\"${CMAKE_INSTALL_PREFIX}/etc/ssl/cert.pem\") endif() -add_library(tls-objects OBJECT ${TLS_SRC}) -if (BUILD_SHARED) - add_library(tls STATIC $) - add_library(tls-shared SHARED $) - export_symbol(tls-shared ${CMAKE_CURRENT_SOURCE_DIR}/tls.sym) - target_link_libraries(tls-shared ssl-shared crypto-shared) +add_library(tls ${TLS_SRC}) +if (BUILD_SHARED_LIBS) + export_symbol(tls ${CMAKE_CURRENT_SOURCE_DIR}/tls.sym) + target_link_libraries(tls ssl crypto) if (WIN32) - target_link_libraries(tls-shared Ws2_32.lib) + target_link_libraries(tls Ws2_32.lib) set(TLS_POSTFIX -${TLS_MAJOR_VERSION}) endif() - set_target_properties(tls-shared PROPERTIES + set_target_properties(tls PROPERTIES OUTPUT_NAME tls${TLS_POSTFIX} ARCHIVE_OUTPUT_NAME tls${TLS_POSTFIX}) - set_target_properties(tls-shared PROPERTIES VERSION ${TLS_VERSION} + set_target_properties(tls PROPERTIES VERSION ${TLS_VERSION} SOVERSION ${TLS_MAJOR_VERSION}) - if(ENABLE_LIBRESSL_INSTALL) - install(TARGETS tls tls-shared DESTINATION ${CMAKE_INSTALL_LIBDIR}) - endif(ENABLE_LIBRESSL_INSTALL) -else() - add_library(tls STATIC ${TLS_SRC}) - if(ENABLE_LIBRESSL_INSTALL) - install(TARGETS tls DESTINATION ${CMAKE_INSTALL_LIBDIR}) - endif(ENABLE_LIBRESSL_INSTALL) endif() +if(ENABLE_LIBRESSL_INSTALL) + install( + TARGETS tls + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) +endif(ENABLE_LIBRESSL_INSTALL) diff --git a/tls/VERSION b/tls/VERSION index 92dcf9a..778aba6 100644 --- a/tls/VERSION +++ b/tls/VERSION @@ -1 +1 @@ -16:1:0 +17:1:0 diff --git a/tls/compat/ftruncate.c b/tls/compat/ftruncate.c new file mode 100644 index 0000000..e825e50 --- /dev/null +++ b/tls/compat/ftruncate.c @@ -0,0 +1,17 @@ +/* + * Public domain + * + * Kinichiro Inoguchi + */ + +#ifdef _WIN32 + +#include + +int +ftruncate(int fd, off_t length) +{ + return _chsize(fd, length); +} + +#endif diff --git a/tls/compat/getuid.c b/tls/compat/getuid.c new file mode 100644 index 0000000..9a46317 --- /dev/null +++ b/tls/compat/getuid.c @@ -0,0 +1,18 @@ +/* + * Public domain + * + * Kinichiro Inoguchi + */ + +#ifdef _WIN32 + +#include + +uid_t +getuid(void) +{ + /* Windows fstat sets 0 as st_uid */ + return 0; +} + +#endif diff --git a/tls/compat/pread.c b/tls/compat/pread.c new file mode 100644 index 0000000..b9d6b09 --- /dev/null +++ b/tls/compat/pread.c @@ -0,0 +1,29 @@ +/* + * Public domain + * + * Kinichiro Inoguchi + */ + +#ifdef _WIN32 + +#define NO_REDEF_POSIX_FUNCTIONS + +#include + +ssize_t +pread(int d, void *buf, size_t nbytes, off_t offset) +{ + off_t cpos, opos, rpos; + ssize_t bytes; + if((cpos = lseek(d, 0, SEEK_CUR)) == -1) + return -1; + if((opos = lseek(d, offset, SEEK_SET)) == -1) + return -1; + if((bytes = read(d, buf, nbytes)) == -1) + return -1; + if((rpos = lseek(d, cpos, SEEK_SET)) == -1) + return -1; + return bytes; +} + +#endif diff --git a/tls/compat/pwrite.c b/tls/compat/pwrite.c new file mode 100644 index 0000000..82f5f55 --- /dev/null +++ b/tls/compat/pwrite.c @@ -0,0 +1,29 @@ +/* + * Public domain + * + * Kinichiro Inoguchi + */ + +#ifdef _WIN32 + +#define NO_REDEF_POSIX_FUNCTIONS + +#include + +ssize_t +pwrite(int d, const void *buf, size_t nbytes, off_t offset) +{ + off_t cpos, opos, rpos; + ssize_t bytes; + if((cpos = lseek(d, 0, SEEK_CUR)) == -1) + return -1; + if((opos = lseek(d, offset, SEEK_SET)) == -1) + return -1; + if((bytes = write(d, buf, nbytes)) == -1) + return -1; + if((rpos = lseek(d, cpos, SEEK_SET)) == -1) + return -1; + return bytes; +} + +#endif diff --git a/tls/tls.c b/tls/tls.c index f07c4c6..467db16 100644 --- a/tls/tls.c +++ b/tls/tls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls.c,v 1.71 2017/09/20 17:05:17 jsing Exp $ */ +/* $OpenBSD: tls.c,v 1.79 2018/03/19 16:34:47 jsing Exp $ */ /* * Copyright (c) 2014 Joel Sing * @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -35,28 +36,34 @@ static struct tls_config *tls_config_default; -int -tls_init(void) +static int tls_init_rv = -1; + +static void +tls_do_init(void) { - static int tls_initialised = 0; - - if (tls_initialised) - return (0); - SSL_load_error_strings(); SSL_library_init(); if (BIO_sock_init() != 1) - return (-1); + return; - if ((tls_config_default = tls_config_new()) == NULL) - return (-1); + if ((tls_config_default = tls_config_new_internal()) == NULL) + return; tls_config_default->refcount++; - tls_initialised = 1; + tls_init_rv = 0; +} - return (0); +int +tls_init(void) +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + + if (pthread_once(&once, tls_do_init) != 0) + return -1; + + return tls_init_rv; } const char * @@ -269,7 +276,9 @@ tls_cert_hash(X509 *cert, char **hash) char d[EVP_MAX_MD_SIZE], *dhex = NULL; int dlen, rv = -1; + free(*hash); *hash = NULL; + if (X509_digest(cert, EVP_sha256(), d, &dlen) != 1) goto err; @@ -288,23 +297,15 @@ tls_cert_hash(X509 *cert, char **hash) return (rv); } -static int -tls_keypair_pubkey_hash(struct tls_keypair *keypair, char **hash) +int +tls_cert_pubkey_hash(X509 *cert, char **hash) { - BIO *membio = NULL; - X509 *cert = NULL; char d[EVP_MAX_MD_SIZE], *dhex = NULL; int dlen, rv = -1; + free(*hash); *hash = NULL; - if ((membio = BIO_new_mem_buf(keypair->cert_mem, - keypair->cert_len)) == NULL) - goto err; - if ((cert = PEM_read_bio_X509_AUX(membio, NULL, tls_password_cb, - NULL)) == NULL) - goto err; - if (X509_pubkey_digest(cert, EVP_sha256(), d, &dlen) != 1) goto err; @@ -320,13 +321,10 @@ tls_keypair_pubkey_hash(struct tls_keypair *keypair, char **hash) err: free(dhex); - X509_free(cert); - BIO_free(membio); return (rv); } - int tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, struct tls_keypair *keypair, int required) @@ -350,8 +348,6 @@ tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, tls_set_errorx(ctx, "failed to load certificate"); goto err; } - if (tls_keypair_pubkey_hash(keypair, &keypair->pubkey_hash) == -1) - goto err; } if (keypair->key_mem != NULL) { diff --git a/tls/tls.sym b/tls/tls.sym index 1e7538c..923924f 100644 --- a/tls/tls.sym +++ b/tls/tls.sym @@ -42,6 +42,7 @@ tls_config_set_ocsp_staple_file tls_config_set_protocols tls_config_set_session_id tls_config_set_session_lifetime +tls_config_set_session_fd tls_config_set_verify_depth tls_config_skip_private_key_check tls_config_verify @@ -51,6 +52,7 @@ tls_configure tls_conn_alpn_selected tls_conn_cipher tls_conn_servername +tls_conn_session_resumed tls_conn_version tls_connect tls_connect_cbs diff --git a/tls/tls_client.c b/tls/tls_client.c index c79f462..04e4402 100644 --- a/tls/tls_client.c +++ b/tls/tls_client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_client.c,v 1.43 2017/08/10 18:18:30 jsing Exp $ */ +/* $OpenBSD: tls_client.c,v 1.45 2018/03/19 16:34:47 jsing Exp $ */ /* * Copyright (c) 2014 Joel Sing * @@ -17,10 +17,12 @@ #include #include +#include #include #include +#include #include #include #include @@ -36,6 +38,9 @@ tls_client(void) { struct tls *ctx; + if (tls_init() == -1) + return (NULL); + if ((ctx = tls_new()) == NULL) return (NULL); @@ -158,6 +163,118 @@ tls_connect_servername(struct tls *ctx, const char *host, const char *port, return (rv); } +static int +tls_client_read_session(struct tls *ctx) +{ + int sfd = ctx->config->session_fd; + uint8_t *session = NULL; + size_t session_len = 0; + SSL_SESSION *ss = NULL; + BIO *bio = NULL; + struct stat sb; + ssize_t n; + int rv = -1; + + if (fstat(sfd, &sb) == -1) { + tls_set_error(ctx, "failed to stat session file"); + goto err; + } + if (sb.st_size < 0 || sb.st_size > INT_MAX) { + tls_set_errorx(ctx, "invalid session file size"); + goto err; + } + session_len = (size_t)sb.st_size; + + /* A zero size file means that we do not yet have a valid session. */ + if (session_len == 0) + goto done; + + if ((session = malloc(session_len)) == NULL) + goto err; + + n = pread(sfd, session, session_len, 0); + if (n < 0 || (size_t)n != session_len) { + tls_set_error(ctx, "failed to read session file"); + goto err; + } + if ((bio = BIO_new_mem_buf(session, session_len)) == NULL) + goto err; + if ((ss = PEM_read_bio_SSL_SESSION(bio, NULL, tls_password_cb, + NULL)) == NULL) { + tls_set_errorx(ctx, "failed to parse session"); + goto err; + } + + if (SSL_set_session(ctx->ssl_conn, ss) != 1) { + tls_set_errorx(ctx, "failed to set session"); + goto err; + } + + done: + rv = 0; + + err: + freezero(session, session_len); + SSL_SESSION_free(ss); + BIO_free(bio); + + return rv; +} + +static int +tls_client_write_session(struct tls *ctx) +{ + int sfd = ctx->config->session_fd; + SSL_SESSION *ss = NULL; + BIO *bio = NULL; + long data_len; + char *data; + off_t offset; + size_t len; + ssize_t n; + int rv = -1; + + if ((ss = SSL_get1_session(ctx->ssl_conn)) == NULL) { + if (ftruncate(sfd, 0) == -1) { + tls_set_error(ctx, "failed to truncate session file"); + goto err; + } + goto done; + } + + if ((bio = BIO_new(BIO_s_mem())) == NULL) + goto err; + if (PEM_write_bio_SSL_SESSION(bio, ss) == 0) + goto err; + if ((data_len = BIO_get_mem_data(bio, &data)) <= 0) + goto err; + + len = (size_t)data_len; + offset = 0; + + if (ftruncate(sfd, len) == -1) { + tls_set_error(ctx, "failed to truncate session file"); + goto err; + } + while (len > 0) { + if ((n = pwrite(sfd, data + offset, len, offset)) == -1) { + tls_set_error(ctx, "failed to write session file"); + goto err; + } + offset += n; + len -= n; + } + + done: + rv = 0; + + err: + SSL_SESSION_free(ss); + BIO_free_all(bio); + + return (rv); +} + static int tls_connect_common(struct tls *ctx, const char *servername) { @@ -221,6 +338,12 @@ tls_connect_common(struct tls *ctx, const char *servername) goto err; } + if (ctx->config->session_fd != -1) { + SSL_clear_options(ctx->ssl_conn, SSL_OP_NO_TICKET); + if (tls_client_read_session(ctx) == -1) + goto err; + } + if (SSL_set_tlsext_status_type(ctx->ssl_conn, TLSEXT_STATUSTYPE_ocsp) != 1) { tls_set_errorx(ctx, "ssl OCSP extension setup failure"); goto err; @@ -336,6 +459,12 @@ tls_handshake_client(struct tls *ctx) } ctx->state |= TLS_HANDSHAKE_COMPLETE; + + if (ctx->config->session_fd != -1) { + if (tls_client_write_session(ctx) == -1) + goto err; + } + rv = 0; err: diff --git a/tls/tls_config.c b/tls/tls_config.c index e7a746d..a4e2373 100644 --- a/tls/tls_config.c +++ b/tls/tls_config.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_config.c,v 1.44.4.1 2017/12/09 16:49:17 jsing Exp $ */ +/* $OpenBSD: tls_config.c,v 1.51 2018/03/20 15:40:10 jsing Exp $ */ /* * Copyright (c) 2014 Joel Sing * @@ -15,6 +15,10 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef _MSC_VER +#define NO_REDEF_POSIX_FUNCTIONS +#endif + #include #include @@ -24,128 +28,9 @@ #include #include + #include "tls_internal.h" -static int -set_string(const char **dest, const char *src) -{ - free((char *)*dest); - *dest = NULL; - if (src != NULL) - if ((*dest = strdup(src)) == NULL) - return -1; - return 0; -} - -static void * -memdup(const void *in, size_t len) -{ - void *out; - - if ((out = malloc(len)) == NULL) - return NULL; - memcpy(out, in, len); - return out; -} - -static int -set_mem(char **dest, size_t *destlen, const void *src, size_t srclen) -{ - free(*dest); - *dest = NULL; - *destlen = 0; - if (src != NULL) - if ((*dest = memdup(src, srclen)) == NULL) - return -1; - *destlen = srclen; - return 0; -} - -static struct tls_keypair * -tls_keypair_new(void) -{ - return calloc(1, sizeof(struct tls_keypair)); -} - -static void -tls_keypair_clear_key(struct tls_keypair *keypair) -{ - freezero(keypair->key_mem, keypair->key_len); - keypair->key_mem = NULL; - keypair->key_len = 0; -} - -static int -tls_keypair_set_cert_file(struct tls_keypair *keypair, struct tls_error *error, - const char *cert_file) -{ - return tls_config_load_file(error, "certificate", cert_file, - &keypair->cert_mem, &keypair->cert_len); -} - -static int -tls_keypair_set_cert_mem(struct tls_keypair *keypair, const uint8_t *cert, - size_t len) -{ - return set_mem(&keypair->cert_mem, &keypair->cert_len, cert, len); -} - -static int -tls_keypair_set_key_file(struct tls_keypair *keypair, struct tls_error *error, - const char *key_file) -{ - tls_keypair_clear_key(keypair); - return tls_config_load_file(error, "key", key_file, - &keypair->key_mem, &keypair->key_len); -} - -static int -tls_keypair_set_key_mem(struct tls_keypair *keypair, const uint8_t *key, - size_t len) -{ - tls_keypair_clear_key(keypair); - return set_mem(&keypair->key_mem, &keypair->key_len, key, len); -} - -static int -tls_keypair_set_ocsp_staple_file(struct tls_keypair *keypair, - struct tls_error *error, const char *ocsp_file) -{ - return tls_config_load_file(error, "ocsp", ocsp_file, - &keypair->ocsp_staple, &keypair->ocsp_staple_len); -} - -static int -tls_keypair_set_ocsp_staple_mem(struct tls_keypair *keypair, - const uint8_t *staple, size_t len) -{ - return set_mem(&keypair->ocsp_staple, &keypair->ocsp_staple_len, staple, - len); -} - -static void -tls_keypair_clear(struct tls_keypair *keypair) -{ - tls_keypair_set_cert_mem(keypair, NULL, 0); - tls_keypair_set_key_mem(keypair, NULL, 0); -} - -static void -tls_keypair_free(struct tls_keypair *keypair) -{ - if (keypair == NULL) - return; - - tls_keypair_clear(keypair); - - free(keypair->cert_mem); - free(keypair->key_mem); - free(keypair->ocsp_staple); - free(keypair->pubkey_hash); - - free(keypair); -} - int tls_config_load_file(struct tls_error *error, const char *filetype, const char *filename, char **buf, size_t *len) @@ -161,31 +46,31 @@ tls_config_load_file(struct tls_error *error, const char *filetype, if ((fd = open(filename, O_RDONLY)) == -1) { tls_error_set(error, "failed to open %s file '%s'", filetype, filename); - goto fail; + goto err; } if (fstat(fd, &st) != 0) { tls_error_set(error, "failed to stat %s file '%s'", filetype, filename); - goto fail; + goto err; } if (st.st_size < 0) - goto fail; + goto err; *len = (size_t)st.st_size; if ((*buf = malloc(*len)) == NULL) { tls_error_set(error, "failed to allocate buffer for " "%s file", filetype); - goto fail; + goto err; } n = read(fd, *buf, *len); if (n < 0 || (size_t)n != *len) { tls_error_set(error, "failed to read %s file '%s'", filetype, filename); - goto fail; + goto err; } close(fd); return 0; - fail: + err: if (fd != -1) close(fd); freezero(*buf, *len); @@ -196,7 +81,7 @@ tls_config_load_file(struct tls_error *error, const char *filetype, } struct tls_config * -tls_config_new(void) +tls_config_new_internal(void) { struct tls_config *config; unsigned char sid[TLS_MAX_SESSION_ID_LENGTH]; @@ -208,6 +93,7 @@ tls_config_new(void) goto err; config->refcount = 1; + config->session_fd = -1; /* * Default configuration. @@ -246,6 +132,15 @@ tls_config_new(void) return (NULL); } +struct tls_config * +tls_config_new(void) +{ + if (tls_init() == -1) + return (NULL); + + return tls_config_new_internal(); +} + void tls_config_free(struct tls_config *config) { @@ -469,12 +364,13 @@ tls_config_add_keypair_mem_internal(struct tls_config *config, const uint8_t *ce if ((keypair = tls_keypair_new()) == NULL) return (-1); - if (tls_keypair_set_cert_mem(keypair, cert, cert_len) != 0) + if (tls_keypair_set_cert_mem(keypair, &config->error, cert, cert_len) != 0) goto err; - if (tls_keypair_set_key_mem(keypair, key, key_len) != 0) + if (tls_keypair_set_key_mem(keypair, &config->error, key, key_len) != 0) goto err; if (staple != NULL && - tls_keypair_set_ocsp_staple_mem(keypair, staple, staple_len) != 0) + tls_keypair_set_ocsp_staple_mem(keypair, &config->error, staple, + staple_len) != 0) goto err; tls_config_keypair_add(config, keypair); @@ -529,13 +425,13 @@ tls_config_set_ca_file(struct tls_config *config, const char *ca_file) int tls_config_set_ca_path(struct tls_config *config, const char *ca_path) { - return set_string(&config->ca_path, ca_path); + return tls_set_string(&config->ca_path, ca_path); } int tls_config_set_ca_mem(struct tls_config *config, const uint8_t *ca, size_t len) { - return set_mem(&config->ca_mem, &config->ca_len, ca, len); + return tls_set_mem(&config->ca_mem, &config->ca_len, ca, len); } int @@ -549,7 +445,8 @@ int tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, size_t len) { - return tls_keypair_set_cert_mem(config->keypair, cert, len); + return tls_keypair_set_cert_mem(config->keypair, &config->error, + cert, len); } int @@ -571,17 +468,17 @@ tls_config_set_ciphers(struct tls_config *config, const char *ciphers) if ((ssl_ctx = SSL_CTX_new(SSLv23_method())) == NULL) { tls_config_set_errorx(config, "out of memory"); - goto fail; + goto err; } if (SSL_CTX_set_cipher_list(ssl_ctx, ciphers) != 1) { tls_config_set_errorx(config, "no ciphers for '%s'", ciphers); - goto fail; + goto err; } SSL_CTX_free(ssl_ctx); - return set_string(&config->ciphers, ciphers); + return tls_set_string(&config->ciphers, ciphers); - fail: + err: SSL_CTX_free(ssl_ctx); return -1; } @@ -597,7 +494,7 @@ int tls_config_set_crl_mem(struct tls_config *config, const uint8_t *crl, size_t len) { - return set_mem(&config->crl_mem, &config->crl_len, crl, len); + return tls_set_mem(&config->crl_mem, &config->crl_len, crl, len); } int @@ -624,17 +521,16 @@ tls_config_set_dheparams(struct tls_config *config, const char *params) int tls_config_set_ecdhecurve(struct tls_config *config, const char *curve) { - if (strchr(curve, ',') != NULL || strchr(curve, ':') != NULL) { + if (curve == NULL || + strcasecmp(curve, "none") == 0 || + strcasecmp(curve, "auto") == 0) { + curve = TLS_ECDHE_CURVES; + } else if (strchr(curve, ',') != NULL || strchr(curve, ':') != NULL) { tls_config_set_errorx(config, "invalid ecdhe curve '%s'", curve); return (-1); } - if (curve == NULL || - strcasecmp(curve, "none") == 0 || - strcasecmp(curve, "auto") == 0) - curve = TLS_ECDHE_CURVES; - return tls_config_set_ecdhecurves(config, curve); } @@ -710,7 +606,8 @@ int tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, size_t len) { - return tls_keypair_set_key_mem(config->keypair, key, len); + return tls_keypair_set_key_mem(config->keypair, &config->error, + key, len); } static int @@ -788,6 +685,44 @@ tls_config_set_protocols(struct tls_config *config, uint32_t protocols) return (0); } +int +tls_config_set_session_fd(struct tls_config *config, int session_fd) +{ + struct stat sb; + mode_t mugo; + + if (session_fd == -1) { + config->session_fd = session_fd; + return (0); + } + + if (fstat(session_fd, &sb) == -1) { + tls_config_set_error(config, "failed to stat session file"); + return (-1); + } + if (!S_ISREG(sb.st_mode)) { + tls_config_set_errorx(config, + "session file is not a regular file"); + return (-1); + } + + if (sb.st_uid != getuid()) { + tls_config_set_errorx(config, "session file has incorrect " + "owner (uid %i != %i)", sb.st_uid, getuid()); + return (-1); + } + mugo = sb.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO); + if (mugo != (S_IRUSR|S_IWUSR)) { + tls_config_set_errorx(config, "session file has incorrect " + "permissions (%o != 600)", mugo); + return (-1); + } + + config->session_fd = session_fd; + + return (0); +} + int tls_config_set_verify_depth(struct tls_config *config, int verify_depth) { @@ -869,7 +804,8 @@ int tls_config_set_ocsp_staple_mem(struct tls_config *config, const uint8_t *staple, size_t len) { - return tls_keypair_set_ocsp_staple_mem(config->keypair, staple, len); + return tls_keypair_set_ocsp_staple_mem(config->keypair, &config->error, + staple, len); } int diff --git a/tls/tls_conninfo.c b/tls/tls_conninfo.c index e382098..8e479ed 100644 --- a/tls/tls_conninfo.c +++ b/tls/tls_conninfo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_conninfo.c,v 1.16 2017/08/27 01:39:26 beck Exp $ */ +/* $OpenBSD: tls_conninfo.c,v 1.20 2018/02/10 04:48:44 jsing Exp $ */ /* * Copyright (c) 2015 Joel Sing * Copyright (c) 2015 Bob Beck @@ -185,8 +185,6 @@ tls_conninfo_cert_pem(struct tls *ctx) BIO *membio = NULL; BUF_MEM *bptr = NULL; - if (ctx->conninfo == NULL) - goto err; if (ctx->ssl_peer_cert == NULL) return 0; if ((membio = BIO_new(BIO_s_mem()))== NULL) @@ -221,6 +219,14 @@ tls_conninfo_cert_pem(struct tls *ctx) return rv; } +static int +tls_conninfo_session(struct tls *ctx) +{ + ctx->conninfo->session_resumed = SSL_session_reused(ctx->ssl_conn); + + return 0; +} + int tls_conninfo_populate(struct tls *ctx) { @@ -238,8 +244,7 @@ tls_conninfo_populate(struct tls *ctx) if ((tmp = SSL_get_cipher(ctx->ssl_conn)) == NULL) goto err; - ctx->conninfo->cipher = strdup(tmp); - if (ctx->conninfo->cipher == NULL) + if ((ctx->conninfo->cipher = strdup(tmp)) == NULL) goto err; if (ctx->servername != NULL) { @@ -250,8 +255,7 @@ tls_conninfo_populate(struct tls *ctx) if ((tmp = SSL_get_version(ctx->ssl_conn)) == NULL) goto err; - ctx->conninfo->version = strdup(tmp); - if (ctx->conninfo->version == NULL) + if ((ctx->conninfo->version = strdup(tmp)) == NULL) goto err; if (tls_get_peer_cert_info(ctx) == -1) @@ -260,6 +264,9 @@ tls_conninfo_populate(struct tls *ctx) if (tls_conninfo_cert_pem(ctx) == -1) goto err; + if (tls_conninfo_session(ctx) == -1) + goto err; + return (0); err: @@ -276,24 +283,15 @@ tls_conninfo_free(struct tls_conninfo *conninfo) return; free(conninfo->alpn); - conninfo->alpn = NULL; free(conninfo->cipher); - conninfo->cipher = NULL; free(conninfo->servername); - conninfo->servername = NULL; free(conninfo->version); - conninfo->version = NULL; free(conninfo->hash); - conninfo->hash = NULL; free(conninfo->issuer); - conninfo->issuer = NULL; free(conninfo->subject); - conninfo->subject = NULL; free(conninfo->peer_cert); - conninfo->peer_cert = NULL; - conninfo->peer_cert_len = 0; free(conninfo); } @@ -322,6 +320,14 @@ tls_conn_servername(struct tls *ctx) return (ctx->conninfo->servername); } +int +tls_conn_session_resumed(struct tls *ctx) +{ + if (ctx->conninfo == NULL) + return (0); + return (ctx->conninfo->session_resumed); +} + const char * tls_conn_version(struct tls *ctx) { @@ -329,4 +335,3 @@ tls_conn_version(struct tls *ctx) return (NULL); return (ctx->conninfo->version); } - diff --git a/tls/tls_internal.h b/tls/tls_internal.h index f688743..a227e2f 100644 --- a/tls/tls_internal.h +++ b/tls/tls_internal.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_internal.h,v 1.65 2017/09/20 17:05:17 jsing Exp $ */ +/* $OpenBSD: tls_internal.h,v 1.71 2018/03/19 16:34:47 jsing Exp $ */ /* * Copyright (c) 2014 Jeremie Courreges-Anglas * Copyright (c) 2014 Joel Sing @@ -97,6 +97,7 @@ struct tls_config { int ocsp_require_stapling; uint32_t protocols; unsigned char session_id[TLS_MAX_SESSION_ID_LENGTH]; + int session_fd; int session_lifetime; struct tls_ticket_key ticket_keys[TLS_NUM_TICKETS]; uint32_t ticket_keyrev; @@ -113,6 +114,7 @@ struct tls_conninfo { char *alpn; char *cipher; char *servername; + int session_resumed; char *version; char *hash; @@ -194,9 +196,33 @@ struct tls { void *cb_arg; }; +int tls_set_mem(char **_dest, size_t *_destlen, const void *_src, + size_t _srclen); +int tls_set_string(const char **_dest, const char *_src); + +struct tls_keypair *tls_keypair_new(void); +void tls_keypair_clear(struct tls_keypair *_keypair); +void tls_keypair_free(struct tls_keypair *_keypair); +int tls_keypair_set_cert_file(struct tls_keypair *_keypair, + struct tls_error *_error, const char *_cert_file); +int tls_keypair_set_cert_mem(struct tls_keypair *_keypair, + struct tls_error *_error, const uint8_t *_cert, size_t _len); +int tls_keypair_set_key_file(struct tls_keypair *_keypair, + struct tls_error *_error, const char *_key_file); +int tls_keypair_set_key_mem(struct tls_keypair *_keypair, + struct tls_error *_error, const uint8_t *_key, size_t _len); +int tls_keypair_set_ocsp_staple_file(struct tls_keypair *_keypair, + struct tls_error *_error, const char *_ocsp_file); +int tls_keypair_set_ocsp_staple_mem(struct tls_keypair *_keypair, + struct tls_error *_error, const uint8_t *_staple, size_t _len); +int tls_keypair_load_cert(struct tls_keypair *_keypair, + struct tls_error *_error, X509 **_cert); + struct tls_sni_ctx *tls_sni_ctx_new(void); void tls_sni_ctx_free(struct tls_sni_ctx *sni_ctx); +struct tls_config *tls_config_new_internal(void); + struct tls *tls_new(void); struct tls *tls_server_conn(struct tls *ctx); @@ -256,6 +282,7 @@ struct tls_ocsp *tls_ocsp_setup_from_peer(struct tls *ctx); int tls_hex_string(const unsigned char *_in, size_t _inlen, char **_out, size_t *_outlen); int tls_cert_hash(X509 *_cert, char **_hash); +int tls_cert_pubkey_hash(X509 *_cert, char **_hash); int tls_password_cb(char *_buf, int _size, int _rwflag, void *_u); diff --git a/tls/tls_keypair.c b/tls/tls_keypair.c new file mode 100644 index 0000000..03e7f4a --- /dev/null +++ b/tls/tls_keypair.c @@ -0,0 +1,178 @@ +/* $OpenBSD: tls_keypair.c,v 1.5 2018/02/10 04:57:35 jsing Exp $ */ +/* + * Copyright (c) 2014 Joel Sing + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +#include + +#include "tls_internal.h" + +struct tls_keypair * +tls_keypair_new(void) +{ + return calloc(1, sizeof(struct tls_keypair)); +} + +static void +tls_keypair_clear_key(struct tls_keypair *keypair) +{ + freezero(keypair->key_mem, keypair->key_len); + keypair->key_mem = NULL; + keypair->key_len = 0; +} + +static int +tls_keypair_pubkey_hash(struct tls_keypair *keypair, struct tls_error *error) +{ + X509 *cert = NULL; + int rv = -1; + + free(keypair->pubkey_hash); + keypair->pubkey_hash = NULL; + + if (keypair->cert_mem == NULL) { + rv = 0; + goto done; + } + + if (tls_keypair_load_cert(keypair, error, &cert) == -1) + goto err; + if (tls_cert_pubkey_hash(cert, &keypair->pubkey_hash) == -1) + goto err; + + rv = 0; + + err: + X509_free(cert); + done: + return (rv); +} + +int +tls_keypair_set_cert_file(struct tls_keypair *keypair, struct tls_error *error, + const char *cert_file) +{ + if (tls_config_load_file(error, "certificate", cert_file, + &keypair->cert_mem, &keypair->cert_len) == -1) + return -1; + return tls_keypair_pubkey_hash(keypair, error); +} + +int +tls_keypair_set_cert_mem(struct tls_keypair *keypair, struct tls_error *error, + const uint8_t *cert, size_t len) +{ + if (tls_set_mem(&keypair->cert_mem, &keypair->cert_len, cert, len) == -1) + return -1; + return tls_keypair_pubkey_hash(keypair, error); +} + +int +tls_keypair_set_key_file(struct tls_keypair *keypair, struct tls_error *error, + const char *key_file) +{ + tls_keypair_clear_key(keypair); + return tls_config_load_file(error, "key", key_file, + &keypair->key_mem, &keypair->key_len); +} + +int +tls_keypair_set_key_mem(struct tls_keypair *keypair, struct tls_error *error, + const uint8_t *key, size_t len) +{ + tls_keypair_clear_key(keypair); + return tls_set_mem(&keypair->key_mem, &keypair->key_len, key, len); +} + +int +tls_keypair_set_ocsp_staple_file(struct tls_keypair *keypair, + struct tls_error *error, const char *ocsp_file) +{ + return tls_config_load_file(error, "ocsp", ocsp_file, + &keypair->ocsp_staple, &keypair->ocsp_staple_len); +} + +int +tls_keypair_set_ocsp_staple_mem(struct tls_keypair *keypair, + struct tls_error *error, const uint8_t *staple, size_t len) +{ + return tls_set_mem(&keypair->ocsp_staple, &keypair->ocsp_staple_len, + staple, len); +} + +void +tls_keypair_clear(struct tls_keypair *keypair) +{ + struct tls_error error; + + tls_keypair_set_cert_mem(keypair, &error, NULL, 0); + tls_keypair_set_key_mem(keypair, &error, NULL, 0); + tls_keypair_set_ocsp_staple_mem(keypair, &error, NULL, 0); + + free(keypair->pubkey_hash); + keypair->pubkey_hash = NULL; +} + +void +tls_keypair_free(struct tls_keypair *keypair) +{ + if (keypair == NULL) + return; + + tls_keypair_clear(keypair); + + free(keypair); +} + +int +tls_keypair_load_cert(struct tls_keypair *keypair, struct tls_error *error, + X509 **cert) +{ + char *errstr = "unknown"; + BIO *cert_bio = NULL; + int ssl_err; + int rv = -1; + + X509_free(*cert); + *cert = NULL; + + if (keypair->cert_mem == NULL) { + tls_error_set(error, "keypair has no certificate"); + goto err; + } + if ((cert_bio = BIO_new_mem_buf(keypair->cert_mem, + keypair->cert_len)) == NULL) { + tls_error_set(error, "failed to create certificate bio"); + goto err; + } + if ((*cert = PEM_read_bio_X509(cert_bio, NULL, tls_password_cb, + NULL)) == NULL) { + if ((ssl_err = ERR_peek_error()) != 0) + errstr = ERR_error_string(ssl_err, NULL); + tls_error_set(error, "failed to load certificate: %s", errstr); + goto err; + } + + rv = 0; + + err: + BIO_free(cert_bio); + + return (rv); +} diff --git a/tls/tls_ocsp.c b/tls/tls_ocsp.c index a8835ed..17afb8e 100644 --- a/tls/tls_ocsp.c +++ b/tls/tls_ocsp.c @@ -47,11 +47,9 @@ tls_ocsp_free(struct tls_ocsp *ocsp) return; X509_free(ocsp->main_cert); - ocsp->main_cert = NULL; free(ocsp->ocsp_result); - ocsp->ocsp_result = NULL; free(ocsp->ocsp_url); - ocsp->ocsp_url = NULL; + free(ocsp); } @@ -101,23 +99,24 @@ tls_ocsp_fill_info(struct tls *ctx, int response_status, int cert_status, tls_ocsp_asn1_parse_time(ctx, revtime, &info->revocation_time) != 0) { tls_set_error(ctx, "unable to parse revocation time in OCSP reply"); - goto error; + goto err; } if (thisupd != NULL && tls_ocsp_asn1_parse_time(ctx, thisupd, &info->this_update) != 0) { tls_set_error(ctx, "unable to parse this update time in OCSP reply"); - goto error; + goto err; } if (nextupd != NULL && tls_ocsp_asn1_parse_time(ctx, nextupd, &info->next_update) != 0) { tls_set_error(ctx, "unable to parse next update time in OCSP reply"); - goto error; + goto err; } ctx->ocsp->ocsp_result = info; return 0; - error: + + err: free(info); return -1; } @@ -162,32 +161,32 @@ tls_ocsp_setup_from_peer(struct tls *ctx) STACK_OF(OPENSSL_STRING) *ocsp_urls = NULL; if ((ocsp = tls_ocsp_new()) == NULL) - goto failed; + goto err; /* steal state from ctx struct */ ocsp->main_cert = SSL_get_peer_certificate(ctx->ssl_conn); ocsp->extra_certs = SSL_get_peer_cert_chain(ctx->ssl_conn); if (ocsp->main_cert == NULL) { tls_set_errorx(ctx, "no peer certificate for OCSP"); - goto failed; + goto err; } ocsp_urls = X509_get1_ocsp(ocsp->main_cert); if (ocsp_urls == NULL) { tls_set_errorx(ctx, "no OCSP URLs in peer certificate"); - goto failed; + goto err; } ocsp->ocsp_url = strdup(sk_OPENSSL_STRING_value(ocsp_urls, 0)); if (ocsp->ocsp_url == NULL) { tls_set_errorx(ctx, "out of memory"); - goto failed; + goto err; } X509_email_free(ocsp_urls); return ocsp; - failed: + err: tls_ocsp_free(ocsp); X509_email_free(ocsp_urls); return NULL; @@ -206,7 +205,7 @@ tls_ocsp_verify_response(struct tls *ctx, OCSP_RESPONSE *resp) if ((br = OCSP_response_get1_basic(resp)) == NULL) { tls_set_errorx(ctx, "cannot load ocsp reply"); - goto error; + goto err; } /* @@ -219,7 +218,7 @@ tls_ocsp_verify_response(struct tls *ctx, OCSP_RESPONSE *resp) if (OCSP_basic_verify(br, ctx->ocsp->extra_certs, SSL_CTX_get_cert_store(ctx->ssl_ctx), flags) != 1) { tls_set_error(ctx, "ocsp verify failed"); - goto error; + goto err; } /* signature OK, look inside */ @@ -227,43 +226,43 @@ tls_ocsp_verify_response(struct tls *ctx, OCSP_RESPONSE *resp) if (response_status != OCSP_RESPONSE_STATUS_SUCCESSFUL) { tls_set_errorx(ctx, "ocsp verify failed: response - %s", OCSP_response_status_str(response_status)); - goto error; + goto err; } cid = tls_ocsp_get_certid(ctx->ocsp->main_cert, ctx->ocsp->extra_certs, ctx->ssl_ctx); if (cid == NULL) { tls_set_errorx(ctx, "ocsp verify failed: no issuer cert"); - goto error; + goto err; } if (OCSP_resp_find_status(br, cid, &cert_status, &crl_reason, &revtime, &thisupd, &nextupd) != 1) { tls_set_errorx(ctx, "ocsp verify failed: no result for cert"); - goto error; + goto err; } if (OCSP_check_validity(thisupd, nextupd, JITTER_SEC, MAXAGE_SEC) != 1) { tls_set_errorx(ctx, "ocsp verify failed: ocsp response not current"); - goto error; + goto err; } if (tls_ocsp_fill_info(ctx, response_status, cert_status, crl_reason, revtime, thisupd, nextupd) != 0) - goto error; + goto err; /* finally can look at status */ if (cert_status != V_OCSP_CERTSTATUS_GOOD && cert_status != V_OCSP_CERTSTATUS_UNKNOWN) { tls_set_errorx(ctx, "ocsp verify failed: revoked cert - %s", OCSP_crl_reason_str(crl_reason)); - goto error; + goto err; } ret = 0; - error: + err: sk_X509_free(combined); OCSP_CERTID_free(cid); OCSP_BASICRESP_free(br); diff --git a/tls/tls_server.c b/tls/tls_server.c index e101176..44bef6b 100644 --- a/tls/tls_server.c +++ b/tls/tls_server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_server.c,v 1.42 2017/09/20 17:05:17 jsing Exp $ */ +/* $OpenBSD: tls_server.c,v 1.44 2018/03/19 16:34:47 jsing Exp $ */ /* * Copyright (c) 2014 Joel Sing * @@ -31,6 +31,9 @@ tls_server(void) { struct tls *ctx; + if (tls_init() == -1) + return (NULL); + if ((ctx = tls_new()) == NULL) return (NULL); @@ -203,43 +206,6 @@ tls_server_ticket_cb(SSL *ssl, unsigned char *keyname, unsigned char *iv, } } -static int -tls_keypair_load_cert(struct tls_keypair *keypair, struct tls_error *error, - X509 **cert) -{ - char *errstr = "unknown"; - BIO *cert_bio = NULL; - int ssl_err; - int rv = -1; - - X509_free(*cert); - *cert = NULL; - - if (keypair->cert_mem == NULL) { - tls_error_set(error, "keypair has no certificate"); - goto err; - } - if ((cert_bio = BIO_new_mem_buf(keypair->cert_mem, - keypair->cert_len)) == NULL) { - tls_error_set(error, "failed to create certificate bio"); - goto err; - } - if ((*cert = PEM_read_bio_X509(cert_bio, NULL, tls_password_cb, - NULL)) == NULL) { - if ((ssl_err = ERR_peek_error()) != 0) - errstr = ERR_error_string(ssl_err, NULL); - tls_error_set(error, "failed to load certificate: %s", errstr); - goto err; - } - - rv = 0; - - err: - BIO_free(cert_bio); - - return (rv); -} - static int tls_configure_server_ssl(struct tls *ctx, SSL_CTX **ssl_ctx, struct tls_keypair *keypair) diff --git a/tls/tls_util.c b/tls/tls_util.c index aaa3eef..7eb9902 100644 --- a/tls/tls_util.c +++ b/tls/tls_util.c @@ -1,6 +1,7 @@ -/* $OpenBSD: tls_util.c,v 1.9 2017/06/22 18:03:57 jsing Exp $ */ +/* $OpenBSD: tls_util.c,v 1.12 2018/02/08 07:55:29 jsing Exp $ */ /* * Copyright (c) 2014 Joel Sing + * Copyright (c) 2014 Ted Unangst * Copyright (c) 2015 Reyk Floeter * * Permission to use, copy, modify, and distribute this software for any @@ -16,6 +17,10 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef _MSC_VER +#define NO_REDEF_POSIX_FUNCTIONS +#endif + #include #include @@ -25,6 +30,41 @@ #include "tls.h" #include "tls_internal.h" +static void * +memdup(const void *in, size_t len) +{ + void *out; + + if ((out = malloc(len)) == NULL) + return NULL; + memcpy(out, in, len); + return out; +} + +int +tls_set_mem(char **dest, size_t *destlen, const void *src, size_t srclen) +{ + free(*dest); + *dest = NULL; + *destlen = 0; + if (src != NULL) + if ((*dest = memdup(src, srclen)) == NULL) + return -1; + *destlen = srclen; + return 0; +} + +int +tls_set_string(const char **dest, const char *src) +{ + free((char *)*dest); + *dest = NULL; + if (src != NULL) + if ((*dest = strdup(src)) == NULL) + return -1; + return 0; +} + /* * Extract the host and port from a colon separated value. For a literal IPv6 * address the address must be contained with square braces. If a host and @@ -43,7 +83,7 @@ tls_host_port(const char *hostport, char **host, char **port) *port = NULL; if ((s = strdup(hostport)) == NULL) - goto fail; + goto err; h = p = s; @@ -66,14 +106,14 @@ tls_host_port(const char *hostport, char **host, char **port) *p++ = '\0'; if (asprintf(host, "%s", h) == -1) - goto fail; + goto err; if (asprintf(port, "%s", p) == -1) - goto fail; + goto err; rv = 0; goto done; - fail: + err: free(*host); *host = NULL; free(*port); @@ -126,38 +166,38 @@ tls_load_file(const char *name, size_t *len, char *password) /* Just load the file into memory without decryption */ if (password == NULL) { if (fstat(fd, &st) != 0) - goto fail; + goto err; if (st.st_size < 0) - goto fail; + goto err; size = (size_t)st.st_size; if ((buf = malloc(size)) == NULL) - goto fail; + goto err; n = read(fd, buf, size); if (n < 0 || (size_t)n != size) - goto fail; + goto err; close(fd); goto done; } /* Or read the (possibly) encrypted key from file */ if ((fp = fdopen(fd, "r")) == NULL) - goto fail; + goto err; fd = -1; key = PEM_read_PrivateKey(fp, NULL, tls_password_cb, password); fclose(fp); if (key == NULL) - goto fail; + goto err; /* Write unencrypted key to memory buffer */ if ((bio = BIO_new(BIO_s_mem())) == NULL) - goto fail; + goto err; if (!PEM_write_bio_PrivateKey(bio, key, NULL, NULL, 0, NULL, NULL)) - goto fail; + goto err; if ((size = BIO_get_mem_data(bio, &data)) <= 0) - goto fail; + goto err; if ((buf = malloc(size)) == NULL) - goto fail; + goto err; memcpy(buf, data, size); BIO_free_all(bio); @@ -167,7 +207,7 @@ tls_load_file(const char *name, size_t *len, char *password) *len = size; return (buf); - fail: + err: if (fd != -1) close(fd); freezero(buf, size); diff --git a/tls/tls_verify.c b/tls/tls_verify.c index 3bd1057..acbe163 100644 --- a/tls/tls_verify.c +++ b/tls/tls_verify.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_verify.c,v 1.19 2017/04/10 17:11:13 jsing Exp $ */ +/* $OpenBSD: tls_verify.c,v 1.20 2018/02/05 00:52:24 jsing Exp $ */ /* * Copyright (c) 2014 Jeremie Courreges-Anglas * @@ -215,16 +215,16 @@ tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, subject_name = X509_get_subject_name(cert); if (subject_name == NULL) - goto out; + goto done; common_name_len = X509_NAME_get_text_by_NID(subject_name, NID_commonName, NULL, 0); if (common_name_len < 0) - goto out; + goto done; common_name = calloc(common_name_len + 1, 1); if (common_name == NULL) - goto out; + goto done; X509_NAME_get_text_by_NID(subject_name, NID_commonName, common_name, common_name_len + 1); @@ -236,7 +236,7 @@ tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, "NUL byte in Common Name field, " "probably a malicious certificate", name); rv = -1; - goto out; + goto done; } /* @@ -247,13 +247,13 @@ tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, inet_pton(AF_INET6, name, &addrbuf) == 1) { if (strcmp(common_name, name) == 0) *cn_match = 1; - goto out; + goto done; } if (tls_match_name(common_name, name) == 0) *cn_match = 1; - out: + done: free(common_name); return rv; }