Преглед изворни кода

Merge pull request #384 from kakwa/master

Add OpenSSL 1.1 support
bel2125 пре 8 година
родитељ
комит
156e04239e
6 измењених фајлова са 410 додато и 38 уклоњено
  1. 106 0
      .travis.yml
  2. 7 0
      CMakeLists.txt
  3. 9 7
      src/CMakeLists.txt
  4. 275 18
      src/civetweb.c
  5. 6 6
      src/sha1.inl
  6. 7 7
      test/private.c

+ 106 - 0
.travis.yml

@@ -33,6 +33,7 @@ before_script:
   # Check some settings of the build server
   # Check some settings of the build server
   - uname -a
   - uname -a
   - pwd
   - pwd
+  - if [[ "${BUILD_TYPE}" == "OSX_OPENSSL_1_1" ]]; then brew install openssl@1.1 ;fi
   # Generate the build scripts with CMake
   # Generate the build scripts with CMake
   - mkdir output
   - mkdir output
   - gcc test/cgi_test.c -o output/cgi_test.cgi
   - gcc test/cgi_test.c -o output/cgi_test.cgi
@@ -48,6 +49,7 @@ before_script:
     -DCIVETWEB_DISABLE_CGI=${NO_CGI}
     -DCIVETWEB_DISABLE_CGI=${NO_CGI}
     -DCIVETWEB_SERVE_NO_FILES=${NO_FILES}
     -DCIVETWEB_SERVE_NO_FILES=${NO_FILES}
     -DCIVETWEB_ENABLE_SSL_DYNAMIC_LOADING=${ENABLE_SSL_DYNAMIC_LOADING}
     -DCIVETWEB_ENABLE_SSL_DYNAMIC_LOADING=${ENABLE_SSL_DYNAMIC_LOADING}
+    -DCIVETWEB_SSL_OPENSSL_API_1_1=${OPENSSL_1_1}
     -DCIVETWEB_ENABLE_WEBSOCKETS=${ENABLE_WEBSOCKETS}
     -DCIVETWEB_ENABLE_WEBSOCKETS=${ENABLE_WEBSOCKETS}
     -DCIVETWEB_ENABLE_CXX=${ENABLE_CXX}
     -DCIVETWEB_ENABLE_CXX=${ENABLE_CXX}
     -DCIVETWEB_ENABLE_IPV6=${ENABLE_IPV6}
     -DCIVETWEB_ENABLE_IPV6=${ENABLE_IPV6}
@@ -57,6 +59,7 @@ before_script:
     -DCIVETWEB_DISABLE_CACHING=${NO_CACHING}
     -DCIVETWEB_DISABLE_CACHING=${NO_CACHING}
     -DCIVETWEB_C_STANDARD=${C_STANDARD}
     -DCIVETWEB_C_STANDARD=${C_STANDARD}
     -DCIVETWEB_CXX_STANDARD=${CXX_STANDARD}
     -DCIVETWEB_CXX_STANDARD=${CXX_STANDARD}
+    ${ADDITIONAL_CMAKE_ARGS}
     ..
     ..
   - ls -la
   - ls -la
 
 
@@ -88,6 +91,7 @@ matrix:
       N=ClangLinuxMinimal
       N=ClangLinuxMinimal
       BUILD_TYPE=Debug
       BUILD_TYPE=Debug
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -110,6 +114,7 @@ matrix:
       N=GCCLinuxMinimal
       N=GCCLinuxMinimal
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -132,6 +137,7 @@ matrix:
       N=ClangOSXMinimal
       N=ClangOSXMinimal
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -154,6 +160,7 @@ matrix:
       N=ClangLinuxMinNoCache
       N=ClangLinuxMinNoCache
       BUILD_TYPE=Debug
       BUILD_TYPE=Debug
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -176,6 +183,7 @@ matrix:
       N=ClangLinuxMax
       N=ClangLinuxMax
       BUILD_TYPE=Coverage
       BUILD_TYPE=Coverage
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -198,6 +206,7 @@ matrix:
       N=GCCLinuxMax
       N=GCCLinuxMax
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -220,6 +229,7 @@ matrix:
       N=ClangOSXMax
       N=ClangOSXMax
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -236,12 +246,42 @@ matrix:
       NO_CACHING=YES
       NO_CACHING=YES
 
 
   -
   -
+    os: osx
+    compiler: clang
+    env:
+      N=ClangOSXOpenSSL_1_1_NoDynLoad
+      BUILD_TYPE=OSX_OPENSSL_1_1
+      ENABLE_SSL_DYNAMIC_LOADING=NO
+      OPENSSL_1_1=YES
+      ENABLE_CXX=NO
+      ENABLE_LUA_SHARED=NO
+      C_STANDARD=auto
+      CXX_STANDARD=auto
+      FEATURES=31
+      BUILD_SHARED=NO
+      NO_FILES=NO
+      ENABLE_SSL=YES
+      NO_CGI=NO
+      ENABLE_IPV6=YES
+      ENABLE_WEBSOCKETS=YES
+      ENABLE_LUA=NO
+      ENABLE_DUKTAPE=NO
+      NO_CACHING=YES
+      OPENSSL_ROOT_DIR="/usr/local/opt/openssl@1.1"
+      LDFLAGS="-L${OPENSSL_ROOT_DIR}/lib"
+      CFLAGS="-I${OPENSSL_ROOT_DIR}/include"
+      ADDITIONAL_CMAKE_ARGS="-DCMAKE_SHARED_LINKER_FLAGS=${LDFLAGS} -DCMAKE_C_FLAGS=${CFLAGS}"
+      PATH="${OPENSSL_ROOT_DIR}/bin:$PATH"
+      DYLD_LIBRARY_PATH="${OPENSSL_ROOT_DIR}/lib:${DYLD_LIBRARY_PATH}"
+
+  -
     os: linux
     os: linux
     compiler: clang
     compiler: clang
     env:
     env:
       N=ClangLinuxDefault
       N=ClangLinuxDefault
       BUILD_TYPE=Debug
       BUILD_TYPE=Debug
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -264,6 +304,7 @@ matrix:
       N=GCCLinuxDefault
       N=GCCLinuxDefault
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -286,6 +327,7 @@ matrix:
       N=ClangOSXDefault
       N=ClangOSXDefault
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -308,6 +350,7 @@ matrix:
       N=ClangLinuxDefaultShared
       N=ClangLinuxDefaultShared
       BUILD_TYPE=Debug
       BUILD_TYPE=Debug
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -330,6 +373,7 @@ matrix:
       N=GCCLinuxDefaultShared
       N=GCCLinuxDefaultShared
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -352,6 +396,7 @@ matrix:
       N=ClangOSXDefaultShared
       N=ClangOSXDefaultShared
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -374,6 +419,7 @@ matrix:
       N=OSX_Package
       N=OSX_Package
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -424,6 +470,7 @@ matrix:
 #      print("      N=C" .. tostring(i) .. "_")
 #      print("      N=C" .. tostring(i) .. "_")
 #      print("      BUILD_TYPE=Release")
 #      print("      BUILD_TYPE=Release")
 #      print("      ENABLE_SSL_DYNAMIC_LOADING=YES")
 #      print("      ENABLE_SSL_DYNAMIC_LOADING=YES")
+#      print("      OPENSSL_1_1=NO")
 #      print("      ENABLE_CXX=NO")
 #      print("      ENABLE_CXX=NO")
 #      print("      C_STANDARD=auto")
 #      print("      C_STANDARD=auto")
 #      print("      CXX_STANDARD=auto")
 #      print("      CXX_STANDARD=auto")
@@ -450,6 +497,7 @@ matrix:
       N=C0_
       N=C0_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -472,6 +520,7 @@ matrix:
       N=C1_
       N=C1_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -494,6 +543,7 @@ matrix:
       N=C2_
       N=C2_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -516,6 +566,7 @@ matrix:
       N=C3_
       N=C3_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -538,6 +589,7 @@ matrix:
       N=C4_
       N=C4_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -560,6 +612,7 @@ matrix:
       N=C5_
       N=C5_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -582,6 +635,7 @@ matrix:
       N=C6_
       N=C6_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -604,6 +658,7 @@ matrix:
       N=C7_
       N=C7_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -626,6 +681,7 @@ matrix:
       N=C8_
       N=C8_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -648,6 +704,7 @@ matrix:
       N=C9_
       N=C9_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -670,6 +727,7 @@ matrix:
       N=C10_
       N=C10_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -692,6 +750,7 @@ matrix:
       N=C11_
       N=C11_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -714,6 +773,7 @@ matrix:
       N=C12_
       N=C12_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -736,6 +796,7 @@ matrix:
       N=C13_
       N=C13_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -758,6 +819,7 @@ matrix:
       N=C14_
       N=C14_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -780,6 +842,7 @@ matrix:
       N=C15_
       N=C15_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -802,6 +865,7 @@ matrix:
       N=C16_
       N=C16_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -824,6 +888,7 @@ matrix:
       N=C17_
       N=C17_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -846,6 +911,7 @@ matrix:
       N=C18_
       N=C18_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -868,6 +934,7 @@ matrix:
       N=C19_
       N=C19_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -890,6 +957,7 @@ matrix:
       N=C20_
       N=C20_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -912,6 +980,7 @@ matrix:
       N=C21_
       N=C21_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -934,6 +1003,7 @@ matrix:
       N=C22_
       N=C22_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -956,6 +1026,7 @@ matrix:
       N=C23_
       N=C23_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -978,6 +1049,7 @@ matrix:
       N=C24_
       N=C24_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -1000,6 +1072,7 @@ matrix:
       N=C25_
       N=C25_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -1022,6 +1095,7 @@ matrix:
       N=C26_
       N=C26_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -1044,6 +1118,7 @@ matrix:
       N=C27_
       N=C27_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -1066,6 +1141,7 @@ matrix:
       N=C28_
       N=C28_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -1088,6 +1164,7 @@ matrix:
       N=C29_
       N=C29_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -1110,6 +1187,7 @@ matrix:
       N=C30_
       N=C30_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -1132,6 +1210,7 @@ matrix:
       N=C31_
       N=C31_
       BUILD_TYPE=Release
       BUILD_TYPE=Release
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       C_STANDARD=auto
       C_STANDARD=auto
       CXX_STANDARD=auto
       CXX_STANDARD=auto
@@ -1153,11 +1232,35 @@ matrix:
 
 
   -
   -
     os: linux
     os: linux
+    compiler: clang
+    env:
+      N=NoSslDynamicLoading
+      BUILD_TYPE=Release
+      ENABLE_SSL_DYNAMIC_LOADING=NO
+      OPENSSL_1_1=NO
+      ENABLE_CXX=NO
+      C_STANDARD=auto
+      CXX_STANDARD=auto
+      ENABLE_LUA_SHARED=NO
+      FEATURES=31
+      BUILD_SHARED=NO
+      NO_FILES=NO
+      ENABLE_SSL=YES
+      NO_CGI=NO
+      ENABLE_IPV6=YES
+      ENABLE_WEBSOCKETS=YES
+      ENABLE_LUA=NO
+      ENABLE_DUKTAPE=NO
+      NO_CACHING=NO
+
+  -
+    os: linux
     compiler: gcc
     compiler: gcc
     env:
     env:
       N=GCCLinuxDefault_Debug
       N=GCCLinuxDefault_Debug
       BUILD_TYPE=Debug
       BUILD_TYPE=Debug
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -1180,6 +1283,7 @@ matrix:
       N=GCCLinuxDefault_RelWithDebInfo
       N=GCCLinuxDefault_RelWithDebInfo
       BUILD_TYPE=RelWithDebInfo
       BUILD_TYPE=RelWithDebInfo
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -1202,6 +1306,7 @@ matrix:
       N=GCCLinuxDefault_MinSizeRel
       N=GCCLinuxDefault_MinSizeRel
       BUILD_TYPE=MinSizeRel
       BUILD_TYPE=MinSizeRel
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto
@@ -1224,6 +1329,7 @@ matrix:
       N=GCCLinuxDefault_None
       N=GCCLinuxDefault_None
       BUILD_TYPE=None
       BUILD_TYPE=None
       ENABLE_SSL_DYNAMIC_LOADING=YES
       ENABLE_SSL_DYNAMIC_LOADING=YES
+      OPENSSL_1_1=NO
       ENABLE_CXX=NO
       ENABLE_CXX=NO
       ENABLE_LUA_SHARED=NO
       ENABLE_LUA_SHARED=NO
       C_STANDARD=auto
       C_STANDARD=auto

+ 7 - 0
CMakeLists.txt

@@ -188,6 +188,10 @@ message(STATUS "Duktape CGI support - ${CIVETWEB_ENABLE_DUKTAPE}")
 option(CIVETWEB_ENABLE_SSL "Enables the secure socket layer" ON)
 option(CIVETWEB_ENABLE_SSL "Enables the secure socket layer" ON)
 message(STATUS "SSL support - ${CIVETWEB_ENABLE_SSL}")
 message(STATUS "SSL support - ${CIVETWEB_ENABLE_SSL}")
 
 
+# OpenSSL 1.1 API
+option(CIVETWEB_SSL_OPENSSL_API_1_1 "Use the OpenSSL 1.1 API" OFF)
+message(STATUS "Compile for OpenSSL 1.1 API - ${CIVETWEB_SSL_OPENSSL_API_1_1}")
+
 # Dynamically load or link the SSL libraries
 # Dynamically load or link the SSL libraries
 cmake_dependent_option(
 cmake_dependent_option(
   CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING "Dynamically loads the SSL library rather than linking it" ON
   CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING "Dynamically loads the SSL library rather than linking it" ON
@@ -399,6 +403,9 @@ else()
     add_definitions(-DCRYPTO_LIB="${CIVETWEB_SSL_CRYPTO_LIB}")
     add_definitions(-DCRYPTO_LIB="${CIVETWEB_SSL_CRYPTO_LIB}")
   endif()
   endif()
 endif()
 endif()
+if(CIVETWEB_SSL_OPENSSL_API_1_1)
+  add_definitions(-DOPENSSL_API_1_1)
+endif()
 add_definitions(-DUSE_STACK_SIZE=${CIVETWEB_THREAD_STACK_SIZE})
 add_definitions(-DUSE_STACK_SIZE=${CIVETWEB_THREAD_STACK_SIZE})
 add_definitions(-DMAX_REQUEST_SIZE=${CIVETWEB_MAX_REQUEST_SIZE})
 add_definitions(-DMAX_REQUEST_SIZE=${CIVETWEB_MAX_REQUEST_SIZE})
 
 

+ 9 - 7
src/CMakeLists.txt

@@ -39,13 +39,15 @@ if (CIVETWEB_ENABLE_WEBSOCKETS AND CIVETWEB_ENABLE_LUA AND LIBRT_FOUND)
 endif()
 endif()
 
 
 # We need to link OpenSSL if not dynamically loading
 # We need to link OpenSSL if not dynamically loading
-if (CIVETWEB_ENABLE_SLL AND NOT CIVETWEB_ENABLE_OPENSLL_DYNAMIC_LOADING)
-  find_package(OpenSSL)
-  target_link_libraries(c-library ${OPENSSL_LIBRARIES})
-else()
-  find_package(LibDl)
-  if (LIBDL_FOUND)
-    target_link_libraries(c-library -ldl)
+if (CIVETWEB_ENABLE_SSL)
+  if (CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING)
+    find_package(LibDl)
+    if (LIBDL_FOUND)
+      target_link_libraries(c-library -ldl)
+    endif()
+  else()
+    find_package(OpenSSL)
+    target_link_libraries(c-library ${OPENSSL_LIBRARIES})
   endif()
   endif()
 endif()
 endif()
 
 

+ 275 - 18
src/civetweb.c

@@ -1248,7 +1248,10 @@ typedef struct SSL_CTX SSL_CTX;
 #include <openssl/engine.h>
 #include <openssl/engine.h>
 #include <openssl/conf.h>
 #include <openssl/conf.h>
 #include <openssl/dh.h>
 #include <openssl/dh.h>
+#include <openssl/bn.h>
+#include <openssl/opensslv.h>
 #else
 #else
+
 /* SSL loaded dynamically from DLL.
 /* SSL loaded dynamically from DLL.
  * I put the prototypes here to be independent from OpenSSL source
  * I put the prototypes here to be independent from OpenSSL source
  * installation. */
  * installation. */
@@ -1259,6 +1262,8 @@ typedef struct ssl_ctx_st SSL_CTX;
 typedef struct x509_store_ctx_st X509_STORE_CTX;
 typedef struct x509_store_ctx_st X509_STORE_CTX;
 typedef struct x509_name X509_NAME;
 typedef struct x509_name X509_NAME;
 typedef struct asn1_integer ASN1_INTEGER;
 typedef struct asn1_integer ASN1_INTEGER;
+typedef struct bignum BIGNUM;
+typedef struct ossl_init_settings_st OPENSSL_INIT_SETTINGS;
 typedef struct evp_md EVP_MD;
 typedef struct evp_md EVP_MD;
 typedef struct x509 X509;
 typedef struct x509 X509;
 
 
@@ -1267,6 +1272,10 @@ typedef struct x509 X509;
 #define SSL_CTRL_CLEAR_OPTIONS (77)
 #define SSL_CTRL_CLEAR_OPTIONS (77)
 #define SSL_CTRL_SET_ECDH_AUTO (94)
 #define SSL_CTRL_SET_ECDH_AUTO (94)
 
 
+#define OPENSSL_INIT_NO_LOAD_SSL_STRINGS    0x00100000L
+#define OPENSSL_INIT_LOAD_SSL_STRINGS       0x00200000L
+#define OPENSSL_INIT_LOAD_CRYPTO_STRINGS    0x00000002L
+
 #define SSL_VERIFY_NONE (0)
 #define SSL_VERIFY_NONE (0)
 #define SSL_VERIFY_PEER (1)
 #define SSL_VERIFY_PEER (1)
 #define SSL_VERIFY_FAIL_IF_NO_PEER_CERT (2)
 #define SSL_VERIFY_FAIL_IF_NO_PEER_CERT (2)
@@ -1297,6 +1306,147 @@ struct ssl_func {
 	void (*ptr)(void); /* Function pointer */
 	void (*ptr)(void); /* Function pointer */
 };
 };
 
 
+
+#ifdef OPENSSL_API_1_1
+
+#define SSL_free (*(void (*)(SSL *))ssl_sw[0].ptr)
+#define SSL_accept (*(int (*)(SSL *))ssl_sw[1].ptr)
+#define SSL_connect (*(int (*)(SSL *))ssl_sw[2].ptr)
+#define SSL_read (*(int (*)(SSL *, void *, int))ssl_sw[3].ptr)
+#define SSL_write (*(int (*)(SSL *, const void *, int))ssl_sw[4].ptr)
+#define SSL_get_error (*(int (*)(SSL *, int))ssl_sw[5].ptr)
+#define SSL_set_fd (*(int (*)(SSL *, SOCKET))ssl_sw[6].ptr)
+#define SSL_new (*(SSL * (*)(SSL_CTX *))ssl_sw[7].ptr)
+#define SSL_CTX_new (*(SSL_CTX * (*)(SSL_METHOD *))ssl_sw[8].ptr)
+#define TLS_server_method (*(SSL_METHOD * (*)(void))ssl_sw[9].ptr)
+#define OPENSSL_init_ssl (*(int (*)(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings))ssl_sw[10].ptr)
+#define SSL_CTX_use_PrivateKey_file                                            \
+	(*(int (*)(SSL_CTX *, const char *, int))ssl_sw[11].ptr)
+#define SSL_CTX_use_certificate_file                                           \
+	(*(int (*)(SSL_CTX *, const char *, int))ssl_sw[12].ptr)
+#define SSL_CTX_set_default_passwd_cb                                          \
+	(*(void (*)(SSL_CTX *, mg_callback_t))ssl_sw[13].ptr)
+#define SSL_CTX_free (*(void (*)(SSL_CTX *))ssl_sw[14].ptr)
+#define SSL_CTX_use_certificate_chain_file                                     \
+	(*(int (*)(SSL_CTX *, const char *))ssl_sw[15].ptr)
+#define TLS_client_method (*(SSL_METHOD * (*)(void))ssl_sw[16].ptr)
+#define SSL_pending (*(int (*)(SSL *))ssl_sw[17].ptr)
+#define SSL_CTX_set_verify                                                     \
+	(*(void (*)(SSL_CTX *,                                                     \
+	            int,                                                           \
+	            int (*verify_callback)(int, X509_STORE_CTX *)))ssl_sw[18].ptr)
+#define SSL_shutdown (*(int (*)(SSL *))ssl_sw[19].ptr)
+#define SSL_CTX_load_verify_locations                                          \
+	(*(int (*)(SSL_CTX *, const char *, const char *))ssl_sw[20].ptr)
+#define SSL_CTX_set_default_verify_paths (*(int (*)(SSL_CTX *))ssl_sw[21].ptr)
+#define SSL_CTX_set_verify_depth (*(void (*)(SSL_CTX *, int))ssl_sw[22].ptr)
+#define SSL_get_peer_certificate (*(X509 * (*)(SSL *))ssl_sw[23].ptr)
+#define SSL_get_version (*(const char *(*)(SSL *))ssl_sw[24].ptr)
+#define SSL_get_current_cipher (*(SSL_CIPHER * (*)(SSL *))ssl_sw[25].ptr)
+#define SSL_CIPHER_get_name                                                    \
+	(*(const char *(*)(const SSL_CIPHER *))ssl_sw[26].ptr)
+#define SSL_CTX_check_private_key (*(int (*)(SSL_CTX *))ssl_sw[27].ptr)
+#define SSL_CTX_set_session_id_context                                         \
+	(*(int (*)(SSL_CTX *, const unsigned char *, unsigned int))ssl_sw[28].ptr)
+#define SSL_CTX_ctrl (*(long (*)(SSL_CTX *, int, long, void *))ssl_sw[29].ptr)
+#define SSL_CTX_set_cipher_list                                                \
+	(*(int (*)(SSL_CTX *, const char *))ssl_sw[30].ptr)
+#define SSL_CTX_set_options (*(unsigned long (*)(SSL_CTX *, unsigned long))ssl_sw[31].ptr)
+
+
+#define SSL_CTX_clear_options(ctx, op)                                         \
+	SSL_CTX_ctrl((ctx), SSL_CTRL_CLEAR_OPTIONS, (op), NULL)
+#define SSL_CTX_set_ecdh_auto(ctx, onoff)                                      \
+	SSL_CTX_ctrl(ctx, SSL_CTRL_SET_ECDH_AUTO, onoff, NULL)
+
+#define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore)
+#define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter)
+
+
+#define ERR_get_error (*(unsigned long (*)(void))crypto_sw[0].ptr)
+#define ERR_error_string (*(char *(*)(unsigned long, char *))crypto_sw[1].ptr)
+#define ERR_remove_state (*(void (*)(unsigned long))crypto_sw[2].ptr)
+#define CONF_modules_unload (*(void (*)(int))crypto_sw[3].ptr)
+#define X509_free (*(void (*)(X509 *))crypto_sw[4].ptr)
+#define X509_get_subject_name (*(X509_NAME * (*)(X509 *))crypto_sw[5].ptr)
+#define X509_get_issuer_name (*(X509_NAME * (*)(X509 *))crypto_sw[6].ptr)
+#define X509_NAME_oneline                                                      \
+	(*(char *(*)(X509_NAME *, char *, int))crypto_sw[7].ptr)
+#define X509_get_serialNumber (*(ASN1_INTEGER * (*)(X509 *))crypto_sw[8].ptr)
+#define EVP_get_digestbyname                                                   \
+	(*(const EVP_MD *(*)(const char *))crypto_sw[9].ptr)
+#define ASN1_digest                                                            \
+	(*(int (*)(int (*)(),                                                      \
+	           const EVP_MD *,                                                 \
+	           char *,                                                         \
+	           unsigned char *,                                                \
+	           unsigned int *))crypto_sw[10].ptr)
+#define i2d_X509 (*(int (*)(X509 *, unsigned char **))crypto_sw[11].ptr)
+#define BN_bn2hex (*(char *(*)(const BIGNUM *a))crypto_sw[12].ptr)
+#define ASN1_INTEGER_to_BN (*(BIGNUM *(*)(const ASN1_INTEGER *ai, BIGNUM *bn))crypto_sw[13].ptr)
+#define BN_free (*(void(*)(const BIGNUM *a))crypto_sw[14].ptr)
+
+
+/* set_ssl_option() function updates this array.
+ * It loads SSL library dynamically and changes NULLs to the actual addresses
+ * of respective functions. The macros above (like SSL_connect()) are really
+ * just calling these functions indirectly via the pointer. */
+static struct ssl_func ssl_sw[] = {{"SSL_free", NULL},
+                                   {"SSL_accept", NULL},
+                                   {"SSL_connect", NULL},
+                                   {"SSL_read", NULL},
+                                   {"SSL_write", NULL},
+                                   {"SSL_get_error", NULL},
+                                   {"SSL_set_fd", NULL},
+                                   {"SSL_new", NULL},
+                                   {"SSL_CTX_new", NULL},
+                                   {"TLS_server_method", NULL},
+                                   {"OPENSSL_init_ssl", NULL},
+                                   {"SSL_CTX_use_PrivateKey_file", NULL},
+                                   {"SSL_CTX_use_certificate_file", NULL},
+                                   {"SSL_CTX_set_default_passwd_cb", NULL},
+                                   {"SSL_CTX_free", NULL},
+                                   {"SSL_CTX_use_certificate_chain_file", NULL},
+                                   {"TLS_client_method", NULL},
+                                   {"SSL_pending", NULL},
+                                   {"SSL_CTX_set_verify", NULL},
+                                   {"SSL_shutdown", NULL},
+                                   {"SSL_CTX_load_verify_locations", NULL},
+                                   {"SSL_CTX_set_default_verify_paths", NULL},
+                                   {"SSL_CTX_set_verify_depth", NULL},
+                                   {"SSL_get_peer_certificate", NULL},
+                                   {"SSL_get_version", NULL},
+                                   {"SSL_get_current_cipher", NULL},
+                                   {"SSL_CIPHER_get_name", NULL},
+                                   {"SSL_CTX_check_private_key", NULL},
+                                   {"SSL_CTX_set_session_id_context", NULL},
+                                   {"SSL_CTX_ctrl", NULL},
+                                   {"SSL_CTX_set_cipher_list", NULL},
+                                   {"SSL_CTX_set_options", NULL},
+                                   {NULL, NULL}};
+
+
+/* Similar array as ssl_sw. These functions could be located in different
+ * lib. */
+static struct ssl_func crypto_sw[] = {
+                                      {"ERR_get_error", NULL},
+                                      {"ERR_error_string", NULL},
+                                      {"ERR_remove_state", NULL},
+                                      {"CONF_modules_unload", NULL},
+                                      {"X509_free", NULL},
+                                      {"X509_get_subject_name", NULL},
+                                      {"X509_get_issuer_name", NULL},
+                                      {"X509_NAME_oneline", NULL},
+                                      {"X509_get_serialNumber", NULL},
+                                      {"EVP_get_digestbyname", NULL},
+                                      {"ASN1_digest", NULL},
+                                      {"i2d_X509", NULL},
+                                      {"BN_bn2hex", NULL},
+                                      {"ASN1_INTEGER_to_BN", NULL},
+                                      {"BN_free", NULL},
+                                      {NULL, NULL}};
+#else
+
 #define SSL_free (*(void (*)(SSL *))ssl_sw[0].ptr)
 #define SSL_free (*(void (*)(SSL *))ssl_sw[0].ptr)
 #define SSL_accept (*(int (*)(SSL *))ssl_sw[1].ptr)
 #define SSL_accept (*(int (*)(SSL *))ssl_sw[1].ptr)
 #define SSL_connect (*(int (*)(SSL *))ssl_sw[2].ptr)
 #define SSL_connect (*(int (*)(SSL *))ssl_sw[2].ptr)
@@ -1383,6 +1533,9 @@ struct ssl_func {
 	           unsigned char *,                                                \
 	           unsigned char *,                                                \
 	           unsigned int *))crypto_sw[18].ptr)
 	           unsigned int *))crypto_sw[18].ptr)
 #define i2d_X509 (*(int (*)(X509 *, unsigned char **))crypto_sw[19].ptr)
 #define i2d_X509 (*(int (*)(X509 *, unsigned char **))crypto_sw[19].ptr)
+#define BN_bn2hex (*(char *(*)(const BIGNUM *a))crypto_sw[20].ptr)
+#define ASN1_INTEGER_to_BN (*(BIGNUM *(*)(const ASN1_INTEGER *ai, BIGNUM *bn))crypto_sw[21].ptr)
+#define BN_free (*(void(*)(const BIGNUM *a))crypto_sw[22].ptr)
 
 
 
 
 /* set_ssl_option() function updates this array.
 /* set_ssl_option() function updates this array.
@@ -1446,7 +1599,11 @@ static struct ssl_func crypto_sw[] = {{"CRYPTO_num_locks", NULL},
                                       {"EVP_get_digestbyname", NULL},
                                       {"EVP_get_digestbyname", NULL},
                                       {"ASN1_digest", NULL},
                                       {"ASN1_digest", NULL},
                                       {"i2d_X509", NULL},
                                       {"i2d_X509", NULL},
+                                      {"BN_bn2hex", NULL},
+                                      {"ASN1_INTEGER_to_BN", NULL},
+                                      {"BN_free", NULL},
                                       {NULL, NULL}};
                                       {NULL, NULL}};
+#endif /* OPENSSL_API_1_1 */
 #endif /* NO_SSL_DL */
 #endif /* NO_SSL_DL */
 #endif /* NO_SSL */
 #endif /* NO_SSL */
 
 
@@ -6714,6 +6871,18 @@ connect_socket(struct mg_context *ctx /* may be NULL */,
 	}
 	}
 
 
 #if !defined(NO_SSL)
 #if !defined(NO_SSL)
+#if !defined(NO_SSL_DL)
+#ifdef OPENSSL_API_1_1
+	if (use_ssl && (TLS_client_method == NULL)) {
+		mg_snprintf(NULL,
+		            NULL, /* No truncation check for ebuf */
+		            ebuf,
+		            ebuf_len,
+		            "%s",
+		            "SSL is not initialized");
+		return 0;
+	}
+#else
 	if (use_ssl && (SSLv23_client_method == NULL)) {
 	if (use_ssl && (SSLv23_client_method == NULL)) {
 		mg_snprintf(NULL,
 		mg_snprintf(NULL,
 		            NULL, /* No truncation check for ebuf */
 		            NULL, /* No truncation check for ebuf */
@@ -6723,9 +6892,14 @@ connect_socket(struct mg_context *ctx /* may be NULL */,
 		            "SSL is not initialized");
 		            "SSL is not initialized");
 		return 0;
 		return 0;
 	}
 	}
+
+#endif /* OPENSSL_API_1_1 */
 #else
 #else
 	(void)use_ssl;
 	(void)use_ssl;
-#endif
+#endif /* NO_SSL_DL */
+#else
+	(void)use_ssl;
+#endif /* !defined(NO_SSL) */
 
 
 	if (mg_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))) {
 	if (mg_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))) {
 		sa->sin.sin_port = htons((uint16_t)port);
 		sa->sin.sin_port = htons((uint16_t)port);
@@ -9393,15 +9567,17 @@ mg_unlock_context(struct mg_context *ctx)
 
 
 #if defined(USE_WEBSOCKET)
 #if defined(USE_WEBSOCKET)
 
 
+#if !defined(NO_SSL_DL)
 #define SHA_API static
 #define SHA_API static
 #include "sha1.inl"
 #include "sha1.inl"
+#endif
 
 
 static int
 static int
 send_websocket_handshake(struct mg_connection *conn, const char *websock_key)
 send_websocket_handshake(struct mg_connection *conn, const char *websock_key)
 {
 {
 	static const char *magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
 	static const char *magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
 	char buf[100], sha[20], b64_sha[sizeof(sha) * 2];
 	char buf[100], sha[20], b64_sha[sizeof(sha) * 2];
-	SHA1_CTX sha_ctx;
+	SHA_CTX sha_ctx;
 	int truncated;
 	int truncated;
 
 
 	/* Calculate Sec-WebSocket-Accept reply from Sec-WebSocket-Key. */
 	/* Calculate Sec-WebSocket-Accept reply from Sec-WebSocket-Key. */
@@ -9413,7 +9589,7 @@ send_websocket_handshake(struct mg_connection *conn, const char *websock_key)
 
 
 	SHA1_Init(&sha_ctx);
 	SHA1_Init(&sha_ctx);
 	SHA1_Update(&sha_ctx, (unsigned char *)buf, (uint32_t)strlen(buf));
 	SHA1_Update(&sha_ctx, (unsigned char *)buf, (uint32_t)strlen(buf));
-	SHA1_Final(&sha_ctx, (unsigned char *)sha);
+	SHA1_Final((unsigned char *)sha, &sha_ctx);
 	base64_encode((unsigned char *)sha, sizeof(sha), b64_sha);
 	base64_encode((unsigned char *)sha, sizeof(sha), b64_sha);
 	mg_printf(conn,
 	mg_printf(conn,
 	          "HTTP/1.1 101 Switching Protocols\r\n"
 	          "HTTP/1.1 101 Switching Protocols\r\n"
@@ -11698,9 +11874,10 @@ refresh_trust(struct mg_connection *conn)
 	return 1;
 	return 1;
 }
 }
 
 
-
+#ifdef OPENSSL_API_1_1
+#else
 static pthread_mutex_t *ssl_mutexes;
 static pthread_mutex_t *ssl_mutexes;
-
+#endif /* OPENSSL_API_1_1 */
 
 
 static int
 static int
 sslize(struct mg_connection *conn,
 sslize(struct mg_connection *conn,
@@ -11740,7 +11917,9 @@ sslize(struct mg_connection *conn,
 		conn->ssl = NULL;
 		conn->ssl = NULL;
 		/* Avoid CRYPTO_cleanup_all_ex_data(); See discussion:
 		/* Avoid CRYPTO_cleanup_all_ex_data(); See discussion:
 		 * https://wiki.openssl.org/index.php/Talk:Library_Initialization */
 		 * https://wiki.openssl.org/index.php/Talk:Library_Initialization */
+#ifndef OPENSSL_API_1_1
 		ERR_remove_state(0);
 		ERR_remove_state(0);
+#endif
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -11786,7 +11965,9 @@ sslize(struct mg_connection *conn,
 		conn->ssl = NULL;
 		conn->ssl = NULL;
 		/* Avoid CRYPTO_cleanup_all_ex_data(); See discussion:
 		/* Avoid CRYPTO_cleanup_all_ex_data(); See discussion:
 		 * https://wiki.openssl.org/index.php/Talk:Library_Initialization */
 		 * https://wiki.openssl.org/index.php/Talk:Library_Initialization */
+#ifndef OPENSSL_API_1_1
 		ERR_remove_state(0);
 		ERR_remove_state(0);
+#endif
 		return 0;
 		return 0;
 	}
 	}
 
 
@@ -11837,10 +12018,9 @@ ssl_get_client_cert_info(struct mg_connection *conn)
 	if (cert) {
 	if (cert) {
 		char str_subject[1024];
 		char str_subject[1024];
 		char str_issuer[1024];
 		char str_issuer[1024];
-		char str_serial[1024];
 		char str_finger[1024];
 		char str_finger[1024];
 		unsigned char buf[256];
 		unsigned char buf[256];
-		int len;
+		char *str_serial = NULL;
 		unsigned int ulen;
 		unsigned int ulen;
 
 
 		/* Handle to algorithm used for fingerprint */
 		/* Handle to algorithm used for fingerprint */
@@ -11858,17 +12038,9 @@ ssl_get_client_cert_info(struct mg_connection *conn)
 		(void)X509_NAME_oneline(iss, str_issuer, (int)sizeof(str_issuer));
 		(void)X509_NAME_oneline(iss, str_issuer, (int)sizeof(str_issuer));
 
 
 		/* Translate serial number to a hex string */
 		/* Translate serial number to a hex string */
-		len = i2c_ASN1_INTEGER(serial, NULL);
-		if ((len > 0) && ((unsigned)len < (unsigned)sizeof(buf))) {
-			unsigned char *pbuf = buf;
-			int len2 = i2c_ASN1_INTEGER(serial, &pbuf);
-			if (!hexdump2string(
-			        buf, len2, str_serial, (int)sizeof(str_serial))) {
-				*str_serial = 0;
-			}
-		} else {
-			*str_serial = 0;
-		}
+		BIGNUM *serial_bn = ASN1_INTEGER_to_BN(serial, NULL);
+		str_serial = BN_bn2hex(serial_bn);
+		BN_free(serial_bn);
 
 
 		/* Calculate SHA1 fingerprint and store as a hex string */
 		/* Calculate SHA1 fingerprint and store as a hex string */
 		ulen = 0;
 		ulen = 0;
@@ -11889,11 +12061,14 @@ ssl_get_client_cert_info(struct mg_connection *conn)
 			/* TODO: write some OOM message */
 			/* TODO: write some OOM message */
 		}
 		}
 
 
+        mg_free(str_serial);
 		X509_free(cert);
 		X509_free(cert);
 	}
 	}
 }
 }
 
 
 
 
+#ifdef OPENSSL_API_1_1
+#else
 static void
 static void
 ssl_locking_callback(int mode, int mutex_num, const char *file, int line)
 ssl_locking_callback(int mode, int mutex_num, const char *file, int line)
 {
 {
@@ -11907,6 +12082,7 @@ ssl_locking_callback(int mode, int mutex_num, const char *file, int line)
 		(void)pthread_mutex_unlock(&ssl_mutexes[mutex_num]);
 		(void)pthread_mutex_unlock(&ssl_mutexes[mutex_num]);
 	}
 	}
 }
 }
+#endif /* OPENSSL_API_1_1 */
 
 
 
 
 #if !defined(NO_SSL_DL)
 #if !defined(NO_SSL_DL)
@@ -11968,6 +12144,24 @@ static int cryptolib_users = 0; /* Reference counter for crypto library. */
 static int
 static int
 initialize_ssl(struct mg_context *ctx)
 initialize_ssl(struct mg_context *ctx)
 {
 {
+
+#ifdef OPENSSL_API_1_1
+#if !defined(NO_SSL_DL)
+	if (!cryptolib_dll_handle) {
+		cryptolib_dll_handle = load_dll(ctx, CRYPTO_LIB, crypto_sw);
+		if (!cryptolib_dll_handle) {
+			return 0;
+		}
+	}
+#else
+    (void)ctx;
+#endif /* NO_SSL_DL */
+
+	if (mg_atomic_inc(&cryptolib_users) > 1) {
+		return 1;
+	}
+
+#else
 	int i;
 	int i;
 	size_t size;
 	size_t size;
 
 
@@ -11978,6 +12172,8 @@ initialize_ssl(struct mg_context *ctx)
 			return 0;
 			return 0;
 		}
 		}
 	}
 	}
+#else
+    (void)ctx;
 #endif /* NO_SSL_DL */
 #endif /* NO_SSL_DL */
 
 
 	if (mg_atomic_inc(&cryptolib_users) > 1) {
 	if (mg_atomic_inc(&cryptolib_users) > 1) {
@@ -12006,6 +12202,7 @@ initialize_ssl(struct mg_context *ctx)
 
 
 	CRYPTO_set_locking_callback(&ssl_locking_callback);
 	CRYPTO_set_locking_callback(&ssl_locking_callback);
 	CRYPTO_set_id_callback(&mg_current_thread_id);
 	CRYPTO_set_id_callback(&mg_current_thread_id);
+#endif /* OPENSSL_API_1_1 */
 
 
 	return 1;
 	return 1;
 }
 }
@@ -12053,6 +12250,22 @@ ssl_use_pem_file(struct mg_context *ctx, const char *pem)
 }
 }
 
 
 
 
+#ifdef OPENSSL_API_1_1
+static unsigned long
+ssl_get_protocol(int version_id)
+{
+	long unsigned ret = SSL_OP_ALL;
+	if (version_id > 0)
+		ret |= SSL_OP_NO_SSLv2;
+	if (version_id > 1)
+		ret |= SSL_OP_NO_SSLv3;
+	if (version_id > 2)
+		ret |= SSL_OP_NO_TLSv1;
+	if (version_id > 3)
+		ret |= SSL_OP_NO_TLSv1_1;
+	return ret;
+}
+#else
 static long
 static long
 ssl_get_protocol(int version_id)
 ssl_get_protocol(int version_id)
 {
 {
@@ -12067,6 +12280,7 @@ ssl_get_protocol(int version_id)
 		ret |= SSL_OP_NO_TLSv1_1;
 		ret |= SSL_OP_NO_TLSv1_1;
 	return ret;
 	return ret;
 }
 }
+#endif /* OPENSSL_API_1_1 */
 
 
 
 
 /* Dynamically load SSL library. Set up ctx->ssl_ctx pointer. */
 /* Dynamically load SSL library. Set up ctx->ssl_ctx pointer. */
@@ -12109,6 +12323,17 @@ set_ssl_option(struct mg_context *ctx)
 	}
 	}
 #endif /* NO_SSL_DL */
 #endif /* NO_SSL_DL */
 
 
+#ifdef OPENSSL_API_1_1
+	/* Initialize SSL library */
+	OPENSSL_init_ssl(0, NULL);
+	OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \
+					| OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
+
+	if ((ctx->ssl_ctx = SSL_CTX_new(TLS_server_method())) == NULL) {
+		mg_cry(fc(ctx), "SSL_CTX_new (server) error: %s", ssl_error());
+		return 0;
+	}
+#else
 	/* Initialize SSL library */
 	/* Initialize SSL library */
 	SSL_library_init();
 	SSL_library_init();
 	SSL_load_error_strings();
 	SSL_load_error_strings();
@@ -12117,6 +12342,7 @@ set_ssl_option(struct mg_context *ctx)
 		mg_cry(fc(ctx), "SSL_CTX_new (server) error: %s", ssl_error());
 		mg_cry(fc(ctx), "SSL_CTX_new (server) error: %s", ssl_error());
 		return 0;
 		return 0;
 	}
 	}
+#endif /* OPENSSL_API_1_1 */
 
 
 	SSL_CTX_clear_options(ctx->ssl_ctx,
 	SSL_CTX_clear_options(ctx->ssl_ctx,
 	                      SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1
 	                      SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1
@@ -12125,7 +12351,9 @@ set_ssl_option(struct mg_context *ctx)
 	SSL_CTX_set_options(ctx->ssl_ctx, ssl_get_protocol(protocol_ver));
 	SSL_CTX_set_options(ctx->ssl_ctx, ssl_get_protocol(protocol_ver));
 	SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_SINGLE_DH_USE);
 	SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_SINGLE_DH_USE);
 	SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
 	SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
+#if !defined(NO_SSL_DL)
 	SSL_CTX_set_ecdh_auto(ctx->ssl_ctx, 1);
 	SSL_CTX_set_ecdh_auto(ctx->ssl_ctx, 1);
+#endif /* NO_SSL_DL */
 
 
 	/* If a callback has been specified, call it. */
 	/* If a callback has been specified, call it. */
 	callback_ret =
 	callback_ret =
@@ -12223,6 +12451,17 @@ set_ssl_option(struct mg_context *ctx)
 static void
 static void
 uninitialize_ssl(struct mg_context *ctx)
 uninitialize_ssl(struct mg_context *ctx)
 {
 {
+#ifdef OPENSSL_API_1_1
+	(void)ctx;
+
+	if (mg_atomic_dec(&cryptolib_users) == 0) {
+
+		/* Shutdown according to
+		 * https://wiki.openssl.org/index.php/Library_Initialization#Cleanup
+		 * http://stackoverflow.com/questions/29845527/how-to-properly-uninitialize-openssl
+		 */
+		CONF_modules_unload(1);
+#else
 	int i;
 	int i;
 	(void)ctx;
 	(void)ctx;
 
 
@@ -12246,6 +12485,8 @@ uninitialize_ssl(struct mg_context *ctx)
 		}
 		}
 		mg_free(ssl_mutexes);
 		mg_free(ssl_mutexes);
 		ssl_mutexes = NULL;
 		ssl_mutexes = NULL;
+#endif /* OPENSSL_API_1_1 */
+
 	}
 	}
 }
 }
 #endif /* !NO_SSL */
 #endif /* !NO_SSL */
@@ -12494,7 +12735,9 @@ close_connection(struct mg_connection *conn)
 		SSL_free(conn->ssl);
 		SSL_free(conn->ssl);
 		/* Avoid CRYPTO_cleanup_all_ex_data(); See discussion:
 		/* Avoid CRYPTO_cleanup_all_ex_data(); See discussion:
 		 * https://wiki.openssl.org/index.php/Talk:Library_Initialization */
 		 * https://wiki.openssl.org/index.php/Talk:Library_Initialization */
+#ifndef OPENSSL_API_1_1
 		ERR_remove_state(0);
 		ERR_remove_state(0);
+#endif
 		conn->ssl = NULL;
 		conn->ssl = NULL;
 	}
 	}
 #endif
 #endif
@@ -12589,6 +12832,19 @@ mg_connect_client_impl(const struct mg_client_options *client_options,
 		            strerror(ERRNO));
 		            strerror(ERRNO));
 		closesocket(sock);
 		closesocket(sock);
 #ifndef NO_SSL
 #ifndef NO_SSL
+#ifdef OPENSSL_API_1_1
+	} else if (use_ssl
+	           && (conn->client_ssl_ctx = SSL_CTX_new(TLS_client_method()))
+	                  == NULL) {
+		mg_snprintf(NULL,
+		            NULL, /* No truncation check for ebuf */
+		            ebuf,
+		            ebuf_len,
+		            "SSL_CTX_new error");
+		closesocket(sock);
+		mg_free(conn);
+		conn = NULL;
+#else
 	} else if (use_ssl
 	} else if (use_ssl
 	           && (conn->client_ssl_ctx = SSL_CTX_new(SSLv23_client_method()))
 	           && (conn->client_ssl_ctx = SSL_CTX_new(SSLv23_client_method()))
 	                  == NULL) {
 	                  == NULL) {
@@ -12600,6 +12856,7 @@ mg_connect_client_impl(const struct mg_client_options *client_options,
 		closesocket(sock);
 		closesocket(sock);
 		mg_free(conn);
 		mg_free(conn);
 		conn = NULL;
 		conn = NULL;
+#endif /* OPENSSL_API_1_1 */
 #endif /* NO_SSL */
 #endif /* NO_SSL */
 
 
 	} else {
 	} else {

+ 6 - 6
src/sha1.inl

@@ -10,10 +10,10 @@ Still 100% Public Domain
 
 
 Corrected a problem which generated improper hash values on 16 bit machines
 Corrected a problem which generated improper hash values on 16 bit machines
 Routine SHA1Update changed from
 Routine SHA1Update changed from
-    void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int
+    void SHA1Update(SHA_CTX* context, unsigned char* data, unsigned int
 len)
 len)
 to
 to
-    void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned
+    void SHA1Update(SHA_CTX* context, unsigned char* data, unsigned
 long len)
 long len)
 
 
 The 'len' parameter was declared an int which works fine on 32 bit machines.
 The 'len' parameter was declared an int which works fine on 32 bit machines.
@@ -92,7 +92,7 @@ typedef struct {
 	uint32_t state[5];
 	uint32_t state[5];
 	uint32_t count[2];
 	uint32_t count[2];
 	uint8_t buffer[64];
 	uint8_t buffer[64];
-} SHA1_CTX;
+} SHA_CTX;
 
 
 #define SHA1_DIGEST_SIZE 20
 #define SHA1_DIGEST_SIZE 20
 
 
@@ -256,7 +256,7 @@ SHA1_Transform(uint32_t state[5], const uint8_t buffer[64])
 
 
 /* SHA1Init - Initialize new context */
 /* SHA1Init - Initialize new context */
 SHA_API void
 SHA_API void
-SHA1_Init(SHA1_CTX *context)
+SHA1_Init(SHA_CTX *context)
 {
 {
 	/* SHA1 initialization constants */
 	/* SHA1 initialization constants */
 	context->state[0] = 0x67452301;
 	context->state[0] = 0x67452301;
@@ -269,7 +269,7 @@ SHA1_Init(SHA1_CTX *context)
 
 
 
 
 SHA_API void
 SHA_API void
-SHA1_Update(SHA1_CTX *context, const uint8_t *data, const uint32_t len)
+SHA1_Update(SHA_CTX *context, const uint8_t *data, const uint32_t len)
 {
 {
 	uint32_t i, j;
 	uint32_t i, j;
 
 
@@ -296,7 +296,7 @@ SHA1_Update(SHA1_CTX *context, const uint8_t *data, const uint32_t len)
 
 
 /* Add padding and return the message digest. */
 /* Add padding and return the message digest. */
 SHA_API void
 SHA_API void
-SHA1_Final(SHA1_CTX *context, uint8_t digest[SHA1_DIGEST_SIZE])
+SHA1_Final(unsigned char *digest, SHA_CTX *context)
 {
 {
 	uint32_t i;
 	uint32_t i;
 	uint8_t finalcount[8];
 	uint8_t finalcount[8];

+ 7 - 7
test/private.c

@@ -669,7 +669,7 @@ END_TEST
 START_TEST(test_sha1)
 START_TEST(test_sha1)
 {
 {
 #ifdef SHA1_DIGEST_SIZE
 #ifdef SHA1_DIGEST_SIZE
-	SHA1_CTX sha_ctx;
+	SHA_CTX sha_ctx;
 	uint8_t digest[SHA1_DIGEST_SIZE] = {0};
 	uint8_t digest[SHA1_DIGEST_SIZE] = {0};
 	char str[48] = {0};
 	char str[48] = {0};
 	int i;
 	int i;
@@ -680,7 +680,7 @@ START_TEST(test_sha1)
 
 
 	/* empty string */
 	/* empty string */
 	SHA1_Init(&sha_ctx);
 	SHA1_Init(&sha_ctx);
-	SHA1_Final(&sha_ctx, digest);
+	SHA1_Final(digest, &sha_ctx);
 	bin2str(str, digest, sizeof(digest));
 	bin2str(str, digest, sizeof(digest));
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_str_eq(str, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
 	ck_assert_str_eq(str, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
@@ -688,7 +688,7 @@ START_TEST(test_sha1)
 	/* empty string */
 	/* empty string */
 	SHA1_Init(&sha_ctx);
 	SHA1_Init(&sha_ctx);
 	SHA1_Update(&sha_ctx, (uint8_t *)"abc", 0);
 	SHA1_Update(&sha_ctx, (uint8_t *)"abc", 0);
-	SHA1_Final(&sha_ctx, digest);
+	SHA1_Final(digest, &sha_ctx);
 	bin2str(str, digest, sizeof(digest));
 	bin2str(str, digest, sizeof(digest));
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_str_eq(str, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
 	ck_assert_str_eq(str, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
@@ -696,7 +696,7 @@ START_TEST(test_sha1)
 	/* "abc" */
 	/* "abc" */
 	SHA1_Init(&sha_ctx);
 	SHA1_Init(&sha_ctx);
 	SHA1_Update(&sha_ctx, (uint8_t *)"abc", 3);
 	SHA1_Update(&sha_ctx, (uint8_t *)"abc", 3);
-	SHA1_Final(&sha_ctx, digest);
+	SHA1_Final(digest, &sha_ctx);
 	bin2str(str, digest, sizeof(digest));
 	bin2str(str, digest, sizeof(digest));
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_str_eq(str, "a9993e364706816aba3e25717850c26c9cd0d89d");
 	ck_assert_str_eq(str, "a9993e364706816aba3e25717850c26c9cd0d89d");
@@ -705,7 +705,7 @@ START_TEST(test_sha1)
 	test_str = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
 	test_str = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
 	SHA1_Init(&sha_ctx);
 	SHA1_Init(&sha_ctx);
 	SHA1_Update(&sha_ctx, (uint8_t *)test_str, (uint32_t)strlen(test_str));
 	SHA1_Update(&sha_ctx, (uint8_t *)test_str, (uint32_t)strlen(test_str));
-	SHA1_Final(&sha_ctx, digest);
+	SHA1_Final(digest, &sha_ctx);
 	bin2str(str, digest, sizeof(digest));
 	bin2str(str, digest, sizeof(digest));
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_str_eq(str, "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
 	ck_assert_str_eq(str, "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
@@ -715,7 +715,7 @@ START_TEST(test_sha1)
 	for (i = 0; i < 1000000; i++) {
 	for (i = 0; i < 1000000; i++) {
 		SHA1_Update(&sha_ctx, (uint8_t *)"a", 1);
 		SHA1_Update(&sha_ctx, (uint8_t *)"a", 1);
 	}
 	}
-	SHA1_Final(&sha_ctx, digest);
+	SHA1_Final(digest, &sha_ctx);
 	bin2str(str, digest, sizeof(digest));
 	bin2str(str, digest, sizeof(digest));
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_str_eq(str, "34aa973cd4c4daa4f61eeb2bdbad27316534016f");
 	ck_assert_str_eq(str, "34aa973cd4c4daa4f61eeb2bdbad27316534016f");
@@ -725,7 +725,7 @@ START_TEST(test_sha1)
 	for (i = 0; i < 100000; i++) {
 	for (i = 0; i < 100000; i++) {
 		SHA1_Update(&sha_ctx, (uint8_t *)"aaaaaaaaaa", 10);
 		SHA1_Update(&sha_ctx, (uint8_t *)"aaaaaaaaaa", 10);
 	}
 	}
-	SHA1_Final(&sha_ctx, digest);
+	SHA1_Final(digest, &sha_ctx);
 	bin2str(str, digest, sizeof(digest));
 	bin2str(str, digest, sizeof(digest));
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_uint_eq(strlen(str), 40);
 	ck_assert_str_eq(str, "34aa973cd4c4daa4f61eeb2bdbad27316534016f");
 	ck_assert_str_eq(str, "34aa973cd4c4daa4f61eeb2bdbad27316534016f");