From 0ed9c9b4d6a70d9a15113d432115e4549a9755a1 Mon Sep 17 00:00:00 2001 From: casey langen Date: Mon, 17 Apr 2017 23:56:50 -0700 Subject: [PATCH] Added HttpDataStream, a new plugin that can provide an IDataStream from an HTTP/HTTPS connection. - Added libcurl and libressl as project dependencies. - Added HttpDataStream (which uses libcurl and libressl). Includes an LruDiskCache so responses can be cached to disk for offline playback. - Added new IEnvironment SDK interface. Plugins can query the environment for path information, data streams, or decoders. More functionality will be added over time. - Fixed FlacDataDecoderFactory to handle the correct mime type (audio/flac, not audio/flag) - Tweaked NomadDecoder.cpp to return the stream length immediately instead of waiting for an fseek(). --- CMakeLists.txt | 1 + archive-win32.sh | 8 + musikcube.sln | 13 +- src/3rdparty/3rdparty.vcxproj | 84 + src/3rdparty/3rdparty.vcxproj.filters | 258 + src/3rdparty/win32_bin/crypto-41.dll | Bin 0 -> 1278976 bytes src/3rdparty/win32_bin/libcurl.dll | Bin 0 -> 313344 bytes src/3rdparty/win32_bin/ssl-43.dll | Bin 0 -> 290816 bytes src/3rdparty/win32_bin/tls-15.dll | Bin 0 -> 116736 bytes src/3rdparty/win32_include/curl/Makefile.am | 53 + src/3rdparty/win32_include/curl/Makefile.in | 707 +++ src/3rdparty/win32_include/curl/curl.h | 2536 ++++++++++ src/3rdparty/win32_include/curl/curlbuild.h | 586 +++ .../win32_include/curl/curlbuild.h.cmake | 197 + .../win32_include/curl/curlbuild.h.in | 197 + src/3rdparty/win32_include/curl/curlrules.h | 262 ++ src/3rdparty/win32_include/curl/curlver.h | 77 + src/3rdparty/win32_include/curl/easy.h | 102 + src/3rdparty/win32_include/curl/mprintf.h | 50 + src/3rdparty/win32_include/curl/multi.h | 439 ++ src/3rdparty/win32_include/curl/stdcheaders.h | 33 + .../win32_include/curl/typecheck-gcc.h | 624 +++ .../win32_include/openssl/Makefile.am | 74 + .../win32_include/openssl/Makefile.in | 582 +++ src/3rdparty/win32_include/openssl/aes.h | 126 + src/3rdparty/win32_include/openssl/asn1.h | 1459 ++++++ src/3rdparty/win32_include/openssl/asn1_mac.h | 426 ++ src/3rdparty/win32_include/openssl/asn1t.h | 880 ++++ src/3rdparty/win32_include/openssl/bio.h | 792 ++++ src/3rdparty/win32_include/openssl/blowfish.h | 112 + src/3rdparty/win32_include/openssl/bn.h | 714 +++ src/3rdparty/win32_include/openssl/buffer.h | 122 + src/3rdparty/win32_include/openssl/camellia.h | 125 + src/3rdparty/win32_include/openssl/cast.h | 104 + src/3rdparty/win32_include/openssl/chacha.h | 54 + src/3rdparty/win32_include/openssl/cmac.h | 82 + src/3rdparty/win32_include/openssl/comp.h | 73 + src/3rdparty/win32_include/openssl/conf.h | 249 + src/3rdparty/win32_include/openssl/conf_api.h | 88 + src/3rdparty/win32_include/openssl/crypto.h | 540 +++ .../win32_include/openssl/curve25519.h | 67 + src/3rdparty/win32_include/openssl/des.h | 219 + src/3rdparty/win32_include/openssl/dh.h | 269 ++ src/3rdparty/win32_include/openssl/dsa.h | 320 ++ src/3rdparty/win32_include/openssl/dso.h | 386 ++ src/3rdparty/win32_include/openssl/dtls1.h | 190 + src/3rdparty/win32_include/openssl/ec.h | 1169 +++++ src/3rdparty/win32_include/openssl/ecdh.h | 128 + src/3rdparty/win32_include/openssl/ecdsa.h | 286 ++ src/3rdparty/win32_include/openssl/engine.h | 807 ++++ src/3rdparty/win32_include/openssl/err.h | 421 ++ src/3rdparty/win32_include/openssl/evp.h | 1502 ++++++ src/3rdparty/win32_include/openssl/gost.h | 266 ++ src/3rdparty/win32_include/openssl/hmac.h | 108 + src/3rdparty/win32_include/openssl/idea.h | 100 + src/3rdparty/win32_include/openssl/lhash.h | 235 + src/3rdparty/win32_include/openssl/md4.h | 103 + src/3rdparty/win32_include/openssl/md5.h | 108 + src/3rdparty/win32_include/openssl/modes.h | 136 + src/3rdparty/win32_include/openssl/obj_mac.h | 4180 +++++++++++++++++ src/3rdparty/win32_include/openssl/objects.h | 1140 +++++ src/3rdparty/win32_include/openssl/ocsp.h | 669 +++ .../win32_include/openssl/opensslconf.h | 153 + .../win32_include/openssl/opensslfeatures.h | 26 + src/3rdparty/win32_include/openssl/opensslv.h | 17 + src/3rdparty/win32_include/openssl/ossl_typ.h | 190 + src/3rdparty/win32_include/openssl/pem.h | 618 +++ src/3rdparty/win32_include/openssl/pem2.h | 71 + src/3rdparty/win32_include/openssl/pkcs12.h | 350 ++ src/3rdparty/win32_include/openssl/pkcs7.h | 529 +++ src/3rdparty/win32_include/openssl/poly1305.h | 49 + src/3rdparty/win32_include/openssl/rand.h | 127 + src/3rdparty/win32_include/openssl/rc2.h | 101 + src/3rdparty/win32_include/openssl/rc4.h | 89 + src/3rdparty/win32_include/openssl/ripemd.h | 105 + src/3rdparty/win32_include/openssl/rsa.h | 556 +++ .../win32_include/openssl/safestack.h | 2667 +++++++++++ src/3rdparty/win32_include/openssl/sha.h | 192 + src/3rdparty/win32_include/openssl/srtp.h | 142 + src/3rdparty/win32_include/openssl/ssl.h | 2066 ++++++++ src/3rdparty/win32_include/openssl/ssl2.h | 153 + src/3rdparty/win32_include/openssl/ssl23.h | 82 + src/3rdparty/win32_include/openssl/ssl3.h | 511 ++ src/3rdparty/win32_include/openssl/stack.h | 107 + src/3rdparty/win32_include/openssl/tls1.h | 755 +++ src/3rdparty/win32_include/openssl/ts.h | 836 ++++ src/3rdparty/win32_include/openssl/txt_db.h | 112 + src/3rdparty/win32_include/openssl/ui.h | 384 ++ .../win32_include/openssl/ui_compat.h | 83 + src/3rdparty/win32_include/openssl/whrlpool.h | 41 + src/3rdparty/win32_include/openssl/x509.h | 1378 ++++++ src/3rdparty/win32_include/openssl/x509_vfy.h | 582 +++ src/3rdparty/win32_include/openssl/x509v3.h | 979 ++++ src/3rdparty/win32_include/pqueue.h | 93 + src/3rdparty/win32_include/tls.h | 212 + src/3rdparty/win32_lib/crypto-41.lib | Bin 0 -> 775230 bytes src/3rdparty/win32_lib/libcurl.lib | Bin 0 -> 14376 bytes src/3rdparty/win32_lib/ssl-43.lib | Bin 0 -> 62120 bytes src/3rdparty/win32_lib/tls-15.lib | Bin 0 -> 20472 bytes .../flacdecoder/FlacDecoderFactory.cpp | 2 +- src/contrib/httpdatastream/CMakeLists.txt | 15 + src/contrib/httpdatastream/HttpDataStream.cpp | 429 ++ src/contrib/httpdatastream/HttpDataStream.h | 98 + .../httpdatastream/HttpDataStreamFactory.cpp | 67 + .../httpdatastream/HttpDataStreamFactory.h | 47 + src/contrib/httpdatastream/LruDiskCache.cpp | 312 ++ src/contrib/httpdatastream/LruDiskCache.h | 78 + src/contrib/httpdatastream/RingBuffer.h | 132 + .../httpdatastream/httpdatastream.vcproj | 202 + .../httpdatastream/httpdatastream.vcxproj | 118 + .../httpdatastream.vcxproj.filters | 46 + .../httpdatastream/httpdatastream_plugin.cpp | 66 + src/contrib/httpdatastream/stdafx.cpp | 35 + src/contrib/httpdatastream/stdafx.h | 43 + src/contrib/nomaddecoder/NomadDecoder.cpp | 9 +- src/core/audio/PlaybackService.cpp | 16 +- src/core/audio/Player.cpp | 5 +- src/core/audio/Stream.cpp | 3 +- src/core/audio/Streams.cpp | 33 +- src/core/audio/Streams.h | 3 + src/core/core.vcxproj | 1 + src/core/core.vcxproj.filters | 3 + src/core/db/Connection.h | 2 + src/core/io/DataStreamFactory.cpp | 24 +- src/core/io/DataStreamFactory.h | 5 +- src/core/library/LocalLibrary.cpp | 1 + src/core/plugin/Plugins.cpp | 47 + src/core/sdk/IEnvironment.h | 50 + src/core/sdk/constants.h | 7 + src/musikbox/Main.cpp | 5 +- src/musikbox/musikbox.vcxproj | 18 +- 131 files changed, 41872 insertions(+), 44 deletions(-) create mode 100644 src/3rdparty/win32_bin/crypto-41.dll create mode 100644 src/3rdparty/win32_bin/libcurl.dll create mode 100644 src/3rdparty/win32_bin/ssl-43.dll create mode 100644 src/3rdparty/win32_bin/tls-15.dll create mode 100644 src/3rdparty/win32_include/curl/Makefile.am create mode 100644 src/3rdparty/win32_include/curl/Makefile.in create mode 100644 src/3rdparty/win32_include/curl/curl.h create mode 100644 src/3rdparty/win32_include/curl/curlbuild.h create mode 100644 src/3rdparty/win32_include/curl/curlbuild.h.cmake create mode 100644 src/3rdparty/win32_include/curl/curlbuild.h.in create mode 100644 src/3rdparty/win32_include/curl/curlrules.h create mode 100644 src/3rdparty/win32_include/curl/curlver.h create mode 100644 src/3rdparty/win32_include/curl/easy.h create mode 100644 src/3rdparty/win32_include/curl/mprintf.h create mode 100644 src/3rdparty/win32_include/curl/multi.h create mode 100644 src/3rdparty/win32_include/curl/stdcheaders.h create mode 100644 src/3rdparty/win32_include/curl/typecheck-gcc.h create mode 100644 src/3rdparty/win32_include/openssl/Makefile.am create mode 100644 src/3rdparty/win32_include/openssl/Makefile.in create mode 100644 src/3rdparty/win32_include/openssl/aes.h create mode 100644 src/3rdparty/win32_include/openssl/asn1.h create mode 100644 src/3rdparty/win32_include/openssl/asn1_mac.h create mode 100644 src/3rdparty/win32_include/openssl/asn1t.h create mode 100644 src/3rdparty/win32_include/openssl/bio.h create mode 100644 src/3rdparty/win32_include/openssl/blowfish.h create mode 100644 src/3rdparty/win32_include/openssl/bn.h create mode 100644 src/3rdparty/win32_include/openssl/buffer.h create mode 100644 src/3rdparty/win32_include/openssl/camellia.h create mode 100644 src/3rdparty/win32_include/openssl/cast.h create mode 100644 src/3rdparty/win32_include/openssl/chacha.h create mode 100644 src/3rdparty/win32_include/openssl/cmac.h create mode 100644 src/3rdparty/win32_include/openssl/comp.h create mode 100644 src/3rdparty/win32_include/openssl/conf.h create mode 100644 src/3rdparty/win32_include/openssl/conf_api.h create mode 100644 src/3rdparty/win32_include/openssl/crypto.h create mode 100644 src/3rdparty/win32_include/openssl/curve25519.h create mode 100644 src/3rdparty/win32_include/openssl/des.h create mode 100644 src/3rdparty/win32_include/openssl/dh.h create mode 100644 src/3rdparty/win32_include/openssl/dsa.h create mode 100644 src/3rdparty/win32_include/openssl/dso.h create mode 100644 src/3rdparty/win32_include/openssl/dtls1.h create mode 100644 src/3rdparty/win32_include/openssl/ec.h create mode 100644 src/3rdparty/win32_include/openssl/ecdh.h create mode 100644 src/3rdparty/win32_include/openssl/ecdsa.h create mode 100644 src/3rdparty/win32_include/openssl/engine.h create mode 100644 src/3rdparty/win32_include/openssl/err.h create mode 100644 src/3rdparty/win32_include/openssl/evp.h create mode 100644 src/3rdparty/win32_include/openssl/gost.h create mode 100644 src/3rdparty/win32_include/openssl/hmac.h create mode 100644 src/3rdparty/win32_include/openssl/idea.h create mode 100644 src/3rdparty/win32_include/openssl/lhash.h create mode 100644 src/3rdparty/win32_include/openssl/md4.h create mode 100644 src/3rdparty/win32_include/openssl/md5.h create mode 100644 src/3rdparty/win32_include/openssl/modes.h create mode 100644 src/3rdparty/win32_include/openssl/obj_mac.h create mode 100644 src/3rdparty/win32_include/openssl/objects.h create mode 100644 src/3rdparty/win32_include/openssl/ocsp.h create mode 100644 src/3rdparty/win32_include/openssl/opensslconf.h create mode 100644 src/3rdparty/win32_include/openssl/opensslfeatures.h create mode 100644 src/3rdparty/win32_include/openssl/opensslv.h create mode 100644 src/3rdparty/win32_include/openssl/ossl_typ.h create mode 100644 src/3rdparty/win32_include/openssl/pem.h create mode 100644 src/3rdparty/win32_include/openssl/pem2.h create mode 100644 src/3rdparty/win32_include/openssl/pkcs12.h create mode 100644 src/3rdparty/win32_include/openssl/pkcs7.h create mode 100644 src/3rdparty/win32_include/openssl/poly1305.h create mode 100644 src/3rdparty/win32_include/openssl/rand.h create mode 100644 src/3rdparty/win32_include/openssl/rc2.h create mode 100644 src/3rdparty/win32_include/openssl/rc4.h create mode 100644 src/3rdparty/win32_include/openssl/ripemd.h create mode 100644 src/3rdparty/win32_include/openssl/rsa.h create mode 100644 src/3rdparty/win32_include/openssl/safestack.h create mode 100644 src/3rdparty/win32_include/openssl/sha.h create mode 100644 src/3rdparty/win32_include/openssl/srtp.h create mode 100644 src/3rdparty/win32_include/openssl/ssl.h create mode 100644 src/3rdparty/win32_include/openssl/ssl2.h create mode 100644 src/3rdparty/win32_include/openssl/ssl23.h create mode 100644 src/3rdparty/win32_include/openssl/ssl3.h create mode 100644 src/3rdparty/win32_include/openssl/stack.h create mode 100644 src/3rdparty/win32_include/openssl/tls1.h create mode 100644 src/3rdparty/win32_include/openssl/ts.h create mode 100644 src/3rdparty/win32_include/openssl/txt_db.h create mode 100644 src/3rdparty/win32_include/openssl/ui.h create mode 100644 src/3rdparty/win32_include/openssl/ui_compat.h create mode 100644 src/3rdparty/win32_include/openssl/whrlpool.h create mode 100644 src/3rdparty/win32_include/openssl/x509.h create mode 100644 src/3rdparty/win32_include/openssl/x509_vfy.h create mode 100644 src/3rdparty/win32_include/openssl/x509v3.h create mode 100644 src/3rdparty/win32_include/pqueue.h create mode 100644 src/3rdparty/win32_include/tls.h create mode 100644 src/3rdparty/win32_lib/crypto-41.lib create mode 100644 src/3rdparty/win32_lib/libcurl.lib create mode 100644 src/3rdparty/win32_lib/ssl-43.lib create mode 100644 src/3rdparty/win32_lib/tls-15.lib create mode 100644 src/contrib/httpdatastream/CMakeLists.txt create mode 100755 src/contrib/httpdatastream/HttpDataStream.cpp create mode 100755 src/contrib/httpdatastream/HttpDataStream.h create mode 100755 src/contrib/httpdatastream/HttpDataStreamFactory.cpp create mode 100755 src/contrib/httpdatastream/HttpDataStreamFactory.h create mode 100644 src/contrib/httpdatastream/LruDiskCache.cpp create mode 100644 src/contrib/httpdatastream/LruDiskCache.h create mode 100644 src/contrib/httpdatastream/RingBuffer.h create mode 100644 src/contrib/httpdatastream/httpdatastream.vcproj create mode 100644 src/contrib/httpdatastream/httpdatastream.vcxproj create mode 100644 src/contrib/httpdatastream/httpdatastream.vcxproj.filters create mode 100644 src/contrib/httpdatastream/httpdatastream_plugin.cpp create mode 100644 src/contrib/httpdatastream/stdafx.cpp create mode 100644 src/contrib/httpdatastream/stdafx.h create mode 100644 src/core/sdk/IEnvironment.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 74d5bbfb4..f25dd73d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,6 +86,7 @@ add_subdirectory(src/contrib/nomaddecoder) add_subdirectory(src/contrib/flacdecoder) add_subdirectory(src/contrib/nullout) add_subdirectory(src/contrib/websocket_remote) +add_subdirectory(src/contrib/httpdatastream) add_dependencies(taglibreader taglib) diff --git a/archive-win32.sh b/archive-win32.sh index 2b53935ed..7b6340198 100644 --- a/archive-win32.sh +++ b/archive-win32.sh @@ -17,6 +17,10 @@ mkdir -p "$VANILLA/plugins" mkdir -p "$VANILLA/themes" mkdir -p "$VANILLA/locales" cp bin/release/musikbox.exe "$VANILLA" +cp bin/release/libcurl.dll "$VANILLA" +cp bin/release/crypto-41.dll "$VANILLA" +cp bin/release/ssl-43.dll "$VANILLA" +cp bin/release/tls-15.dll "$VANILLA" cp bin/release/plugins/*.dll "$VANILLA/plugins" cp bin/release/themes/*.json "$VANILLA/themes" cp bin/release/locales/*.json "$VANILLA/locales" @@ -30,6 +34,10 @@ mkdir -p "$MILKDROP/plugins" mkdir -p "$MILKDROP/themes" mkdir -p "$MILKDROP/locales" cp bin/release/musikbox.exe "$MILKDROP" +cp bin/release/libcurl.dll "$VANILLA" +cp bin/release/crypto-41.dll "$VANILLA" +cp bin/release/ssl-43.dll "$VANILLA" +cp bin/release/tls-15.dll "$VANILLA" cp bin/release/plugins/*.dll "$MILKDROP/plugins" cp bin/release/themes/*.json "$MILKDROP/themes" cp bin/release/locales/*.json "$MILKDROP/locales" diff --git a/musikcube.sln b/musikcube.sln index 0983605e5..4d99cf5dd 100644 --- a/musikcube.sln +++ b/musikcube.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26403.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "musikbox", "src\musikbox\musikbox.vcxproj", "{C7102EB1-7311-4B36-A7FF-89DD7F077FF9}" ProjectSection(ProjectDependencies) = postProject @@ -12,6 +12,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "musikbox", "src\musikbox\mu {43A78C57-C9A3-4852-B0BE-05335C5C077D} = {43A78C57-C9A3-4852-B0BE-05335C5C077D} {465EF178-91C1-4068-BE1D-F9616ECCB6DE} = {465EF178-91C1-4068-BE1D-F9616ECCB6DE} {4F10C17A-8AF7-4FAC-A4E2-087AE6E8F9D8} = {4F10C17A-8AF7-4FAC-A4E2-087AE6E8F9D8} + {FA74D37C-8184-4596-BFE9-766C159045E1} = {FA74D37C-8184-4596-BFE9-766C159045E1} {4993E68D-E97A-4CD2-AC8E-168AE315BAC5} = {4993E68D-E97A-4CD2-AC8E-168AE315BAC5} {CA56A398-7F9A-493A-A7FC-C6B4D550B674} = {CA56A398-7F9A-493A-A7FC-C6B4D550B674} {292974B0-C8B7-41EF-B603-554A2B25CB90} = {292974B0-C8B7-41EF-B603-554A2B25CB90} @@ -68,6 +69,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nullout", "src\contrib\null EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "websocket_remote", "src\contrib\websocket_remote\websocket_remote.vcxproj", "{43A78C57-C9A3-4852-B0BE-05335C5C077D}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "httpdatastream", "src\contrib\httpdatastream\httpdatastream.vcxproj", "{FA74D37C-8184-4596-BFE9-766C159045E1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -188,6 +191,12 @@ Global {43A78C57-C9A3-4852-B0BE-05335C5C077D}.Release|Win32.Build.0 = Release|Win32 {43A78C57-C9A3-4852-B0BE-05335C5C077D}.Release|x64.ActiveCfg = Release|x64 {43A78C57-C9A3-4852-B0BE-05335C5C077D}.Release|x64.Build.0 = Release|x64 + {FA74D37C-8184-4596-BFE9-766C159045E1}.Debug|Win32.ActiveCfg = Debug|Win32 + {FA74D37C-8184-4596-BFE9-766C159045E1}.Debug|Win32.Build.0 = Debug|Win32 + {FA74D37C-8184-4596-BFE9-766C159045E1}.Debug|x64.ActiveCfg = Debug|Win32 + {FA74D37C-8184-4596-BFE9-766C159045E1}.Release|Win32.ActiveCfg = Release|Win32 + {FA74D37C-8184-4596-BFE9-766C159045E1}.Release|Win32.Build.0 = Release|Win32 + {FA74D37C-8184-4596-BFE9-766C159045E1}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/3rdparty/3rdparty.vcxproj b/src/3rdparty/3rdparty.vcxproj index 1161e8e6d..16226ea77 100755 --- a/src/3rdparty/3rdparty.vcxproj +++ b/src/3rdparty/3rdparty.vcxproj @@ -151,6 +151,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/3rdparty/3rdparty.vcxproj.filters b/src/3rdparty/3rdparty.vcxproj.filters index 7a05bf018..570762f11 100755 --- a/src/3rdparty/3rdparty.vcxproj.filters +++ b/src/3rdparty/3rdparty.vcxproj.filters @@ -14,6 +14,12 @@ {2a6ed669-412a-4c0a-9874-ef170a0952ee} + + {6442fc4a-15e8-4522-a12a-54963c8b1cb1} + + + {ac39b793-9ca0-43de-8a2e-71272dfe0709} + @@ -198,5 +204,257 @@ src + + src\curl + + + src\curl + + + src\curl + + + src\curl + + + src\curl + + + src\curl + + + src\curl + + + src\curl + + + src\curl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src\openssl + + + src + + + src + + + src + + + src + + + src + + + src + \ No newline at end of file diff --git a/src/3rdparty/win32_bin/crypto-41.dll b/src/3rdparty/win32_bin/crypto-41.dll new file mode 100644 index 0000000000000000000000000000000000000000..8a91431368323e27ba2cde274f1868d7749459da GIT binary patch literal 1278976 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

6HPTXyO#hqv4(FF^8C>m!TTr02@lepoBi0_Q{r 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 # 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%0ABiqsa9R8vZf&%YJ@29-#lqeyZrdP2QG& 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

Q>A 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

HiLb`l2N<8RWrc$ajD<-7-&3X~Jja4CWNIA~B z2yg z_z)VJ&r+nKUQ8sNMJJq)8g}L!z@FMo$UEq0*bnn`fdo<&3v^?!()jeD|DeXF4dVC} zC=iwK`p~SQlvj{j8~6Bi| zPxhCjTDtHNb64+F%c-0rGM2aYoJIC^aj+X~nP<=GTxVBXr{)|nj_&BK!87c8ATD$} z%Z!$`mD`COl<#>6u;?CZ(3;aFqlf7GNRo*-y)&SBzSCUQ#?Au$B-vy*b!G~tvQOdm zu%GV($nd7TSkc=i(@rzafwKe1w7z92_)8mep;q7_JjV49I1)c$Iq(er4UyTk@M6>9 zgafr>Kjr1XRs%IKCxD`4PL}Jbqm&u89+>|P>P!&O-X`F(d$&?IUA>>9(0MxnE7ix~ zP4JumKuddiu_wz(2UhE1+oPXB0yEo!Y}qD+050ncY%a4#M1~^{>3$9WrNN$^IQT{h zPuP8PpGGP$yq)HrM#3D{uh7Ip-v0WvNJ{az;E`4T807AJWhBk+z3r|h25 z61;&6Uj1~yw0pv91bub-(#%dQG!AzI$Rg@)VA9P+FzB;-Ht=L}D3#l>7wM>@4K|0z1#>btzD)OP zte)KnLU1V9QMA2GVK`1&!X8E!Ck`!7Q8#6nHcvD<>`rrVg6=w@;|iC$Y-HOaZ391} zZf!)E(ZWWdaNeG+z%O!;d}J$dgtO&kBDDtvLVa_o4NP*34+}MFY#Yl$1JZjkdiK(# zg!txLuYuA%&@WaN*tH+Sp2HQ{$P^MLOscVc$!GlDw@_xeN1OF5GG!lP2m>$B8XiI= zG=C#KAE~G3<34)6xS5`>Zo+f*LytVgU;an=>v5UC8rJgHZ`SbF@4a|E_Tz@f@X}pY ztzjEJ{PghzJ~}uAwA#?~&R2W1hOIpGY3MJN0uUqsEFG?=QLDTT*RwQ2LLMASX+iHV zhbXZB1HbEOG`6V8r5~Vy2cdLK3og3ETdcT1M+wrdHd54`7)_NFJCEvQ`Zl$dmhX|# z?ti35&X?=F6_mW|><@2c%qNWwqIW*kM`Oi}4^Vbp|+qlPATV>rh7imu#v z$I1}4Lr@*ele9G%4nKaG-B1wZqzq2!e8Z!yVlc^p#i>CHR4G^Q${m#M6t#>S*UB*g?roEdnI}YdvE$umj8*I40?SX9oOg)n>J#YvNvF?ly8Ll5C z?Ve0!nWYCFhHuZuXi|6)y3FfGeEAe;%3igcq&)4I?W@E!|Um+P~qn9>Q0ZL+#1J+ntWb-C6z(S?U>bA6_lZk>0bfmbOfQ ztD9V{cIk;9p3k{P%eSz+rilYgpdojO1+# zmLs>~^ZpIzzXi>eQJsWSIVrl-I&aO4H|_TaH$1s=6)zm&Gb;&&6GZK*)CEz1#Y%N>ZeW%1Y)jztSb4SosSLPH zoW5g-+NqzFQ>Uy#cia+--%UiI74Sk`;J-Q#kGnm1Y*>Lu?OFuf0YB6akB#s{{rtOp z$kqQEJr^lE0NZjj?dQ=@Pn_r{%@xzvE9&2XPMy9;`9wW7LC%6kS`V%c(no7!aJ3}H zR#Br)^_WFaySrea(rMW$r7{TVaI=sYW!7ZXCl?1)#N`Kskel zfrAw)UoP$G!P-V}UhxFyg@P*y#oh%2hFYIgp9=!Lv&D=*qSuH2iUI_sNDt}w9>#6| z1JGFYvu%+cp#A|7R!euctd`ccm@EgRq*%4Xp?=nzc|c@QdtimLUopAhJvk*MPS#rV9mDwZn!% zL4<=L38V=8s&i?CHLqJPklcj}dE&bO?fa*swI7(I(H}q%WPO>sCuZ!E_8sodJP4AB zTP=NYXtg9C#P7}3QV{QV_f6`AdUR(9+djb$rB?!$*40w&`_8>{9Fi-5k+lhp2q6&) zK$fs@%o!0SNpCsoUNbpO0TBu3JIh}U^~afJQvd;rX*`+w&H zyZ_mIp#IwbtN8#=mf_!q)LZHC7=BOV_X>UnPyPSfd>|_uu;$@Wh~EGLDQ|+_7g+#Xg(Cr zcvD_Sn=3PnvG{Y9S=WuM(9Z=vwpsp4FNfu?!LiHL7OR{XPLYQc%Bf{-6!#N7&iN)E zv-w!{I)(f;6rq|+X;PYx|P^!n? z4bJyP`K<-|jjGjeRrOTO)r+=YMAscNa-3=_ZFNKu&Bosf`ZiwUALVCD>-ms`V2q?Iyd<{H>sN4-NtdJmrfoR$S z2jrt9JmaF(k?aI~*ma1F(3!}NOHbJm_#ztiw<|!|Gz=xv=4#nuPf3Z_bA3dnC)9vn z$L_Ojr8b!`g{WD$dkV3qJ1^1K+SS29IR|;nBumKFoKqXF^3UAhzx8>C9W1WXKO{4HvNjwy=kF)Q$zPo zWh0D4tyWVRuBOppz0COm42t0bn9xCPlve*-KdA?*&1^m3;GugF9twR5tO8-xrp4Z< zym&_mbNkHVOkSD3Cd0P41jQz^XE=ReyU9k|3foCeI(Nlg5W`JasVC6B3X!Job$sOH z+tx+r}QB4$Jhn+f{`)wq5x#R_`T zd%-0j{-*{~2P%|V)v?~!5v!DiJ`7iABK+Rre!+-eLV0;42OO^ILoU#>J&*DGL30p# zvFG*n2kGLXSeS4+kGv6{g2gf!mun~ojgX~Ct~;i;2fsoUQLEAle_F!=0^Xvh@EXIO z`95bCq#=j*<-DuVZg~kE@5CPCLL3&N`@+~cbP>LT1T*b+)Wc-dNlqwdtrYg41tna< zF<6}r9AXFT@B!ys%KyO}9B(4KbSS^vdxCItoF4QA7PlH;(n(cnDG5v#9NF_3{IEsb zR#h3Ad;-0ybpDP0yl=&Rbweu%{3 zsuEfwd*aJQdgMr%hEkZwg`;!#60}u0P>Nna8;i}#r4)xTM}ffCf42O_h172fZs$h_PSAVRXLk@k78PcA^k#DvfP4s)gh^>gJ5;Avq>T&X~U8 zN{ni{{do=YH5%47KaX*3j2PDzJa1zQsUOqFa_Y4&(J*H0Xc+^WvjyB7VWztKtONs^ ztHiD^w$CoHDZ(ISTWQH3*P;o6@x})-vD2Q@e5-bsy{yEuWNGEnWnk{1t~MP5A-{+l z+i8?3cB$AK?}B^MjxP_a?D+z2{)z2SXG@O#jU^x(c}ku-Fn!%gfBxUpfuxNXc$VO< znmRgwQk}Ro2a2DQ0%{8kedyLVZbf_}HyA#lQi^OPnvMMyk(cVd+)K+sW3!haR0Ly> zX|4zSZE8z$8+$73HhXDD z6#b+6C}(H*`u=>(o3`Hy@+q&j;4l?zBhijnFeazHCRT6XK_O(MYddOPjnM*5_B=Me z!QC;e!DUi1tF7hQEQ-i}I4qX`!dTJZhE;7)``WV=&>16z-<^&VcgLXwL|N%Lha98L zY}Px}?(6UB%+jroJbER(7uaA~8+)rX@5c00!8OGW^wE&oo?TEkm>q?_@n2*_M6}Rd zE?agql|eWzXV=c8`Q9fc9GK;Wgl5LD_u=G@rMeYo9n--oX}lq^@}ONgib0er^VXkG z&B?ruOO3q2m__st5#4CRh+jANgHDlY8uS6?d;|bj9j93dZ0hczwk7odD2%Y%qtWK1 zA!KaYG9qB;ve|0Ndq`CP!{6Pr%DrKd1M`6DoAMvdkkDxui4KD4GNAXnR8XtKKZ|GFT zwl~lhmJ;dy2Fgg|koX&X_=d7cs-L^TRZBd6|5NZ}3s5d;6B*7mn9*Wv4#_tF3D{um zHpd6#G|ZN)7)kHZ8>qmXHf0(Nd0&z9<%Y?@Wx40{@rq|Iq*Mm&7UkR}6JVZ0b{yu1+4C-fKZg0KBrb9X-jGaJ7r4+mImcH4) zrhFhi9;6Jg#rqPyH(D`oy1Ja*dzjXM=SfZEQc|w>|CnO))d-l?^Jb05_Am+YmNvCv z-VNFSa}ylPm0U=x>Z|AhLq#K?##ob_AdhcyIdX58ZMo}Z>x{j@sOQYi7FgWb2K^k; z2_ZclbR`%E*Z1(!l0b53SgWNy7)1s)L>;lZh57K}Je?x~;Zgb-_9+dfm9|35fL1$G zFP_@4cMBba&Vq(+Tfbso=xfcw-Rt^M-`UxJVVyT7%h&qc#oF0i0{Kk)02=2ZN@1 zJw`cqj^fzdL*~&r$lnzAz(0vw0y{`W=QT5qVr%&}E#I!?JGA^{Ek9MuPt)?#wfqb% zf9h&2KTFHcZp_cs>heGfTHOLX(MiKY7Er{VB_@IOkxBbeA%((LZVdPWtQg`d4qW#P zW5k*p%6MtGLVyf?w1REWSXiN-L5?Vj4;&d~1ad22XI9i?i^!JGOkKCSRg{D-2 zb^A>IwgnfIvp--I@K-<|V6lHA)|fYHae85)M@wXXIS!Q}Tp?@$|J5a$pw&@Nt9m*L z*TZ*4Y21av%rMy?h!(Jic5#}!4w`G~|DjK;Wei**5SLpbfNVEhj!`;_?x$8SgGu@@ z$=99Ogd{@@k?2K_(X(++%@@!y<(x@(TbKI%!~(!{qX|C@wu+B|4IGe zLf`Bx`E2$jig{sERQ|k1ir$9_K5y72aP|D|+*>x{girv6cpiNRRyU4GWTpfqO1tVi zo8c2+R$6Zh$_4Y1_P|W}Z!bqn46F*;-P~&V!x=RFSgOE42?CoCh~?xa1y;JFkW*9Q zFvv}fF>Y)}CpLA8`vtxX_X^REAt3_aW2yZZBHVTexNzBDbzF%)L7ifvn=deY7UDjJ z%YcOC`H)(`0IN zUk!J|U2p@a(2qQ*n!1OcxI$|YkCnQtstvp2?|I@KAK}-Jp9w&Xz%LQMG5Dq9$C zn+m8Hv9s>~u^rZSs6hL5T7a4Tu* z!gL$B93dWhmgTX|SvB8eY~J&KrH{%Oo*LovY-Uo-j8sob`v;;Y-;xj4XZ z5WUv4x*^viXHyv^1~Je~RWEilnL%qXHRP+k8isHkN-|sdWu!WX-=^vWQQhTL;ePh5 z3wZsX6<`@EVBLiU`0l%Unv7c=VE$q!xM`c3pNugo8JeLO9AVE2xStvVa+~t6&UGu7 z>SnbY`T@{jBc-H{{4|h?spmON*>a1O%XM?L?UqTcJp5{eYb9x{@l>R4{crK6Qtz8? zQa+RRw5S8s(vP9yZj$Q%3r}@mp?s4%aHD*kI&d>6WWXym1mUme!-Bt8apZO6lWiUo z#_=A^&rtewlxyng5Z|b~sfXAO{2`Vyab-5W#L*O$>r_&G_nT)ZBmMKD5DM17GkF;A z+-sB+gw0eW5f(4Pf=cd6IXU-E*^zsXY|m9NyA#)^R3bgPk12RFKEOjv!5h?pH8O4o zl3^fkU?Y?v2kuv{MIcFwgID3hP9Kx;LAVO0@#?Hm5~w=hE(A$17T@T7B>etw5lyEz z{u!btoQxp);Wz&m(f<i@L{swK}kJ%NnWv-_R23z>+Q3$=9j_`C<2b zqRR!f0uv_QmRPco86!`8ajRrzZoq(`$40n)sA3=%5H&r8H<(6iNz_$OAt2` zR1rLck5y>;Ae3F#ZYh$lR|oE>Md5c61>H>)bdRzNaXiR4_#1p22IT}FQ;X9bCDn0o zE0oJa_;`SFQSq?=QF}IGlv3Gxss0XpaJJe7wkkD{v!v%vJbkrU(En{}>$w6z>gDOq zmWtI_59tGqu0b+vX0307u|9mn;3KBpb^glW==#I_D>I1A*@MjRPuI_Z+xgCH!hJbs zmf(aV(nQy{DN!>%@SXX-Ji>P-AB!Q*$Lg`rgnrJH_62j#XCd;1fzZbnE0#@-3+Dbq z?TFH=GBT^OGymGxYF9=R_bm1ENq0459dCh+VczR^+dcl`)Dm3RiY1(wgjAwa>&5B* z+EgCk|=V(m+f4DpM_^7ID@y}!?$v^@VOn@k;k%t9?3I=Q9peAS{ zsKJDk#E5~~Dy7l33Udgy1cE2AnVe2vS9E{ zQYvU7__9!H5q!xZ>;M1w(hEua2z>bqlm7|u{mHZZUU2^=zFAns!K0XE?CYFPS4&v0Pg_exjBsIm)ePZ(D&njB90kX} zt)UfJG8^oCGCiDuJJzy7I2x}#o(Dpsmd&2>C%glf6@on;VRe=+dCbf8s9qU(z^55# zlvO5-!UUz( zXYG`@aB;5A;rB8z3pv1Jeit$a>+5ogMUIJ5gqX|8xh7IJoAIGUkYkk~;EP!$C#{{( zHT7dkSz01w^&)*rv0f#By-<2R;`pj*6_wPz8#tAg&2B0@AC1ZddBw%_(yE>f zJMu+1iurI9UuO6V3|x%PS{ePSw@o~v;&k;zFep-8sLiAtxzX@xx`SQ{Qm-wBsusEP zTIGx~_+;@(XPh#gM-Iz)$_g1z%k$vw)~v+{zNU7U%@m_3E&9UHBE{P2R?=2{venD% z>dA1y98R%B_LO8tk!lD&(Ir*JL8KOg;b&224X>7es^`nU1*oxx$E$CtBtLShQ}2uz zrf8rtRctkncm*Hl#jJ{x_6-7SFf@^jwN&v*`wEL2l|6Ro{U6hUf8gsmGFW@U2R}Yd zGLbfmPu^$s)>v!vtR7u07sPwkWv@Z|c;zUxZ1#9Cnci6(S(_&_yR=b|R0fW>$7Oi~ zS_)ZIHf^m>P_84R)9{o0s^GkHe`UTGFfta(mi`z}wgd7sn`Qv3MYbr;VV=1aMcWE=cp>K_}s%`XNSPfzDgkeJREwhNFVd% zpELCqpM}1TvBN6My$>zn8oxc3$4I(8dKrJ0@sQe9mfM;xb1rk(WmV?sy_z15SiilA z0Y@tHxabO~JkH!*_#MgWDVYXw6gFBIWfhS0_fe6xTu7aSP!RUTNc{th#k%1*`rKO@ zM?ugtKt~q%>>LP34NFJJiJHDpJcY0$F-pgiYMDO zTU(*dq+hjNW)Ts;)wIFy|L%NG64Y{B^p<3Hs7%&neWf~s8)y9A&GX5XJ@K$l7u}E? zE=#QKx3$mgIG*P7N9D%EPO-Y1R!{dBlO)%8$#t65X}*5NZAWHy#L|4TTO`-9vh%%R z^eX-**}Yudyd2#Uf*H$e6+7*N2woFeT6jWyR`6*Ff&AnPLE=6qCD(chZRz#w-s)Zu4kq}zOrzH0D zB+YffkHrnliOJ*eUH`*WTp3zYX#Cbb+gy+vw@**zTUF@fk-3#q9wItHK?&bE4(+%h zlJ)<)jy@{llaKA_kx$l9PEJER`lYAd-%-n3gIL*_*Md09D97>^t@ayu0Yd_u>Gk%l zrwX8LFK75Z9zxXYnmkcNF!b5c+<;o=AB=8x>Ii=Ua97FUGM_dS!+6tlA1u z<<%@A3Jy2g#z=KF6_7$5X=dShMs{WW739;Vo#k0qhZmqo>BbA?1sw+%U6#uDvs zI3Zyt6eNmwFR}4gTE1%Q4u8=d5U-}y+yj(mg)g@A^X~|R23Dk41L8LoDeiNV*n=ab`=X_aCdxkltDoB3>@WbWrnQ@o>}(GU+g!nmMWKoAomDDtt;^Uk;jpNmWYy;4moP+xt-2iuRo6swym(4J9(uQ7n(Y(&nDU$&lu<;93M+3e_gPLU)+zG(`nf?nNO`N@ z+8cT=d=BgD%>4J-Qt&_4cHQ`R>s9>lLnbOYWG7?(K57rW)bL;2HHlYG;y*p1ac+o0 zg67=t}aHt;`UQ5bh`;!9iTJ&dRk)C1nzsx z6Dh&FPvhirP4Jg5R{3^EHu$MeoY>&OdLVj(m(8Jq$EZX%9f9Fyd!R#ZTT_X(%Q4f5s`aC*Hr z^h(2JZhc$iBkm9S8_tGE>~xE~I3&B1aqWI;8v+Y z5_&b*a)M&kE6xn{{goHriO{PnFLE`+bIFN(**U|_Wxv8Z&^81!dpj;f$DV9d((2u4(9V@(ftRkTFJFkXJ0nh#(>7e0)8y)L)^#n-mQ$PC z+A%JxC1kh0q#FAhYJh^F?~o_@4%c+B1a3{}JM4Hx_&itNVWI3uAENJ2N0FiW4nLPd z&ROh}>N`~GGn;dv_gO@$t%!osk}`v0sD^7i4}J`b&Rc2Kc@k-0Wi*%njzb?)C1KUji)LG z+>_r)BesufQJ-0nR)6XS-YY7r)E{?KutKeWK;R)k-NK8ALSXFbl@>CZMUpS%HQ;o~DMk;0NV}F0O0% zv!mNUSJ>u<6v>w&W5kUlMOFkFlytMVrCE?f%3;?^&^+sh1~PD!uS}OTs};ga|0(>6piZxON9kT z6Y4RxSenC;k0fU;P4=Q-4>b+2Y;ao&C)FRlc30E!5z_9nX2-C8@II^`yh}fb<#inR zLiAwij+)y8xOE71t;jS|L*<88rJCFQb|Co69$yFOlx)@hJ~V=U5qH5czNm{yQ0kEq zA#y*k#Veh0w7N=(6tuQiSO#tbfqV%jIz?`ue3G@g{^0MJiMaL!aSHf8M$bsY6f zmzi0P9WkpT2CG&o1`irn0t8NY!69xEb~;+#u4cU=+FQcWl98peYZ$(4P2$VZ*1EX* zGCYifGW$OoWyZjdx1D`8`CIFbMj8ccV9?8R>a%VH?*kYgwR{}_{A=h#6n5jf`jHT- z9J{P7{c1dc(F7PY2@E=mkLf+7IdZ_qlb2voJzSwQPxkSA^+gut=u+`kIB)v)260BJ zB+$n5l@;~zdP2VJQz35uB6SBBN6HUiek6KzDzfNMTSo%jcblDpW*rH1=UvdOBZ2O` z3z}^w-pgS*WPdiaC}$;`Bgch)b6X%%9t#Pppo?pO*;7H^MQ0`Yaj;oD^;o6t2|V2(uR^%vBRH;GBWNh6&`Y?xTXbWx z&8ofJgeKK*9K0OGZ89=~K=4U_iJhr7bKGV3;BDUIQX+IZB)eQ2JhO@5|m7OmgMC1&SeyLZgvY`znXqt0{&v@>ZG7+v|Hw;IjCm~5OXr%lchzi( zA=4N26TCF&@mzM2e;Qu4{3Amt#$MC*ugZx&hQawMtk&=t+x=)0|Alv>E{%Kbom9y|@$G=|+5EhqYAkqV?5r_#k zO_gCMcHH6FM}J6m^B@sg9X@1u=F>kkvuJN?a1YNs}&Jv>)=R$hyEprT4ifI+>POlfNDXKgF1>0U|)pUBK*%5Z|{>=9N+p9p{?kIdwu z#7uVeA%11(iZ>AY(%u)3nN!VI?f@)c8cLeHv3oFse((CcDN60H4348T4c^VJxs$F<$;2gcVqcy$S; zItGc)I%Lj?q3eQ~k2-{lpi;Agg^3Ap=S%yW4yYY^zN}swXZPs9{edW74L-9Y&+5>J znPNH2G(Jv`lZP2E+P@!rnE5tEh8|`P0?_~UVFogiP*41B_mI;JA}tOw41T7%mP=i0 z0XDO8o(Xw__jaj?J^Dx!y;6ee4PDx%c!A4RJv);e!>4~jR+QL&#nizHK#pFs=4DoQ z^kvFL^KHavd4>=FZ$->wRoP$%Ha)64K)6hRUzvzg4MU&L{+wj*5uw4}3uBMe?W7X9 zM{Vukd5yCgHa!U8{>o&!ywFW<#g&}>YS`*J)F@d0qH6UGc+6@H?f!?OM74Txt2k2p zuO@*QEYn@7WVN{(n}~8I>U-+NhxxK>q6h1}R#`A;q9O~&Q|o61FK+!cz$c27aZr4T z!%lSDd2!}$#povLJQh5o+ysQv<-Cpc zh^S%)B!Vq77gqtsrM^NdvOu(HLnk1^|7zay`=tY;lO3oMP-(e=w!zSbDbb1dz}*4! z(7WMc+#Ho2ieFNpKARw$)2y0+b-mw8k2b<4!V*0Xe@ArHC?R0Q)hpwM?ok8g9rjbh zx^&>NAzjLornO60>C)HuG)MvBz|rXz+PEHo@*mRru(=!M%w5E-GGW85LAEH@n9IQA>AFkl)Y%vAI6b;qc z+FFCtWGq?S!6ogi6H+0%DYCHoE0vs$wZCEr33L96oVHz7E?{*`@y$swMjY#C5BpE` z)^&CCWi-9!ZG*-pvLKYcGt(Mpb?TgD$2!}?B~}sI<@qrbdv6YSTHX^!GcTKzw6=s$t)5s zIZ2A1rI%<1V>zu_wYLjdILh6LHl=-4hkC2`s^3Xbr_1n;B78W>!s7DlM|`lSvI;7c zh*bp+Vv?Do#sAPQyhs`+)n}ympz)Y_I7j46St4gTQ-mFenHmF}eNR`Dw;=Sas3VRF zSXd2|_M@j)+V9Auj2vrkq*05d`uYTUOER6T*KlVCW&o$+U@Ot}HDe^;OApoJRySKPW8_^b=XR;5xYSAVN) z^KZ>m|JEz>A?Nx&aWzoS2oDbxVrBI$mgIo_rp9N-09P0k4r&26u6K@RC=Loanej8K z6&cq>dfI1LMlKuJ`656Pb6TRXQtICksY=`9b=&$dbYE&8`>Qn!^IiY-<;=< zZyuMD&MA{Ah|G%I2XfoFa_6?4J9jHnU$`H;$~&#exTa~1mrM66i;NuO zs(NpA^+NTBHPm`S`qUdb1&}@!+Oc9Xpoih9U^~5!kRT^&;HG5+>T`mNTaowNH3CP_ z5`=}Dbu4s7=Xcx}T9mc!EhcM?Kh)FkniMS}WgoAxhCRNWk9i})&Q8B8V0SwNRu4tf zY7QRHJd=Pd6oPtnoca2JTC+W~|C|6YM(7Qh!EJ+p@pavgEYa}08>oo4Wik0yH=_dO z+gF=?qTrak7H}x0rdsir{n-E!ARUNlddwqa`lQ>CBl!{wHoOS20YS%( zT8sLPN%$DmN+VaLoSzcLEIy`5mMC>XviiO&EhKYHYYG>FyHIfq*;o11Phi2xC9!_( zNeKi%UDY^E?#zluSXAHI)(;&igKpU}tbec3N-+7WDK>KTX_>{qKV zua*&Jh0vOr&cZjQXkf;0ITZC5!4ci)K%EN8GP7SszwZ&R{Ut5nlC4BtNO5NYZI6dK z4PsjN-9zmy``6_^C2I|$al9cfF%N0L7LkBZz78d;GR-=U#}T?uQm#e@s~r7@qeEyN zPM5?9&w~&OU#!;LORt%1X5rrdU{jQ5>x4Lb5RC@aL|T6Lgck{IoxLb)>Egk2+~!<( zNOkag1kMpB2|6sMra-fvbQXfO&%BExYyy;30!qPBaTar5eagZLHJQq-XSuU{8`{Y< zZ8*$>_3mxQXLg)QL+LehlVEK;Tr`DWUX{vjpb95Z7E{Yn$=+#gkiU@@#lNA?6y*h5 zUISpEtBR%sTjXkvKvpgNe5+V4yi>I0q&!n0k*flzPzYD@n9k-<@+$SSReA=w6=RWZ z5a725@77z)M%_VOTg(16BiDVcNcX*AWpshv#sSQP}34 zGs?)0UQOhvmAPVmQ#cZ0*lT01*B*SjsTf0eU$1!m-Qy_Su+%ANmo=rE*lAE_`9)hIt+k9(J-zd2qt?m({+HbeNojISmwA+JTCA zGS*IMw&Rtf#~O7z8AH9{?1JM}Rop)8-8rZ#vHboSDCvz9nOMg1pYg0Feu*x+Be2qn za*Z*|b0l<&pMTVsKhMY7W%@OEjRj!*+VhRsH`KRiMR?G~PE;Z(Xy;~X0~Fmm6@ zfl+)Ah;RlEEsqGN09#vIiz6CfC#8fAIt{4@+G#)L4d>nRz)VuD;^hv7f!o1-%8=m1 zQtok8&F|huCd=-9Ui^v zPv&MtO%iR#nexiYLE<6@U^$yDpMlDzw2-A&Z+LR`@~cRJrVVwPLuUpxQPsn@s&L^}7ECXT<8bOl1PX4TDuUGEjkJ>0Da~7o{Fh|rCvwwqMR*S z2S%QH_bHZHo=2VHuPg5S60=SfT97Ng(`FVB)8aXXvG8FqvN1DiJO?7wXV$*^up?ra zsD4iANUnNnu##y`CHC!A%YkZ2y|1c1UEjx`@suN~fm|}eYn~LZJ)^7Z<27mz`Pet@ zK#dCVC~`p~uYRV}^otJ-Y1(`??zHX{7uQ!3quc6A2sVVcYkqEPDiw*51O(*`gax%I zi+_R2yT5?uF9jx>uU9738npd^_ z_vxsGmt{rL)P7iGt2ZK+5ECQSQz8p;+qxpv6LC5bsh%;kFXrLmK|;Y&CZc2(IFwU^ zU&gKRvGX)7f_A6+=(}BI>bIGphV|75|+OArx|PZjh8@ zq5%Xxn&)`T)p;H`zTzqRwAqjr!6E`TQEwsx?C~_~8BBI5_(UU`Alhz3V*O;Qb3uZq zJxzM8g;Sp{E|zQ8%#JtH2VPwNCdr=lJLOt3V?YU?3i5`1=8j^kTVE^`W^k6osM0)` zzBB{>AkMZWY~daeC1uvsmn@Eq3qI+szj5iZ(7uM$Wucx`!TOtTTo&5ZP=rBo!|Z}R z%gnn{E;XhsE2{MC#eN)Fn=JMT%h1dTP=b57_B^xwewOXm!0t$zXxk?|R%ratV(9An z3k0@}7-+lB5U*PPeYVGHwHWZ}JI+g%Kco|`NhF-R{4t$Slt>u6{P#LxS|Y(U_8c-c zNb=P(q!K*})NgKFHOd`QP=++p84#C;ezGlt71SDM6*@2!d>0^0mn@#J8q^V6MEuxl z++aoTOj(AqLq`hZHvXQ!WA}0Mcxv!&IV%L8OsPF#ER9~1=JX=`nF{rpWO@coxV=-$ii$7@rb+%@=w_Z=p+z6MDdYW_)0P$8l_H}O zFB(aFT*g$~6wZ)87YY`;R(^WZT7OvLCg{oE}2W!rH}7gBbVI*7lm{T}fzl0j-_8k1rJpma$O%7?w$pHH!@< z7lOb>5$bA4DcB$1Bz39jT&9U5B)#gFs3omK=uf5KRJ9hqp)&II7&#FE*>l|M64_)_ zqsU~$y(TAKB;FC;M2m)#Eh5L0Y9WQ>xZAHb@=2C@_aF~|f(rgi&`*&C&ZWT%sBV#k zw%*iFgX$@)?`j;QLG%eSpPJ9ZeFLZJZ?XD0vn?HnFU^++BBA&?J7Otj``f;uYtZVL z$}ZS+SL!^o_hhkgS~UebmQcYGpr=tXx?WspJtYm?H*kF5z%-8V_PR6jzPl~c9v{uIUn-g1mGlKK9}LO-WK-@kDxtFlKLe3YOXe&f79!x=M@uG?& zqRmYxX)y`0DmAAKo|0+V{r=B&|>oa)?)8gyg%`jmbz z3k>v8eqa3@1hrM_aXw&1NALW%wa>}l2jh2^<73OAh?Q^+fz3??uX#m8VIejTRj@rY zQtY>q8l6`bE%_~X+5>M@a?cf-aD-@7>Ntq{2R*d6Yp44x-|1C;>sk~@*Ik6MUppF% z#z|e;*BSAdyFCl4BiH)XDGCYVPx6M?oy;n~hx4DEL*8ojy8Dd{IJ4X96;EcaB&=F} z?pwf^GX*-RVntR zjCRDZ(IPus;7^USuBXOXx&nw`6ObVQamF|YAlnN{a|+6(_Mm50nLjda)@Xfgsp;@1 zg2*y~Leqx+z=t+HYgp5-{qv^()-j%h>`aWYc0aBe$`ndT3JWYMb1VSnOm`=)LVWf^_CyEPq%ikm3h@hGPU)JkN(nr zT9aG&MOm0mw$`1Bel;L<=608!@=|i8&Z&DeGyFEW3icP)#nI`y*8EGF*)<|k*FUI| z++nJjLsgP_uNkV6%=;x;10VipYP3y;FU^FGhkZnBiX*_^p;Bm&W;7J+hrqge&*DJ` zZI=duEwb*(_)_6u#^_vZ_KYdg@w3^ToxWeIo*;`0&Y9uAIYUIt{$K0xqz`nMPJCua zC+z<&*x%H6%41B4mLE{(vRBLT`giarLh687`#kgDduDrj-#etmjpLMmyo5mvB9`El zmny-Xwr6pbHwO1s0o>+|m~#gP5an?@U6={NtK$2zSzp`iP`fXYL4rn1Qt;l=e}GGZ zQ0HredR%|x3o|Rw8S75#4-)AlhTr}d0Aj{QuAFk){*h9jZ{Pa&DsnuYb)y;4+(gax zqra;p@n5W4sv3Y^Ie75frpAAGFi+UuR(c9K%s2t?Gi>@W7fZ;vgN%U80qM=ffE53k z)q&87@MoLW#XUyq^`R5S-+8TcJ34j!dym=i_?q*9sq09Tx$zYTe_47oF`Bi3`Vsb| z`gHp&Cv&48U5eB4PejgwrCRG}1`t)8SD$i&J(cJXQE6UrF8DLpX=e>h5hVxC2}7AM zL~p`|A+P4z9^O!t9IWn0V?S#UX;xdtrLD_f!)J5g($?GgYkUDu6MYv8G!P*bw`QO$ zV#a*Ni{e@1&MO%2)mh?^Hi$w zs`#%cpme?O23O1^8romtR+&*Bmgk#!)&a`z?TGrLELV^HCs*>P?a^ce(swQ!8tFLd zS|{7mE;XB+R?TK<^%`0^pH{DIO*7x~IjwHF`~!U+DSb|xGc7zlT7Fb1fClvx{aN$i zKV;2(o5tnK4!+c<_cifK#m~=%`>$?IQ@`e2>j3)eQ|(|)wfaIL;k5d+;1lDlor@Q$ zGHJHUp4W8w^l))o8rXxQfZk}yE;BY_)#=faAEIfyYK)_CyK01ad}*-dE9~dAb35(O zyXnR@$_86%NyT~0P~luvH43i?GOc&p(l5Q|`!3vnAP_hW&P$y~4Q0eRJmoiD`3*t? z4t(xTJG^A8Tk_k(;l~f z%p*c3I0FVM4b-Q6pmF@~IG=n&Ke?^{88h&I|4~NPkNN$E-yiwC!7t7)m$6RfcLBfo z{4`c3;PD*?9=AP|gvXDL4THx^ylQv=pWqWs0+9-}?C+9Cv%jbd4*75rg=YJI=;zSH zbB~g^>wSq8lK4Basr#hNuX*AqJ<6@vfy2;B-X%Xr$rJ|+L%+0Ao-aQ8kQM)L#`grj zE`A62y~8h!u}$DNmEWiNRq%6HX0cD*-8`&!S3sZ zrFLn{zMkh2Y|ozyOJ_nYIergX_MvDemVKk7^k`igm41xkL^Z*+?fcsMjI$=a&$jQh z_u2NPSRKf?#k8+PO#9|Y)xY6dueDUc4&}lQVbSOs_bK`KY1l3MG@X{UR1#WrZs|sq z)q@64WhFim(9~7Gm>|YjhZe(J!0ol+^H^dktHI6fe_@SvRIIUtYaR3RsigOh4!7gEj6*FIe zE@rCj7do5e$v$yKhrmY?7r{)4ec*Tm^1LH|S8JgruBDw_jA#LcCbbdeE2KWq!vZzu zenE~&tROKL)N&P2z&=;(12fE9`;pK>8tl}kg$|&1V~^IxgafbA56lN&)Mi;?7LqW@ z0=*iiFr|Y$Kk6O{`@h6y^3vZBjaOHghx0_#g4^5Dxb@sibsUmb&5q*Ac-2hqx5`)( z+z7^3EmyVrahh;L;?U0<9^bU~0(`e12Mkh^__zHsi&}(&gTgL$U1_KP{q6j@4n6)M z?Ywd%+0O0%w4Huw=durJN8)JV!mg%p$pyxxX4&n2Yr*YSt+N8PKd5y6N3dl3>^ zWoS+H;|fVIvrcgl#dKlfm4-G3+cJ6)xJ~ZQ5WS#SWYN*^$PhYHVrohZE~twXomCYO2P$WPVg*a4-F*`@cX3?S6F(vaNoOaO0;$jd4?(`z?u^*(ZVDmDNqHhWR zkday!s4Hy^e0iR_y9`%IJg@xp52&^K4nn?LR17k~`Pl?7D z(Rv(E|3HI!sepPB|411s|0(>Flg)v28ecvd(&C^(H#|l|I)E)y!M0_Qz=y!P3L$~| zaXz*06E)PQd|$CA28&H~ik&89FzEM2QV`Nb=8Dv~GZ{4?VC}{$c1+&G>y1+)H%=S$*DoBz z%~>Av<{S^gKq@K$G`O^<)8f^hW#B`Gi6K_PArH3nWYEgW)=ON6=0viiUz5l!(Q9)b zu2}f+!|FyRLez~ve}~8XeApAYayk3y(#Vy!TV3L!Ox)N*EVLGF@Cn$E2O!YAf%quQ zSfjNUch$>+6sO4!T`5|U85WJ;5rWobfyk09ZklsimyC-n$;In8?z&r-Ou;XAVXlG8 zwJdUZ>|MI@$53Dv`+_MXv)|+CDo!J1?BulkZ_Y>K@MGS-U+@tluBM`?!ImbTwKCV# z@M_8-3qcTzq0Mf-3|2sL_lS2hG39#Lq+H4<26qG@Hvz@u;QDb}SSQnS0n* z4#G+-I#67&M}33OlY6>L|KXkd0&1~73^&D6wEWQIp2<5hI)23v+ny!HV_{uxILj(M zXe~Ox7qYf>g&_nOdE%K-E+j8j6aQPZ5yKNMliS{K@G=hrG0rNi%R%g9k87*TvBw~T z3TGD9oib7j>;4f=`3*|I{o++XO}zu`i&;l-Fd^!zJ=sSxy2GdsPgDoaL0|Gn@b1M_ z+JLwycn>!kjAF9lf@%lvfvsqkydN<$Yq;he~YU>3nP16O3f?ci?5F!8}pC zVubac^==c)hTRWk$@0(n!tVPT0sP%%?qrNeQksqPfI<~5b>dSd(_{Jt50i&(n zCh^Lbt?EEQ?wUAcH6+2_4Lww|&vSim)#Vb$t1+{%ie7X&D`LDE zFK#GeL%>7fs#NPvzeKe&i@ZF~4@iuNCXAPaMu=rG2djd1U-v>7mCA}fF=s~a;O$gm zp~37#8&0u<;R~zdwN&4B;&fO!zvUe7yXr|l>jEWEsfih<>DEPZsdTzTk-x$dT_-S^ zv`hSqaYQ=IM@H69TX5+|?SDrmVw~)_^<=8mixJS3UL3R4#rEDBi>08+JHTwueotmYLUShN@`y29diZZByaLsLy66p;9{!k=A@ndw3D+NW!F5u(~?J{0xwr`YvOpHA4 z^kbt`cx6P7DxzQPD?UkY?t%@lbbfl{6h|RYS7W(g##F&g!M);b$42`4ORgRc>|o3H zXq|Y`&F{)JN=Lz-`jNE*??hU985~YeqMP|EkY6YJS?t_ZzWQ@-z_~!n3$J7$otfS8 zB7d#pk(OQL>v%JzChDIRX%SF5kd%0)r`AwacgMk$3QK3h*Fwwl6pQ*>cA?q{l)>+EOTn$G z&K%t!(2Z=6N+6#UH4@nFjVz;RCV7Wojp-s{w$gI5R-6WQ=QS*-yEFGU#C z_sMRaS{Yu<%#Jr7+9c&X#dr>Fk)}Zt$sd(YTmJO}4@*nF7O8|u_BQM6iA+*})MBTR zGN%nfzTMAt=WN;tHXo)j+8L8*Ct8LlJKYXm8xytZF=y{7vwL-!%`&|jQkEX~)u9u? zmNEeBB7w&47rI%g4UM0>F#1WDV)>($E(kG?O zInmqUoxzpsJ_((uq_rf~a_EqKmteLm9XuHFZ{Inv3of~hd&A--y9SZOzJHEUPNgiQ zpFq!oCd^&@{j^ok$fdApPW{#fA)A6YcQcfNZ9*``Gp4sWI!KkX_c;A5LE!c}bL0}t zd;jkU=DbG}OX!0Hvqd&4p>x@g!TON}do&T$C^>`({`_NzprGVO5W(X@+FT+i**=;G zUcW--VmJ}JSEhZ7CW3L}%7S)i#2^)PW^y=+-Gt__Y*LzHVBYC$3;N%_4k1s+4S!pQ z{Z~k3>|-ehEWal)v%?7FkA=#;sQV_9_c2timwG;i%3THyeSpf9k|+d0K7L$ZWhYCQ zN}O#Pyu4cuT?s-yNWula4heV2xjK*DwRI(7*0+rTK`u3IbjW3zLk{sH%KSOc5JXZP z@+mteJ~NaMuUkkz7ViVB6u?}#{W{>PHU)4@rI z=aFDbFHkeEQFA0k2ZbhtB!Anb%{CvF| zMD#N^fI~=TxHL&FgDtHT(2GZAf7k{)tiiLL1|39nngg;evPTqb>r0i*_Cr_Tuu5Kj zNcS2^kl?RNsFRGPeTxa9eU#<*^G|}(cMe7Am8XB$V(hCDJcm6R9NTa{!(~|J(l4v! zXG{PvjcxtjH2H#LrUf?JTU6^k`>^xC)_$9gTz)JLL1&O*`0 zq#|=V<%Eo$BjvYfW`93uzfmR}c7NkHIEq9z$)X5t*(xQPFN4$9Jih4h3IgAw!ThxF z_ONixTfR+^fj2Y@Cy$_}%feZ@9`>JWiPtJ$Tt-fES-K^-YWZN#95U&WkmSE4s|%O& z9@O*Y6m+@{tNvwnsQuwwtGnPBXgyeS_OX)CvxXwab>@3=sCazi;KxL>?>|&X)6St{ zNV~uO5s=c|6xw)YB(8IKkmF^^&b}8s?XHsGq(=Oj& z+K=C_5$1hNyW~zX?LQGBujdw~U6z0_?Z0;MTs|h(zSQ|415PmQ8kEj1bQj^2r44u2 zkwp|~k%h)C6Nqe-Cm6TnUQ?uxg3f;9vgzzka;l5^pM3vLGgWq)U97(k>@=7;c%mDm zVcYuGb{y%b^{?+ZNHG7`JI1Y0z3z*Vjp&AY5^eR@n1 zwpwVubk9Mj1cg~SWFvAgPnMR8_%30q{4b5CY(z7LZbXtDVq^z(6?&jU&h5ji80}Qy zwC%vd(#J)3^RH?Onc(3Ey9f`jQC{ez@bC*AI(hHEN+;U@q|*Ur#_faNfUKzA%!)jX zDft*o;QROCTbK~fk^zWmNo0e}OGI-dk*G+aoP(z`cS0mz{um-D4AVyt$tkEHCy1nE z`)DHhRc>EhBDrU-NH*|=^nhT7UfFnk88VT=A`a*2HIAy*ALxm+^f45kUXRAo|MtBN z^(xXN0lvP|?sJl%mq*xAXjxcPgdtK9te|rU*E{JEP67wDoE&+SX4`c2B@UGA?>iOY zk@xF;bl1|y>OVNr4C&_}VT^1NRua6CO0ZIV`9F1U#nasonT9hq=}kpV-(=xxbaTbd zU_y9*%qLOMUw_o{Lp_47kL>*+OXHcy;9g^MwDhrEPNa9Ar#YgeJY`7RPA}aBGLxP< z-2k&#CgPVO)R7RBbT;oX?uzPhNA+YyG~?p%ntTgHqCyL-UT7{tl*2q1X<0_Fc`7u^ znMe_hI5by8BeF&#?upZwDpCWv%t16FAEGsI_fkvWOC(11l-ZW~u+T5~&Pa>!1lE9n zi1Vx~AvvNYBvRawkVtvU$+=-T;niCOGmlI|vOAf0FD`RrvzBh#X(iNQ+;3{`!xJvn zA`iLr2_4a565W^&LeW70f7yT&}(gY$j%snY-lbyMJ%kN0`tc|irCvTMQ?^RY*PUn07V(E4= zx+2cOWBvlS;ho{p&PM1oZGYR+gL02U$HMIB4v%Qg8LVq5f6pI0sAz z$?Cm{gJyh_oEiJhVCS`V<-b7mpQ05rIaY>thG&8`(rm~PA{eRjLpu$d595b_Xh<(} zaK<`P&~Cn-K$PtfE!rq{@T6dmizwF7e}*Wjh%aPTG^Pov=n43wsB*|f6%lX$e}XD# zv&}`IBe-B+}{QUmrJ>jVwMfMbRGO02Gwb`X3B`ud_$Nw&iW;}tZz`jnlPueZygSRdb{_c>RQ87E|F z)t@1rTXXI6oow)+8}v=Mvq}v+>I&eqH?#r$RLJbMYxK*YC20Teh#K_;^Z%fX*_Er5L=$@R2Y+}5b?9MFSwuc-CawCJn;7UJva+AJoG1$&YazO+UU@wq@0F}<*STp6Vo z?9sQ|+WaC2c8pvqv#ryrqj$ukC2@=z0A9<5vSnOPFob>Paj$V9X0y?2{cP`txYUUF zqAiNQj&!_IUG*J}p~!RgxbEFxPv=V!olS0hzvl1JMOn@sP5f$lpi{WY2~gIFL9-7e zFW45^9vMGj+meBo3id3GWay3+;ItT0quoi#AFQ~<`$-wL#%0B5yB zyV&>25A415(B3yPa2oR*D)Fm=(qj28>#C_o}wV6gQ95Qe#q zW_|~4ji~?9=(RL^G@7|SQvP_TG}e%cFIpk&X5#^mg>Re@_+sfP-6vI`BO4)<%Y5LC zOOIXLbS*l$_iehMmNFy!%{Y<~v$`$gu=V2JH_!m}NeScd3N&teeW*xDzfAg-(T@r) zAG8P9=LpYt_FrX2_bt}fXPx-`5!K)0k-FbUO4}pGK2SRqUCmYJiB~`O?k!wzxyF{_|Z7)t#u|MdFn~VD6;PN~nX2xcepcWnU5yIhdG@FRh^8)Kd`LAK2 z5P)}Hq!F#1gCGJJA=+VwSvcSV+Rw4M@FqTd;LY52Viz>5L;h+L_ z&=G31098B+FF}>&RPUsYF1Da+0-$}cLksDmPD=zbVVg3Ew*O)9iiP5_6+Qq zyek|yHm0PEgH}xRO7V1rCM$*shPb|%C2FwBgAX2s?`cz|8*eQ%JFZeU283g^*|`VI zm>)-GC-TGyPV4cafnGALrG54396Z+Mo3XUD=;fz}N13sJXy}i?nR0tq{LVa8MkRJY zo|f`d+l7i^$rP$7cGNdr3Vybx;G9PHxLU8#B>_Tmo-;yv0Cr>5{lyxIM88w*(!DaW zB<(ZozFt-=dq)PJo_!vfWxMf~xi*aBu{(@$RI#6(R{XZ6WW*#G=t@c_mG85yRa20+ zV;RCJ2p#TDHB6JZTpLN0apC~mf8&I9gr_X~P#+4ip1zHo;qV}rO9grSrt!OoUm?HC z`OW1wkKYu2<@~hDu=*Y-6t` z?OoQAS)o0+w66NAJY>#O7Uc$d&GnppW#=U2UaA9nOL{m1c%Ya`Z68 z0eZI#!-1u!dZU5O3N~Z61i$q-eF-)ro?z9?qJ>5|y}z7mAXLix=%FZdU&yPdj_;smFaYiAzBg!rH}CkVFo^Cr-) z4z!KL8q^6V*I^P)?i`Flo#=7AK5CzaZD{h<2_`3|qjIRPs;VD}+c&%gEo9SEi@ry5 zy;w(NY!8oxwGAx@gh$~B4VkLAb_>{({z{fO_we=f@XV4Pf4DhzLLO_E}mun`{aV4m=|<1 z@omBfd6D_kFC2;5#xKsixgmU1NsVvYI;Ku6Qf_4CUp5!mX zP@*iSwQL+SfwLYw)wP!4o^BeXV?=T5g0UbiC?VvdGSHSXrvYn74yiDBfjL)({d1}e ze|O0g_5i^ctjWL`VWj$_)iYqG;Z#3GLz%jvX}aP(-AFDCO1m_V==T}E*VN;b`~=>L z#EgQiy932|^g3|RsI4)Y3hOYf;JInRC3)7`K+_d<;rc3fJmH(fxc~A{Px#WN)!w@B z?6w=?ZL7VPzPc){t*hG{jMcdctw==N!u(nqy z?4dn$-mw9ZR{s-&_{B7|RKloWg6LvmpGeH)&Ad@b$F7+z~4a{fL3NTjKiZh+e~my9A;!h@agsn9d=@_Ne)f& zDy!Pithe65@D{rbkLvuatf9SwOGq0W{uJwFB5l=Qaf1ZgvdWfM;JNn>zqq&*cZRC= zdNzbbSsVwK5&P0gS+W>AGR&pSl$1EDNmzp%cVl%-!-$T4k`r-`+I?$sbj7-V_BBls zfx?HW7cvDUEz7ohzWj5xru;CYe&Youlu+$hXO;QwvHHaxy^O!hB58IiKySq@A5bQg zkBsxfgO@+~q;NJkNW?M!LGh-XKc9qK4{@{==gqg@3U8{NH(xA{zpWkSYiAc+yas=` zdv`>PWB`j%EFj_`T})Xwv{rdme3n`zr4wX=JszWKjAd|-fOBGT`~&-Sv_jz+Xi&E{N31J@ zzYEjTf{W!}kbKndR_j;!w|=Y);Na3oqeK)xO~O`;(rp&B(_AB+9ibul%9-i|W7cMPCbCd< z{pS+nRZq`>$J$NTF4{&fIE$ONKIehtXE5}opJUeB%Ku{CdH{z#uY2^mDBZ``92fhx z%ks$DyPZq~VZqQ63n(sExPw9hyJ%PIqSu@E1Y6n!rJzg{Bu<~IkZSq6?qLKA12UWp z38CUQCRqUjME8YPl@QAOfH?4O?=wuvZ%13=xnnmCePhraAV~tCjF1wRu;xT67HN5_H z9CwVJ;W*D7(VZ$^y!Ln%T?&x;9S6XXwBLB8PGetkJBR|D zN0>-h-{FRU_$5PTe=IO-M)Pv7;8?dk0eH7bwbIL9E|s}uajOnms8tKDB+v>o=9$5a zy@%4TCbnmYN8oUdN}+e|W_@Q7tGXQ(c!CFI1~<0Tt%LHM1?$4|^SZ<NzpU}7wCN?~_>u|&tWImm8=cl$%?J5r}SoHaO>`eJrfnW^&` z5{T;(?*|?`FPoS>W-N8h8d<(CaE({bZEfek%M%cS$?3auB~hcIb1p(c4Gn54@`O`M zxDPy*ze8d~Yt8eRZ%6(K!qXf)J3sc!(VA_(<96_wzlXig{NqKYQ{;Dfl=!RcJ>7Pi zTSc!_@l33t?_Nd$C0t{;9S9N}?vr-FxRFRPG`=kO_BQE2FrUCN_G!Us-etjX$Fg9e z{Vdvl>qFYN&tM<4w#%1J5x@-T+xDfnU`_0C8crApYET8g@q4;VxJ?`nAf??M^_O5a z+}sEuDTpsCx-{6lLMT*c3btnbeanPMy<@(i;o3d$id?l*Z1>+n-9WZKnsX;QD~nEA zyF=wC!=or34oJ~OCyjUWckezCdLh{IDXNI(R9e0HJFE_Ya<4!+nt6?Y*+@x(xic@c zTfj{Goy=(FJUbw@rAuwQjidRycApS%zwCfJ_zh7I{lFkLljsiO=aSJK!~;CbAoSe) zD}ykWF#tVF?jVBsy)po%DrH&F7@VrkEIP|neZ&~-iGv^ykJdePM!1U+02*wA%ThT zDnnvY;1MxUV~@8kM>l`;V2ltje-P|{MK;F@iX52!LFgr4_+4;NmEb{$y z>n@2-m|oDXqZpa-R3n2Ud2OJ$?;kR~q7?a#%q`wWIlSm2gL#)f5Nz2>YIN?DXvOVz zTI7a+u!)_6U+Ggol!Mc#(%!&j{@it-#TSYPx_`8#QS5!x68hge@km)ec5^ppkG zQ;ofhhkN9qjt5g7KEuP^@^CE=&GImJeGv|`b!FUO>&hNaaVo=}u-%wMMq2aOr}IE_ zIFaL_MIO?55Y{QaDq!s-iuKro?2PdjYl$vkXT|UIGu**h;To`(a}j(Wp{2yP<`R{8 z!H{`HY$5lb@P-1kGXQk8Y~>To_q^e8>hc>B?v;OW5m4*yi_vb4I(r58l%hQUbSqnN zL7dPBV`tKd2d2!*&Wc<-L;fXjAve?_H%P^m9YPU_41ZE$G2-D$*FMAZG3D)QbuLy56b4!ai4=qU^Lfh3-U){Ut?(25tc&qof8w ziB}_IrH%@d&N8nz<)I2c{vZ7P~XFtc~;4DpG$2L+{jOXIthoiUHL{oUy| zT}?0Bjd!%$ypX;S2+;PdIU~a7bC)%lT;jwt_;gx@nwS_^*^rUNePw+ZsNvB_s`F4? z-^IMrSMFEnt`B$1x~EAJBy?vzY+3w@6&xDv%Oq$r*}1^(88C=kv~pDNm*rU^VWl%4$*`00mP5JIZBi6T1ldDTj8al{9^em||^DJk;c z5BNu&{|TBDkY^b;@p5R1=c`Yx}7`cvaolqwIf=ah&-MDY?)6( z-8h6WvL2WEPf~-6;$MPmv=>@C2Ln~-Z*RKdGLgR%#QYM0MMQG)^vr(c+?(KrKU43`u;h-;2Up0k2Ug0NG=@Kvsa+8 zBmb#yv1S~vDKcxcb+(mOW1X_0_~%jpX9-riz^A`jjdLmx)}zL{Ou!EXmm9sMU7}!O zS4yCt`gr`3D&lk$LS?LdEavNoGN`st)E&#kas^jK$d~vf1^W{@nY}Zss#Sj&B@gur zM7|6YMT4TVji2Ipdhyb(YW00mYiZ2xcZ6U=HXymYTI)v%0X`_PO9pCXiyJWP#Qye& zX_}Z0k#ty|P^!#yIK4uh09|npqpOxZo=@L*KfUUF>RZoc((;s}8Ce=f)T;l(+Pi>9 zRhs{}a^<8_0yvj(ZZ}A$RrWekC$gx8c?@<Fz{4(n_SO?{b~X0pHmVH?N>z~5XwR+{rvim<=&Jl0!lXdruoTRVuimpn*$OKrYdL3;?o`$ zNGi^i$47aDC21yIp_Ak=jpz^RLYIuJz4sLsY2*qJID4*k3rvgJ65(9@?0ckFx2vfa3$o@G+OGZp+Lz%O z%+zmYviQI*^)8tiC(ZS}L3UB-d9e8}DQDc44c0nSZ=ob(GX{-RBEjhrH_}VKPB<}L zo4)#MUMA=w75!FLfx9c!Z3|f!ebt~gClYC4BA~JMOZsABUMFFX-%B9RYrwL*;^%B6 zt`WPtUf_D@($wAk_+r2|xo$*vXSKi7b~3~0Ajt16I|%u?!Hj$Anqm)T5n6#+k{}_& zGz@0oBm#nb9v!TwjZ}1SLR$Hk=-|3kbf9CHg$D+32;U7OG@Nf!r}#A+ja4@Ftof>U z+WoAOl@~*R-p#jJKVVT5( z@K63fYT-Oxb zLo%cf?f*y=xClsBM+5ejwLAVO2_3-$8v;y4uaJ)zw|n)wsL) zchc3FvLf8!ho!4~7*zb`3v=VjTlN;BPh~~vrMDj4+qG5d@kP>GS;Gg6LnywPTj7Wm z>^7y>>yj<18%!W#;uX#8c$NB3TC|u<2T)C~IhfejIReW5*hO@~s5xka4pga_wArr4 zT78*3So4q1p_bio)U`U4mwuaDMsS#4-GQuCFGY{~1bsPc_pvlCHen!ekTgZ$Aknr8 zzQZPdR|h@boe14qf0Jv%;Ms zOfai>hUT3T6x#}xR!IKp*nWsRbPy+PLwMXN&%32@7IjZzQPhVkP;m=q7-^jkI1p*IuApydSd@bI0`ikz-T-U8w;lAp{j|GJuV{I^_ORchSV>ZKE;WT;+v*VITdwgvRW9gPrQ5G;p0po zlz2;4{fTkz#!lYqPvitMn}^MtQ_}TYnccEJlocmR@LPAdJ*^`n6K#xnT|eeiM@Ek1 z60|g@1j<_kf~q`V7a0>i;}gMpgEiqg^zV>CbSGn0PoGj6oY1l;UVkz(I!E>MMjK3}jl6EitZT zWEY8Yp`gm;#p6CZvMXd{yUmeZ2wsZLCKy;2e$2ur#sQtXQC#l@a;{rmj1SpG*+`uD z)Sk9HGK}E7jBD42jHTDty|O5fNhWlXvqQN!m_kET@}MEwk*3vNq>jjFidyCVOgYMv zFgOosLb;{PgBjUO&&3@8lk8T{TxMf&aN2Tq6Y=AMHwJQ$j%Qe%4rI!NB<3bKy})|B zj^qns)0Y?f`a>gtlX=Rb6!1Wt#t4_nWDUq<6__hKkhxg$28WupoB5<%O}G2bmzhxP zpR)B5{>*$0U2agZ3{b%*;dcj4pSFq$+|+rHHHout^_pxg(NhvLG2z3?PFW;7g@al) ziLh=>0)q`uzjpe0=&K^sImPJtqbuX))pSk9ye=#pVKU%uZ+2{0_@s072=B2K!xqj) z=f8eS34xz&!LF8J?oDl09B9s1kJ^LZicT98sZGcKE`bH-bbJ!41X<`I4o;ibykPqI z;ge}AxRnuGV4l@smSsWsq$4z(3#^f?L!Jv`Wp42W1)s!ndtWuS1?(msQirr~2)vkA za112jm#C@29E^{eDtF7hsO^kMpvj@YqYv^ksn`3GRWr0@TI;2Ai!Ypn}Y4q!9mF~@X;Zx&Ku{)I$%J)9Masn>NiE4-RBs4sbxrBwe zJaVS^Q=kpj~kSvh~+Ev6XtL_`D&T%HCAxQpk zZsIH^Y^N|etHP&*9PwL4ZcG;Gx)b#=l+v5O!LRoWlN|B$Y_xa!j?dy6FunbTs z9~!rX@YqQ+XB8?V*_t{zfsM3H@TGI{zAg?ItOV1IHp*iwJ(gs+0_vywLEXy_LoW6$ zJ)!Z+r)$Zk33aZ1bn)1=in>6Dn$@B<^s&gY^*{&>Ri`3z-TAP3uXRs0UKSscHQh*h zaA!I}Q>&30Xwh*~N|^_D<8Fby=5WjPiyj@H|_jPccU=VNw*Riz5>{(h&ca^llvC%2K5BemRa?DK^+B|Ex!2W zSPWcoS}hltwVX#S_~O^KIQ~g37i3nd98vOtMA{R!zxzT)LhhQ3X83WrtT^G!Avzlqt5KuJ1UF0j~zE545TlE1|6eD0H?K~k6($p{PZrE z2B`MliZ4wbisD_D%a4SRJ-~O_8E^1w6_#@xI-^f2HUn!6EOru&Z7QgOz zCHC!VzV#g=*E}~CjJvR>%?ZnW?zoHU-#kU|EJP52wB}p?(afjv*evy%Vo{89KV_>Y zoN`lcDVC?cgT=nX?yy{I0#FSK@y6BM;)Sg5gSmxP53BU>{F2!CfW1m+JXMhLS@1BQ zi+0Yhs3-}fi`5oUfQ1ZH<;)8*I^lbw%mQPh5qXr%cG>F{DBK-oy7$IM%{Axxd#Gv_ z_zo}vgdg;6FZR8@VtIYtJDH&iAQ=KS`g$ZPp@^yY$Y}+qW3FUhaXEUN@p(>f-9h)A zhlQRv&sempWr&fj84AsF$6jO|{q+m-E_9L;yA6GzfYiZc45oU~-b zA&D!_L6@8bpGW4X-`ltHO84f8FqOZ-x+bJ(>@S)QH{7I3fS6)OfHkFR^a}O_HymFWPjRUu;mS%oJ8lVogjm^fx>6+PPw! zSOQNh-N~*(^_Xe?FX-)jr?=yCy}dix z+ac0hWG=E^KlP;cHcuuqPSTh57Tlu|1+Iu?F6T0rW!fLDOrYSOw#b>0rOt>Rc4V^X zN`#-14gQ48QM9QX^y(d0d6s*#n*|*{kr{%Z=Pu%b`KzucO=Z7Yys)GmS%5sk{4 zsE9_TU_skH%#_;7D=nH;%R|6&O^Q4mJ`2DM(W5*Uw1Xb>xI5a*i7ZS~a!H))cu2As zx)7`21*5Zos0OT%tpegochPHIuq!Dbq18{@+TV8PO|T?nO_ekSh;O7qiV6Ro>I z^cJPLiH`q2vb5Ugu#Nv21^EcgS*J(XZ25mjL5`hE1MO3g-g90(5_rNP*+WxIvM+RodW0(F$ow6@mR8w#>g*Et^@eY6(as*& zWBEaMAPu`Nb>c&Ei@~rTb|LIEY*p1OqU(kxS#jfQ!LtWmpnCV+vM%AdM12Q1u)anH zp}M=f{$nti5O&|?u&1)vyJm!!6#jC3a5e^4Vj6h9P^zPZQoYTpkAhD_FT|c3eE$zF zm$4@X-?!3W>@nFvQ4|PoK7a<;LH@ta@y4mwT?OOHJlN3lGMA$7K$OTub%!5&>@lcA zuHb;AwaKmz*B!<{F_6BrICL0QH6b~ywec+;BZUavLx8s8`|{YB8sd@4 zPvvG9?G745@9|sVVJUqI9tzh@um!nY=bp13!a&F2YqbYErAKt<2t6`GCD1MCNH__8 zAxG7kbhAgPoMq9l6zu?7AWlH0Kn5%@ne`N&!>6&vu$0r&LbqnGE>qtukzK3Ve-%mQ z1onb;Q;J?Qg$d0QQ|7l`@65l^Ci``AZ-=d9h%Iyu2RoATa&^2~lM3#pnBGSH=jhLK z8g|=g#puwlGvztxn~CJW7QBEre$L@7%@!=+ji1T95z$}>Z^RNgqhp9YmY3BXd-h4Y z+z2}+wV`o7q+X|2Ztovys;IPI)a_{ffyT7S*-O%X5c<(FYcTW0P3SP{z7j0QFsR@-g zocQRk&!W;JeO&C`+%|I{4(T*TjhdQ7OPM?xwytW~F?Y5}+n!{)ZQi!^Q-WuSih&uJWP}b(67vmgsVYZVh!CXPd(1jiz^LZR% zW=iX6&kqhYpIx!+o^}*7%r{T+_K*;~zLJ$#5L(KjC8}DsI*43bkf%LfDhiCTqQ=(S z@jDVo6Q;UfHND3Q>@!|PG`QU}=>?4NL!;IEu+kf*hXFRU5MiKc!l`eaq7{G~#jmdW zz}k4BG0Ves{o_KOO2j)=jEZ@C435&^`PF0^NbKj(pVTj?+Q1Ihl7v`zS1mVJePRuX zXiSC~#H_wKosl-Rl9;^MxGGL$qSt*>=7hf zvYWVGJ*FGXvl9muFY_88JKIi|;|7Z8_m$_i7f zQ0)_$p{?uXG>+egF9&nhWJes{4zSCkX0}L?`aMsbwmblg?E(8k4M+?^oG!wr6K)l< z9c^variQR^+Gq{7m%&)eMcH%gF_j|>?ml{jYM(~EVdNpVXv+lTVB12|dVIO|;KkHK z83|$^Ur!?#I8c?LhmlHlK-eTIk@5vb7K+MmYQf!3u9^CNU>;bO!0lOdE~~r7QXQ(2 zrKU`IzDd*==s-OzpHHi#>hxN)7`g}jbC8#MoZOu@_PVXBlXtPA9Ma-DkX;hPhSI@P zC@tGn6)%F3s2*m{krJVIl2!jak;mlU$Yg3*}=MKMcvb~VMuuMxs6M@YIjqpW7zQ8pl9}|!# zX{yycc->7+yy!_?FB~>4(6?syU71~MQ0PJG?7q)}7Kv=WI4ro-oTPH~=>?>IQJb3D zDuUQ&b9Lp(F*Mkd&g>lfK>Jt!8e2}?XQZ~b^kUR>i+F-jZ+Y|kCcG*@Kb`3 zP|QBB{)+tI$(D?woilC>PMonK=$Ww^6Mhh6r$eZV*zibJ=NwVRwZ(Ee9TEYKS9XxC zWnXjIr!8I0W&QJ-7Y#Ju8vmnRbT#o<$wy%=<2GOgf<={Y>RyFaR&chQC{x2KPh5Ru z3O(<1H+_pbTW*cxcXDDl%M+W{kX26&f3$bq$xo%KrmX1|^`7TF6)VHf#m4mxM9^KKpgRISZxn+GrTkE4!C2&| z(YiT}mgmZe6HmVh#c+(^(4+4j3SDs|ve=VQt`ORT6w$;uq5=if->&}qJn6W=tL8#m zVGj3kPU7y3LX}~EyhNOJ)U=0pltk>Jv89haK0PJpzF}|LW`57wcKT<-{u^5>)POFW zBLqn5cV9LN>gG49B9!Asd&5;u8^Vr617DQmMrXWNtT#;%QgbYlI*hc((+B}}wKIHp zAiN_j{3Zc}osqQ2)e@sJ3HN6JD>)6YnyySiBtiv>Vp;G)4qd#8Oe+L6#78aA+}=>0 zU;Ru3eccHZHHJ5g_Y$fins6LAyt)vCJ!W1kS8XY0CA0?f{c6$Im^>aw`3Gw)H+jgf z#B$VpD(bY!d8#!I&3zV~l(FO<{E_!isZ;#iPy<)2S4VRzUS^>nm6~L9Qxto-d2Y`Yla*?#cCseSIiWm?rb#2= zHzz{c?cZ$@uPmBp6igS}t^`qkJN=@X_P`kRz|VBs>4Eg>znzB`(=%h7wpKqXfLTID zZO=x{dpbR(!!!6n^VL;bFKBln9i>n4LUq$QtUy!UOf)YU)za>`ErHoYNUEljS=1=C zO7&XFFZHxaJukZw^-TC|J*B1WsyuF0sJz-k?uHYh@){gcp?aY;t50h{YDqRQKGDEo zX<${dfxk|+0A)6jo!NkW5$m)1^s4Sjt!l3n5m+CVstS@--Il0Iwh(ss)MePIFa7iN z%}A}UUe{+Lv7=w=_23?+CwaRFe|f$wf)Ep8rGJv|X0dzZDg5vPGI7mHsI3Olwce^u=!>%7LV@VR?1*6Z5rR{OQG@&rfhmeX9Lmjl|iO1>cuZhPgYGdN@0)1hliui3M>OT^xbJY*6$Bj487bQvzr}d`>z*7>O zDyVxhHQ5t=+N@h(3r>lzTA&_Wz{t#7Q0+|@MfG6rOi^0L``emq^o7dR9|e&MBAT~g zDae47vn8db{gD##3ESx`_{YzsQwdfz!I5%G$rt5h;aG4Sjh0&cXmj^PI zVtw!thsfRRw%9uTF@Rgx=lMc&x7OZ79|Lw(Cw=bYN*oW3Dz{qr6?v*u1DBZU*xV{B z@!xg9kUNp7K{CZ&sg=%EsV70SD9M-Ui%&KU3nDovaEV!u^{mp*LRVaa;+GBr=sQlU ze?xHD2B52wfSzRndUFEM15|Aqx(ovPDW(1DAe2aTY=++gRO~4^?~;HXluQ<&e&sO% zeUvgn#r6c9oYw8?mVB+nF86k8IE!9O4(K`MYNo&`1DY!Xx;D|dQ_{U9=9J0ken+<* zJe&Y}qKsj+6by~3wBRcxPo@L-6CBuf^h;~mgdF(9QI~*H7=)qaiq*nBBqkORiG`I@uEsF?;T%cO))U$9VME}O zKk~#xiWMY0oc7wuk~l&B$P)`jE-Cs;vn1BbA9)Jos&{Ege|cCE@0UOF6d0{`SzpZU z%pfBo?RtbnV`9|#P%9^xQ3!%yHnLa-?#3{mVs&WE9OTkaE3_zvP4Q7q$TMwX#_1$$ zKHOIon#R>)`->h=rSe!)+8R8Iv;#V=-x{*kV2(DqX|-$!95g_{9)6PF_{Sc#i!N9-TEAK(uR8zwY)P=n%9udQN`)fvwh?d3e) z|Gf8QEmEm~VsskYVpqXh5`K~DW#L81f>dTWVQcAHt&V%MgYY)h0pH;xbw+GKJnqs`=; z0ag;EK_;B}4TQ&8AVG>4q-$l6OxxXZ3);!n>5$T9?F{MvRQYq1`Nv;0M;#ReW!8F)MPpDqS1Qz1+xAndQ}xp|29|4wNw%j94Yl?S*81o_sda(W zs;l-$t?BAl|FqWb!CDvolUlEpT6NWvrPd66d$nK{p%jZDbtVD#_+Z8V=r#ud&!w9C zo;tLPrD9#XJOy%8FG%Uj2Vu)#tv|PFO&sT`wQBsaMyj4J;Eqs_P-|ks2;h#JDU+y8 zP8*$&e#A$q!4_s(Em-cYP9wIj6-K3;p#Ptiq1@|PhKmQ6;m(iDvHF5#s7^w_=r$p1 zWVBOOxxPF#&6Bg=TzCyuJudT}Ri(H5vw~FE_eJ7?O8e&toLznFw;S!t%#BtL%@jJ< z|BRr{@D(=P+guS3y5g6axC^ZsOf(w?vZ*9=c&Rq-0*zh-NxS&d0qxQ&;8G8c1qh+z z1CFJ581YWK9)3k|@gp|~+rqgK1a*~BlHI0q9>+#Vr^cslRKL0!3?+xRBkntr$Qy3W zXK;=%A<2Amkfl}YxA5eRwt2CK67;(;I7A+s3nWn5sz$&tdnNP}_NLj!5VO_E@{mFE zf?{7am%x8=z1{0b!CeGP#&4j<mt5O^L(mEsq0* zErbhF7x&E!wDFfm>^K$bY9v`)Es#>KCXN6wIi*XCy5r&XPW!rZy~~_yiG5&dIl%UJ z#aBE1fuZr$AS10fUw53oXOV5iMfK|tkxwz!J7bq5N)+k%@IWxXN=n^km7>Tn^~xx4 z=^i*Y=L181UB8VPDC-VCA~&y3p)tFJp3^;-Q_*9hKqdD)Ft9}pgpZ0p2At5pUCpkb47wU_M`Luig7%2D+frVdTnqMqW7GFqV; zdBDPx`VuboD{8g2xWtQbu`1Rmuy{;Whkq0ZO(9g{>zlgYEKTA-5-w#Dn zA<4ENxhEG$&IS_I{~_^CzLPq1DaKM-ZnQnu8a-J}SRk8swK1%XM{XF(YHW}h2n|u? zSHhf3Wh?5;Vg(%hg3K4CW(M#l5-d96Iy?vo{RM=ylN!?j51)WINk0EdVNK>U&4`_!5 zh(eJpkK2TnZOPS9C_82X?qiyIZcj6gp^X|X+Y4#dJW)M2mYeOoEWB~8&Q)b7ubRWR z6|rpBlk7b4n3M)L7flx=R4Vrz>Ca606I#fUnOq5NYl%avu2Bz52?)>0?9L(06T4RP z9=N$mt<3;|%a$5By(S+=AOkz=-#lF3c3ZQnd9lMd*7bGrnO!&9v)aTZ#)b1~wCFXm z2MXQyVTf=%&UAbY+4|duC1>~gaQnGgZTR|H9GVED)tK!xGSAVYxg(T*R@rd`LcZez zl!;N>CG(9v^HBqXv`_Cq?BF(h2MlcwYuH+B&2~!bvKU{j9vZ&f=DzDW=0Q$KglTSD zpl~tD^Ju*_^{lI8IIeL{^7T*JhXz)|ThgTa*`4ai_d$z=)yo}i?#+moidUtHr+hTd zT>_o2-~GEC3}Qd(^le>EL`w^)j!Ks|wch?4{;a9`l6r5X-sSjmU3FQYFgicJq{UT# zVmbP8C+3CHoAXLzA7RMv#il=3J``h6)_!?&UTo+Ru=siRLj^>F?J!=UJDl`)g7!;M7)m5uHcN2^&4GhFJ~K7;mj50-iK%*VS*3uy0}bl zbEK7oq_~g)63Psfo1gO_Ck8k-yP{~P`LWIV$*vM3)Zm_+I^$|e9!96-ydp;$oInnBr>$_a;oj6%WtCK$)U(=WtC(s5yQrJXiM zwal~QDv!e|WrJiOWPDL-=yY^*Zw4BiO|=(vID8NV3Kxlf_20;oSzLs&53PzWOq=e@ z4LUk9e8!>)#%%mL7otjajWhhd{q~IBS3Bm}FAUtY%=_|Mf;v3V8@J6%!yqi>)nW5H z!*zLSq1^i7!jKzPty%W+3iX7!fUQ%K7#k1kQxfG#1s8#ea z@}hOendIO8_P5M{Q8yuFsvR;*$*CTOqFBmQb27*zvuPcjGK?&N3K@oua^?08&TfV+ zHkuhVXP4%Xm74RKclx|COQw2=TF60VEXrk?nJzFLMn3o}&c$(^G=I6Ct+wTz&b&e! zZ^p621c9iUTGx*X*jYWy@c7Lg?_cEPw>SA8EyzbHdD%oCpn**9+M#^lt^87 zVvxH}ALO5jLW}P>K~(VSxjipj*G&)GO2LP$rs&kM96#cq%0u9|vhIp1meWQQ3V>a2 z9)~Tqh|;B)f4U!R3-|S}Js*(2g5%Uo>>LScaiV!1EJSu!H#$W!{*@}C38Xx0*Gam$ z>&&k|))!cIU8+Vx>EP{Drl!n;N9b(#rgq48@7|T80@<7#i}lrQiRvKor3?Yu#I6qe zg|n{a+m^#zW;=back>hRJuQb9Mmeopj_CL8?hWmj<9uz)QJw2ZzfL_6emf0=9n5ez z3&21AXO#YY)WxoPQ0(D$MV%8Pp}pMI@Fm8%mdjTo*z~l7gY<2&2B9Fd#rw(l z*7Uq!Y`l-|{g^7fMjN8)C3lH3g+G1w-!&!)BKXk^B zon1h&e$AeeW5BHOIckh83V(PrpM#f$Kg9Cz3vzwR+=wRwxL1Qk8{s*yXJX^Npun9l z+@Xz@q#y;R9E3Sa?MG~8=|j#wLN4uaxg{a&iC(SjL_h-tCd=!o3;ce z(nFpVk2W!O&{9bx<=fASV;fVaA-XUd$$cvTgs$0gCm5!CsNEPs4+?5U5kcLFwi5>A zL)4W#;Nwbegr4ZaTns@X3!RZ+Tts8U6~O&fBm+NwQikiN{17xE?NU(@w1`$=a|A_6 zFFU~&7z#IFtY3X+rtkvR!!WaW0mLqV9iTmpWY?C+4fVT6*_=KRSpFIQv1W8ceeac< zUV}>MbmCIVSDU(v+)07r^HLyj(fm@W9o~T~X&esY#Z4B@QqQRTt4Mi@&kSbabn8cG z5muv(VEW5?pDBmESk(ID;|yiV-3g!b+L^XfPfdzzB(|2gam)h4t4rRXx3S4G4$!Vc zq2Ufmf+sw1c-1-Tp&=ckE3ut+-?dr=cX z?4E2DVkBWm;s3}Q4lZ{HOsm8*Z?Aot)RkmghWiuZ+YMjn{HtAG~ zsI^3r;d*3?*J(4MO*tNCBWDNy!pS50iP?bxUFTWyjCM5k-{{F8dCU&<4t^M{z+7-e zG6*cz4q9Yga>bPsaEtjC%BoT=W|ze+ZnoMkIvz`T;(V=CX98b!H75m1{HOIOMv#W~ zB@CS&5Fr(^)i>GKdPMf>5dm}lNV<)$y|@T~FDd9o35R-&(!8s1UJZf$72deHIhQ{3;{3BxtOW{lk=K2FAmPYwh}69Vmdi*3|e=rBERz?d&(0riw%$kG-_ ztKvE}>gg1n*Wagt&US$aKqN{0v+tU1mWpn3NfJlbnA&)nnXC424j82i2wcX6y8^$X zAM@_(XVKY`2YE#WH+}A_T=lu>YXQb=t&Ggu%32i>`86O>cdAT51y}(tU~xi%MPo#oFCCScCAIeIt%uoVWW-3 z@GRP+Wk=fjkSf1kA=q8rttXN7JJRsI-VBSPHIUX^^KrB9lj<0LPMfi~-r4N?cosUZ z0v}ZY(rqpw;BZCOjcz;%PS8fl76Pyg; z*e+3fUNMh->ki>zxj?X}dQc?o#-Fu zs=!q&RBuN$!Doa!Y1B;?Ou)P_QEOb0y2-*)nj$9Xk{vy`sPj3_TTCBKMil*)qdrPn zG}lHLN+O)KHnjz>u^uP2@i5Z{0$+WGe45mzZ0lLvuS-xm@r2ar*oDY0W_>JI8(*bs z2XP?kZoE)`{`=nd$v_ ztkuc!>wu;o7Sv6hLv#nN59LfL0Eug|;8mSNbmuyybK;qEx{Na;4OZw&!2gr?w58!0 z(ywA)e(3V@azCb8+~`d2jC3t@5eyFitS;)QR4e7d=!o8YRESMkMXCigX4w{+a+nZn ztx`C1Ku~KUW$0-Rd0AEGqfTPp8BNkPsi|%bWx4u;mKsg|(sibZ3rts(t6{qIOmq)^ zbr9rcdVG_ka?U#g*rvmLk6ZymzLCkq>nrLSI4d_HhxNsdb4OTwYbHddN7gvQr5=KA zaub8iD_mXtK1nT@F%hdlMWhN7o6>yIPQmxC2&^gjE6-9~zX-?H)HjKg;^$eM4&Uvv z5OGDNafZkwATwu*P$Jx!9d7?LI^pNy;d7SpRoF{J05T;Mp^N-#SQ@>G`m_IP%Lkw| zV@K8t-R?hT;=;J5AAv#-&LcwO{pysRY$Dn{75b~Rm@oGljiCUgkRWu^IbW7DLYjuT z<7HOH5K$Fq4erxm55Zf?!*13;LJxJm5V2ohGNT-4D-}_4(od094!|+wYK}wE>4y?+AQ*0&FY}_l8_GcmH>bEP zJ9HL8k&BQoh(j56K|XC)ee)@R`9WLkm!tJ8!xRnQE+dz!yXQfT^_zY?eY+Ih&QevX3zImJHjeI+=@TA6DUS6BdvWt)U4m)_Jm{6>CTOX8&h^k|=EB(>Mc8o05 zwfh+W(`j|~{hScmAd01+6n&;gz^}yZ~stK`YRTU>H zGO*jsdWM@=qg>sO!(gH(#jX}%mfw4Db((Qd+J7Q1(LQbdhD=tQV>pz-x;V0cpp$vb zK!nn3obao+VOVGgl9atUvk+LixZb|69FV0GBW6&1RgS9AAI_$(*!x=lM3`YFjKpp@ zOn;O91G}a6*mf3j;!{>7bC+ln;28c6P4v)Jz`K9h@f!Z4IdFW|Q0-h73zdpU&3DEw&|FE97*Cyr+u zdfUU7vw*wtouB~-y_zZ;3eS`~r!5qMzfZ0)sut)iR>R9o>=uClShQmMTeKFKwJdO5 z!M-KXv6;*9nt`5p`)W?-eD~(=7&NIYNRqQ8IYTG60)%Lkr!VJPwu76(GWX_=r3GzE zpfey2MQ20Ddeg(8*EK{A6pj#$kRTit+y!744KZ)I_p5t$ zQ@FF*veGnBX9et`!a#|-Mk?+jL{FWmFX}W-#Y&@hi;)C_as?r2^NqerO&dk$9WGbH zUT29f?2AXvjIJt-EImMC=e&b9TV`g*yw@}9m;b%5dFdhiChg*euoPD}G%a4>2f48f zk?1R(QyKl4G=d)+@3G)8i_!^q7DB;&;#aTyjdGf26d){|kTfe_9f&u;I?A`%2$6P> z<$ik)sCB6DC%g92i4OG>vb1Zm2PK3b3GYzi#tmo{kVxHOWc+I<7Ejg3Ug#2aoXr|B zUE?ri^p)joVF<(aXG&e_KK-sTSVl9 z+J|Mt?OciJ?p6PwyXZ0Cf>$Cr;b7oE!zo$Kb!ABh9|sx1O6`<8V*305WnUalmtiZx zzubEnRcaT*UHwIrCw7=q>{On(dE7GNiFfWJ`Uc{LtNX? zI8-`?c9xgma9#v=;Z{F-lB6S<6u9FU2`3DZI9)C;R;t^4p!#gXFjh&c6Ged!RBHZ-~9S8+criHM5M%zx(bWFVQ(z@@Bd3uH~6if!A_B z!V`TZ<=ha{%`!eAP#ELBTO#5hRPeg*F4j*Ic#;Uv#*BxA?sL>3fcrrSbAtI*1_52x z+2^Y@bD)J@i~6>gM{2f5YIa0wcBu!D;lU(zH;trl)VHHt{W+0h*D06){w$AX6H-Xm7YK z-yT`CC3p=FT%>V9qLAVeRVETT$`**!;A7<=LY2Dhw%}-Syr=fe*1ZgJ`+nM3v?T_k z^?f4 zzwm2w-!oGm)Lii1g<7Zkbj`YX&scag`Fvj zN{c*(UZdj2sF0#*Ev}M?CF~HkW=)q+PwMY;ZMJi4C>td1j}tT-SMxCLZKoZqHz8iN z{bnB*e$CljR9nvk%R&?1E#1IfuEw=$x(pJBP^c8R(1ECdVfGIeH}Bw&dHcQCXbp+xbSq0L6!L2OjP1=FqsNi@b zq>K}c-)&@^6J6!3_P&8_tA@WyEs@gDEY{Uf@0ATZ5__cr#G4ukf%#|CcxKTS0nm4> zN)Kc&j;-d7wao5#MZ&p!NOk&_6%UROIRsLq4`9=qed4CmU+_lMc?B!AvRoZVez@GI z$u(Y3ZOpj%8-+9!AN;M`sVmeEUtEHR78H~e>@x;DgguCvGgTv}iUXRy-!Z^Zlg({;szJGuw2?|Fx$dC#Q+vi z9QgN3w$3DG8-_D-%OJV|Wt^XgAr6dGE;74@RH zEjS(@awbHQkMSSJk2x_LOsI&=HR@iPYHBqhVx4)2!eZ#^3%0fOrAg4hZ-EqQM^|N| z=RoM9sI#S9y_l(M>RO=jg@_XgagJXZ?PFyH3f`fDfD^ley?-0b z$r>s{{uyq?ft@S1tKf>Zc$!?_7nr*_foEm7zFB9kSq z3S3I{1FB_dAgDCaXib+NNjBz?wu>S1ChTF@e8MEWF-AUZ0!nBdBq^uMQZFZ8QkJ?- zvL=wS@Qc1M?lVZjV(QWPC*|0!khn6KmWEsN@NGEF3Byx;iY=3op~X=Z`eV9yLYL1j z`Fuz|GYojGAaDwnsb=UDk_=nJbZty3!2hOAI+?-L@WExwE=7)KwuKq1)p6jw@KH{a z;1mhhOr++Vlt|5wOgZ6!5&Otw^C#c@nV^4CF1C#4tsH3Kb36bijKFZ;Kxjl~y1W85 zT$g6nO6-Dg->0W1Uk^tlMhxbD#ACkWg9VHd*Ozkn^$xA7m63zjvoa56-lqo!;*mS> z(i6Euc!QC@P5}Swv5nr5jS`fOC{u8%#rahK}tt zWW&*X$hbkwpvl~5lj@TV3P&z= zZ%30P=f@_xH&xi#{;?cy=gOQ8Gj~3o&sTi}Poc#Q!vA|E)kmB9DW&~;QVvmLrRunV zo3i-{Vgj5%9{E-k-z2>y;+0lNDM83OpzRAW5?#+#5(hLIZVf71! zjrFuN=7_mZ%=36!aFnFvOA56$Hx85GiVbOgP(KhNbwyjOI`H%8PbA%Vfsm$HnNycz zpM$3(Ji#dm_l;ehscVkT%8!ix3+SEhR3y3D~FxuRo zN>^vUL8U%0UMU+d?`vq-`#cS6w8=2W^0$?$i=|ZO5UM4}2_HGDN=y0esTU2tw9v16 z(naao9{O1nyL@pvoJ$8pbc=P=lVBogsJhzSc!!`1C@tGBry`Bk8s3OA4$Dn+_45gF zMxCX?eYaE|9A3P70hUjzOQA!Ss78~&{UAo(h}RyFu!`07g(xYzh~sd;AD@`SVxNQFV8@f-}pWqm=$g% zNX3zvvSC-e+i*&K%9X5f2X76hBr<@z@oApjoAD|)>K=W$U3Y&FdPD_bv;A& z;+cYECGyi79awckilqKvDz|4(&$Q04pC<6^;;We8rYZx{i92 ztakP56Dc60Yk&$>AR~J3wN$lixsevV2Di8N=v8UqkL;n3xV8c{6Sj;kul@7ZJejiN zA;fZ7#NvMKR!$WtfRXBfw-a}Vp|Z0(V&V+ge4$k{n;H-bd zCF=26e&hM*_tKUdcHuE~DHB1?wxMv;WPdaX*$A!{}LegkwOBxsPPQ28@`86~I$likPsy@Dob z@($jW%esc=I@50qsGl-P+;QY?=Wcw9#pLa9H@?bm{TjPX0+OmaW#{$lZYt$SW3JR-Zn;Cko$;>!^ zBZlEZACU{EHpl!FcQ?JnF6%{u_IR|M7~JkV+j(zb7sao1hd1*aaH0s?1CUhKr+%d? z!v&tkT3Sn#pbAo57%}4Uiwtxx>mtXPXv5!q8ikzJB!`Hp%U3Q3=Zw}b7z+r zsXvxZn*zL>!&lmZ<(0;vf;S9z>iv`sqVLNMQr%2$t{P6Sx}E0fR(OUNUCcOglw1)^k|!VnH^{7 z$g*5j0q}edWG*fYuR1akm$tHKMBiwc8vEyzGb9BB8I|IYD>#W7t8_qfscer`*~^K_e6G-2 zavp88i!-8Ke@dy033_rW9aM{MPr3w4Z9riT2O-JOk0I-zt-NTarsGL~Ax?NA2wL?* z&E?CL^Ea(*keiR7f2BTnoyDT>oH}eLf!f}jSTs%A-M>3U8e=IVZK5E`NJl8xF9pr; zpI9-aPp1S$_wNu*$=-wJlt>rkgZj~$FYH3X<5JPIMDg9$5j^blF6qHus($y!l<~2c z?>Xw&YqHivA0{>(ru$@z=|17}On1u(T?ribXOe}~h3u}Rpuggg8#3t$cgjrFQv~)k zUy1w`^RYTbwyi0^oUjXxTPy^rKy z3O$74s>Q1mH$1XK`z$#IF_=sNS`zF zNCEm$Yuh5t#LjFajQbX8IX1GWRXn_JXhjnf)-Z&+J*nztUY)d!m9ReSe!^IH-pl@m z1=&66dH9|j4&uKyTg^mNh)>pQ<-AOjd_ULu_&(`*F%3T?QjUUy++)UX19Q5Y5pmkq zyS#_ockSjWU^lhmbN`e;zueTike8WQr|W+5)C%ZTY6Db1&RT_+%HCKze7&pTl&Hn8 zphNsXO|+wDsJ{EKiICCax#|IFxL-GnNzlQyPE3EdbAPK+rBvouPjA$D2~}u@7KG9F z!xVMm^=cWA;6iten!`hQdU_~JEzrP;Z&fvmN53&$g{TJEY^=iDvHpp*PVb?Wf1pAS z!&9a1O{p;Whbm>fLtYl#P39?gm+FUeXZmVYhj<)R5Q{YwwWiuZSXv7HP^l$3-=<6I zWqHY;EiHxE6*^Yb+t9i3^~E92s$BJd2D4?74SIFl(weR_E@AM6yAPCXQtb$bNlR#J zK*b`K;AZo4Ix5tlX(j#?=K)Ar*AD$WjJefH31uGd?o}gH;b2ogXF_8Og(k5q%He}n zsb3fBlgj9h6&0LvZ*opFbqjLPQ0EE7iA|1*ay5`4)8d&EzSUz7ij3Qd(!{=k?$7df z^ns@FBdpp-=7OOts@Lc0j+dZZz83u@M|a$AG|Sy9`NDD5ao2r3KU>eAf==Qu=p@-=^7dc4HmN}U zl1FABzDf5_NWkhq#^UJD9_EQ%99=i1VZAv>XNYYJ@>rU4m#bT(iXwFrKLCT!V?6^m z+L*6-?ve-f+WGQPzO_5Uo#L*63PT(H>S9SxD4Plf(&#rhy5R(d-CUVC3*nqJYy<=_ zKWJR*}Vts)OuI!GN z4lbslsf&r1dTB~8GhPN4)6g$lOqriqOqt=+7t?igOd#cuFOfrj`xf(%R~O0V?K5(; z<^2ye+h&NddI2Zx9GKrn(bUoeKzy3`9E;9hP_Ec)B6dg(?4B*q_7D*Ee)yk40XWr3 zDJg83hiS>&KtlB(pbyS42Vj~p9mgD4=EpAdqa<=aB%^S~KB`hLfkwmYVLOH1YKUtO zZm(9Uf5`XPKGCqU4o9#FIHV~4*SBe2FQ1*=OwqhPfcM88+-EqzA8ieQMh_M_i{qL-*y?G0{|dqy2$=FnJbb#H#L zU~h0@(~GyeqSbK#h-F~N2Q1!G?jQUcW6mmw4KbX5yNBjeSD_$VaYp6RUc)$f)_7(f z0qm7S4d-(=Xtwqs5uhS}WRg;>NS*;z%7Il4dwP(r(4JB;47BY}FeYwe@nabH6Dk%2 zzDksSah=+<69eZqL2)Hw-aJ(8eo=T2v0a+W5qzdHdY#=s(!9>qkyc3N(Jd1(w{*;p zrTw{(kakx!?Ogu>Svq8it{G8(<+QaqF-M23u(W=9aj&DUHNkix`n{xG z<8HaTMg}~gNy^Mn>F_jHRYa!86cxs61qfNDa9H)@$x#f|q^*l!&YUZyRTL5XR zKZ>KS852W8JDP6e1CbofGUe)evQ(R?c2*s-P!}way;Q1oVKnw9!kXaNBu-Nlc1;^BPuyM zXK7#9pdEMPOXSfH9f^lciHBeD0L{_>%QC(`{MZ@+x+GHPiiEQN?sNTp!~G-}TOX9a zdm>GZ{I+$W!Ju6~h$&{qpX|7=9eU}DFx)&`o{Wd2gz3uyy@vs9EWV)?_>mcuME|%8 zCZwY~^2A@rrQYPiTT$`%36s@(GCI|2;{vu#(|vrKDey=j5k@EkThC05JXFX=#M%VE zuv2-$j&@Gup$mAzilq4iIK1Jl=f@B}5+1jQ*gfXu#JKd^o16ZspWAp2 zxwzw5x)I{MTQp2ibZL5z-@uA$@4gi-V_zgHg^lMU(MS2!iruo2j8E{VOHYgq0$RZ* zQRhaaraXF|UvaDV*h;4{9YApH5%;#Q%rbk36I|JClQg80whG*a?$dsSppv)!?-{z4 ztjn=t+ zm?d)jCYiWcQDlSuEhuW$-^v+1X2<**ZIYQPH~UvvuI$JWIj_Ty>A7Waor`Bhbe>35 zmx^8wQYODu>;~Q__Wb+0Sl9JV*{9|Vm&g?+F~2f!%>A73X&6Z3#f*fV z-1yZg8(*&p;&?apGJd$lX&hy4{88q{7yKLE<_w=?<0q%LGngJNM@OmXMcKLAjE}u- z(WdFNW)26s#6QyemJ!c1#zgdZn3ApfYD~QT88z;<-z|u4qwb9E;=R@1OX`1PD#%Aan zox<5E9F4<~#%a>a=zM!u346_G)ay6dKe#Q?Qt6+Gnb0+K|EM*5Dg_&z`W!a;KMa&$ zBUy&BOkY`}~E1b54EA>8KIaUzv6p&9?W_s-n(IOc+eah0{0%Sn(ePAm)mK zd~7;Ev8c0Y?|=^9UKwz5Ps1%i-7eSy@U>HL0jZ6 zP4XqK%XZzBtdo#?BBC?4%2#9C;Fv}>SQuPBfV$oA5tuh1CCE}L4zN1ebyfo4^OBVV zum}bJw*ZSJ>Jiy78rX2(O81>YhJ10ec{JeFutqg{ViTdEaAx!gfjb(N(T!+)%en4} zY!FNfF{p=$_<{PEGO;(`vkhI5IXy)?5r{`+Mv66lHjQngO|7I9KsgDC7Ii*jG^R^R zq-iaGh5zn7;cn_-NY85ADj%X>x0|(eX)O1cAQR}bNRuWZdc`_yE4jl1D}%M(k3(a^ zk3J#AY$Zgb)$749bLu`A&W7H{q#;M6&c#GK^f4MS-_5+F8XEADh(4m`8G5~$O%hS) z$6uIBib-!cibFn~gHFJZyo4zdz(%hs(hZ_mM z(3lbZ&Kn+Cf;BRL_xB_=OL^?_&m=^f9^~s_YZYc|gwVY={FoGkT+~|%wrpzFu17!; zdfWX%lPHoW()1vZ3#Rx1X+=H%Y{yB?&|z7?-$<611swhw3;6UsIExIu2L&O?i6sch zTtV1;{|kg9E9XlP(oZ)IA|y@Veknrw;6L?wWg#S!kUar5&=gJrDe0|lj0mJFkqCa~U@aqxSW#QqU|`T(000aM+KpA(I#+>L@Z^la_}otRaCleTNz^1lPL>l&)^ z>XxEMwV3qfIK`&7Yy>ukdi=1zU2HSAn*{g3+j!ve@-l(%$ROySh5-5C~_oSgg_v-pX zk3xJ-rG9r~CjFod5Q*7_rVyl)MrTnxQJXG0GCnJ|Lzj68;0)bolNz4q{n*`vFIvtb z^FDGK?yzP!d?<-KO!Q?Ecm*0$n)}J!^pwUQYppTfFYP!r{utcP!iW^QtMLi>s^?4Q zwQbMpMC@S`H%)DLT^T%&?~FQBu+q)o%fVvOH?i3%01HIP(X$Sp*(SiTacr!iCb3u=8|f?r zvgRQsNM@?Z!-?QxCfX<~sdY`J1foEdH_fpF8;?@cPSnvP(_r#t@RiZ1SDRiL(zEAM zdnVKWlchE4{{vC+XW8$-b2gE-dMrl=>e|#`4$nWPD~Ses+~ih1rXMYgxhW zq8EFgko!yhwnEey9nHC4{d$&06?tI*!i{HV~2ZU zBWsoXpynq(>9q&>!5K!Sy74E{yr^BATfg--ii(ggn3G_?-8TjXlNQUW(f4rziO##} zjzoQMe?p1E)D z%ByC|TyOectdt#QN~t$}i>O(0pUz=H+3Uv=EA19`0FKat6#IJtK@`%ox5CB%>p*&6xpi;sR@>na6 zE%JDmVBA0&6UkeA)5E-}$A2u3kILgi`tfmj{1K1QyZ*wXR9U7An{Ab=D|riVpBueP zxHeMvMf&pujvsl;*KguDM_L-eTYQsp26;S#$ME(kiSY>^ z%}e1si%b$NJEguN_6lVaBzTzNJ1Ts3q||7j72$(3U(D#m2M~hJgc~4SlZ!uUB*}sd z9suU(1Y7iLF7GSa4baurBW{5HFMIDD6-CoM>NZgna8OY(qhiit#)OJFU_wwai;7vn z9MCc0h&kt+bIuYBfC)3GDCWU2pduI$?z3lT^?kqZch5O@-GA;{S68!px~sdZtLxc& zcXidSR+(Xd^2sj30DZ54SxTk>uh$jp%m_Kg9iIAqi_!Wr@nwL=6>DRJoXbSW(WSDX znoQQZV7sv)olnnv7?vo@GXAHa8VQI88|XyWCmBpH;h`izKo5EZ`2F)i~%Q+stvQW7M?tpA!3FCbsh5%*_*X9_W|bFC(}pQO(Tr@Lk(CO*3N{D}p`rG}E^%}W|We2g$8m)Q*<-U39CGGuJS}WX3CtI(m|wO?Ls!lz(ORjW2K{{%$}Jdo5=QE z437WW*0G~!dj{%O=UVIu=VIE6<>kOoRz;rAlxIb9iKEECBJ4QHit!SsGgBNFnK8z( ziy;rY|K7?)*iJte>Dt8k4eglR-QT>c>mz^L#yz#)2T!)+%M5XxX$rM!M3+$Ge{=cU z!IREt(zlxbE9=G0|IUmWG3e${%HHC#f0k)sHP-SP7q*I+0=hO% zgTu0v3wP^WaH@qi^t**eK@0l%Frd&zr`4NIqm{AK-L&7W0?RV}NJ;I7EC#}B-QuJ( zLK)}cLr0xzj345XSy(ZSZVz-G?BP<^!lSg@s7Luhp>n4d9+gc!r-G|XDQ=NF4z4G4 z(G+cVi`=(N!xvm#%2yxFn~JE0CWGh{&G9;WNnjBfY?R}(PYYAJm$b^Tm&Aq~C*_A* zei5k^sSGUYzi!OIRsv%I(+o2jG>@UxCs*^7;KVScI&h<8{<6{<>oo}`D^{2<* zOP;({flzHEQ+R1+G?Aly8GL*`nET^XWc%OW{iEf(zdnKO{>m0PzkW6Arc0qEX&aT{ zN&kw0EIp_RvH6XZ#up9EOg)v=-=ZfIc{HRmP^;szL;8}>yvYt`A_-tb9YZ<32Gy_7 zlZgw+vsqIw{aS+D_za3P1q4W&YhAZofKA=Xld{yUJ=LPA;bTz!I)RNy7DzIls=T!D zDB7eMtVochDd{Uu=8Sa$3z5iE&h=kYa51aYIF7@ivBojPrC>m+$G3ny{uYwo5tjPZ z$1*bu(Ov4>(goe0he~G`eK*qZ@=P=Z;(QpN zXs~axehXWTy0Mt?p?>q!*H*X4s7K>t?x=2&Zd)1EjgKMM9IjnRRyV{loLXGi}A88!Sf1_p2z^pQH4!>+b3k&t!PbG#cEED=s>+A)?S zj{GZePq~Jqw!yKK`gQy;l zsZR=|6i=l=BzqA3^a)7pAmAFT^zpbgUixOFm%3?+Be8LY$qQl_agcQPy0t@V-g zAvE<7!}DoETfjg2hS_owx`C~d(@57aYyDF>Ak)j}Or*-x@SrL5QW!Af_IL|o^L4o( z9YpA-#A zVQG8QkezjB)~(sclk2IInBB&nfToMr!&?sUl}V=L>M7xt#tSpwl<}%5;SR=2ri44I z*CYMEuU9xTb8>w$Z@i}DJM)_VzGM;d7|=~lZRY;xLh6OhFKnE<&U7cyRu3mY#;DgD&sRO z`aiSKE3=H%EKt6NY& z^|#G=?uHR;rpGGfaguA96_0U?k>t+*yusfWV9dAa6vhh>2mAL4_iLj|B1lPKg1)%%rjr=cn-JGO zK`o$CgcqTVn4m1+@8k?}`kkEpozYi+Vvqf=uTO57MFow?TbAkiFZEx4pYY}X^Xp&B z{3rc>GmS6dlL`MH(n6VQo-H&Wt2W$Bv&YiK@Colomoe9xZFbtrW|}RQE~7uu6NL~6 zJ)%sC<$sR7XY>>u^*wg|eyO@ndn}IB0N!LITuV-Uqd)r&vCm+|K%r6MWjB`ArZ!3X zdD6+C^Ed4TdXN?jX`9i4sE1>-X^xwvG;zphNtBe!<-)WHX62IF{<~*8gT&-n>mP)3 z%_zEZGwM2i4J|IqsOpqG9<@F57OIysScHs7|M&eHd-ngX?Y@az z#x&`s@v-FAU)iA^uCGCE=({Viq8S^jhVk!?cVueH_9rfw#Xyd4I515b#dAB-7_mi$ z1Mw2gUkUe0h`4mxvoms+=CBA;1*3j3fg9a$ZKDF(NKKk-cf$Qh*W=Do&q`){IX6o{ zDQXr2!_2f-%<8-uWnJgRSab8&b*``$!P@0I34yjUEc=#gRGowXi9?%_F^Wl`bYb0k z^vtY)UV3*Ki%xK9YyAY)Xntd6zRV|>`MQPim$zpce-#`F8RISQ2J)h!r)k6#>BP=_)<$1?se&>G?cZum-rG1r90^Z7C1&grYizwKLq(vH(r&?L6_Nz!&_);W4DQSu zh$&fMoW3}nRB5)6c8uTuwDktoVA!5!#&pV7`_4wQzq^a2u8E6fiJ+-We->1PNVl4} zx-Nb?OBX+F!cr@% zL`WwWOMN}IbXdbh16q?4JHKglU8Z6t<0?26%;B(0IuHl+K+tv8J?>pxRNN)7x&R3hefVuknb&Z47av>{MsiMaq1`i22{}Q)rTExK6=DkHFj_ms zP)xs*oEQq2l3p?;Juhh{NE+0+^7~pzr2Okz`b4hPHR5-9R?P8#RGxgEg)oEiMKguM z_tTWlU75Q;MzVbK(~OR(=BJqw>Zj>sFi=FPSHr$aF8y3r8p1~mU4)Dh0Y7V|c zbLCh+O?a4fy$p_>RH9y0Oxx6hk_Tt<@LA(c=6+u$-l`WHxmtLkhOAhVtdJxl302B? zYITGvL;H=h066Fan^A}V%mQGv1k$7)=tNs8jiAOsO?JGK{)UOMVFx|IMdm4QYwXqE z9IE~vz-*|h%gZQvI?{QhWd`voM`d3&R^Mg|*%kUs&HtJCD=pPR)a8E;(agoMMlak} z?<2>Wls`e=i8Un}SATJ{I(DGiWbW#+p@p_M@2L(n%*YJ$?zEb_BPFad*VN0~jV^|F zc$C?H+@gChQ_KZa<4%kE7bBE`(a^Kyg1*P^tK67myvp+ql%w5*%px%A8alcfCos^T zA&Kcl%{S3_J<~YC@_$~~Xk(R66wLX=z&zrw5Z$jJlUK;d0bCg#ZZXat{D%7_Zk5Ml zADyrB%tur5VLSq4qmM4ukVBiEG5HN26RH9g6S_`HW)3543Lk%BCF~IqCS1rm!E!Y- z*HOO2XR+}&_fE7hCO4B<7!4C;th+YdY>G^J^pd7z83Jkw(-E+ZTvXzK+8+8*&y2A+ z+I$Fzo!j1w8RKrvEm9}nD4RMDHM5R#28&3EZ1K`?nmks|JYc#k`;X}&Z24ZRCu9WN4D zLk`q%i7Sfn^HgEeep-%D2C#36$%}#2pnMc^HtCe#)OzYm;l$#_{M%#s?W~A#nw<9Nd8T`< znWv?EH^yqiuG|D{QpoPI-fkHs2{Pu+e6OR5G`H zAg?d9PiYgRsR}=w>i+G|34Dwvh%%iZ%5;J#(+Q$XC%9=FtqbdEsOLwMgKKC?SOeZ( z!i*R9P6?B%N7|%>$>k$0Q^Mr>k>)93l7UFGlrVGNUL?nIcmCP*6X-3lMa(|mB=C>0 z+}f8(j8j4LTe|3R@02Licus7`Y1S3YfZk8zi0v7D4+&v>0B|SP4&~{PGSF5Djz?&Wl54dlp6_Sxy*9KPm_!C6f20O$Shsb+9z?D&zkT^ zO65|RWP5CL>3QB`+V^zsb?gw+bC8s3ftw22Sg_$786!uA%aH+D;;o#>RmAB;ipJ26 zLvu^w&zc_OGN-)*`%cT#HSiR3+AF3T4?BGg9hI0DShQhgrjbl^#^K_l>-cH9L~(S~ z>8w(u?+S7gtzCY55VB&U4Hsc_B3x*`;s*I5Q&4V@t^DPN@msk5=-bY$+){^nNq#q) zGP*rvtBX7{0~7LGV+`gMW084&+ zN(pZmXdd?~+xr0XxP-*RSO|Sn(%CYgwd#AO0}n7yxyQ+#84e^KV`pM3iYGo+yt)yT zf$0L~5pnNH^Kwo6xn7)kjp+jJfw$v6MP#N>-N1-!QGp#J;@%m|b~d-kZpeD3l|+`sQ^89USdTy5?$Dbcv7*k`}D#XXBll2fF`#;tjp zus$$^d|iXP1Am78szc|Ue`mi zxKI9`Ntb-Q3SKsZADOpidQQrkxgl~ZG0$SY$ArxdbJ09t@Zq#)G8e4wp+&4V!Xcyh z{|lFii!xm&?p5aH*|5)e;a4%gVlK_S#D(W3{FRHCmoYE1UHs3y7(X+{Ma9QP=r2ks zrpQB$`w(FgGmN#`^g|!<=v*Ie?a@B@n=*3{e;YC_r;!;YvyLf`tv*mT5phxfEwK#U z!W;{@**?jKfWJFotW=HBHVvHS^qN*`hLczGSDV_GXI;u!*-y;rEj$ z>Z%a?=i$S@RISI)ATc2>NkEVL6(1L&Lzhf@F3qyq=&63_8|%0sF4hse+0i6pZLE6{ zkF6ZAC8l*9lU&PdVm;%#qD8!U1Y5N4vS9=>rUo~0vF4{Pn`UdIZP+tgep?3HxjZWG zqP>_+UKSPhM)2Zk^Vd0uYQu(z%vVv1xbiMtBaE-a^>{Na%!{#eKyG+2uGpOvC999) zPuB=zNpSIbUE=^~6rb6Kj7I3do|LXgs^# z_s>P*t?E($lpG~SDL#8#s64*~(v#GDW%QND_O01qxDanu?OzF9)P$6GZk<@7I8yuGFwdkF-e}bUTJxM_v%6ys_Ol4OfqtN(}aTqXmuglpA`>B`mtyh z6h&2-Tx0FG?3x8T$SuPM`0H=(Q!XrE9HW2({IzA-Ig`iqzsOl) z_@DC|CS_j1a3)UA6Nq<8lMNuW?GlLCNeOKG>%HY zq3O}tWN7-%g@G-9ZyGP&2xUj1`1r)fNx_tRY#-{9!+}F6G6uAJ8Iyc_m?%jkffet~ zhOE4k8!Y2vO>K}hY7LrEJ+1R zq~vA0T-F_xqnY_oo(1MG@fIt!J=Ei?|2f`Pjwivs|2S6OX@8$uddkPg%A8mgrP)X` zb2=O1KE!)Cm@?w7nK2sc6&q*F71y5Fhtui}-3i$c=wocL?nq)&u?YyqV|{#LZ|NfC z5cj}be{Mwk-7L@<@2+6x=_Y7oOLoajFYZ%HNtkttXND4~Egf}_X(oP240+4Wy1|yg zLuiD3H|^aVviMiCOJfHw-DtZmniDn*Ya*{i$AoFAZN^R+H zWys5mwzPWtM)2Nj>2GeZ-pPkNI%)Yv5XV%TU~cihU#OI*b4X)iNqc6Dw$U%6z)j^+ zQcA&-JuLJS8*LZT*qIcjdmc&s=QuQg9MprdAc~%TGQAMF(=xQzm56Wbg#YV=&Tycf zh~{YQ06Cnei@u}LF1i?;y6E$j%K^vHK9;E&TlV{BxuAxOEr+@<+Sf%= zB5VTkq<9cpiEhaH6CCTKeVv-PkSD8)ARZ}2<3L=P^`;#^6UVY6C4yl&tGP#xqZ8&r z*8FYs6G?*o@Hr(R0*i+QbTUqx8c?&Iv2i&+Q{?tRiN$?*oDVRqys5unJF&H)`R}dr zyS!-^t*>fYfxB?#R=dge1CXXQj}*OZ#tp=cKp~^=@#3le4&H zJc(*%@OcvFdfUXSStFfC$|(z}s|gxyq=WQH=5V*L$>qv13?(VWBZ+Foz(})ZxAZ9< z$uuY@1=!$3DnYE>8k#Jhg&xLxB+(p;A1f|}6Q67{n$67U8DQh@pf4tUfV8iFN$zt{ z5~6^kCm^0()Rtkor|^< z#)c$g3hIY!kT^c_xm0HzmSCA0Vxh-eRW8Ye(fRBd4*kFi5{*;^ro#(>4}thJrKw{AC+qz^`SF)HFE@+6)Ao z>+#uNp{INp5o%=L3q$_Q^lxZlW3~y?!3NshWQuH=93||Tm8;FPX9*c*N);P6W%YJu z<{ILO$_aWoKSSNeiPIJ5E$(Pm?_T`X`4-gn>cuXbIEy%MM%>DI-JOkE*F4zWSxkf+ z6aV`d_WKspx%X0&$XVho;=Mif1dir&B9kc50hJzJ0Wt)kjZKQXjWh?AOlL*f2TT5B zMH&oCrm`YkUrK&tg{DMp$)`HA(=rE*Hi0=8m4NDENs7rId;SELo|at{1fA)uOJqQl zy{Ly^YlDOQ=Gyl3nNSQLissRoF};X3A&Z&+3in-r?~`!7MhM6>!e>Cta_1rS)XbAQ4}QA&-71CFMlLGMCe4X-wuXJQB<>LnIMY5#%WDrQ zzgp^ehW5+><3R5mIa>)$5RMk1!Ga}S*fUF`!<+uMC7(uYESy4WZXjXj0&`=?O`C|) z&2MogeR;iZll}BJ%EGUBv>%YFJ zh4~c^XHvvKSMp^t5#qP-wm_wHl0Qag$>d7lMwrvBo6vDmKk+0^L=mludtp-2z{1AM z@%fm#N}GcwHLgIE_SwRaY3wJh@tJ0tr3rSXoe3fC+?T9RduGE`L#9awGCDYv*vY$X zMu`~y8sD!e2G`qk@X$4zWs^1TvFHc!)@4%`FpO6;klYv>ZDFOnKVub0fOi^OQ_ z7c7=h`5pTYtcXT6tri}R+VRDBEj(vB;QZ$SrduHYT=!I)u9Q2IfzkG8al1E zrw3%%owlVM{c5*&!gl`a?yp_*qLszbHZ-ubj+ScH?HG~COt#W`gG|yzr1oQbr0%jv zi(7_ftmC86!el3DZYAD&bnES{Slg(;?qL5#nJTWC7GIt;W%32xHVym1U{J(w3zU%P5vH z?DJ!>WW5uzYXtjQsP{3!?dmmAf{L)z7Tnh$n!kcD_d%GHAh|}b!O{Wy&%a^KY#pktw{x&sXy*{N)9&}a zDh=!$mTa(dXxiNN_cl3dTi?EyXH1&(ZPnPZA3`QhOtJs`Ipf^m!S@dhAO57%rAv!E zD_8DiVPgkOHY5(=fQ(xulMX}vwF;!cOKEv3)W4aUZi1ERPgM{lYiv? z@#CYx$LDZVvu5*clahYE+qchsz}>q?er?{|^X-8H9v9ZGEuOk{YsclIM!oD78oDO@ z#EHOyzkWU2zhp^0|B@wJcdb!lh^)Ft$X^)7Ab)}u0DsNi8yr#y=D%-Kut1D&A zk|leMoHdGCt(^H-}- zpg@ho!-hTn(6#H)pBp!JOX<*IYa2JWF}?5KKXK#8k;xOwl<83a#f$inl`8dEF=Ixq zuN^yXA9(8)jfRR+{{8!~Ue3-9i=?H!h&*&?{QGX*j-U7UzuWZc)sVRJ=LfW^U3=7% zmMxdwZQXjM-rM_N%bPc64vvXAQ}*M>ORskCZkOlh&-a%aH=gyNO`Fx7U0wZ_&YYR! zriaH|hwtALtyNG8!d!FCCVny|9O`6Q9oi}gAE*CE@`MhIC=jl_Xq&2Ho zZ^GVw{UYD^`kpSAFJIMVqes8q*sE9Q%4yT`-D=lv{nW>gxA+w+)?`ZAvYqxUTUv}?)(l~Jd&VAgwxAFEqeJ<`?w5ayhWy`A6eEIT@ zZv6PqRo}e1*Elj#=To!huoFXvKAaa4V%G28y+gO#wq2XBYgdb-Lx#lu@bcQ5B{}&^ ziMMZW9_Zgcdj5n7$%*^-H*>PFakzK-^zb?3#w86eQKIFjiWR%N6f9Wl)AsFMt{go& zy8Y$LD~jv&S0}~CZ(17=pf6gaNd5R$t(HGNcdqv=oz8yd+_{>CBSs`Ns$YN7#bd`t z?)LM$7Tdh}LMsakYqOM;)STI~7u?djcX-e0)&0MB>9RlO)Tu#>X3fg$9Tv8#RG~t3 zPOV>Gs@Ah-ak;*IGaOmDvYcy<9L3HI8gzR^T->hU`SY{vSi02p_?k5piWM$gck%4m zxt$Xeqgvd!F*~Dk=iTEcY*(8@XrVSeZc=U_^$?k5Aa_H{tdx@Hu&cTe*^eOfxj*I zzXSgP;QtH!--7=I@J|K*<>229{KLV&Ao%YGe}C}r3jXfkZw~(Lz`r~ACxd@A@V5c~ zCE!0A{5yhw1Ms&4{|?~aAN+fOe`)aF1pXTEKL-9;!M_IhuL1vh;9nB_2Z8@}@ZSLb z1;Bqj_y>T0Mewfx{)fT;1Ni?0{}k|V1OC0i{|5L^1poTrKN9>`fd5zUmsbu2{L6!X zFYqq{{*mDS9{kUPe^c;}1OHaw{{;N+g1;X8TY~>!@GlGgufRVK_+JA52jJfs{Fj3N zP4IUBe{1lc2L4Il-vsEPcC{P%+Y8}Kg&{>#9B zBlxcb|6AZc75x3ce+u~T0e>y{M}vPE@V^88b-{l;_&*2#Lf}6J{N2Fc3;f%He_`-{ z1pe8;e+c-$1b<)f9|ry(!GAmW?*#v?;9nE`b>LqW{2PP65BQ$||9Rlw5BzU~e**X) z1^*x5p9TC&fd2vTpAY_t;O_+f_rQM+_zwsFQQ+?a{-41A3i!7N|Ki|33H;ZBe^Ky{ z2mi<5KMVY4g8xGBZv_4q!GAaS$AZ5V_?v-$PVnCX{yo9}JNUQ7YF|c@OJ|L<=}4x{;R=13;5>*{~+*x4*mx4F9rUG!9NiEvx2`C{L6!Xe()~< z{=>k(EBJ2&{|?~q2LAWK{|NY(0sj}^UkUtYfPY8uzh&ev_3e+u~51OI;D?+gC1pW!&Ulsi8fPXgdZvp<+;O_$d-N8Q` z{O^GOUhwY&{)@nW8Th{h|MB4e2K*zzzb5z(1^*E6zX$$p!G9O{4*`EK@J|N+x8UC& z{3n3_e(<*e|I^?<4*W}ie?{;w2>#o_|0wuh27f*H$Af z{{i^#0sk@J9}WJ~!9NQ8CxibF@b>}#X5gO${`TntSn#g`{<*>568x`#e{t}S0DmX& zUk?6O;J+IDvw(k2@DBq2=iqMu|5D(882kglKP&ia!M{BC=Li1+;6DufyMq5l@b3Wr zZs30({EvWt8SsAr{*}Og2KaXbex1_+JNqJMhm1{_nuQC-|=b z|0dv{7yK`R{|@k<0{->DzaRMff`2~n9}WJ!z<(O}w*&vj;9m^<%Yy$x@Sg+zO~L;I z_@4xSNAQ0F{yo6o7W^N9e**Yd1^+tWpAGz5fWI~PyMTXp@DB(7JK(<;{QH3aBJf`Z z{x89QJovu>|48t!3I0RDKLq^mfqz@@-v$0dz~2k}lfnNj`1c3@3E;mU{B6MhH29AL z{}SL|5&R2+|90>{3jUYDUl0EA;2!|~MZmum_@4uR9r(`${}JF{AN-GjzaRKF2Y(Cj zPXYhz;NKhktAl?R@IM9qv%o(L{0o8qdhmY+{@=iVCHUt6|3Tm%2mbTHe<}E{0sq3_ zKO6iL!T$#McLx8`;Qti-=Yjtw@DB!md+@&i{;$Em5%>=Te|PX-1^yMlUjzOJ!M_vu zp8@|oo;#A;ckJ&zC1Pvd{L6cks&jSl9=A^(>x%60{;_w7#fw&*e^ho(89HX)qA}Oz zlxS`KHSNKxb`P$Wy%f}>ddUS_`W$P~_0W?61x}Y(nfM2EXaKz+&0j#kma=hF*B+(_vW!?fJWRiUxR>8I;hXNo3S~|KRYzapUJF53cXM zDt_dtQpejpJD+#ooFu=!&QV9}+?edt@@e1cRr0^;<=TFQ$JCB}62|sBG-LnZGX*zJ zOJ7>f=DYX6<|Fd`@>no?$djcfzD?{<{Lbh-&&^wn>aw87i?Vw<`(-I@IBXGqtkUX< zmu79Vsd?w~?9!DFZ@W7(8};+< zmha7@50T@WWt+4qQPXHrRN)!l#D~z%3d-92eYvW8N8~8nc2w6PKQprb@~SmcQ~2Kg zdZlVtsL?M@ldb6X?gMXi>b9m%#TqV$24u6-yy>#!_VN!$*DqRApxvd=pv}&Ydk<7asY~lDfd|gS zuln$-*VHW=N}8pf{W_}qB{#n&)u#OHHl|Et-Q&x}uMSLmf4uLfmnWkiS9#ztvu~q@ z#a85U&T)ChWS5pRztuZ)J4e;;`-g5SbEQ?K^@YAvKK%GyhgtS9FT%zS$#bOKs#7C& z{b;^4N3nj1%`VPM+nK*X(#F{Glf6DJbS-wJZHw7qw`#?uZ;qZXf%%JkE2?wVwWcnoj8yo+~6pe=>GqkJQ=~zaEH~em=-|!=xoK zgLYN8H~dJ>5;xse?Ty?q*~wv8-?jRQXWSlT9ar*tvXjp+vlFY|?OfeX+ke=y*Hd0+ z?6$diw&-hp?vHV6-kiQsV|dHESvS1BKj~nZ1BbU(sZzW_*~&||T@LlzT)pPmwgKCt zr>7l^S(uPJc86=rm6o4UAHH+X?sU`@!l7 zcAIL>cl_oPTsN2DL#bUisz>!c@%~l8XLS!Xo8a^G_Sy!cKX)E~!_nzN%`2ndUQg}V zZTGL9j>GFco%N{6xM^PwMAyGK@KpI~F130#+!8)2qEH^Y63@@-TGTD=zRW&jq}k5e zPmb8xtbKVjc43%Tzuq&hP8@N(>b-#OLz*}0axw<|J;A>t_(y>Ma`3+j{-3~q5BM(u z|IXl_0{)A@zXbTFf&T;W4+8%M;NJrL2Y~-d@P7vW=HQ#AM0R9ib zzXJH*0sk`K-vs>q!G9e14+j5u@IMazdBNWg{Evda6ZlUD|6btl0saZ#KLh*=g8x$R z_Xhub;6EGuPk?`M@P7{eUBJIA_-6rs3-DhJ{@cL+Gx#3{|I^^#9sJ9I|6=e@0{>0m ze;xeqfqxP3p9}u$z<(q7R|Wq-@UIR2yTRWY{M&>7ckr(V{`F|E%Dj4E|=|zZ3lX zgZ~upw*mjx;2#J6H^Bcc_}>Tr1K?i;{40ZhDEQX||Lx#^5d3q4e@pOB1^?{eUkUs} zz`qUncLM*X;Qs>r3xNMg@Sh6)mf-IT{-eRaBKUU&{|?~q3jVpke;)Wx0RQ>m9}NB< zz`r{9zX$)i;O_(e4Zwdq_+J43x8UCm{2jr67WhvC|N7ux9{hWP|0wXc1AiU(yMzBo z@P7jSYr%gZ`1c0?5#S#H{*AzY2l)2~|E=KP1N;YrzX$kxgTDp%{{a7?;6DcZTZ8`t z@V^TFO~8K(_;&^W0^pw={6oP%5d4$Ce+Bq|2mhYnzZU!_fWHs;Yr(%L_zwdANbnB^ z|MB2oAN)sxe>?Es2mX7(zYh4f1pg}F?+X4?!GA3H?+5>l;9m~>2ZH}E@E-#H-@yM4 z_?v_O0`T7h{-wb`9Q-GOzYX}$2LEl~?+^ad!M`B*9|ix<;Qt)_lfnNy`1b+-bnx#8 z{++@98TcE({~h>$1pf`-?*RUD!QUGEt-${r_=kYMFZkaD|J>mJ6Z{jwzcKi)2meOk zuLJ*X;Qs;qvw^<`{H5;-A9}R2!2dn?j{yHs;GY5hwZQ)#_}2#iIPl*N{++j9Q+r7|0VEu2LD#zpC9~BgMV4@PXPbC;BOE9SHOQK`0oP$eBhr2{NusD7x_-_LLO5k4^{5ydE3-Hea z{-?mdIr#Sj|9Rlw0Q}2?|3dI@3;wsje>3>og8ww|e**sV!T$pIuLJ+Z;C~JLn}UBX z@IMLuso;MA{DZ)M3HVn4|D52z3j8O7e_!xF1ODT{-wFIrfd6Xn9|r!f!T%=s>%o5w z_}2jctl&Qh{11bFaqwRX{(j(p7W|{ZKL-3`!G9(AKLmeI@J|8%``~{N{M&%PCHNl$ z|2g1a1pM2B|6A~{4*mh)?+*Tj!2dS*dx3v5@b3-&cHr*_{&m5>6!=Gh|10o61pZIK ze>C{t0RNice;xdHga2^we+2$t!2crnR|Efs;2#10CBVN0_%8#0Gw?qG{x88l4E$$+ z|8el|4*p%hKN*fd69f9}4~*!2dk>2Y`P9_(y?%IQY*8e{b+V1^&;# ze-8LNgZ~Zie+vHj!M{EDcLe`_;6E7rr-8o>_%{cC5Ac5i{u9A}H2Ajy|03Yu8T<|4 ze+>LDfqzZ#FAe?|z~2J=^ML4*VN}e;oMh!9N)M^MQXP_)h}= zM&Lg~_y_+W@Gl4cIl#Xw_-68&e>d>20sh&*zYF+(0RJ`M9}51D z!GA3H=LG*H;J*?4i-CUu@XreVI`BUZ{)NH+6Zi*$|0?jG3jSu`KMMT)!2c)sHwORW z;Qt={UxI%X@b3%$E5QFU__qZAGvNOn{L6sE7P z{I`MsX7Fzd{?oyKA^7hAe@pOx2maT=e-Ze%0soKSzZ?9Qga0k?_Xq#-;NKtodw~Bu z@ShF-w%|Vi{2zh81Nh$u{|Df|3H-l-e=hLf1^&IkzaaQG1OMCL{~7!p!T$>Qr-J`4 z@UI8{O~C&E_zwhs7x3Q#{)NE*Ir!HFe|zxX3I2BAe-!+^!2c@vR|Wqe;D541R{wjI zYiz4^q2ZSG)4n|TIq601>1!%w%&s=Sag&Qr60dfexU}l_@Z$A8v|eW0=to3bn~IzK zO2@ez9@A}ei=nz(B}RQq={IZO$~!)jR|gT_Lu#7Fw$_QuD0W<-g(Pe zPB}gHe#vKp9Q$@IYBw3==t?0yC>6SANDpCSe+p-0LzW;GiOf@Ds^9vJx`o%=y!8`~ zA0EBCb)}jgFQ1>@E^%AOj7|lI-}&^T)GLQV6$U;DpW}7#SJ>+#%7_solms=RvjN_qM6r80BoOrl$KQL0z3uDpHwRtLTi)TFc2WEh;rk`4W)kl`by=> zm6gYjA1gh3_EdWG=%HM?bV;$bwN>)x&#!FXzFm3t?3q%#c5Nj(I$F7R@1D}ESu@4g z*H@{>$j`XAIK_-{fnB?HRqo%vPnX>GikFv{GGxdQrA?bQicY6f?CtH9)vH%4etv$+ z&!0b~U!ijF;6bHAg$hbQK!B1nXHKPDxpIoLv$K+vl%yOwbV!*oV}`P7)hgxb)2B-7 z)~%JRSFbAJ;o(ZPYSok}Q>G|m#*9&{tgMuwLx(CSPMlD7?b@YOsZvF`MH_71ym=K% z#!WwX@IY~NbX2^(y_Gt3>L|T?_g0=fd7>03P(aC%BZpG3U_qs7)vAg{qfyqbU905D zlSk>;v7_STy_B@HG-c4BK?-qcl-;{`D={%K%EpZwmC2JQE1NcLQi6kn zl|Fs?C@WU1P&#$$q;%`nO(|Tsu(E8~G9@7)f&O_JO22;nl-sv&D-I40%EgNpse6nU zY~EbivSo{snwrW;v_OSsQ)TYlxr&8_h4T9KYvtj?hf3D0S(OG28W3V7URk`>;-o2P8put6C%Y?yNP>{(_0 z{P{|mGG&ynU%x8fzkgSbA3v^Cs#Hn&_3M{%^ypCr`1vT~#*I@}u3V{DTU#ss{{G6F zH*b`tO`9qsM~+lZpFXYJy?a+FQKE#hXU`s`QKLr6oH=up&6_tXAt52kj~_pjQKLpF zS+ZnNPMtcXbne_)`S$Ib^5Me=W$)g-O15m-lo~Z^C@osFP|B7qs|*}CP^nwDu2QR3 zE#=dvPs-MEG>m8}vL?I@LO92Lx( z%JqhdHIhnomkPCq$~1?H6hb8$MFl!V<@rX%*-NFVL4_$xWvNR=`9vjYNCmk=F(_ZmvK0t%O&i8-B7w1-f#t5C45QLf=A)+s1eD-`MplxYi2{s4 z`AtUg1*7yjG=0bCQQtnm}yaoqOQdB zimDXTE+${ppO{54`=aW_9q5J067?u*Thy|cY%zsmYQ=<$$rCjy=1J77sBKZbVgkjT z5wjxdT2!E@UQw-LF2v-EDHb)Kt08WNxDVnIiOLt#E^1!P zte9SLZ^T6tcSqbIam~c+izyP5B4$h6DlwZm}qf3#Pt!kPE47YZZY{{ za>V3|D<|ei%!ZgqG3jFJ#AOh(CuT=nATcRo{>99SizhCTxC`=6Ot!dQ;tqF!-?y0z~;+lx7DK3Gy zs^VUVJ1VY+xN_otii;@jlek;r4vJeRF0q(;al^!o5Z6RpAaVP|oe}q0Tt;#0#6=bt zPuvP|uf;tUH%DACG3(+QiEAOQp}48yDvKK?Zko6o;vnxVUlRzKDw?=3U%y zajV6p61PFjy|{4V>WFJ0Znn6@;vQ4QYVqjZ!6^^LH3k(B$Kgvrt{27f8LUQ8EyKZT z54f!6mI8U4*4$1Ps?SD>dlAT_@@S8tDx$z^Gq*pF>UEpyu#haJ@MyD;y&b5BQlL4X zVmnOMTkuGpP~95y7`lV}1G0Gq?CVo3U&-PERM7xbLJ`!B6OVKlxE!ELR-$O1gW60~ zhdo$z#z}Xd?eo^iGP>0@Bm*uFdI-s5v)v^qX94P*AsE$}vTO-uPHLChYs#HmEe1*#B zjVj4c6>2~=bwfQ)2c6@nz(-V#yQqnks1rTvONUA_r&<|M5!t}HJXNg_YTzKMVmMVd z1f=IsEwWQ3^MUkiRB~I?ur1YT7gf!U>N%dOlmiUt%cv9sjW<*oAJo$`RL(;lZ9Nc; z1h<@EWr=zTpbF7XR;dhrQ&5LTQ9Y%>zcVUpAXUf{^?IHv76bYhsnS(Y|5vF#Wl@{^ zz*K|Uj;87ni%7{p#a9J^L8vhs)LI|mA2sQMnz;oYKT*G@LH0dW-2+oHjp{ube1?L+ z3{=$ys^JH)Xo>2MKpj>@t%Ok}&A|ONrlACCt2t_T6>9$!D*OnhVj^nmJF4IYD)#~= z=P71mBr2o~s^vPE3_)$>LS6Plg{(nE_r-jyL*0d9idvzHPN1%~p{jy0H9b)mhfw`_ zQIpA-l(VRTJD9Sj;CmBwQWMO3pvsz|ik6}lf1uLSK&TsPeg*0$9n;ViGqM-8SQoX^ z8Z~2q38{{n_=4Ikj!HX;iS)%}`h)Lc%;r5*T2WMX6Vxz0Hk8Y#p~a$SCLBRK5z}!F)e(PXwS2z_&o%t|PgTyIU2=BoO}VbB z^5n^fCwKK3nnRUlW|n3)R_0k%*{)sDc8!Luw^wD28nHF@eHgMvmD{&(-tJ@BK0}qa zZx6ryDUTgMVFIQ8Q^XHq-x147-SCw0~ z9N#iBcemTBw6m*h*Q>765LHf`_-SIs+>{xrtX}F7Mu0m91J;Y1L=K@-nJSPk)-e zrRXzXRd(s(-er28{r6OvJ9nqtJKf8kQ{~vPVPiKO|Dac8&6M9#XsPe;y4Ihe+47;w%Nt51B zy0Ylo8CClE&GgIr;@U`6#>aPz-#&lGL{;X^+dc2eRuvDZvRN~;X68-jd#G~#`bO(# zJT97FmC@0f=)#wR@2avwg`*V$S9SGP<%J8EFDx40x1uVuWGR@XR)OpdRJm{8{C#G{ zo9$I)*RFwG-&Q($P?cJ34egL)1wN|M)%BX|%nZNds_ff$QQroiFLzg^xw(zGLpIBt zs@%PM@$TBSS}alJ$dPd)5A1yYM3s?|St7IF47sezeEIt2i=15bmMUAcsNG`Jh{bNI zjEid=H*58Qo~r!(`Qzt^Lf@;X^2LiiFIqK!v{RMcx{d7iyzKE)s+=w!uga1oSC*`BzO}6?t5%Jy8uFvx1yvqA_~T$=%gH{fOia`!7Vy9MS(O@1 zUClVx!t~WQ$$R%k-+R6NgsUopg6aeXoGz5C%Jb*L&##))yOb)gU(a>DQ08GBq_bW-Jn3126qE=Ueh<-&y%7AC)~*H4u_d-m=b zUjO_$RXRHdITza4u%0Rh4m>w-z`YoaD)Z+bm_KGzwP;oD-#>kSzVhxTRC)C1+oMrE z0w=4oQ>QkaR_EJ!LzPRGj9K#TmD^NR7ArQVnEmc1l~mcUUr4_!iIII(`RUV(PmgkD zlvU;E(YHol*!=pMDs$#+o^xSWm+7i(*sxH;I=(>@RB2=5Y}2r`LvvL|M3js0(yv*j z%6IQpymOs+>8UCoJ!`Axlx^bA#HNJ#dOg4!&LR9UZHa=oun6Czc) zVujy|YoA>4e@yakKS9=S-Yjsl#$D}qRhBEax17gpuVJbjGv?Bm6-VAZQ|0vORj2nm znD4bJ@86$#KYiDs(yA;_U`T=3u{9!8dF=7Z7n# zl?@uCHFy;<<)JD&cW%*nalzeJRJnQc;mzY6d>*Ot?b`)!E&4|#sCsY^p`oQh+rC*hUzJau^n7xD+NNHrELd?+wSdQswK{7hd=ExiwRj*|XQmKB7j!DXJ_|WKxlDee1tbWuHFF z`qWIl*jbf#?~c9uVau^Ps@%DA_0BR?+e}mC^5uP&UresjL6zUXM|@vX=VKpLUb^IZ z$uDKa7FCugv9v_>LoFRt>Ekor=d<(SJ*u2BqwI`M`*X*ra@44MqfYF2c}bPEYrm|0 zFMiZJRkm(jp>@~ZEAyzbN00tJqTS9eRpq#Gzs9|pnY2NbwQ42QijN)fN|p2GWt-+<0Xc~!Y>+x~6twq0JT^7-=v&l|Ui+oa0gy;t?F^ew!tDvumVIr7P4 zVk1=+EjpuU?rn{#sdDYwmTQ;ZFJYs~!iC2bPV%e!L6wag=V)B4!>rz_ymH0u%9ykz zhg6xC_8{#@IeJZHN=r)zOJ_$L7ge@z@6-OU&1S~&ndGWfJyxB)QmKS0X_X(^?&8B@ zsv>uQ23>())G`|H}cFjY>QR)5;03q^jZa_Lh4 zrFYY-H&kV6>d#bz-Is!@Jay{HsZ9fhJE<~PuGYC$_AIGWW%=?4%THeG-CmVb*syKGx?Fu+Ta_0t*1S0E%d*|7w6L(VaMD;8P^Fibhu7R( zdmpQ^NfY}f`CH8Cp~|UKpG|$bK7FGqckNogt7y&ti@o=NYHIl&Mo;LW_g+E?9YXId zKtQB75m7OO01-%l1Oa=)a_v{KTx{4Cx#~r1h^W|56cw={Dq?TgQBiq&PI54E@9%f{ zzW3I9>#grUi(zK=?3vlKXHVNRXA(P)aBXdO*hbGx$|l_U`s?-k@^j@0_rwYF6JZZF z%q85!#Q4Nb65HMq?wva+cm7(;hekq9?0uO=`2#7#TG zb#^}GT=6jjEy6f9=EW5g z?^qi;JOnnSpsKcD@)Jn&U6;m(<3HYaq8+DXFIH9zxo?jcgF$F{2<%XrHY#vQF( zyjgLQyV3m{Cmkbyq-d3RKHBhR`0bI+HuC#6=9V{%QT=csKsx)O6@9_>DHS*SUQf>I z)CpgI-l0*pX4EX#kc8B@q}cRqwjiBdn$BgHq;t5L>{3h&j)0kE+&msDmy?Os7=z*l zB1CY$Ft1FefQezDjIeZiXlQywOekX{q($LyMpAl66dhEC7#0>0mzbW<%VeiRG6+Y+ zB&CNY$E7nyriap#=y*6Rfx#F6h;U*UDFdJ^P63~S@}O{e0t&ylpnz8-U}s`n9z{eq zg;m663fL4DGcPZL$;!pBg<49gtHG`Xy9MlSu!q2&0(%+k9kBPoJ_P#)>^HDd+DfXb zU=6|AgLMMy2R0OJ6xh*V$AK*XJ00viu&cqY1-l#UUa*J29tV30Yzx@SU~huG1NJG{ zH()=5#dIKVKSn}AYyzlaF^mlgU}zwmsip2t-T=ao3(b`U?}G^a1-a}p!p|zo8^9@I z7b1TqpNSQLWltzb7oiH%@ddmhHawxt&r4?sN`)@F2sH=p=d<~I4v#zFPiF}u0Uw9u zvjsUkkc=WG7ncv@x}fsd8O7P@`M`4?3*{9Y5sQJK7tasRpU=ZY4UDn5*&HrpSj+)lu~1Esi~I3!?K8N@ zpI%VJPG|A*3oucYF+2dcNQO{3$VGXN@)^x9VvWw@WE4T|^Bi0p-5p&?J1U#Vw zQI0IEfCm~ob`izYpAwS{3P_-bna^Qic*{XPRK7Je)5eDqTfpWfCPq8pzU<}JB=Hv+|JgyG~L_jF$%n6W!nUROs zh}Q$s7x_R5S-hfrCY~qi4?ocg@|Xe?_up`0;}|heY-mJ+55+9RhZa}F%PwN(Q^Fu~ zKE=A!%fp67&_-hmSTtac8I=EPN&mt>kst&6FzY;MIYADEN})3n(}Sa8Ln6}?BStZ7 zDE|Hwr+>+Z$>xs+o6gB*qrAXtUBCoxGV^d9DxA^b=D)Tjlh1V?%}meW2>5~`l*_-B zDZ=OR@(}ir@-7pw`G7nW+)NivdRD>E>BuY=A`c~RHn%u`s5En2GXIz80J+AA9ts`# z8A4X)bGUrYM7BRQFB8jWmJax>tZnS<9UN&s{((c{882fznlG5LKDnBL#Ch4$>s`M2rdHtiz&rO)<6O}`qk5e|6+zrRwbirE&s`2NbmpO;vrVT z$=Su#&E3P(%bOk?0+TCB0_Va5Mid~C`r)LppVTkaFM*9tp*nfxjl@PLQ=Qz93u#7E zom|lT3}=9tIk-MxQNN~uMdK00j)K{PYX{bz0>4)Vmf}yr;3pk$gWg6&^ag>IK{W;g zZ&6_qgDkvJh2u>Jm%u|8dr(?&7`$`!xBSp6S%b@fAz~mc$_JI_EP^2>Xp3m^_y?G$ z7>u9=4FISNL<|8#liFYy8gvK4VCunPLEsYgUJHJrG0<&M1g`-*IPITectqN{fQ0Z+ zdZKPs02rKKG(9mAwHKF%_bjX+ms1KstXPoc#pC9oB>~KxS zN_-ss`)Lp@_Qp!8^u!qF^rVPr282P9ia~__X5pPni2FMn!BE^#`lf)B&rTQML)Vb- zC$Nh+S!F`{MQc)G+Qrc7f}2ed4jE8B8vZFTY4F*?85uxA7i>llwP}jN+^;SZ)Y-JPIGJtRM--;uPcnEQiU51u#JgCzH(;aI!c+4T}d$lu`ji z3Sf1>LGvSr59?#Jm>eho^2ubg&>|XNnV@{}Fd|a~$z&J6OwBH3vDulB9Lt1xmk$dJ zZYBj5o)ke@!Qd4*thuO~Z$=9IZA9IBFb(3nMgz zoyX3HY7N8z49`cz0YGKu^I@G_fbxJeh=EY|Y`jT+g^MIW43{F}xj3GPLZGFzAdkc1 z2t+MK$>#w31*{yzr-3+VT%5_kaA@FS7TSb>fkw#7L@7``@Nf~Z4JKo}8S|J$*=$TG zI6?pj1jfnBV`sxMQMfKabrG)WP<{h(LKztdvvQ#RP-qbdC4obvBEmVawSVCu#CXtLMyW~DS!oQY``3V7YpT2JWQFu%qxaAC16BH8weMm#)XP8x%jyBE1VB2 zTnb0P2F|d7I9Tb5(}f5CI`EW4IwU~@WeS@bZvrNt#o>taOcaMY4$g5D2Qr7(hYLh= zG7+ySqK=8!4o#hf?}0c({6N1Q=&l$M2YrEqkcn_Uq6_s1aTqUC*dfJWAO#snI*D|m zaRl!+h}i_3&ql%x`!un%c-=(}OyCuBIWYY3nR%j$5R?wY!<-xCTfy`6H`v$&O86+PF#^&;hvvbe}i-`@cD$*qg zr%;M;*aI2>hK~WLcd~ML9G0lX5gg`P4zNW4gGy!@zPBqzTWmaySX?nTlUam10;EA4 z`-Qz+=wAcl^Uo;)6UoTms=>=77)jw};Wg%C1x1_*Xv2sGXweumFcAI1dofYqvkQws z0NMXE)(ym=(g%%m198x^&}hwtd4i9SvN-to!p{M{3`}ompN=X^$fS5*fp%lV1{yeu z3izqZ5s3lbeNm?s3**@W3o(!a;ZT6rC5Mv@qq87~4SQ^u<3&vSIV~d2qB3&1yb{=b z1I>aQ0Oe<5c)$7^cOfq{cHkoh_=(AG5D$vEXh#kNfVki@AM{1Ud_>{<~H@^2C0Ao_NIUjba?-w%G2AEN0f_{k#wIq;)=48h(6Kf*=+``|~o@P07% zP=t^CZ>)tl@S_FT8-OF)k^h?rAOFzYUYI}fD}o>G_w>OUf*;id`7OYY%GChtCc;Pl zAn>DdHNl38;K&~bev}XLj}!UP$8!bXNA*JfQt+ev)xk~|;UND~@WXZr|M+e#_)-37 zU$Rl;NBhSuBEJN*>JAY;^6wYH;hH0MNCZdzQ{YEsNrS&dStmBY~d82*t42h)^sxcsL^@ z3B!_;Lhv0GxL7zN22i3v8y1SgAdI`QfC!e6l$ewd5fcu2RpdkZRRRL}#6*l>fD$!I zgoDDU+z7fmvLYxdFU%_u-;6-|=s08t;zmRyMg&JO28XdYC^d=xGiD$R`6qceBRh~L zi4ny}VvHOJhqJltB4!>@B&s9CVW77Gc0_~_?f`xwBR-iC6T(2WgCA@X#uyogY*a)@ z1aJ)M1ayNP2m^0Y66kRVU*rnIz#lvu7Mp;#0dnb(!w~kMFoVDuiAd`MqliBh*4XsK z5V$@KpWDI72IL(Tk(h*qz#812$`Z{_INDJ27b=t?KVDWAOrQSLOz@-W#fJiYqKE@} zTil&MNuy9RDPtgn#|uPZj9E~SNBI5F<{Z$F{)_71>;>dv41Ax(;le@(rY4wUp`%mX z^D=!PF4Ldt;F3wn$wS&W3jB8i=O5spU8W$oXsrm-Q8s?Gf@V+HZ9!sr%qN&0N)ZWk zFzk&*`zkc7U_MZ*G+-DdG&wqMj1STcj6`q;uy7|DLrICgg8btB1mPLd;H(A4B{cq0 zz;6#0jnQa)^#gw#*wJ9oIGhP?0oci4=Yd@T7L6Ndj6h?F1=vs&1~?iI(YTDp;Jpw= zW886Y(O7yJTnxgD*bvmt6hb)hJ~$A9evJ2FN+=^SBq0J$)j+I4PLmi3F?4)9NMHzE zVcR%6qqf2OpRgNaBDgDpi~Me4es|;_5fRFW73)ypAn3y)LI{$GF=HSs%*VwWrL`7K z*ho1(B$-b~D>I=U1-{*Ia0q6EN5sGZ1s;&caEB2S`V#`{x*R4_zhU{A?#S=p;_iXF zu3m1q>+bA=Wy1kbk*k}tvxB!A!WEGP7t>L31)li;L$b_a;ink1Qiplle0F3}J-k~)k{DJHz(hw178IKk| zq6HX%hw};&qEsRVib8On`U{<6qyQxpbWY}PMz97I{1YDz+W4Ria$t!1vkxVM$!B}G ziQ$BD_ys&Z=zI`cm;wQlm4h@W!a8Qbq0Zm)$1C=eMpRuK1iG9F>^xopJJSK*BB3=r z)YPGf&0=#31o)aBh4DyqM96m#Y9G-V8#+ZJ;)u#jM11~91I|^%)4}{eVu1(-jTiVF z&{7WuR%kyV?SD`ApZOxHn{eDjvO%mH2R3XX=|FT4jgI{PB##3kGbmmtmp@}s8R%T^ zKjnjJH8@U~hcM<>ejrsI4Rj+Mu97^Gd{}1=KwuojdkKOH4Sf6di-GUFelhS3+b;&b z;rhi4ah%{0`eN|FNxo2nH?*_`a2_ulW6(YgQT^}fGB~_+xTcULO!x2j=v1u$KiwN5 zZZXRF-*M4NI-*)g$3LCLjD{Ba_k6O_iL<$X%3~<$iSxIAN)OZOkZ2I@sfWr_bV4{( zp5nMTPf`1#HS>Qnnw~I+GhogY8HBG3u>EmLs%U?PB1%1!RPntRxM&|hfp~BRj2DDU zqkh6r9zg(G5&jc~(hUO`DvQYXDCCFs63C!EP!h!Rpy$Gp3E#!Xz^Xfh9tZbPV(_B{ zMre9mBqJ3=N;eo|F?{n1=|tQ5bd+cy4URdKw&3FTGf+#2@^L`qQr?bI+38! zAx;>4u*C2XAOqI>u%0FA@)>AHJh~4qs;iUN&$>epHwAX2U-*WA6u>(bs-%j3EEXBW zJ8OXDB`B#9<0U@61AL%vA&i8i^q;GBf`&{;hiE_s(Xe(94GSSWxUE+J%mUg3w3slf zfSwYnjoi3kMjSnX9*z9}-X{v&(+e_0tCycVQS}}~4}=L?y}(b%CSuAV2&1wHGY`Vz z@`G@f4uTY$&rlub0SxhHfd~;LSPHPvVX$6@ia{TOGfbh*43;cKoQz_)KmqlS3`z7# zhu!9gbdYtpQWh4AQEmA{kOe_HT!+Fd8-i}zWTBNMo07nuz!NSpDN#t(Z5@&jW#c1{ zQN8%0l_czEiYeAkrPRDq8yp_N=NF?(HuxnSz>8u+y5s^_^1uv_sv{4;7{IQZibDQk+nJ;KK3_)so65>PfMVfwLz8C?0JfUbt?7eOf8<{kv=l z(&4(5hI{7#uh9N(Y1$!1k&kG|o zoQDj^sW5#4QlaCgW{iOb$LV5$78dO+P#(lxFRHT#o@Wf)g<~<{5H&F_G6JxZV zQ(`cR7M7!HDm%b!@=i#j3_2Mo^){*6GVcpO0) zsyG2dZVYJogV~_rC;I5%NO~5USn&=#66!O-_1DfqpcC>I8e~TyLZ23t=#kiy_Tp2uN=4oi5i5yE&sg^P|r7f_39e^7~H22Cc! zq5*-?1TolB2Ej1lEQ4k{?{z(72RO>7wCNC9+V z7>$Ltd_P8XTv95Oj^+%cOF|t7>AWdIy09?NI-?0MDIpo3_aF-#6aIrzv6x#7ngIM_ z1I(%Dz8+p6;G;8&!De2Va6N(64TH@a(ON@#a0G;JisFp_A#Nk&iPGr6D@fu7i9?Gh zP6ky>%%HfZqPRF~u?X;@xH}>`f6Y;NSL^eCh(ow?qW#F=bf^SfQ5?#DusJHqQ)6%h z3X9^<`fae$6~&=*pTWjj6lX9v0>WORICM@m*hGoq&{@@BGg=gf`r|JK`kl3?e&{~i zeX;d2!V40M`!FajNfZY^77oAr{j1q4Di58-3^orzCdBDLWuSGa_)vrLCf4qfgEN5e zevw>>ry{gWt0wl;VJZhs6}*co-DZ=_0K! z9>$f^1VofZbU9WSFFbI<{bEXJJUnoqGoVHmmMM0ygX4)EB;jGvffbQTl(+Cei=cb( zp%wujbl447~JaK^DEsz&MFB-p}iiHvVEu!)VXavtq5e%h6bd3{B zL*zl=Blk1Jqk7@UViEHIj^812grhWoi~MltmB&VCLVA;DuN91)J6?Ed>)UOKQBMfs!lKn0wF{E6`fjiVNkKlKv2!-eP47`SNa z$rOt_3NVyz3%F6>&W1Q}2Fz!Gi|@%1Pvrnd74Gj6^CoHwU4Y#er4_FuRzXrl^D-ef zDC5EVe3Yjfq(yRr;*mjl`T=Zz^iLRSzfgdovWfgqf;bV3pa;!cqXAX`JRx*Yh$rGS zqVy;~G|oE#jo|!Z1dx8AsLfEsf1Qx z3q-OB@hER`L&!S8J5;A}{&4OY@{`ASTY}yb>C{j>VVnSl+83oo%vuV5Lf#M`DI#4d z8cSLrj!1`GKZqml_iJ3@5XQMu{PQ*8D)`qW|7hrUK+3ee zBD%z762&394nbU0EL?y9GfLzcO8-N5xKNq+VKquDW(Xb=AjCsmDCcSL&#?@}-3Pf| zEs|}-Gea>sNAXV~EYAOL5Oxy7j~aw86(i(%Top<6K3J5;xDDWf-)R$Rpxr(IEd(zR z(q&OO;te)gl(#PAiML4%JsK&jlM+&~gwU8ol=rXj2nGVi2tUaai$jYJ;pz1NKHv?7 z$LMGd@tBaeJfMZ38_DPvQGLOSn-vfy^zaCPc()c{Nasvksz*9!6gQxAMnpk)DD)tG zA|Yoej{&pm?_6Y@pn9|sqW!wbdEK!U)J`mi;)sQq_<3(hZF=Z$-RtskOw@c4}qO@_4MV>KFs zX9J7^YGzJrTTJYj+i}FKvrvAySh4k|vJrRfM@lW%_z!)sl@nOJ6;Dty=6BzNt zI0<@1;&WFae<2R#P4Mb6lqW7@Sp3hj5#B$w>t{%V|AFl({22(JaggXdI&S8$(MsMQ0!f&Kt` zLwX3zM+Lb|=z3^QLGu!RXIvZy-B}Vh_Rz=BoJ_z_*eVF)@htt82_?rW6Cb-|g1?LwzMqz8P%aBK8 z2Fo#`d+>S(jWvj8;(SChJ9uq^3OowssserB#SQ8MgZl;Q1Lpt_^^5u7NA*MfvISsh z9f4qoPZY2>MKH96LG`l$s|&Oc>nwsdC~j%(ul*E2*c(V6Cq@sd-+${rFh}G1Pm~sQ zAmMr>8EzMXEC~A+9>Cit1ddMtj>c4?Q;CLClzgDwf|7o&6A?c?K$xI=3;4xlLNoa% zF3O_?;?dfC5ek4o^j{OfP#(yj_PGPF6)?XNFw{N|0fzb|N=uaY65+ubQ(Ok5piDGJ zAQ-|!WhjbZ@CgoI0O2BBVTtxDpooMp@CJX#fCrbu(ZQmSAL#s&o;(u5peZh47GL@oqFXrWAQ)@Z&~ewcO*IOZ;Q)sQsAqk zn3TfJKSpku>c9NM54Oo%C*ZTB|Ycovr!aE2rO- zkF(Y-qo42b>NvFbPT68*U7v9al-K74{ARrOM2Xf7t4QaD+q6BU<3^85eosw)yrMdJ zSH|jLDM6Y~S>wIWCm&F)wsjlbvj5Uky4s#ONma|A6-`#td|hjMl*bx#dZ*ndXI+7I z!01cH%jZ_Q9=X0}bgM<)j6|1-C37mQR}Wj_yXSCZuEEpBQ_D@Qvs%bEnag&X_Kn*; zd6>)em++kR?4Eta<Z=>$$LG+JZdz|wS-IIYzB*5#hx^cXqDI^s-y^GS z`=%PP-&Rc^?ePvsJ)bpCIb^2ZoYxEYZ{RVSw$7e%Z0rKxo5j5Qe9DRP4War$+s2<5 zk+G{SMy4dtqv+lb1AmFiV2c}EPOcw4mSr(sZx638r!Fxs;Kg6w8oZYYz9#YC z^6e{}Dnl7FTF4D!_efptKK6aM>s?uEm8{xGN4=CC7mlk4&M~~x6|Q#lwHD_U6!P|F5ctW|@A^tNS)Qt?i0K*~7#?*o@Byjz%oLx^z`v074Lre2p zd~ika;=Tu;mSozgzf(UnZ=T^BrKKCk*2Ee%Ey-E-w)INQi5<1NW;9xfj`Fb|4#m%_ zOe7Ylv}}CzRKTmd{(iUang{bQ-H+X||KNR%?=yT)O}@3G=4#fabZzO9is_pCmgOay z`lf73&Eq*=>qxDf?jK62 z^vJX@K1_aNw2YO!Yumll`5`AtrzMWMwJB{1<@Di45)&jXXYFjQ$jH$g>$O>by;@SZaM#Ozoj*8v37I3h*6%yHRl-BhCW>4fq>;KYz(@DtAFGoB+3SMS zu0LFodp)psjqKX1RUe(6_B{4-h(0lf`eqKLGs^Ns!R#~7X0pb%7)u1^=8&6vjs$4x zuJWrY7@s@aeOk_(2OATl6W1Q}l#SbEI9oPg^q+U9y$qeQ_|QA;6wli}dzBR9-bk4k zzUhZ2-Ss~z{`r@n&Tr(zS=0to@|`al%dUK)?VQXHcUeIS|7bSj(IcNbw@-SyO{hD! zz4QGaVa(8-%958=0?wX$NjEOuvgV@K1Df)4->UlQF3z<9x?T&CV&o3z$4V*%^BSe( zKP^>1WM4LUl||9svJrdc?>TBx^2c3Ox#hRi|6EY(7}$Epq)0v4qA=I-ai@OV+>5g} z=!TD+sB>FRaP*H2M;A_seCG3V;>)i_XBa^wC)V`CegijI-+XlHD^Z_0-bej&PUCJ-hjaudbROd8; zeeHX@%D(Z)daj?AaRH-y&OY9==kjBf=hWH;j52&;Qu0;CKj!cqwvCF>lQq}p2TZ4) z%StG1j&dAdtGf1xveuc>=MPpS`hDB_!9m`5dra>;e>)=&6-#fuab+j<9L(n({qy z-raTK=$w|<+wC*PRgbP-%borHuRX>KGS9zh&^ydA-xyavitREgC#ZJ6tzY}I_0GMA zOpog+Bvr22m_B#vn%;^XQ~WdjnCJPq#G!jt`tnz5Gt_gmZRWWvUpIMtw(8#9m1~ZS zEZsW$V+yOt%%Hz%R^`gDllm{@YcD1_IVL_Fc58{X^U?gCcP~ah??2G7N zEzRL$x({YP)f}T5d|xAga^S&h#`Ef3o3&!|Ixfdv_!|5n_-tMM_#PwQShlq3Mf&i>UjEnbBe2Fa z^15MqHG+K^nwauTbK6D1BcFdvRt)%1W5g^7H2?igkt==b@DfUc+1+fnQ>Slw1r)CTZ0%3!&wu;GG(c;(|K25b z8@eC&*39b28Rh@1H)zHRL(8a7ZZ@11y%a5a?=^`Dj=3L>=3twy6P(R-HFt!(T3P{5#V%z8;a+E~7-LGp6`?rBox z7o2OYUaX{he@}iKPQCqy{P}8XX`J;38>z(GbL{2&@((=A(7cm_afaR4a$Gs*^`a`P zO+Nx-7uL*uDsz8f-GS>LCQdfKwCiQMXWN?1rI&(jbA#O1|DYT$e}Aj`hWG0QG3vg( zUz?3a=;lW{XKl9pYgPAi!B?)2OGsL0?-P1XAEoqs%t!gYRkc5E?j8}uu&Nk##K$Kw zdG4ZFl!H5Se?(TSynHl!NAk!&w5nJ(J6l{ky4H*sZoBOZ)j7~`>W8tDoo$v%JpKH= zfMz8%TC09~x4pIWFs&06X8C6x25Oubc4v;t+1JfqWK~S0=v&IdgLJs_#=MA6ce!%B zvVF;kqwg}^)#z@elc?j?+K$`&^z%J~JeJAH{p!l=UAiQ$#AfZ$nsMd){R;EkuHOS( zGZZX*%?=-Xt-R^4@-<3F9xqfZx@+CL$$?R-e);=~gB2NaQ!?LtYO*p#_e z-`6!6FA8{1XNAiP`W@F)b9p|V-#>pCcSn84=gt>ZQC$XWlybQps>zeic-m*@`(9&P zNj<%M=d6;=+s*x0%kL`QbqcRkIDH!?Wv!jkaY>4=krUI6HpWUK5<-Yd8K(OH{GC;akU2&tUcOPvU<+__)4GCXUq? zsjHf+|Mk^*wVMr8|K_Hy2dUb@p>s6U<+(2vZ`nStZjZ^{lbOC_&h2^68jt;GdYG9q z{ph+m$9vy=o>V$6dYt6Auvy=)>^1TFB=skwq~)8(4cFY@S%uZcZ|2gc?@b?z`5jBy zSYq+#(}p#{VaZI#k&R0}jEvdzz4M({kKn_}hWT@wzGNi|7T2CjepkHz@U3rQOv@J& zXWuhgP^LV7_JfM_Ws6g}VFfAsDa(@E7e?KcXztpraQL$H%=%#&JJi9(zNkZd@~5^#|9;$p5hZy)9c6RNl?0;=IkVo^|`+ogXsZ zDV3KVR3%Ki7)u(f7WZ|Q%=S}t5*w{9KUT6@`1ud|oWK&9sBukoGCP>o6LsF)pY!qf zu94%gj45}VZmfT-#(M5$zM}JFqMP=~lOtYVsK0yQ=+dew-(E~GO1(sWD9xKknjGmb zU*v5u`S;1`Mcs1_uZu3)pLRn3+oAPsrO8RJ>b8E9Yn$wU^OQ`s}@E?OJ@5#;Jx5*C(CA&gL2{JjhsDWqNEM_pkk2 zkMXqXVJT(Y6-Td5*nH;P$q4rA&nk&i?k);5lIORdiM|}wQSWUN7j|UlQ_G6oQr%;Z zy=nhi^+&wJ_y-GnSZ1&1{Bh{y{NtY-Ekbrl8gJcl`Q6$h%;U47$3Lr#(|WYzdRpd@ zFPki_yL^1M&#BlM`79&3r>%!}_I7VVFNY@;m@5CZL~G~6>7+S(=hi$XS1x}P;5+L3 z(r2q~xUIi+@Qr=^0y_zx-R&!o6sKVVg z_aAT7yZ?Rn-tfw=%U>-z)%LU{#n;*QhI6fxZ+o#$}4*pj&19{mM^V! zB>%%aDzi$m;Z3Hr*7_Gsn^Kngz0|i_Wh?8mvob%>;G-$axG!t%N4@uVEUj<37JvMn zylKp7j9llr>DXckj=gI(}0pqd(OrRNg(H{o?+kJ1#vhs-KG`*dH@K?5f-B zJz6Adsl8oBKC3JCZ#X0~Y$Ny5Oy5A>%xa2zq>(=9vsIDRzHwU2JAuoe*p>OzH&7XF zUEcFHMwVTQKiKR-Yd&JKaq2n4`=73yJ=&y3YCXH_X;sABrTTv~#9q5__x5G4+w$$U zP2Q5(9?Q;5cK)&`)^6YZgQ@F#ed<4k^y{_1Tg$j*WpB2s(e~S8t-^21RH#}jDw)e4 zeSNX^z@^m89Vf5sIHEpQ_QV0j@zUMwxT~tcTO=Vt#z;5k?i^l`h65G0iw8u46d%dX%r>>=V9hq<`toL-) zo|19niYYNaE|lL~^z^sAUv^ELy6a2S=##_r7XH>J@o;<-=}Xs(>zvQmmTtT|dYc24 z9Jt}J+({Q^%)zt=C6~JIElGJ?)CBjp+)6196b!D7frT>)P~@R|QaIEvF^(R>NTk6z zej?nz`LB9q_(WoKMmirJZN$~y=+Qm&H6pyc0#D$;l|{HG2{(j_Ccvu&{#I1J6k zQL^A_mhc|a-{L?CSps)3+5aKI-{a&#A1&Zp3v)&)O#ID4xXL6dOdewiit@z6s7!eC z2fmgUeGmz0@O%dW(c6cEKzLb$VJQE>Fks=pYnD*wflu+_G8$a7%7mL$pzmU_;Kd%| z1rN|$0a;n_{T3I0EK?Xpa)Hij;9&z^ZgByYQ3OYnTuK24UM^wrxLmkFHjn`Wu7kn% z`T6X89^5BJuQ|fGDE>_;@eU6c$oeN3N+zTRZhj$|#Lwjap7tjmfdxGJ`CcRii7xuu z4z$e_W)|FO!}B5Dk${JEibc-@4ZNGeDZmrK1-GAXtRVR&UL1k1Vc|L&(h0%?D|v9` z8R~>;fu5}puRND0ssIH~&4(9;&|5BePk^`qHi}0897h(tg#dE?_rw6>7qfEk&)}eF z41e=O?7{_l(*hps7C`?56}yzMFI zKhi}r;ekFTxJBTWAQ!Bt!xBUD(8_>Bh<~E${7V|{=nQT;bWW7w-*|}Q;!nFGY;<;x zOtZ@EO{O^~-ADM)#?6P!hn4`xf-|qD#_PWY*BrC0EZF(uYX-VDbF>iQL3C(xyE_|vOsiW&%5i$9B z#rQ{BS1ol{f0b6%Dq1}1x81vP{*SKzu2T**t~yFmaT8s4B%4;>Gdz;{vaeifWJizu zZ_f);#>gm6sa>T~zOC!w+3JsfF68^Z&#D{}1_ZDo4^U@>AbF_wkK+g@33v97(fW(`2PP{=)-5{S`TG2ecG!Q)fLp zZ+k83X-ECZ4yn6~zc?=brfG8Q{5I>!so^oX$H%PsYh~=lrA?d6eXHigr#*RP!n7&4 z^x(#xLk67_Obdn?UY1#A)xLMs&gJ``uU@pI^TeF~gLjs0JH90PgL|`^jPsiRY5)I& z+h1b#?;cHG_g|e{V0q%&oxjFehTUy0HlE;r#IxaZ{|cF!^@+-lI=pCfC(@sL$0xp8 zYIW0DXO-37Iiu$5-VW$^(ORkbD)ds`kxSR=4LYW2hCgnhM!HhsXYVa$Id=| zZ@zQlRF9T<$5f0M2m42kIvsgU_Afhn(yo>z`BNK*b=}l#8GBV_y664vtF&IftL(Ox zscK(v@bv8oALDlU|7Ozo=7nC%zReo#qi>IBe(CsbrHj|Jr#HBMQaMrqOR@rojeD)$ z=#Zu$5L|z};)`*9OOVC?$p8Py|NpV_e@rb^u=#hM`j1Bsy-Fq@*y(a_;mu>GF7ppN zAMrisa$wQAHcVi$z45ni;jgF@J}uAPVv*%j&00I^;l~^|^Zf$5x6P&IOSCU^uVXuO ze?N5W+w9+NnVC6CZIPTTtMMXbhraonvu^xvnR(Bhaw9LCn?svb-uZQ1 z8}n*v)xLJshN(}Y`Cs4XHW{~W%5h&B_Tk0c4ZjDGLlz7(%)2q~56rRswU=G9p3=5& z65Q~Lkq^U1lswzD-YM?Egb^$5oiiEnboya#;kf4MovUB9-6Q({f8QhHdnx$Ijv?>6 zGC323xS%U>p};Rnfa{9(Y)Cf*5BYG=*MR8jgh%5H$G$6sRRZvRc z6A=nrlfqR>#d*a@RS54wPeAWJPGlGH(EA1WQ)7e@30}8E??r1D}u*a;Ym^WGyop;#OpSM_JAr5 zxjg_^_z1%g^37(6_SdM6$RM37y6+|p7F}9Y1B>qHX@Ly_O9vYYmH{>nY&_T`u*qPD zQeKve@Xd8VAJFe2xkO>YMKmCTT(8N(JA4ETzZ*!BkbvKQmxSMx$BpzL1HVcCUk&^o z{r@c^_y4gO0-p!o{Tl)<{L0agWh)<^6~mE-l5YV=m@hHz40eAE0ubTvgWyCMeVZw6 zevt{0ydb&xPx%n|2uD00~9>t0C1HlM``Y(#>LkUF&!3cx;Hi{E3Q=As$M{$E)0!Gk>vL^CGe(^j| zc(5VzLurs-yncgmQ5eM&^&VW`f5Jy~CipP8{{MuJctG$4`M>@Xk{FDrKcb(Y3)O=N zi}Mq~{#WZOR@DEV7YI@3!X z-NU-EN7ys02YZY4VI-0)Nr|LF(jw`R3`kUxE6J1OP4Xv2lHy5eq%kBWDVxM26_X~B zrjg1?i%82zYe<_(TS5*&$Ki4ut!60;=cN-UCCE>R&-C9zeaTB25>LE^MT ztHce7PKj=bClWmpA0@s>kR+ugH6)EBZ6xg^-6cIGeI@-R!zGg?Qzg?R(0{bkcyCsl}eTxBgK;9NKKQPA+!by2ESs$Hr} z>V?#IseUO*X|l9}w3@V*w2riaw3W1tG)+2QIz@VnG+VkvdWQ58>E+TD(rctQNN<;} zmadVmm2Q-7mcAg}Dt$$|UAja1iS&EvK51DQB^fmt9T^iDa~V4snvA~;T_#*6LMB=! zQ6^a?O@=K~CNoWDmQ1%EJHR@HdZ!XHd!`BmMNPr%a<*aT_C$icAe}7**e*J*(TX$*^9ERvTd>*vR$$- zWM9el%1XKWM+#NKqK0z*gWXOj4Myut;IK!WxB2g@X!*6`B+-D6}ecDs(A4 zQ~0RRry#4Sps1!uRir68E7BFy6w?)%iusCs#S+C?it`nhDOM=1Q><02Q#`C#uXt9m zTk(kmCgm&2?aCd>uatX~zbMP9D5xl@=%`RtY*d_8 zLR7+4qE%v55>--F(p0ila#g0ORH#&`Y*yK>QlnCRi=js>@Z^scu%?s=7yYpK8783DsuR zC#r8%->ZICl~z+w(^9iib5QeEW2l9zrK+W?vD7$fJhd5Wv(y%;RjO5~ZB^T@R;|{g zc3SO<+6}cQYCUQn)%w(w)Q!|l)Xmjx)a}%r)jiee>f!2%>gno*>U{Mw^(pF0)K{tR zQLk06Q$MWUsD48IqWTr}d+OiSWi^yE^fatA95g&NLNpi}5gM@?DH>xmvNbpw`5Kcn zW@yaSSfH^?W4XpUjSU)mH0m{)G}<+8Y24Fzq47%Ny~Y=fehmXnQ%#zttER6eLo-@4 zRWnzUr&*|3thq>Yjphc;D$RYG2Q?csFKD)Fc56P-l-5$vQq$7WGSQ-H*=X5md20D< z(X~RfBDB)A*jm|Ixmr`SrfJR6TB5Z~Yn4`|R-IP8)(NfCS{Jo$X!UBzYLm59v^BJ~ zwDq(Nw5i&z+TPm!+6?Vj?PP6^cD^=GyI6a<_A2cS+B>!PXxC{sXg6uMYPV_M((cgi z(tf1+RI5*4w97r*~GbRj)(umELzfNquR3HGLg@Q+;!N2Ys5pyMCa4w0^ukM?Y78 zlKvF^x%%_)tbB*R3RT!-?+F-QRXuDCZ(LtlrMmLN)jJk|I8htS$ z8Os_g7;6~o7*mbyjA_RH#u3KR#<9lv#)Zc7jh7f#7*`qB7}p!0Fg|U3*7$;Pr*XG& zk8!W@cVm)?l8K6mfr+q|4-q z$qSSBCjBOA6a$J8#fpNi>$pQ2HqS6eUv)Q+HFkX@qI4X{u?OX}T%jbc$)YX@%)3(<;+FrnRPZrYB6#n%*$& zG<{_H%=E44N7Fu2Ni(vUikX3#sTtMG&dk}&+bq&7){JGAZN@h%Hk)QvZZ_9!nb|tC z4Q89o4w^NXb(nRTJu-V`)@vqdPBvFCw=%aer0&3mpqR3mXf63%W&!MYKh_MYct*MVZAE zi)j|+7L^uN7JDq}Eb1*zTU@ZXXmP{hmPMzLksUg%z zYAjqZn?YSfT~1v^T}RzOt)}jyHc&58TdB9GUDRIc7pkaf)btJ79jth%jwtR$^vt(B}btPQM9 ztWB+*t^KV7ts|`Ct<$W>STn7&t&6Q^Sg*3)U|nzBV12^6-TIbwhxI+{SJu7Ok~Y#d zYBr`e<~D&g;WlGz*fty+o=vgMEStGDOKd7_s%*B~RNFM#G}*M<+_34kd1mv<=DiKc zR>RiFmTF70jkQg-O}Ay+=Gx}l@@;3?&bM7)yUKQ*?P1$`+taoeZ98qdZC}{Fwe7Rj zu(PsrwsW=fw+pn3w2QS%w&U34+wtrs*)6hLWw*v|v)xv^opud&7ww+dy|8<4_r>nJ z9ob&RUdP_to@VcE?`==FPq9z6=h&Cn&#<3szubO4(lAM9CkX?I@CFwb~x+M=5Wt}!{?Y z=V;vyk*D2X4)hW#>+o{m0%xQ{KxzjSI3a8CZJDm4wuir$B=P}Mq=WOSEXTI|^=Vi`ooHsb{ zbl&IOFR-6hp!j0?*p*M;X&>{8+~$z_qt8kY?& z+g)m0YF!SxG`n1IX?3~c^33Ix%X^nEF0!svS36gltGg@RHQY7LHQhDaHP@BzTIM>< zb(U+D>t@#)*Tb$STraq`xxR3H>-yc5J*ynDR+yd`}!e6)N_e5`!ze4KqEed2x6 zd{{o&KKVXnK68Dx`t0;M=yTDh-KWdvk~&3zqwy?q(JiN2}6 z>Ar=&lYD3R&iAeK-Qc^`ce`(m??KRte6RT4@a^*L_WkJF?@RJi@>BEE@iXzW z@pJbJ@r(6K^h@(&`{nu-`jz{^&&>O6_p9@3^gHW!#jn%vp5I%)UO!2HC4W7C1Ah~L zQ-244SAS3cK>rYbo-?+z_xRWO*ZZIFZ}xBXfA23HKn_p| zPzx{$Fb}W^par-F&;wEeSOM&Sl7JZja|5aZ4hJ*@GzK&UoDOIXxDn71&=v3`peLX| zKp{{m&@<3C&_9qKm>QTK$PUa7EDM|xxFB#@U`=3S;KjhUz|O#DfiD8z27V7T2r><# z2H6EU2L%R&1Tlif1TllMgYtvs1}zKP9JDiNU(mszhM8W%!J(pfWpG03yucjZQH_#jD7wAvuJ@ohVFLdc(*V z;u+!{5*v~d!Un_iyDMDnQ1Ig@5Oetfw!>G)nV_teEl zr_u5wH)YnxsYYa7b(rz!*itjsgB!GbpQ$}uynl>ae`L@}#`nNg&NYsgKb>OF_?BFA zeqZ~a4!f)J4_@08r&xL7U69#4uUM|)jmC#tiZ-Ri(u|@;=q0W_ozxw1_y;F!?{C!y z_H~ZbILkO)&Kk2^MXmj}#FXVy-sA6k`aiDylw_MerPQZxWE$ALgwF4 zDjpqdxxRLJ^Xx)hhgvL8v;G0!@943OWu6&H)$19VGZ(l7&TQ2!*>-7Dsw4JV>T&6h z`Elgxz>}ZSU8DoOW}G|C;#?nfVM4QD&9zn~-Sh1;WxYO){(4qTtLZn5^-tU{FS{K+ zXQ|4E_4EhZ=@}l*6(5YHrF>I%EgCa@_+@NXlAo;$cJE?l+5}gy1aTtN3wxM_qAPt4O?0tY<}(_5lvaY zo7!-$Hu>K3)$1GD|8iFE&Z}v+y=xOvVa+&J!%-=`snQ(3>r-y&F5|#>v&!x9yIMlq zY~RpFO{(de+$LQiW3cSuOZsD%rv2A)%p_an$2I3q^}3X|FSoI@uV8%hElH)j-uJHE zW~tuK{NNFO)4FZc%9iljCYAc)K7;tx?k#<><69Th9hEof8vf&Sqv}if?eZz!yJ?|P zfrR zOPzo2sZZ+I)wpPQz!CS2{g&?J=t)htxK2m2EVr(v_6{4dZp7IB%dA(5t$(p5cQF(S z-o`y|FS6cQzP-U@Pr)$rYws22ZZC`Wby!WmAN=IiWyM2E;g(S|W_-ReK018#SjEYy zdgfPF7a4eUe7O2Can7u2b7LBJ{o2A=VfU9ca2X^1P^5U@DLf4yDBZSO*}w8}ms~Y{ z-{JY^C(nAq(GMBcB2jj_chi&)>x0*7PYRBB(>w}OS<>0ao-ulbD#aviyF$;@)^5)9 zkU;N=t;`=2DW_krSUWE{Ugld-SoxgS|Fbz*=$+Ki6+N{rvySv#Y`Q;#e*4NkTe9zox2wKPYJI%5 zLn)Y)*7M{cy}ybo^LcvLbk$QP6JJ;A>^w8EZHv>$AJZ1xT^$qnw1o5f?`4xVe6>hB zr_nVFJGGnY9(N<1`MfvDSu=wbnXF{0mNO=`DeD}+mF0ij?ZKtFQ*T}~waXqogJ~i= zEu+_awv(}kZ_0~@TQX_m)?W0v?jCm3z(I1xdc}_a3Dydx`|W~+|f z=}G;;<9#sk?XMc&w~!)O$XH^v>HaM@pR+NX*m>XXJ&g{Shbi|g%1m`%=*9RgD`dLS z_evx9&TGzAR~GfD`plTwtEVqg-yhiaqf6fU($>l@tAvyP7h~@MkJbCf|G!V!8Oh4X z$jC@$sYqr~W=1M|ma-#~O;%DQNg*p5MhOWS(NKwuj3}Fwk(G4bzq`+O{Cs;5l@B3WubG@Fg{LUKF)RE6-T}_Uj&foMmM4lrG%I_44^+mF~Jo!?g zIV)sq@nJMlcGlE;!Gp%+4o{BR!T#RoR`yTEc+F2> zTScYKtd-imkMO0m2k6BzHLokXq;rDI972d8xf%k{-)cqy-3+LGRA*7amm)|hmZO4`990fGWBwt zcQiegWKE}6AFpepqN3U0sLbiTwarHlQg zAMbKjBsXS$b7#A&+FaeNp=8WcEq-#Q%W3_Q`{!Jx4}agble1kQe22Rw{qOmtz7~lo z>%}As_7FphtAVE?Oy3r`i0RmJM@>CAe5u2Bcf_wR!c1|&yU*yhk1;UXMn2l&v-8uz z=Fh?~9)QDy^M*^ZSPpck4tE?VvGD40DnW^~2eS1eLFy8$FXU zgEq204RWOI7#V(KEpE6^u%P(qm+*nrcrll(9Rc3qb&vL&Ne$i9xt2Q9QN7=K(~mV2 z`onu7{CksGl3MoBP3t0f3^3$N)%bz%Bh2haFF#-QQHTl4yfk63mY??|{B^~ax&p_B z%%gIK^e#60Yv${hQEe@uLZH6=^yT!?K+Wg-O41HD_dOY_OK?cL9cIS&D)o-LG;v7$ zP)w7TN8?+z2F=PjP1-XmvGfr(pTDyhO@zn4Ltb@TV}5A6rytX_+B+^IAxxsJ~<=2V{U!nJkvJY@)5sv zXPy3BdlVIr)Y9h{?iY4$UBcDkm5gN_gF!dDMCQobLlHqTk*`J>6~oJ)UDqisOTMon zJ0o6fcq6?y^Bj|Tf07`-{??d#N|D$5C4%}tns57Y;Yz$(yTFs-3w7gn%A7~7?Is&< z3$CaPw_USU&$;!E`GB9L@{K77^Y7}|e)QmPlV1zUfCi3C7I39e)SDJsGo&r6-Kg-PD1jR<0|-pV^19{Z6jW zeVUkJm9&a`4o?>CsoL-nbCr{qSA{R?x~*2LaBKV8Z#%zW8J-niW7np^-?l*Y@O@HF z@TQ6cjg8)g-r)r=Jd-wz25owE=Y+W7g1t)KRNYRwcIt`W60sWLgKK3buH}X&>Vuf? z3(yG^ZN9kCjqcA{tT_H+eS7#+k)^A!{+oeKO_%m>C#65MU$>Z9={?dq;&Or`<&w@J zUB-g)r`6$!mfEL3#wuO2-COt?rcI7`Y3Ux0W>Bm4>E?4$ys#APwQiT$H$#;9kp05; zd3)XZ{T*&IWkzk64${VKb_cWlquJFRV^29lsj?MzA5C=$671fW$TFZ1xZO5sr@R*(tEvFG*bKIsB%PFkT#R8QL>D<{bR)lLDnrjSqW}Za{N+` za9s9Q%vkl2IE(eXoikO-x4vtrvs%jKHmS-->^d+rNHi(j;WPO-8KJcEhalDC+XIv3 z0yBZNcW-3-wD$!X9y)sIp`#|1aa0@gx>YBny&@7HZsa?`1r?ADX*>vq_=PcvWxJr>i=*te#4@71-(cc zZfP4wY95kgV|+u$OD9BdQLI@_LP=}YiIs($4~T8!AvQlM+wC+4Y2wl|o{3H+dk4a#9{Uz-nx*Hawb=FZ%;0@pvBj5JMfH~yb|nYzH?k8v_wnoQ za@O_CM&8dJF|X_}`f`8ZT*7o1f9lZ#E{0#hRN-}^oZzXnXItpXDQwv-Ln`(1ELaF1tO?Gkl@Rx-KF`^P7Rthsp@Sb&Q+K_wy&O zY#y`V6jycE5%Y}ej;|j%clN>;nkS+R(m&V5(+7k-n;H>T-Xy;J;lL@*H)lEQd7}p_ z)cAycW$@$$DzU?>IDV@2YOM6_Bgbkw&D(}M{U!|6a<0k@Oaz+U9hrjZhEc}+XJz_W zV?O@il)~qoC0x_ngpbmcyedw++W5+xFU;vQw;j8+Z%dT>x;on0b7t}l(+m4!rC&ck zA*ww6p@Jv0LPXguVaDO5;98z@W2pG`RUdCW~%(_JaAu(gGtCz&SBb{!TJwbrQ1Unu=!#QQ^H+ORyjt;bk**S zs&C6bzUhorZwkn?wX||Y4%DBnrG4<}j#i5~OL}}`%pT&6 zOjGGQx!N)sasN+4xjCEUM}s`dga25-B>#s7d??bylD5!vk2N(Va0|4LkA^S#+}L zIww&i)K7Xpe@vI54j$z56z%(AY|T3+VzP8*c+HjSE$4bwA+3uaj`ddvNH_&({^@!f zuqRx7>77)ve&f;d@b*CiMv2k$r%j%!kb?YC!Db3KN@l0oydUGo`lhJ;?ZGn)RE)2K zpPqH!KIqJx&KjVQk0Gv=ixwZZXx;v-6~ZaUwL15k?k(%$IPg-pL)CGgPg^S_Tf!W6 z?-f~kaQ;v2sgUvPv3G(mXE}9rUxd~#zE$Il+O1Pi!qKuhehdfh=@AS%HuoNFqFQ6W zAv!ekK|P^N&ER+WWf79EDq&rEp*j_V8BdE-V%7M9v9~B!UP|{gO+CYnywrP7_cXbZ z0s0QhKj+m#i%*(oFn*6uDPxT}{_ShY7=5(4*O%_Qq=bR=sIvpqwXLJR{NRPx;<;o= zC2Gd`ol!^E)!J=+ou$zgn$0%Ye&Wg5x-_Aa)1yKi6Dq$=9)ExM>UBtgcvxD>KKLbI znf7rvxd9Crr)WiJN)2W1`JH-dNS*TX%GtXGC3wedrXl;*=r-x{duHiIWv`iEn0Y2Ukzy03}Q=O-)w{1jsv|E`f7*^oz7uH@ptS-xmA?0j&( ze%G7Jebnx3S0m;~rSmbrJC?`0UI+btIk@H^I}p2A-m5M#o#H$q#_ecc(KKVaRAG_u zfiO+d32CXSXEDQ3U0J&Fi4RXs9N*C${ng#|{(I-WTi^YZYW@{PmvKm&{eg++EV?|CoXCw{eeoZ}-5+GZA(34R5Zs znH^WVvqPc6wz>KZC#$hz(<-|iC?8l|>!Rd-#{te^gbGTlu+4RM-lI$D)_?minO=*_G2TN$Fx6cv-QsR zM4LAE8T=ag>7nDsHN|#;{$<`4hj1Sot%V44u2k3NcQNZ~J-u7sJ^tBl7|wzckkOJ zP{0^>sQ5_Tc&GDOI_1HQ#?&bV-N$(!cJeO;j4Yjr4D%IqT7Cb)qINk(>?GBppDRl& zo*}ogvhE)+5kE6&ne*N6Yl!TF)9n%`l?qvQMM;vwTrQ~5t8{gkt3z*=HQ&)`Pp$QU{Bq*Y-KDXycDi#4HA>udz0EX>!PfR8X;XALD#OACZ@XIpTr}_Ka9?N7 z={)?JJjBI*$9Z$slyqNYmWNIO{UN)Uf*ZvkarKxp;UJ#&)t2$+E0r1l9rE0rAK0f^ zTH9&gEPD$Udm7A$n>ZPkI}ftK9B#@1g7YQI%QJ z+NW#6=wd+J+GnZ$w8qiZfqDD8o}j82ACD>fmm9|WZqDya_^fAnDWPL_$Rw=N`Nkc( zS5regvBi4g!r@8xOllRAp9}3(9zLweNwa6_rhDVWOwYS3D@ATwLvwP~8tHEZ57HJ~ z%YSQq;Y9x9En8)>PTe$(3p?o{@#y{D$T}0VU9n``*mKe9IQz2aJGQp!csvk|PA)8T z>Z>ss|LrmE|Hoz0VQ1lndMU-rle~8(n9hdkt_9J(N_#$%kVUZG@eTMGQYUu2*Dy_B zBKDnl%J)o#KhG8YE8VoIY;If>-KzZR#p_!0dg*%!_J&Q?i$`l2whldazuKO1;-x`d z<<{mg3*Iz(Wuk9lv%)f9^m~*FC?9|w`5(S0%=3tKEvr}mhb=a69m~hHZo3>-M+~}9&G2xxdyQ1BH>(#x_ z4Z0`Iai-w<`W7pasp&p#_nOQLA^K;tgR%a#LpBPAiCVAO4)`W~pq7g2e5#{De2dyknq^Uu=J*XIez8dsb=aV9HHCS3I$t?W#O*V!85h1==1N&0zHg zYsNF;^f6aIB`q$=7Sd7w3{I)R-xVH{&J8ynjCj;d`;)6O*=?FD?nN!J zN2hYjiTs*Wz9^Yi-!5*oFHtUwQVRH7+Bw<0xz!^iL2}dU^!s<{YzG8-#RbQ!x2@xp zaMXv!)y?7Yb4IK!kG5Nm%Rib=*>!k;Hu}+0wN2J!nEE?LA)~J~a|T0UjVDWE$4CBr zDhaUE{1eYl80qS(Yu4`G@owc#&Hol*H^f>X}I%@u%bsHoXPjiOjrf;mLbcQ*7 z^*`d?Km%SEO&g^zOSd8(gz3I_)=;QWPrg)V`sqW=nY}F%;?)P0szeV;wY%o?3v``d zt+HgKom0}XPa7}i{M4=yv*|j6dtKgFmyEM)JalW`%X`{NwUsP>SqyTwnlCrj%2v78 ziSP>1O2jm1hsasKW^KA$J$aydH~Z>X^C63gssq&q595sz57=l*_$zM~naix&628E) zRP1K3eabOum^1#6X;PzMI()yBf8XEZ_05|Vc{J|sQI85KM5~yK5w(+4bj;?pb7soB zM#rt@?>vrrHb8lZN!lscpXC(STd#7K(XIDP)4hO)Uq@8dy_z*X{&VFRm2w$|I-QiTn@*xmMvEmpx3J8 z`Q`bIjZYUt8>X_(`#q&AY46G5()bvV;Kj4fRiXK&?H|@{!$zT+1$1dNFTRKDn~`!0 z_lx{yAljOsuUmY$TG!4$G{|d>I^^rb3lsXkGJrbwBgN zWxs`FX9|9vPs8~q-Pob=%E#LlV=Dos2fHfy3hn-+E*v{Ib=%~qbgRWp^M?)w6aKtA z4g{}+IHT&$CDd_e#Y*fs-c9vmz$wD~ zWMVsYNoyf1t4zu$L)!TC*|v+xe90P;tYO1`duOCe*FJw%Djm2vu)UFyLBf-}R*gO@ zl4Y;RvsR_Hve^KGvOnK5sI2aAY&a>$q;q`WS-i&g+s<+m(=W$U68H0R4|+2xg!&q5 z&|X`87i8(+R(s!3NbMd&2l4n#+xWVoEk{kV!{yFTe=gW$rEu@hgr)~q$ARBoTd!=| z-Es5U`-i6vR@#3$aoz00&v2L2-_8abDmk(ap4j5?<&R$Fi^~n}-V;aH{LedTSzSy^ z?u@rx&n$Rm$)kf3#d}wyu-dtDxnCZhl#l%EU z4c^XkEcS+C&)X|SGAimh97XdE7>stW*oG;o=Dkbt&*Qii6_ctxX7e(zk+F)l?|zOS z4S)L9kiZ?0a^0DtBHjzNE0t?D5%cv6ZYiaU*Vkql{^+rhCHvfrhNd>98;Z_z%zO9< zXN$im%M8%{AiBc#QZYKr?!^uF^HXc?Z5Pf&?_#G_H=SeuF;Kg$c+y-w_fS^at7Vn3 zs_7&*!sYX~a88cF9~uQ^wpD+81Fy`ntREK4X!sa`4oj);gbm{p1&P)2Og5n*y?{j6_0)BtH zsM!DRqk@TY)VU{XGfMu^G)-fVLq``XPZ|V2e$|wn5z2JoTjHK;hLUW|DHWQ0K|f?_ z*miBrenazFDtS;THeBRI!y94V(r(=Or?%u$YB&)`H z&aD^hJ~JL#e?Z`2$>0fF$Hwm&1!Lc~#X&)PMf^)%nnj9xx!qf+9xmv5-YrCE*| z$4Z6M51!#URWm=b=^hK8cJ%q|r7zq%y?YJ)=JcfaD52iccP^0;OgmXtcOUziu}6b8 zFm2a9`bcIw)xtx8pKK!-;|m40@786_6ZM;{Xk({2EF#K$Fv5>9JR!rP?U*1F|1;;@ zaE9I$*{gF@bq4NLj>ckXOv2;*p${J!5hs64MPxrp$XJY@`nP^lL0;NEfMTJ1`rm1} zUH?u8Q$#&~m%pzEWfV^l%JQ$&|K|O``v3EG%5I_mn>?D7JB7cc8d8vECMJ4T2oxpjKXCt(PX7ORiTth8U;WTVN?B@@<^Nk|*8k=hf6JexY!f{Af3K$+B~Kk? z@%D8W{Fhdh!j*FK^rpba{#wI>xUV|}1ttOKDT+S|1Iqaf#aZe#Yk|2W@-!l-h#{QG8O_aANF2~i&_3Nep@0c3y^e-l;= z|7|-;b?ki4oQ0#h1`6_&bN06XzszU(pXF0_{ny-(GZY>h#q5_-%l|Oo{(39_h59-A zP_S_Dmq12=*17*ZC3`0df$hv0ps>w+{^oEv-J5pnh)V=To(8B~(1Wl<38Hp^4Fm6;NBb}>2bhOc`x;2B9)!2|43T-q3>xXrKuyG9Yc5{b(8J=d8!^Gip3v)?hvsZ=*wK3f(xv9e^sJNkh<=T9bngIW>bo#GlY@Mz zw+W{t1|%~MkOzN_fCaxiXzk6y=bKLwVH#mrCvS#ykK<5m^)>hyWkJN47X(=(!*Q*b z@JBBL_|Ol$R!Pt}yaUF1rC`**inyjF1u++X5YJ9Gq3O;gR5(kb!m~VB$65>;rdh=D zUVac(-$`muKL_cHi$qS~XApE}M@6nYsOmZhlO?t=KeLP2b1aUcDKy2HEJv`s>`$J& zPzz5=RdH3q3~q!=61Hngkea%moQYBe!QHn&`fd$gj(SW)n16(4kFS%f_n1-3ivtI$ zlu?6rj?kvj0rOjDNTs{Sz)i7_WGdmp7u#KNCgmXJUJAm@hXg1{jKft`A&B#^BA!y* zmaq8i0K3$UxOs#J+lp=pT>ygvbM;~!~>y?zew$RWr!3tCWBm6plh~}$Q{;z z_8bEcRZIm3eIEF6s}nox+6dhprogT)LF{^O2(KfO$a@}}u~bN&yf4;*2Fqum?Q~VAfvj~hEK2N#Af~tE!ozd0{j(rxI>ipZ zvYLtM;3-U0{S0Bpx=<;en$%){j?8Z#5yFi5UC(p4$+MC zq}zjbY?^K$=G1S3>@68g(^SIVyshM+vd7S?ageY$?*JW7`p{Bx9B1GrEb3RFwedY- zQ|BkRZ*>q9tyf@E>K(GFO#_P-SjcSI3Xt13OO{(T!pjjF;uSS3#!7$3GuNo#xZ!u) zwqGB29%&^mbNZpv#3sU$M-!-DS)fos9HxBLfpu-XxP7sJ=>N`&{2xz|2|qqVsL>+n zK{CUDO)W7V)div#XZ$xseK7&K96>Xa$B|CX#Qn zo$!NQ4Y7D~6O1kKBiA);aJNt-hn^h64>HF|?>j~)ban+E-#CieS4s(sA3V5M(2F4S zwLv*R5pVo30Y$oc7~eLDFSo|QfYw7ev1gv_Zx6vb+9fho_!%@#=YfaSd+1n>B5p>t zVfr`&s2PaC`CpC%Kbsw@p7=$qMCn7*{sQtW!x5;Q_98o48gQTE8Yx2k2G5;H!!W}w z;No(h{NC+>pLS})%q$l)q*p$SB!CHc+l?t4K%hL#THZW6#4jFbc_sV&__04~# zxKwo;BiP1KGL!_xzI~)~iw-2vZosPCP7pYM4x;9-!iTj9JkeQ>iBzlPukJ&T$L~Sh zryqpTz^#O3I1lQlOB0Rpe5m}z0Ag5|fx>JB!_^wJ9bO~F=2StoCsJz>`* zjv%*(R9|I+O~0>Wzgs&}7v+=N!)oB0a59Q6C!kIO6}p^8SUye#JGV>1I{sOpQr-_1 z1|r~fw+w0z*5k{JT-;0d0Q7|zL4E&vNYfX>2c$DG@|g;c@{>f8ggM5&ogvR8u;R1% zXlVZs0$S3{q^_+h7^`f?do&`r{ud7jce(***e>J{{)$ukcH`b28c4ig0n@=6&?Z)a zTYu1C(N$-#;rs|MSklNHrW5G9HHjEsJ%qd$9SO^4jd-uw6a4ukq3wVsY%vyqEd`E5 z;lnIAE$j=bw#sPCs7*xA)MEeICdldEi?OlQXyWV!wlsP$HPDVvi{23`8J);9*98y4 zE`im_d8oVf8>D>s;j3{5giQ3p5MK*S@}{D%6gAE>%b*ZD4aEN5PVx#YVntUFDISml zRg^N0(G7#P1&}S#U*UC83nU+`giQewq&2kxeCe8{d@jo1cl0=s6W0Olzs`~tVb6e# zPL5P%zCyV_`3PMKN5IW@gmf8f!NY4T#La{K$i;MmNGPzyC*@JFs-Of@QypaS{tVbQ zt4L(jh+wC<86jAb~xA<`b5hs9L}nBM#dVqGIae2WCg^WVS= zr^I0F`C&+ux(C}M*l{}(7k0<;qFm~dN)T{V|Iuq>D=|Jd= zF%aurK-Fz4uBMlP;K4=|J8+fAv{?l0Q73|8AO(hBxWT|Z09Ohwz_ZY0SeN{bG~5sg z2lg@&Pv~;cFg6NB?`^<@pJrGx-i>ds=i*HFHr#Ra7D<<5fe*G$fW~%b_G*vo~2_ zxg!?{_$q?&4p)M49W7`Zy(Ze09sr|k0`cXe1)Lqqg!A^{pguiCd>x|4)}cV+SeG(* zMq3ca7g|tmgBTHZrV5UEvJg%?-eSmGY0?lsqk`@x43TugIgU4wHB1Yq~lvMhFDw_UK z&yfQTxjw+a?gzIz2FNVh9`s(+BYc$up`^i_>|`kcgZHguXP7cf{^lfXm2TiPvS8CO zQ?yEnf}$)hm~tq@8)q%xO0EgoY-z@=GA!uee-Wvt>*3dOFeX3a2l+8yJk!&MImY>@ z!(B+G2N)t>`Z1C=m=%)Mg$S9cKft4~2~L^3#GDsn;I)zqLu4=1w6$RF@&Jj#c|cYD zlL&cy5JbO|=vXxi)O!w+E;_onu*sMlZI8qsG-bG9vQ1@#n=+mrX6(t06a;X)n1>>-H z^E_zA8I#|`0+7A+IwA3LBhs*kLZ%-zJlU9t{bDS@rIt+U@-V^Ckv+uQ3!xyjc@X*> zUIOP~c8b(H7;dX}gZq{-czhR$U2C=Q`E5D*I71zcZ?A`j-b}bR2=HZtAc{5FLqV=6 za9Pk2xmE69D{>L0=0{;QfDPtJPh2l!P0-KKpz*~tvg=O)YF_vPi#CUVkAFK!xb@?s zW5-}kL=QGM??63$54boLgWIgPz*C(mJU|&|j62hk`s0`2uFPKInw=kR zM_pJJkqwCnUkRpO1N2T4BJ5ATg<@}C;_myy@aBaHu~$tK;$%FC7t5g-`{fIn;n@l| z9g(;wdK#KT4KbuG9dpR1qzdy-5a{zHxAdsPE2gt#pvnvUqFhPNAA13T8xNBy8{dOA zDNBr>9mKXQb>fwgJ%~0`lGpZch4@)@?70$&yTzo*m;UW=rZgY32B@Gv_#BycIt!2V zuMl&^F>ob;3k%~+AuHAZhy09Ckv9_e+s5OK)ooCn&H@t(*GX}f37j3J$Jk|*-z*_GbvH7<;2-I;w zWyfm_oXjScAL>B%(LOTx;xWkFz)0qw+5)<~BZQZK1#0BD5gmyeFmt?sz|iBchj}k~ zOpyWq(B%+twH+D4%!nONc)=wmiwv%A!>z&|(A~EgJ2rHYPSk!d(G-P)cir&2kvSfS zw}y=R=R`V-0yR#UgsU$HXVmHR!6Zm)CPiB-b4QNOc-X# z!1o#cD47rnPLKSFTW%51%ey7+3Al7R0L-@oPxoo5cu=t331ig52n*Zu%kx@*~K=KajL3t;}R8& z^*bQJ(Sg@qkHbPBJqh>QL1C{b63C1T6<0}^&j-#!kr41n0&E(+$*9e#cxz}Jm#Ot} z>6#Du)zTOTjF!lIfyeOB%LLfMPKR+Z2hi%UC45enBNc;(VDthP?4W-F@6;5D2$By{ zGddtb%>dqW-v=0rhv$FXNtfljpe8O(NaoF<^5GHk!p|CfVfhHdFPUS)vE4*+Gc~rX zWRO>~6JW!GAqbb`K;mv9UJ(&NS&Lk<;9fu2AMAn?9}FQ=?=_Jx*@fB&ND~@_wZtVz zGU>(cA3DVOkeyI-HV;kdG_Y&^2kdl@g2saFM8>!_WUIX*PwYJj<$IrzzeZx9<)R+x z@OcsrlU<~d_DxW`u|iJAyusV2(#VuzcHk6d!wUhEP_^1jMvlfqtWgo>1!=*RH`mB- zGb<2X=|>rlvf_E21Eh9%5`+w_5ZWPr$bY1ptUknsqjwufUv3RlpW01!a^8YeWh+ve zj~Aqs@4YMnSlc0@K6zq4ZQ>v-(Fl>VJEt(--1BHMKVyk z4htWOkV^I^U{KPTj3u1m_Hk~QIj@FmG?PHPiye=gErMv#UC2@u1jC-i=vej@CBHA= z!owkQWs?xxcesv+zR9ES5kbJ2n!T6`Zwtdc)+0wd}Ax% zi$FJs(>nssMjJw_=P1ynvLlbd2wM$z!QiuZG$)( zemo}22SVx0$US=#65hEH2YghKUHmi|ck?A$4-Vn&`(lt&%1ui9tw-hoE~2g082th# z2&PUa3{(mvc`0!Mc?Uhb)Fp^^>YBKjkq?T@4G6VmTgZym1P!I1nEcijd1!>tUcrP& z>!ifCDt94w?*@?5Tp~B6=pYlf4oDhyfh3g}!5e=CQ=W0brrbzaG_554n@?hJuPyBM zokFH9U8I%_1KzzEN!}1^28~C@@YRm{$mC#x?a%(;J!wfIuI&PJQLatKv0LCQ;z_Pg z)&#}wK%Bh43+-c7VYzo3j`vQ(^79aAOfrSM5=&(3utwHH!(btvMl>fA_+E37oL%3G z`w}|QuEG@>C%%z3<~N~D_8sZhHixtRgGA?+OvnjIMy6gXFx#v}9$+`Z8tO~L5jzqc z9G+vOX%wFBJ&T^_cfcuDL1@U@k6HuUh);hkq4d-{OnKc1l3zEVc(xDF(;7owZy%I# z0=Xq=4U<~G5@pf0Aduq;r5pM%im{%QGLQ##uK+^1hX&oPHxr%@Jb;$P7DUVf;ox-+ z{GeM6bsO#yor_z6e#{cGFKAkhBW$L*-IqoYH=X??OwVe?b9w7ASG40e#G&vn8*m ze1r_Lh1eAm4|l#O1C<*m4oFJlha_j5zWfa2-z_4;p<|@1;bj=m3rGI^{V>hQgmRS& z@XX5@dY%42+MaS!@VX>$HzyI_=XS#-EowNC`v48DR*{;D@1UaT9GK=xiAxUiSQgi8}|0l-k$OQ*1+e zC2L|_;!DaHg@7&PCdB)(bgX)-0t`WBIAP0;cx)Lv$zo!n-Wd3#Zjp@IbdbE65>soI zgNrJ{;J361?+W4mstJAENeQtacGm>vt7Z z?EA2XX%Sar7{HVqg4Y5;#H_+^6o?4Nb#e08-CaryGXB7|l-+pYgcj-q-y_eVBZNm! zAhY2kSdD0cxaJR(-?Vu0+$Is+Qhy#cQm&!S*>A*HZ6P)bkC5(^`>3wZbGZ9jG}QST zkO@|;n5dot9GmRXX8Qu+`dlAKGdi-%y##e1vXNOYUgG!TSD^lZ7rsi5AxDmXhFG~n zMDFKqY^$NhQ`1T)DG)}~<23B(QGqy%XE=0Z8jZD6@pA1(g6Se1gq)W}W3^jw|7SdW z7hZz%iS=a1`6RHBK;memK2UWC0IPrjY?FRSZob@uHuN+&Y(fL}%HgCczYx&*d?d2% zLXozTi#*F$fGcsSXumKERes^%z48rDJ$yxET{wu=BDqAddJ_JayGOohZi116aisK; z8#X9rK-9AmFj>1v9;^9`_jK3b+TI`#(NZ8KwM(%;&m6@Z-%=E-!cfd+2VZ~uL1SY| zOotcAZ@Q;}uGI&Qgv5ZU0|(j476XpCPGIywA0u18Bg=Xg6v}spTQ+7W`qYEC?kbG= zse0gjG#WD-)PV8408Y?4kq^(=10~i$KHsww3nsGgi=YGc-pYg2v>fPRx<)j49fK6U zJ7g;tKb(pj#$99981?WiT2|afiz{oSv(RzKv|A5Pded>%`y9A-?ZmuVAL7P|uV~@A z9Y5@&d>#}pz;oVP=)P;3VCK)qZ6U41=u1AR9;qfBZ-0ZO-U{M0XFa~pvH`uBWN5wP z3kvz`P|=rx)ZIOdH|oDaq;(8BJ#PcS)1%ldRYo|r`+>J+8gg0i;IW&QM8E$fyyD%8 zYd)*E^}PUqYK2*!*;+jYDvy&Mo@mwhRG!VlX$fgiLhq}udK2IXwYh zTQ%Zb{2yfTu*Wm%Ib^zFE$SB4lS|^Vc-mqE`Nqx+|GeFVUh^8@p4C8p*i;3^94b(K z@-AM;wv0(`oPn{!J*4;t6_tLoO z%^@_o;6rpI+y)c6HZq>Z*Y2W;s~=)eoEx?}FckMq~^A4(^$vsC+~Q%AT1+^|cR#qi7V; zde%c&^({1Y4a2CfZ-9B)1I5{$;K2hqQeoF2{Qa~Nt*{?6e7-j6Ovu79iNVO8q zz0-lGGkKL$_lX^SBk4ra-Hq30`@mn}DjZ3ZBrZ)S!D-7CqK08T z?2nm;kJ~l_+nYPYL*6QEr^H<)+On~n%)|$06`|2(fPAN|Oo{(V5WTVuVAMVj?bWUD z?9LtX6J`7o^VJJhEBC`7zdfm6kPXT^i-GMm1IB-8faLm{*ipks60eF-KFW)*etaAr zmPdnisTW8c>&BQhR}8#pLQ*ek;1RiPME|-kU>8;j`pU;(-#`wgcC+J1C@F zCakEZp|`@7)ZDBO;)`uK5Re9Wd-%a5NCggv9U(?(s=;mGHY)k;$9Jh!Ff5dUWXTdS zTsjO}U3171DMN6zF(97KoyVul`#^+v15A&yahVdAyfbD=s1r}ILq3m4NK(U$`Cj12 z4T8@2^MvNXqtKG^h)A`Rf*T&xxNZFm_E5;TCHoKJp+$XyVj7BD<%V%-$8WqTEK3C4 z-iNLt252{(1~Je4(d*)UWb5o9KUufo8udP~UjGKx^HiYPb1CHK;()LOeRTGxB^vZD zL3ObrvKn8533DaltLy`~C@G0Q3mz8Ps0pf*+%ySSsfU1@^x&;NS}U zq`OKk4X0sWVJZ1LJ`Wjlo?@=}eN4;bC4ah|z=6%4#HOxsIDPvG*_aI2;BXR;U8==W zjbPICsRqdP3cy-X22>l45kDlpK*tmv5kqBLY}@FGJu!CJ-^@*x?v#T8i;Eb_q5`dTg;;mC4P6aB60bTdke2a0InbhlLhdig z->$we@|BA4-%E?1>rF||C|;;}^%~=&ufvp53GS0uhZ|=KvEPh9&*)*u=Ba{K+o$A0 z%xSPnlP8+(Qo((LIVSoRp-;yvpng*U-*Xwrr!%TB?Z1h%4|KqS*A3*3sV;aPC5H}$ z=b-kPFyX@?jlUvvz>_8ryX2mb`IB40vdNkJGx84CE59Zr?RP+*s4x~bih=codg7MU zAlT?ck^b+W!}+EeEPZB(fKr}4P%2AuYCL^P($k6euEzl>SF6=9bnkFiD)<0 zLyHe}82s}z{z&l0mjP24%czVZ{egJxu?jiMxCJ!8ju7D&Lm$ElZC%E(DMOj4%bkTc zZ}#BkB3U@5pH4{Xb;CmHByh9%DEK2Po?*c}c5aAv_pCJvxiR6^Ecm!Np7GMMI_!!JWq zNUKAcr{RN?>uL#BX%7-T{ZFAoSP#X5ilN4?9lU>RM~Uh}Qo8CU7+Z2eWL7-{e6U9* zj)g&OBu6xKPTnIlHum3MsVWZ1S+fDI2rj3U5YOg8<{O3LBO5-F(-{_Ju`$| zfeijK+eq*gtKuGV7YvLCL%y^xxv9n$NA%?3)q*uN-|#22wrV4zdKT%#b{y_D`J>jZ zrzp`|4PFJZU~#I3;5j0QPpxu^k=gI4QN9!IH(BCo`bpxY{}nWlV?eiir|>wH0P-z( z;i0`7K(&7f18%+|ue3kH;5}i4)G9MNdGHZ3=5x63z;)cIOO5A+tbm&sp z#+rA@M&biTvQnNg^c)9GN(^AIJrN%73@0XCo1y1nKYEUC#^Re+qd$$vo+Fi)ZXn|{K`S_>R6IBdMaQK2dl-aJ~PG2E1xBm!A5WFasn~%8;h2*{~ z2mS{|=i!j!`$q9|izuW-!^miegi@3Sg=`HGr746|qLPG?GD1T`LZzvciju7QDoKb2 z8HtoKiXxKk>-YTrgx;R_eXi@A&p8*}OC5WJwk14r5l&djs;s5X-@+>aWajSh)+hI*%iu<{IXfpa1IKZb zgc!8l(c)|V*plIkRV*hbpAs~U;XA7u^D~|io>!o$csg5_WC5|Or%8Hc360lFV{&S7 z7>uQKRQ>}phUH;8Jf z;gpjR%@3D>$#z?`9pAy+@(rja;1%n7wh@Zf4XohwcG|O9@Sgs@r7KmU(2u@^Wm(gy z)6I;&tvt&ULwga`)`BAwR4F^z2fJq1BjDozzF=}Ub~OK_?Clj~dDet!DoWz-@|XPU zZDTsyI~=Wf1L^J54tO{FlATp3=RO;;th0xESsj9OO*rMw_=gso9=7<n51hYcAj zMrR#T(NKSdg6|DrcnaLk-oZkHodtcpn-y%y#Fx0)I5o(R^wT%61_?nosvpE^(m1Az zR`R_g1$S)M4Z88}1XOcf)JZiO#4rY(}8>WG<0h@qD0m4dTlXl z9hpZ<3t}NseuEBqG%?4-R`5+KH1A>=VvJuyZ}Dj=^5}(+@E!IG3_|)6d)jqXm9-UJ z!Bbl=w&=VoZ5b5FH5?~lgONM`t#FCE2h!j z35B^An0(%LoO8d$><)zD#e@#F>boTBy5yP4l5{-2Y0EWgLP=1vDA+p%36a6%c2kkc zyM<>Z!Uw@$F0p|>La1a$3Ez6nl->^%d>&yZjtIHRKD#Smv2h)r>fi@oyJ?hn_dl8u zI1OHwL#SP&o_Flq3DG4R*w-3A{2V@u`<#)0=eTvW;+s5$w@C5;XKf0O-pkX^YeIIZ z3pHs-fc#`ArYMFko84f+1*0(4c{4jZNfImL+}XM(pXpvgGEWh77xprlFO;@M zPj(*hpg~Bkn}Xnf5nNf@oX!PX;Bi_9*{NTnAk{>0cMmpaMFa9%-?A@ucS*K;7OM<@ zL{q${k=Mz7a5O@#PZM)8J~OjL)j0F0n}-h$fhZU5a1o@ zP{u_XJ88h07yR1AZJ4*a6gT&5rvpzH_-$X% zq`+8<2)4xJP-(|U;(u#V{LL2&`y5!A!cY|2SK+b14K8@A%;=p0<;|+09~IV=_RN8F z1K(nXX9XGDFvi>hIqp^<=<;{k$kT2DM!p?_nV&ewV-37Vyr3)cs{CHb1nL+aL7622 zZ}wT6AFlPlhI>2Mkm|9x-Y|kbMYSRH>j8v`J)mKx*Lh??B}wlrAdTAhSbpgda@x;e zjK^%0l!(!YkX}SL2cinEnOxUnbX0qh%uf%DX_*XVvs95>y!ipiy?nrY?~f6*yGQ){ z2XnF;Cr)chzEf4nVX_;s4zEs#4uZIG-=CsP=i7n_s=+k;cZ)RMobwgjwjj2!&A{X zqMP_gDTwNSW7`EiRWIl^HhKv9Q*|9?S>{u*?FlX$?vDF$p{r4=`C;!8? zj1csH490@g6);~mik?0f$LH{HlxtlEBnFNn3lc&Bst(5FqGYX(u+qee=;`j!v+B!~QckA*!pnEXv*xZ}rv z0xKoUXIVd^=q3wh8LWUG_h(@1uFo`MvoBZO|Cd74ySP|yI)%C(rqh=)p?T#2t#3R< z74{c!>fR+9>=gp{{W5}1Z^Rd=7*TUJ$Io9X_^w$^iSz$L|5+#YDM~|PQY#;DaTm6a zI!GTMJK)&!Y<{gaj5avMvB~RCAT7y*8M&3=hjIptbqbsEA$lk7%FI4KkKiLe+v^L~J;LV8amR z(!LqDECs%{HvrWF+x#?e746RXg3JNOC@1_ToBJz-;?`Yf&hvU`=L3DRs0yYR8m%m} z{+ zT5y{D0^_8LDJMe?8%-1GYegxGJpCCh?+3H8bP0T!t5JP@ZgFTj8BJB<>ubbO>{|?{;0MUOmCv6K?I2^n zK(6)K0JC<*O<3dalJ8nM7>;Zx-Y=GU@ojKol(7$Ir+GqNXJd z6VF|MW z=GBm`={s1j|3xRBxsyrbOo;cGQh7rjn%@s)LNJUB)ed0m8ASvPN#Vb~pMk;bQ!uX% z#)xCPsmA9kUHtWj1_U3a))VuX@JbdwyOX4mT0mhYmTYaoV9e0A6+HYznk(!p>Njp7 zV%&6|VXc9^c|Vwh-$5Gu;{m&EtV!jkH}l)wA#_qsj<0aEf_GmW`!+|=@gttn;rl&w zbipnb)255>uXYRU@K{<9u#El77)z=_;>`MC3H|f^&Tc*tuGN$~BHXzURWHqWRg_W*c+3+k)d}clr01f#jqn%G2*_ zpns$d3tQ$3gNP|?zKa~)Nb%qYzBs|G&WZf=t;izu7kjt&3XLcaW>54x@#*tMn$#gp zDZ5Uwt3E17P)p^VHruenpp?lETqJN=vymLMohI*@!PD)9xwuvqOXKI^n8#usy)BNu zK0FWE+BiCD(ab;Sy(RmodocIbqDg8mm_+0X+7R!{B}SSevibyzd1XlP>xZ!CH=Jlx zjvsAV(}Fifdsy_}fwb||8=Cyvn5y3A^BD6OEK&VR$LAYD)bu+Q7F~z8=2*;cz6ZZe z^O$DSIg)z+j=yPIMH18f*vUgV_#@~@(Rzgx={O$IRoBt4yaeHEeGpf169W$Q(i*w_ zkgz(9^x41I{+Lfx{k@Fszf*)+^Lj99RSR<;biVPdkpM z(Ulz!XlG&xHZ1L;C%ZS$Uw(?`R@#yI22Bj!W=!&&_@f1~WZLLTQ+ik6$9_$8#vZ}j zAKMTab32jS5J_ExHSb;^+PajDNH;?B8lea?)0pNI>$BJ`>f{sm9^Zcp{#jWbomldY zsw^bg)F;y@{@z=9>GzXfy(*&Oo1OG8D}nygl0jJZbzUs&^EIol(%8Wzh^%uVYeBa+ z^D|~LlWu|y-ozE2h@<86AZRN*$MGR=_>#G4So(e)^S*Nnyks-W?9C#(3x(WvfGb_K zT}jI}nbPtF0la615jOoe$a`Y8&~)u;uD9hg;&PH{eb+>|t1wW(9ol_$1kcb9z`k!k zV7+oa443bvegC<^XJ8&0yPhL((hMH2Iu&UV9!%qsJNaJyf|XAtNJPGzP5n}bwMz9& zW8+S$kW=94U;jh+l>O}Me^Ibjx)&1#(fzt(irg=a!upe zfn8zn8eM=#7f<3{$SPcIy-IglUeG4x>oj}xagx8ifiz~N@L2WVxa`^pv&umjyLcLs5%x`=u<=}`U& zX(}48NtPR=vHY(Sy`NS=_ZlA4bICMp3bJQvt-9btAJL{;^U0^AkDG0qgSP9pS>a+2 zs?JQInLDqM-pgYrm+=re=u1ze)wK~Dk>Hx|&gj1U7 z4)m@{VB_0cDSGreu0ON{G0IB3D7u?I)~;b$f^YIL;~akKf5xdV1KGk?`nb1i1>4j8 zl#H^@!CWDp%$82#BR}n=Q#(d;|1m*yRZ@?lAI`%Qp=7bz_XAY3Bq-Xzj&yY6>7;%* zsk=r|NBB8N6IciLsLKB?Rt&E=gs1;bLA+W^jTbF7y5&(puM66v;J$O2|1b+|9mf1 zD>l-|KlyBc_+~m^`iCx5Z6+69My7@Xk(afZIYji4k$5}?97~}+13#hb1%tHWcv4F= zgodNJib*15=5~tyOO#?Cb&SbxW;hQTn2d$lS&;Adgq5Qe`}@Wc4mK5}?5_uD zBX1;X{h)7IqIC7Ha5K^C_-^3{*GV8G=#f(e%9xh%({v6s?JEr`y7P6 zZ3YcFSOBS;61@LdkKj+v;ww8qe>R%Xrlu3PAx3O)ay1?wE@xKt4-i;ykGD~ckX6a# zWo~s)+a1bZ#qo@fgGGzk8|AJ{4*CwvW@M1$N6vDj6Zxpv7QeAF6Vn)rzhU)M*&vs`L9Q_DpT z-+)(cF&if_fv#>bgQjH+`A-n?B;(c zx%RlCZyS28B^mn@S!XG`Je$5OaO>+tP87a@Jal%iLCr*mdWfOZCrk6DLB zc9PgQ*o`}RMN#jnR_YfIMg9JbT+#arHq6pxGTN!Q5oRDTQl+T>W5D&?df+?SoTrL> z#P$VaXmMLGb-mH%Gv2JluBhMSn7@_o926MmX9cj=3SgJRp3uIEDoS^bfPPpMH_=zc zKCN8pso6}~--Zaj|6WK>xPk+n@pSt3BiuiKZnLm>Z67ATI_kXGt4jBAzW1(P41t#;<%sm;lY2rL#h=G4aq#?{9C-5 zk;EQ6y+p3NlbD1GP4AOPe?NR%kX#F z#nYu%LhAe*eoku;q}>x~iS<9a;`SZl<-Wo_)$hVi^&D?YUvS?`QuKcCCfv~|z;3Z4 ztZmG3s#_F<=|1}?-)T0YthZx{W-E!G^`=}Cd8Al9##|vU(4pXnUFV*{>FhyF-tn4y zd1ledYs9;B^Xcv6EUuHJL2E>acD=n#x8y%^$@Lp($+&VZBNav6zMOVcZX&TK670>) zv)FNL3UkybrKs6u{N}u&v_q|pRftN^^&>|7?Z-^=GyKGwKj+ir+qL{>aWC!+H)DYt z7~UPZ0kYUv(TYg%I(*(G zvWjv)#GTj&$;-ot`K|512ABHOm`BrKFaP{)UlR8=3qll+{i$oDhUT|dEihzaXl=T`=NCFXmvLzeDcbM|jn;|XxD>b|Bpj%x=RA^4neR7>< zPQEVie;3%2750c%m7^`s&5`-wBgIXgisqaZ7~T0FjvO{+74&eb9{f9Y(zQz+EOejXkIAg3vhzX~ z*-lr;vKPQIaV_#9_9HcQFpaK$hxmdnobxThn)qxUC*%umu4!ZM=K0ci+4WHLKS-Ac zMe*cefpqTvcqBR;#bCwpEJ?W!A~U)O4Y#11{eeAc9{}CrqulSd7(MhlNH>+L@Jaq9 z%vNuMbZ`Kjd9(;8&HeeGlnSa33qj1>R8sk3gV8hM1nw%D6wh8G|EuGfnv(*(+}BF& z3B#aUG>m`WHJAp8N%Ao^LVrj3BMgaDML_UJ+J94(Je`7gYLF~8EuIdst`54PEo9CE zwvg7uZXWrrLYRB=c}UnpI;pI~V)UEIdRaVslvNC~n3-gE>=P;7)uZ>%uG8`tbzIat zpUw(gte_;r<@{0>+8jp(A0)ZM`;D}F)MYOEcQyX3xI)?+L2Ququ5Z9LK2O*6m#rR9SrvVgb_+CK3Ee2Wc8B=rYhcsYy4 zzsw`qhyT#;){P2(UF^K)Kw7&ypyJz24|OJ?RPdTs2rTSng;qXgem|7d|B^s7A)$67 zQ-Agi-IJ{NH_L}qJMuiQ-E@!|oFw^)tWKmq45ZT~8PpL|!d|#cMW;auA0W~NnMb)i zw@OCHK-cjJL#Glh`tk&MPf9YY!1@Mu!~SkSOUGRRiLe~ZI#aOPb$dHQPT ze%2D8URCO`6EbWc4?%x*6T#s*oz3}*i=&s}+V1=O@cZqcv|wBu;z4^CmD1Jw<>Wmp zooq80JSw)Z<#HU-CkOIVhVyYaznE6VpCg}j$+%n{LDfg%=*+o!l(e^v|EoKPAH%1? zPV+GGFMA+#O$^QTv1Fl&ope@xA^Vy$1#@Dy(uHY8biXr%uhV{nD94%nrJ@v>h?uag zO4g)0<_d1i8jee^8^~Og(c8iN(}mRkTlKDEliOj;H=-(DSpArcPYTJn9Z0 zsdpV)Qht!k#YQuyDFdl$i8@>1ehi=WK4Ic4d#ak?$;RIo_TV3B+;-;0he)|*9md=>hDauKuP0j$bA zP!yGj=?*FQlRt`Xy?)764Tq!q)Je27KcTEjMe@4(o-Eu{*tA~~G-{2ohh>VR%V#g- z+YC_qJ(33Q)}e5zPF^Y1N4+C|(I&4>+!&ZoJ>O=Na_2Eh^++Z2Ta&2h?tYH^dHsj*hIwlw63a_wye(aeA zR4$5R_mPKqR}jzK?%R^Ceme%GZKJrdWH?N|Ns&jC*_%ywz|t&fRCp#z%lf$e>LWs~ zrkmc|9;V{p`}FecWsLH^z(WN-W8DQ|&ZwD6k<6Lz+Ov{s4!W|fBW9sQatm8L+n#nD z67em<-}KM&0xZfTcvi(4Ql2t{ZGV~ux!aR* zI4=xO>INe5!*eX1y^S2zi)r z@12xdbO(p8?}Zh&rQq+&XyUKabRuc1FjtP`4OJe9e7Bdh#k-Lj8V!H53X<6QnrvP% z`uA@p-xD{X!d$s6@I;j_FR z(+U}jEh08N{pA<5v>kkmfrr46y0TLqoo?gR9G>a z{#aD%nBdfqRWK9JVgDYigp8X71+Y>KJ!HVFB*Lk`@eUiYG#hI#t>g1HO(%7^TYSvp z5s+?q&i@E3&n6-BANN3+V!C}vW%desxHgbaH~I_R$Zj5?rbipbX=9S59Ocg*$#0vi z!O-}8<`nFM3-0dliCab$^Fz7%@Zl79ZvZ!6It?=tiuiO7QAE6mVq>nlV9_`$_EqyN zhQ5`Ew z10emMivv{%xFyK%4)c%m!ACE1{*AE=5)!R*FU zIE(G$-kUS&-y`sZr*ojQw3q1!dXe~o9o%NK7QMgzhn=7xw1!KeT}Ku^><86l#0dE< zFQe(<9zqrhmg}W z!Cq}qoHCBU#}B>aa<7qHS@ar7HJ=gI_Ad@}a>}>B`3Ya3r zewh7))#B02?&C6AZEQrP&7TB6#fq*7-2onZUh|hKL+S9%Be1J2hVx7t2u&%}IPwL* zvdER1Kbn%t+d5ooj^-2Yj6_2IP$q6|M{ly%<5EovJvgd`K>N28dg~KEvFi|dWq#!v zZ$^>cs7(5}Q)onfKau|@nT=+Cl!Z*$hUisK=y}Hn%&iULox1yRxzv_=C4ZA#j3EgJ z?O}Q%kM?#|V$AD07z(+oFhQ$sowSC`)nBqELn+iZ_zU~4@O`+togcP6PCE^iD9=~$ z#{QY$%^zh{t>4NH2|MA}=D}>cMmg#0?7$|^4!o(dW6O#eHpETF>V_17ckU&z)_!^% z@(W}B4JOOSV_EP34=7)lh)*`(=Fc!ZlooB39LxGEQt)5H zK+?J$MtGiV12nMCo-+DPL-vOl6a{lA7=iJ^Vfk zKevs;qDAk8oaAr{)K%ptR_VYpS{rlh&m(MjF1Oz;WG`jC>1XN>8hSGXdD|b6qmTtu z>sLo|>_D9G?t}xA<6q9!P`c1prP+BEo>SXU@>g4U7~T2NeN)NNbs=8F%2MdFT1>lr z36;|{Y5VrubZ3!plx?0DTHbWCGLeB$-aCg6j1MLygG`=s)R}7ABw(E_j+f;|G)!ax z_UzhCf3^<6C;yR@Fs=*=Hx${sWxeD#Y6cI{QKl=yTbNJcWcp>W43GUiaLgqb4Lu6< z?bK-)UECsQ-FNWX>k3U)-peZ%n_QFT}i51Y}&A~KsvkL6XQt8o; zNElX!(~+J&49Jkc@ZUFZYA}aVg)FUq{0=q&S~U8m0#1K?&VGOXL#>M^@T)gNsN=B~ zJ7KB@sjCfqV)sIHxwm7wq8K%MnzMmRhLOs)yBO@HN#>@Kn7_z~&MUdmsvjcsLA{Ti zl7E7|e$UuA-a&&79Uz;=7nC&OF4lcthL9q2KK;if)V_XB9!cl$bh9_om+H{{L0VXv z)kOzn&QpZYSCix$E95`y@gJ|?7ST!YQ48l)S*t0v=^|XDztOJ))$~EH4qgpqh+X;( zZzjlc3F}XEt9Aj?-`qoM<<^1a?i8}m6WNM_d+_BeRY_C5y;kiRZ)+}KDBQ4fXB)0<3V7GmG2 zR}}TD6UV1ja5H5`+V7D@O2@4zaC{{Fuv$%3j?ygmnGF4IKFBxutf5-L?~%;UNBF8N zzTvC{y}F%-9qoFgIH_BBuX#}7K~q+hBM#Nk$GOX%k9c5zjE>w%r-+o#tZ>s56uz0m zsqqMsUin`6}|y3YnG;r5tZrNZ+< z*N}WbH?0g)#&)GK+*{BU776Uxj>I~eacL1nUG7J*)CjyvNTE!{9_BDy8Yz#wP%rf0 z{q)Oa&LS?z>vE(%AyZnjY8v}%YC`jWnz3!0dth*M9_z5FgM^+FrCF|mRL~5rn^Q(b zhBvTs!Bb@ARP&tW$~Zo@hM(~-h4=<@q(9nBYIV=pmtS+Bp!k8r4w&GBza5YF8b!K) zJXq_j1(duol{MA3lG5JOm^(yG*cpGZ?M^9JzGFMr9yo`r^P-u^UO)OdXan>7Ye4+0 z1zR;j3c4NE%>G>~zG}_nThAnu?^7i9#km|2%M`h5`6wzdeNGlzkD|x*Dke+mlk{>=A#cB$&UcQY zsHy3g=Q|Fj`N8zbH-xgEIZ^k%JIG9ZjM_c3Fy7Uek{Sz`gwJTyP3a~6?jseZl;g;q zSrBf`kx$NA5_{&$W@QR_)g{5~=Qy`K2fGbcHjF#H4)a6^KVw#Xu+0{(OvejsL=}dB+ zV<6scNPgmZY>ZMi`MiF>)GytEWcoCu>Xy^EF=KEb@5 zH%O*Kxq2HZK72u{+c$I3PEV+A{lI$;y3zc!c?kM`3WF}Jr+{S_$ZkUfTIWPyi24LcB|U|@6XF9VA2<+Wo$-$+2?3rzA`>1+j85S zev~h^qNeRLuxb2r7~b-v>7R!nBj-2C?mR{<1ygV@#g6~l+UI-HNzoJBX!?4cU9_fVdk#FL*-qeZd~R8T*Jet8`u;=RsHdmdI&A&2BUErC6uA=e6nR6N#G4ao@5`UGY*jnXcbs5)M(r@^d&#EWI7<^B zc_1RPA6A=pvgtzK+)qJAw2N&cJzF6o5&1^&5QnpgGyhS7v?tl_m_pu?HLS?z88yE? z$k%WCN=a_Aq?GDLHecV8@#j5om;TAc+s9yHp(r14w+pZ0wfR(i6H5Q;4&R~!)N$%5 z%{`!nHv!e$tV-~XWW)F?RaZJ#nT$t*hd1DYa7)_Z7TwcWj-3OAzScBxZu2UH9vNSu z=u#oq+%I&VZSlq9yKc}f9SCz(b*{MOG!1ht7dmm;=--l??5dk5PKkK2U8_z(I=+l; zocRyhZ8B`m$S;_oc$>b~24H|gHLvJ+Kzf32AEEXMr43pn@@^Q8&&lI!zdS|T)5*}# z(xlW~8%SLJB^h2B2ltd7c<;8MLzenT3ws2s;oXo?_{eg1MNq)yR{rm70ENF-gUP2s zv~Sx1zOLsCxhco-XCgLO6mE!*k|{LzZ7@x-BJlpUA8|JF0pEF927iQiSl<3&l*hO5xdV;hUw;jS4v|pz zlI1~ndvW^eBYw1S4n=&d9~g+{_va`$$mZ!TY8s<)9Z?j1^sS<9KU_aZdzPoZnZinK1f2WrdR=|I>z z`uN!fU3GGN@$@hB=9(gg{25GJW^SbKkGIgS)=V~`=pmK%n9x3{Vg#E!peT`O@|wRD zMlOC-J4c#{o?MSL!QFIJdn+==UPG>i9Ng!m;Xi{HG=aG?{b?pB5=o-cC_yJXsKW2~ zsE~or5ay8hnx;K^%W}Jt>6f5q?70sNvVF`C9n6RSw;qa0Y9K4+Q9QKc9>l~-grwF7 zj8_o{j?Sl+rO&xa@J3qws+zedS<8nK+I8my_s^ODkrn^=3#Ab# z87s$VaTK`)c;k_6FODBuz*S5{aduB55|{g-L|{U^_3X%Cm>P@7J&zfYcOfaX-3*;Q zf$7h4BKOi&EY9X9LRG`q74beidZx);16SkYHEU!K{)-9O`k0!jfIXWm$h+hO6<;am zuiSM|SqpN61b3JRb5cc$0%|eF#29@{y6Xpv+E7^RQmZldY zD8!$RyEszEjdbdEv80ffALvBbH{3cF&CGN{XYBp9b^3wsDvd-$$7`H>h*Az(yQDEO1ZV zO#ERf<~y#y^UfsPtC+yN>boJgq>;~2ZKIWi?mSGwit0^|(#!j`2pSv84-e|cephK4 z_hJQBHqPbk1@o~e^DftNZzS<;tH|u~7o3(`PwJn1aVDUN8T449f5vO-Tsa9EXGZc? z<;7SSEW=Nov%`e*HN0+`0uB85oBz8yTNCp|?bw_c!*U(K84%Q&jLL@|mSw z3~hL3!CSO4sO~FRz0OAp@rfaihb35(pv^^Nj4?7v*jpWKaCp#ac73lldD+jWZ(c>X zd*CRA`Lv@@*OAS9SWIatK1|*D07g5B^6+ST+B-+^RGnOK+FgO)IMa(SFK6ISBe2YN|%PPtxdx)@XijqA*Xo>tpkB6_T;B z-d1`*5q?UN988Zx? zQ+Csn+F+D5B+#A!JO1FsYg+NHm-X+tPHit-=wo0H6?v@_x{HUPbG!ljW_5)8BaZQ^ z^ml^p^b2v@Wbmdok#;PWqhqhG(+|sX3fxyiCx@J+JO5`THspaMXYqXw+sJE98%;j2 zjj9%=qD|{K)kF@1{G7p$R{Z$=z76q{Fk?%3iR-J!6IfA4N67gpDJ$wz9Dh zXqq>l4kq7%#pe~Q=|V7`EplTGsSPlBpUR3$PLt%|^(6i{6khk@nUszS#_o4znJ?y& zeSa;^g``tY-dP^EXgS&p9Qd{%Jxp3D@UB+_Nz6r_uPEO_?aTwN!ancWYJ$*Gp}+M) zGLH~7qm28GY;9p6OfEDsy>Fk%L4FLii4Vkur<`^T3H{h0qXFJm{{5=o;y znH|!e2@45dD!DTcv$DM?NOmGr#eTS+Y%vMm_Hb}prPLT6`~Vil$*cyY}grC^Iv$lWao7uKlqmGz%7@8x64 zbciI?W>0pt`3FpT3)xZ26QsZIH$N@rMY-9>__E)p@l|+-8_NGC^#wYV_)`>Ub z$~8C?Sq;&x;2EsgB$C=eSyO2FHnNO zDQOpOWTPueDPqzt_KXp}Y*(W+tu~x*5j+_MdHj7lmKg~-ZBxJdFuMPaR!)~EF!VR+r{| z8_I$kLulV6SLUa7N9Zwl!p#bnQgu%glhPMM;!_oz+-ZZCBWmdAYBxAta-q>?zH}w8 zkR3cdP|#Q{c)jFsa_E@EE}Utlg8_y#o1T;5$*=tUT!FKk@)P%N{T1@F+HkTorz?*P zc%eYGCu9&>t^1jph8(v z&Wonm$NEvRdIDs&X(CV`2)bm$Wj__;o@pn}Z%L+m7NeNl^{w<>>@%2OG976LRd#hj z|K>0JkbFQ*doJ+1{x;OK?kRkgKT)%o!04UrB;U3MzQV%-_QQ1f?D}nV=8YqJ;G~53 zXT!L7tri*tzpeIi8@(JQ=;41ugdX67oC*AQl#&UXbN?Y(?E(Li8I7@*KBF?^8mjHV z{o-v=Xt)B$z7(M9JyHFM=QLpV5E?(s9a`}W{iFLxIb{ML7FdJrBenUoO>vNDFyJqT zZlsDb4<4!V080P%@*Nqggumq?JzcQ{mvZi7I{S{jH?Q*HPAlo#{vXs9af>P(nou=i zDyl1nWAu9m%89>^-_-|Tc;hD@kZF#!yDwnQ0(Fu;?un2kkI_6clD+z5jQ(dr-gm?m z5*^{qC8MjUNJf*^c|4^RyI!#Q5o$E>y|i$R&`@ZWtLN%N9+OpB41aF%f`0w^O^5!N z;QenaSnoAK-LH)pe&hpYULV9ZUfM>Y3P*Tbo&mK+$N@{jGmSC>$HeNU?02w})=~3PZ3Q;Yftl^bply^qx{87U`?SpK2;w&`RAL8qVc9ZkE z!R*(fU@}k}&0;O>=#Kth-s#;Y@L9@i*UBAa>*CD9p2(70bR7G*wFs{?G443lOcEU@&4;@G#+2e{I^GrqFT+JN|K%D+}Cj34oK_YKuYq=~>ps3ub4ErC@q3Zbsu|6n+?64!)kkHER#kRo-H#4}0} zzw;G&g!+-op?5s@lq>lvzotX0Mv}X$EVH?{0@=T0Xy8{v!CyVgny+wt+ZV(RZn#OO zEDrI1mf5h*&t={9R?7qm8ci3b0s{!n#e>sI# z9^ymo7tvfXTb_MZl&Z2EusFdDbt)QstXUnr{XJn~vXDlcT1JQW6;bynO&<7770)k* zva%Q>A+KzV{|;C~vg0fBF5W^Sa!06maVvDnHnO_Kc4T(Eg*_SEibnTVX4CFNVjBjt z0Zt5OmLH+nJ=f@Ct_PcU+m%WmedD8_{f9_#MYitz2ca+S1lJk7f()(q;JSVWjwjV} z^Rx+gZ0$jlJesj4#*5`PEu-wP25PM`C7D%1o^kbOH0d7TVj3sW6`8_Z3PLF@Xc+Tb zbP(^Yrm#NOAt*07&3uJk(JUDgXfE1An{!m@&$f1?J{l~X-Rv;|06fDTfFgIr2jQ&}_lusVv`s zxn=KphJ7y?8!e(+pM_qCch1bC^C!Y&OEGUs0e()G<2j4+Db_oVT}=u^gJ%`La$q%0 zYE&Sl0X8(?bT`Dlynsk%43m5Di_&K%^B)mUu{huw7Ip7JnD$cMr!E0mw{*c1FeNt= zd!B6*Mw6b{)3K?8NxJwfS0oP-3oqiD=an(kLqqVb?$GD%45q(U7R#sH#vYAMT&a7G z8HuiRF0__DtuunqOS zJNVJ?brdw?DsC4yQ?*Pe8ft_boB2(C;_n0~EGTCo=bVx7M3xsP)sW<^`QX(WSZjF~ zKkjwW*#qJ1b5atuI=*BJLJr{0nRiSJYBX-jZMNWO2XgKg!RbRC9lZFHeaO*ALi;Ip zP2koS$8KN~HjhS_d@?^FbbHyz`(k3`AWXUGNAq{Ll5JW!ovwRB`SH>uZ@drn2@Nzr z-H^7MM)29kHj$O{Cm{KHXn;0hy`q4#zWle&G6-kmC^rK3jBU+r&v#L)jS_a*RDJ^$ZxP$=o5 zl(gLJL{utNqAZC@S=waZ_k9ad5pA?0lBH5wC@m6^HVLU{k&2Y1v?xlYGtX!4btB*P z_y0Z5|Md)?JM;eRGiT13bM8I&Twx^sz=y7LQ^TkC?8ep+Drn4A4@x@I65TrZjUF3$ z8COj^ORqbufTsk#rB+>hhwJZC*o{^|EyL_^CVGjUzFP~=lD>m#rd!d~HCFg*$!gm3 z%`$vs-e)u_)Ej^Ka*1~0S&!Q7TBxUMd-1L3qBy_19Y5%NgS@_%Vl(*eorA`7yy;Xb z9i%h^2evclPir0`%R^5oZtgeO*2sc3p4EbeylSOqj(vfB)B>qdn<;$aeg{(POv8nK zBAD;>X{4fvC|}>Bc&NckT(!Cj#WfpJJ*U*r;@~fI5chDrJoqM#4YkF)JD*V=WlQmk zPCe>j`EhJ>MHwqQoyK++i|D}ibNH%cJ3a0-6F=|03Dq3pAmlV$YF}?hG7%Xe`PuSd1n#`qODO?dYn11U%C?8jEUdrz)jp;I@fV&|AIp zSW9g;eOwr>{iqSRe0m;Mt?QP)JZrcuL4&%qxEK}g+(&EaZonCL_Taq4 z5)|8dht9eXhcY65(Cy3xNayYXG;zE%TIXv`(H38^;t5?;5i}eZ1x}~1Ni5c1F%Ic9 zb0Oy25bC`A0i+-E8t%rCLh?yN(1G~|SmHt$3VF64kE^Vs$xF5!Mm$hT@*DvXNw#)G{9bUBQl0C|qkcovd-LU%T;go&(dAvdU zD0L*J5;=-nHZXUV?p7oiJ)9s%l@y4fA+PZ7_&5k(47#oh? zS1V&1AzSS4DS)m0mY}uGZMX-XU~lnyD81??tZ{}>=sSGYyQ6D8wN=ljMInuxLTG(P2EhAO0%)9JdESgYwW z(x|pX<_XH^wRtz1zv~JmJwz6H{1}Jg_PjxvA-iybe>J|*b_rj+vK<=;(0JRZPdI1I z2W+$8GVVUVg?JK^dLvF-wiiAZk){NyM`KM1PwJg>E;iomg?FA_giK$bqh0d1Bdwm1xP2=FbuU~` z*N4>N`BwE*U346dzpw(Uj317=e0Naya*go8^ZRk(Yi@k_pcmCzybT3aT*39OT3F}p zeA;^4Nqkv(IQ2*vzQb+08h&>w5?T7dbxBkWwi#(c^N%k=ANUWWxmEDKbCxYG5Qguh zT-b&@<^*G&(jVyf{f}7sqy@eAK{w9VRz*KY_@PUut0~{2eek@{Q)mi2(|?t_4^ovh zLJP$9;%7X(II+_gU%A(YY^UEsiTmrY@M0-yrW`L4*`kfdozz9A-s%Flrk#|JhepSt zG~MmkC-VS4_xU6iFZRRnQyXwyOcRcnpo@y8#8IF0_|ck5j9YW|pfPG9v|9K{`+i}_I&nPOviAzA`X)=OTF2sA#aO)X-X`3;aSVPMISSu|_n+MzhQoc_ zyD3dxdwjmbk{&+}?pYLtdqW+Up^DPiRC(SbB(K$ls|%K*Y^C{Bx+KDL1a{&|{sjEg z@--DI?v09FJg`;`JlAoMmUO{8da4<#lo!S}~ZrEZ_l#flGF(G}@N+KVAz;ybkv?gt#bw-e>)uD~I}t=Phs z8x?4_pr+d^;WPV8eEw4dI(7LO^-?njt3^Da0!B3Bd_{OaVMhv1cxHm$-m5_hLPw|{ z%cD_P_iftd!B}ka@F+SU#gBWGH=s37x8sZ_GIZ^p`FMfpUg|D4g<4`(QyZ3s;>HvT zuYl)_oK3C4g<{k2bME`p>-|@-8GM&e-gE~xSZ_+N6WWi0M8;E0(MNdvm`c2}Qx(5b z4M!7132@;fRin$iVRoCi;Hk9KMsKNUdZ_ zp^W5Fczy3kB-U&U&w1L3ghX#s2db99Z(}JVzR(>ga?Ay~QdR`>cu&A%q_*SxZ~W<* z)92%m6V5pOsU=#uLXd7%7=n&$+d!Mc?@Vo+yMVqkQ3+4I9!h-P{+Ed+%bZdYlTbn)L-gxG9B0 zB&Q?Q#}!y+TNM4t0FEQAJFtRsC0gn)M)5S2;Guh7A&pgMQ0S4@xYy)1Zp^l(&J?8K zPcHdX&&`i0dchrvmQqGaWBqWDCXKE)71HZ>z;6_o$>Wz^7g1enBK%GgFMhvuFIuo? zGM@Bh2fnw%A3J+bLaQ=PB9ligw6a$sQj$@nHY-)4t&tvddq52SeB~6~+3^vr*w8`C zy~x0x7n<<;(;v{5PrIlY_YR=_+N6*zPvt+y8>_1=FCIbLn4kcdr*jmUA;<&mO=mCJL1gx6UhBZ z29=g0f%247sPnIeW4=`QtyIHxsM;1&8V4kiz~=&bVZZ|1@_IeGt>B4bUY(^2-2<_P z$N{|KxF+_E_oF^spN>zdT*Z61O!5AhJ+xJu0rF^8rAy-AevZnCw2`U}KKwQU(P2es z@rBV;$OK8;Igyt(tAB`jP50Bw#RG8qp(J|2*k`zT*j#GI7DrT5yq^llw?LakV{tG% zpLcZBGWr6)Hmc7$j=t=KwhZurNRDfG&%Jox6D zJ#hO9WAWlSU2dw!Htm<@c+Ws4`Z4n=26gXxh^ z?%=SrWypKiS7h;Bg~~dA6-z7cq!Wsd;HkSmqM?S7Nd90sy)vW@Q9d1Lh|+hIAg}^W zg6{)0eF(zYyv6wPtIgOG?jg2RtfVqkZ=j_`owWL>9jI%!GF5Fq1BJWorNyr;K}kQ? zP`vR8c!u;OBmtjG^4N$*X)gquZ*aF{$3Pm-vnh15+@rKmJku(m}(js+C=mGQ`P zMLjOBEXB8X1)_k;-Doq@mMSd^L9Q7+)Voz-@C=4=sOrQT+@tcC+9BP7!{9#4v||(T z!=BN|`!X*!jQ)TZH-E<8_voRA!I>zVKOc*x38VTY_b3~W<+y8dK2}#%hwmxh$KUkt z;ho3dqqO2=e42KmZ6^z&9Y!tKXPYV>sZooLJ-Us1Dj!iVbkec|FPt ztZT#2vH?^bvT!pyJGD6umiR=hNqb2Qo`c>Nyh6D%x6;NMOK{R{E^7XD2{dG40XmU) z0ENt{Mlx`p)=A?fG>SqHiy9k5I?A<>0f&*Wy_A!x$z;C{|<7o=6=m$IpN_X8pG)kRDhsC_mnxZwh zlII4JtAqD>tvBOUThGz2c8B4DFJIwzW6kkT$NMxLB8B4oxbfVvk5P>91T^QR4a(c8 zk9hB8pkmV*bjtTdsLu2)R(jru-tUdaISMoJ((C|Kh~#ki87HjUv;cl9Z53sBaws~k z)J!p?^zd{pe!T6fD2l(>O4sX7M;&SzRNW>8v~`yv9s61iPn$1^=k4mo4sgGATec5M za+aY&F4d!uZ4c-m_F7Yv-OWbv_sBSkk=FVA^W0!-pd%TdedotF7&xg?}O?vg- z1YDxiNOj82MDlmu;aw4B_?f~_EM}L8Y<|9=7W+-ZLvt75IeB+b*u`(ut5!73jpXB6x=8JGv5no2#sC zE;=c35EnBFXeVwfyrW%;mKPh2M_)UN0=t#a!n%FiUQ94)VBYyH@#{Vx1A0HRo)PUfHi;LA})qsETK+Mts zIViE%L>=0o(`U=B_&_*7m$+alvebwn`04Y(YWMYvWy8`1At#?c*Bl$*lb|F=R&de= zWp>WMW4GBNR-UZfNB|-ub|3@aBp;4X;)@Z<&>{*blKd<@LknKD7?A`cEfx>j3^t#| zgErCC>eB^9;D9dC0UP2Ecwh^K=(1#l2R6hvuz^^7q6@q}f5b;5;j?*tx}e^d53%Ws z!R8TNR*tN=M3LA4v3&IRhm|YQg&bJESUR8ub__(3pQ)#KfDoc6!~_4J2sLR?&}K0R zj|XH#2Wp~A+Q5T~t@0XxtnZI%f!WAiw6ghN8IeD}p;#RfJ@hvjBK ze!ub|xv&gKZmcFN-oX6Xx%TDV7nc=}hp%sVSTl&Vi3ned!3V?3$J$iTW(_T17+lh3 z*|0VxONX^t$l$YP8u%l&tW809K%{VdfrR)aK8OzCv;4B#M5;xik(f|eGPVceiyf0? z1A43|pv3aU$%*)7=fUE0;{Nj0mk+y7?EZo}djy$06dw~&d@yo+&;}c5gNz9+AmBrr z$XGf=28E@^;t?4c{ytl_4HH-_8@6viEdPDFqzy6IKH0M0;z7(`aoO?Md68U*e|A2k zO$x|<Bn&5{v+L?3j44^k*h&;gzn$iOC&Eo1SBuSk{?F3{s*@9jJbpaui90Ek^E9wH+; zS}YwRgD*a_c|-4Y#GrZM0i?292uL(u?GQL zMtl=rpvQ{G%7L^OfbTvZeYp@GOP7;hUta9|wa8#aG7;LyjO+^vPN5wM&Lg2Fd{$wC z4sf}EST*4TkJxf}z+u_4Y=BS7M)JZ0Jz@(sL_ZQ(BuS2MHilP_6CRNf8&XItk_Q(P zY@m)LJgA8m@=ACcnFIkro7l1P0}ioa@jymwSh+x(#36aG^LDWhMs_ZKc0@337DDb` zo=&7~@8BmV?Wf53mnS?@?mwuld-&+_llrF(&z`?%YUB$NTl<^09q-0WvbV8wM z_FrE`O=_IfDA+033DqR11gS>&>!dpSDryovi57%Es8|hZ68s5Lf_)X$NH@}*@COyE zK~Y>>JUqO-e0;-)j~F2+$Y6+wj2Fw?37Z4B_7!nd18Wy%;LuBNpP0`UYF>!HQw{G7aAHQqY?%jL$ zCMG5&rKB7@n3k52k(qh;aCY{wV<%3WI(7PVUS59w`STYpT)I?PSX5L}a`kFi+4bwU zZk3ncxl>hDU0qZ2;6Yv8!-r3v)YmsOym-;r*xda3bxTWo`h4k z!7T$w7=n_`02pc}Qy9z{K*C_g00PVe41ACS2}5iKkTAq%009O&9^gwsEd_cY2NH(Z z3?RT@2XcrF81$e}a@DHbDKqNtKAktB8Aixx0;PXJuL$Me{2}Xt@qXox( z5CR|Ufw(}%4Fr1`)L;)Xz+|t38th?9!V7F*9;kVsM*M(b1M@)5!w;r>5RVVyLCpg- z;s*?T9;kWvAs!#ZgR2R!2Lj9w82Dfh1o8MF9$aXEJrH1iz`zH4AczMAhMZ(V_02@U ztfT-F5n{lL5Y$4zhbA9jKEQl{p|Cd*89a(XIsgPU=?q}72ZCA%Y9ZhQ274Z`2O^sm zdIXz|j3}anNk@R7CY=I|7{F&hEd({ZpUVfB4=^8KKESMjht0|wd`g%M01(t{guDj;J5K}|tT0iTRP{{Ri{Fv!4; z0eV7E3xOR2>=;lBK`o@hHiuUR#Am>Ofjc0mVE_Sxgb4(C6x0wOFc8!bA22I41L8Aa zgD_w~p$P;v3@~7jgB`?YKzs(o2Mh!?#0Lz?lLAKwcp?An0pR0<8VFcq`>?NaVQfJT zmb_TSvv#BS(6gvfWeL*Y9JDp1QqHVGz?;M0S$xrTtLGhHW$z^h|L8AaxRc_ft(BEpbvIH zAO{RJ#AbDX)qD0SJp~;iU4mDb!60UB8W;)&$N^J;fe$i}!*l=+5R!u$2r)qlgyf)> z13ega3JBy3kOKxgAdmwl!_#+wf!=cik>TP7B16j!F+k3M9i9QB!vHy83NY|N26EPE z6*m*?AT~D;7sTcU;sW2?5Q7V1gPZ|!2FL+}9T3O?L!PVxTMPc-$V}1!f||7<;7|(; zCIBYLnIH!Y1U1M3v&H17PgHq$BtRVqY96RT4hld}gBJU0YMG^`M^IJ z0y4|k6M%;dD-hHmmjgNJB494SKs-#)2Z9>>gS`Y`AgIAVU?%7TK@D=ymjDa|HOK*j zcUGa`_0Nb1|BO#~q>S$)(oWS8WTXQ@9t>-K9)=b#52F-FYZ%aQ9!4Xy^8|PpH9%TG z2|!H38_L7@2<>!e6F)Ex?3xAoUvw5Bcs7KCr-_LX)7WsKiR28X&LXCVgTJ$vJ<(dD zVd3X%XW{N*>+9g>=dLt;>ddLrE$n?BNT?{2b4MWV@j^0p{3lDZK2-(`$ zGk@g`d|OYZJ)~~$z;y8S_3|Z{-2j=3XP}L{i#?OwcP8{5A$aj)dV2XY{T%#3g>Eh|spWnZjC(u4AP}V&8IDtKnyeIxXpFs6LDve-o zJRbI8pnsE>Z{PU-y{?~)g}t9m|6U9G=YYM{c)%X2W1_8O{A*&c_d~J+!W`6KLT#+U zWRiM$U#;I)`}Wna8?)pKK!;3F&i(?;|7T?(c>dptrT4!W%jbVF78yU*0R`&uhOqVk zrB8x&Wik&#MF!6FWTBRTHAWI@Xy-}6`U4aRvKpX|&}K@*ItBC*aGo5jU4$;kn|7h4rdPgc}`>R<{WpdnxWM1pChPogJbxB<2YHQ)0YUcc${N) zF!Yn`&(=_rWB*|yA5=;efA>w+gTZSAF**sh1J{jFz~ihN9G4^qwb>&W!LV*{c>j&R zvEU?cP+W41Dj3A$#2Va}KePXzsUgzRjDo2DJZ9k%ldaEHkOCw3${)883lI@|cdgdwNlHooMXnjOp6#?#N; zW}s6zZ{wr_bE(gtRx0f&Y`ltB|*C&2nR(<=$QZpl?!98Ygmw&j%aj>&+u$yk> z5#a7mmYToaXZm!#>{zO-^PNOEC^4Mj+UyGu)agK_F0dB5!hCguH4{k19oj$%K&3!T zkN!2rn6y3nF>Dr83fS8h^nn_IJ^~s0!`d4F_JI&*HTVR|GXuLI@CT#?L~J?b-}J-J z!k9{R)M6P}e{m83s8(yD=Pi5s*9NQVL`Z z?MR?>pvJ!ZYM@Qd6SP1-9f<9n`lJZ>m=1egCq79TYs$8116zWRlY?Sk zAu&|JCU3zAM$RC<7VxEXM=(wd;u`_Kvd63Z&Lv18=SLlbVh%okBQZ-sM+@wT4JjmMIq;GO@W>d~0B>Nv#NaXT$ar${ zCFhNeeLQHg3W?DRJl1#(;4xMSGR_T%LG+}6N9Gh~>MSzv?<>hm4di_;Sk<5PXA$U- zJa_de5<64iZ3bV2M{*_ou?F72aZLv~$$=CS#2w^r)8KuI=|D5!HaT^xS<|hIb(flI zFI~38K-&m(yr+7>65~s1&jmJqF611;d#b;8f7|<4o9z5-9}5?0uh3p-s=LC##MEG+ zmFdc5AObtq6+hH=uzXti2YDgn=;GjRZ%WR}IJSBQx<)z%I)H6~{NTI{Dvn>X73R8Z z8_=)|@C_t(wl;pOwcpFv9x^3so}-N&y!AxvbQc;!Dob=B7ZZY6Z=Osg%bmRy$DYj_ zcs9tkb)sp{i+!s*K8BW72b(RG-TZd@#Cu0V(MYrNg=CcWJhD4~sZx)G?H`cpPuAhpPEbC&6>wF?6D<5QsCwY_o zY9bJspAQTVEP?ZL=K!1K0Tn)%m?a6#uUko9@ewN2M0a<+@E-0hw8eb3ae zVf!EaTz1E^Cq{5uo&*>73~vj9=|sZx;DS#OJ|0g%#K$s*KYYQJ$~HB{?M)C zHg-dpzo#^E$pYMDpkT14v*MxSEB%4}BF8L+qe;py4nN%A61c^D^q6%rPO`G$k-vNB zN34D=P@#fWW;=anLL%a?#wh#mad08wc(EcRyBbJbQJq^4+QP zdxBO(pV#$O=6+Lk(NOMN&C&$qQr@7S9<53T-oJz{KKd}N+xrkxz$kNwxzh|I-Q3UT z)90Kz_{dVx=lC95^Kes>uirf-BFblsHv6s2^^%L0PMy}=`(m`7)C#46{UUGNrty0H z+Fnf)4?PR|#?=1%eo>NJ{2g7L0zDi9zXrDiUT{es%$xhsEe)?+G(Y)E<>rmAwZ0-7zQW6j?~A@}8M1YV z`xOD&Rw+m_Gp=zf?`e?_BN+F5p6x)4TP`a_qbGiF%l@)us?CBQ_q7XDux0N__%Rtv zF0}6XLCBgy-@8Rj8=KP>?SA1oE!DSNRFwO>ZqEATt)lDWC))0t%gD- zKtKDNe7x|TK9^|*8DqaJZ)s?WWJb@9u!>a@Up`z%6!~A3iwvH%hI@Z`OB5=8n)ur6 z$gqT+3-iW@>^xF`G&p`@X2{asZXd^jt6J*T6U{dIXv=a@ro4RO`gEk#+zpDj zI8?LX0)5S5!@~_S&%Vg5v0vstOlA~nI&|ft=ZFlSza#Es=rK8|8ck6jU(qV3AC zjFcH}dZDG4tck+tfQJi|Q;KGNHf!|DOtHp{C58oLn6YnE}gYdLCzvd7@_?rsrg4-nq{_T~GA9 z(|yS!jppV*OcO+pJDML^DdqdJMl8%=*8EAW-4~wnu3K?oZ@9?1?T2+E*Qpn&n#=I* z-{L>TPQG<$q@-BvTE8l&Y+y%z~jOx^c6WWr;f{pyQ8FFU=yYw0mbhlXHhdgZIrN-u>})@b?g z6jQl!ZWZG`#S~=>Y~214?-qT-JWi3B{dWJdR-ZKgu7rRcFubI2=8ZD6z5jmyVCj<= z=C2knYP|nmnt#R6?w5zZy^}aJN!l|c{pC5c#1T72#H@XyAABS5q4Kbc%Tucq#wEBm zk3hY`V``@lOVCve9JcCRl}h=up(%4!b=78PEv*wcZ!o5*Oh{?-J^L=5p0D~bJg$fl z{W8ELs-d#^s#)lFM%l;GvW@0?H}V&&8x?)ucGXRywKc9?_R3^0uBIO%u2yKh=9%J# zLfg8>XNRP$See-Cw^4ERkW^a@U97gSx~(VdUi6y!V-pp4jSEKBOTw0>P{MMhPbad5+ z?UP$?d}w!=HOXB*xwK3_@986fmW#}q+&J#zUOTKZ%gp@O&D9lGQQV{V9K6JOVrc?S<2gSreCcXpK7 z3GxM7ysac(N@A6tCA)Gx-jI`BD4clYm_e>f`p=^f(gF-+P!u-v53js4;{U)yX#F2~ zR5@1;r`-B{D^|QFCjOW^Cl7Mn^M`)-?`r=pmtR3Aw*PAW-XLNAtc>6c5*ev?-@ktEtJ7hCyxuWqn@aqHB+{Kq2uM%#{565hKr zxSiM3zUgZ_rY72n*4s_)kFk1Jt+BjTnsqP#zsaND?pJOCp=NF#r%l$bU;a*UNqA1^ za0|1~k!O<6%t=xGa8*6RzVPjklVuKAGWgU(pKW1bVm2R>#WzbW44S;+cH^mje}Bw_ z3?vzkYg}Cu_9)D%%FfbL*>i8l#rSG{kEUa`iLSfGXa$~WY)Vxxokqt*U#)1=dVTYN z+y_0NFuBUC2Hy!h%XIb^RYY`+@+y(OU7Btmk#phj7L&XgH{A0+CJa-ySY$HW>fxvh z2{Eq4YYVnnEt0!xfVf(M=4XDFPl+E8S2-*Km3%1g2Hkru_{)$ZfvlemvwH5tBq=~#uwc{~cMEAAg!C>{A_?%h|~YFl_k&K#F? zY1W)P^SGgQ%1digW`Yo55A4&H_iwr%U7iAsE-gAgEuKyZTF35iJ=3gHEsfRoFIc*P9u+wCjzQ1vt);iD z<Xet-V_C1E2BCu)~hju`J+Y&A~rsnKuo{vvN?-*_MYvGQrg`{PBL zj>8fTZrb7NIp>RHoeWcsDY9t7Bu|r|@HPAay^1O;-+u{E(GJC}KO)Vp$~0KGw=Xu- z`K)sO$-wsIM`0!VHjBzzd~K?Bt85sHxAR`ucK`IHI}t1IC>kzO?v1*bd+E7sQ**Io znTC!@@qy~;wx$t1Gq2TO|C!jMH*S>8gxh67x*|&NcA8pDFukSB9(b{2&)e&{$_CP|ucIis zeF{%j+uONU@3vm_lMp$p;b3Eso3Y?}Xl~Jzkc?gCQ$>b!DJ8paR8_y>v0=SLlb()t zgiFzd=jt`GXu^rM&ugV`Ul|ntFZ(0cw|yR1>N95*ExXt>H`ww%)#&go{_fE)T_Zj$ z+kL4ccu$91Z>{i|&itven$5$_;|ue8HdVf@^_V}WATxWWNcY>2dPgzAyl8y9Yxn1X z&w^cfKxZ`9#gWH;gahLhF`^3XCJkw-~uQMyS6WDm3b6jhSx8`0^84d!#l5 z$y)L*#P5WBHoiH2D>x|Ur0cB*D|GL`4QrX=$jcRWv)>-G@(|;Pw6d7tH_9^0im{VlV*9`?n^sCRGqq`(j zxlMMjZT~^#-u$sdGu$A78X2X^cY@)*jQ>tVW3Y3jh!>u*@{3fa_`4N$g&Lu@y{z)~J>Sw*>3Kn?792@WIykXaTs);z*DCM+wLi)4Z~L#(xBa(Ynz%7b%|mYF zIP;6Q+DI zyotBr{?Vzif=4vp+SY}gQ|H?E^!8qji!uAZ8yg8t7;pd4`K~U`JgO0O@#=iHSpBTl zh|Xp3SosQCpqSCtCex@o>!DuGhb?Dc>euE@+p{kY(R?$;%1q=}ivW6(zJ_Be%B9T$9m%(ck<@qMq(2d8D)NYFx;5+i;CBCw4kl zJCB0{XTJPT$LlZR{nhvyZ&;poD!cfY_+y!;NA-7&+-|r>@7?yQn@bJH6$=G;R8L^~ z=g7>7jkI{@J#)>Bb3X6KK2OS1x|B8aQ*M>-%&!VjDUm0H-##=MBNa$j=_#DR*Rh!R zURNvA$2B?1+Od3<(kF(v*ghD#JY!Vu{eU$OX8CW}qrWzEQpKFuPZu)zDrvpFe5;m} zo!uo9P_i~{mAu?v+E zz4L6xylsqegvh0Fac zo@yRW&I!tXxL3peYt|>LmtI59i|5Gf|DG_jeyxdN-M;SJk(uSYXS;7c*>riSir7U_ z)l#8pqf<|FSGPaeGkNos50l*ye zSf_O4iw=PUug+vdssy~-zkdD2`4{qQubE#}e>-jLJbi;&$$i^p?>FQoU8L-9hbldZ zw}5A#HGVBW%d>0JZl8~zJ3eferLOU|y}I4BNodVz)1it#2FEvPaB9-JU$S@7&)U^D zADT6B<`<_wk(>_BiE;~y-b;8)dTC)$|a zNbMEVsO-)k+#mL({9nEPO#CYeoBwm~@8SM{j{br3JA>M>>y=MqQfj^I3*$Aq^QQ#P zlwYRwLbCac#L3&KX@@3`8XVuy3GKwRrdxN2ktu)dFe%!0~x)A;o;-e-5{Gct1BU;qwSt8>4e8wHWmY z&tj&2t9|=k-^O@aLhu@&Th`Ep|E6#UaNlhU-Q?PQR6JJnrKxdCwdMFdCp%AE4T`k? zdFR9N$uC4@t}LsW)jltv<%pn$c6+28ZB;h2yCCjJ+?^Gp;fG)Tp~$xEo8Gk}PRQ%i zlpRZlSX-wUs-5_LzhGTO)fw$cjI#lQw@2iE(;N7iqW{v~-8o!b_h7lUZiMF0yIz*k zV=je-+br%>D=LX@h;%oUJEXaPozfX?kI5Uh$$Fg{cOljI>$dlkvKXE}w%@sRV-zL& z-=&YZ#>Gd}tEKQ8De_L7rGISi$hpFETmpj2M6P%|X({jUo7r$y?&ri8i`7Rf7UlGm zs>jOlFwDLgz3+&atjZfnYZw1R|0#ovj#1JMM|4mAytw{Jt-$wf$xgxy@i&4uRozWz zFOx1Vg*PdkW7zjIRAve?t^#iC!##k@0I%A@mNT;i8P|w>0KQJ_W7+aWAin{)X8^tl zI6aOn_Xhbbz>BuBaVp?)z-@i_I^f%YOT*dn4!{+Fk8NY)v4;g2cK|0uu(1~4O2Cgd zu(3PfWZ231`s|Yc9{?O1#g` zyrv%)0M=UDk1qorYr)3jj|no00HbwmtOK~1U`sZ32YdyvniU)G1zZBy*_w@u0KWiS zYQx5_05<|2xV@VI51c>43*Nv2hRJ48Uyza35I~`?2w;lY$Jx0s5+djRwe90nP=y$e*nr1~`xC2e5GxV6tA4&uTdD|EuVp_9|bX zZ2xZMKDh@`%r{Mw;i0_07y5Vj3vu|p_LGN*y-tm69hu#J!dFVgfG&96aaHfqnXx;L z3FfIJdl|>0zCOAy0xd98|&m+l4bw#uE-mK1`oO$QNJ4db zKzkAT3@F8bQg~XL@LuT(h zb8F&f<|%*A33F_>Wv3*q{;J)$(NsarjO)|75;J*s4O2@s-@suPXN`Hjc)yII*SfT% zlHI!-&xWI3XH~wG6 z`D^}v?V%Sf-=}%WX6N_=lXf4NoPHr%>wRXu@7m=2(Vq*>#qHYJ$=_ryroOx*V$XWf z6{W><&Xn-Z^m`FIPf@k=gYKkSH{eN2w2)e|~b0 zT&}g-l6i$0hL%AeT35@_6Ryf;;$zQeEXuzc?Ybc4TSUaPve(6q)L30721du4Cn zp?i+T|2Picm&a_`RHD4!Z9^rs=qvw`nmOlh7sRFNpT6vMapEpDd)DW)1CKw`j!%8b zb?DxR1aTqFWM0O{`{Qn27_=P*?yCbu9DZ-5#KRYtEZn4DrH-((Km0mLKwTqK)cJ|Y z`^>`DCWGJwpPmP~+-<)dSL%Dp#cL7wVh8_w6I?EIggQ+rP~e;Q=~Le3@OJOB&qoh% zPFtPHmTHL9j#>2h*>A@m&T;d)i?hzm=lQ|cFIXI3JyBt$-H-!Q2iTJ)C%-}LU;JJP z;dy21Ylc*0FPL|_^0vNpcCD?nTb+w&xO`9)y18aTM(}LWRXeJuY+L+(r$qeN{c6WY zO4#|$o?&RvaKY81{9EGIioiw37v>EN5Nca9t$hB1yWL-!Q-dyB!Id2(jCLEA4fo+~+iO#%b3)G~GQ4?%X{7RQYW9 zgxMiB(PeuThmHKce{RFEDEG=41@=?keH(J^!K#(>=F9#lo-_ASPHyx3z!cD#R&U&uS(}UusSspmFF2U!=y%jRC2?vJ{?pND6N|cA+gu7x+ zWOCA!#zS`ww1^J!fHD5}{j%9`!g=~i_sewMh~$q_sq^2jx@4Hny*;$eX!|B*MYUZ1 zCtGB_moslqzHFH$Bkwx5;nU}pE7RZn+)|*@x|WiD_4JM4Ev83$FZCoZYWkt`X3ssl ztR=(owpWD%vx0o?X1A?g7*so|RBdw6DyH4weuew_i^kKcJ{N{X2gYRV4R}zJi3fUM zxBq>=q*o64uAt&*dZz0R_rq-CECFeXt2SxNm?wp!Pk3lLIiKD+_VVt#cag>31DQ9U zEHbHSvA*16dgivVRr?xI-j=v{b%CKp6U?TZlJJ`2b@$aaAGxnrB(xqlv%RpPq0 z+WAL^gw0(zS#O2Ia!$XPh&>OlADqP()5^2Q)iJn9D&kHs;=^CdCE%Jw+|A z?G9^w3gQlrQhGZhy(>dq_i<9${$r0i^cyEtrQn&_1387tkUSytb!Sl~N4O1ww zZMJlb47_rRx$QR;>yXw{$fGX${&}2`_Y?{KMZW6EYb;yc%)XUB!a$_$}jaZN-^Er-|s7HOM}Y?;xJ&s&G(e6bMxsJQ%j zXVkj$@BDkO8AU(hH_RG#zHRrpCi{amyJHrfs?zI@ojP0p`Df34o{6(w49k67@Mv{d z#t>$WAtx@mKw|Y*aKx{u0;L){el@c~V7z{E#;mU%hEWN}j9u-tvLy zq^~Qs#ib|-$XSOSQCu5ycTKta+T6DyrAnE*pS=s+1U}#nR)hkwMu;bv+nq#D<*c_U%`!JOjs4}ao``MC+%V^K`Z!@RGH@tHz+Zbaq zX2!LTbC1$@5Z5a$a)2WTPzqubbzW4^D|a zmYk&fYQpqJ=bBU>{8;^V+liI320V^S)^u~n7NQjmd8+anLJ^aeb&9Ke6+1Xhr`iM2 zx%8*zX`l8t`g|YpElH8iuAM)%KTkAsVr$H?v7a+C-1_q*EzWtspy&ib2JdIHwg2@i z_tRyaf~70lPs`+mb46b4Qk`(*-kCRz?%^rQ${wlaa@m`;?P^9}iBZ+sm=pWNQu*M3 zxU|ft-Z3Lx^j!U)|J*^wkrZ;bl1*U@-g{^O0Qgo z%VDSXSKa}~M@BdZUbuMJ0!8p0dbgoab-~7p9}mAai+wH4D_;Gw!tkk?hs}`zV@pzO zXuIEGv$^8qai73LXTGxME6IjQgg^sx9@K^|^pe|>|C_=aa>X&?Tf^m(X6d&3s<#a1 zQCl!L zr^3?>ExC)*=ak&H++H(FTbr{z$bGAS*d9My|2B8HbRSrLA34_Jv51)Jcw;v1@$9}k zIyvz;`_Ufz$R@1vQvS4W~Faw@VRtKM(EH_h_F*ci^3KB?^3s{Y!G zegE-q@k@V<4&<|b-ub?ZbMRhA^7>UEzH{=}ryUV%Mm&5`nqzhg?Q1{Yks`mowq#c0 z>aokHBcZPAWhyMYm8%Lw^%GJ4soP8M(N0D~TlN(ePUwqI@dc+y?a$rQA72OpkT}1V z)1qaFVlZm>B`sfi8qIG1JN1DvK_P0_aIr&g7rkOK%QjYiSJe>Qo z$$m!0XHaaCGP=!r9rVK4(!a4OE?T72WPOp)$sFECd!8@#u(a6wzKtu6cVyl=HN0y2 zq^XfZX4R=x*2De%zYMu3zRbqT5y?GAKJ?$O{vT#hMm~!Rxe+%>#N4MRk=^NT@v>vo>&+c6ld-fXTBjgG&u06DOzaxbis$* zvq=Y+)4k2*{IOk=dNy(Q@6n5LF2t3kW;0|{{$)PDx-y_aaSgK;<1M&tQZXv(En~TI zu>a!eLw<69e4Ak#lUWy$o-E{Co2)mxO;vLis+&~g?vu{HEVHUk_sn<;fe=5b&H>}I zn+|Ff5I!tv1jixH{1Jmtto?cZ>07_%bkK$yXLfy1`E7sdPbrc@W1{2Vh9)I0cWLtZ zx?XF`bN;R6$Aw<3ho7eYVNlX??bxA{r*c9kt}P0?TK4+!H2v67R994y)ySU3{-@ku zcs=hbu?ev?@qJu+qX|hjCx1$qEnNBeO`68IdmHldnc}WrtHp=>HZN{{UK|v!qfxnA zu+V^=$RF~*c#bpqm(MQG@T#eoAWzc#vjX3avirPd`RuZ4&7<#PoWzC?zph#3k{HD0 zoq}#(PK%SReP}d0Lg8$*>sry~4;Q~oSSWfLe&;P*Y$~@?IrrzZaS-!2GE-C(Ol>sYqq*`{cU*{7H+v4?#B3 zpXK^%(+%`RjQ*2CQNGg)qctM@#&ybnQtleH&+f2TnOpZTql2CwPT9y%Pffx*+Qcq? z9ci}4>ALK(s+7*HZ&S=0uQJTPw`8Hn-$D&Nxc1WMqFT=%fuqm%vjQbPwO_F0N}Wg+i{KB>S4mzV9ST+4p^4i%LS9 zQlb<|B}r1zDwQ^+v`R`^MGMlVh40LB@8wo1@ArRy@AEUBnKS3ioH?_dJ2TH5d$gtb z+cVCx;c@=HOFKfT9C?oWp{op^K@t z-C`o5<+$gGyHO;w98%y%G9PPPMtGwS-_BA0|H+3Z5ya;vHW_ElojPlocYoFkr)C)s z$+IrW0;_`ftIt(Rxmw6+;;%i><`vnYvNm^c5&H|nh*wKZ8eR#R7Cd+J*0fch;Fa)5 z!tM7}*6ymAEpZ7li-yxSnM@;36VUTwwnJ1-)ZP-FR>wrX=3Oy8>~5{%_pD~}$&C8{ zQrYorDS_0>$K1kpmmSQRQldP!Y0Hmz6XoL4-OJ1ue3F@?GApU{BWX}adTrgK+$VW< zYa**3znS?~`q;dsl||`KpA>v)u5ZpfL~|kp1Ue5%O%gf2{^gw-Znh&15ue#Kcpg zAA$T|TJcCC)}&2-9y>DQ5oVqKR8xBW4~-ITY2Ny;HT7cjh;d~j#gB7 zzmu4G=(qvbkH|F;{wxbjBh;PVaMa`Wanm$kCyd{foKkI5*Xyv}*Sm!j48_afu zh3nhTh_w|0CJrapJqrU4B>m+TChv+^iI{khFV-Gy4Y~ z1(Mj^Ez~6f5?jgg)@6sNWJ9?j@LYX zVejcFYw@lXcFtKX>$M&1#2#DO>E99()?9Yp_XJzaCGwve3;t=vy*(2L)Y$7i%2M@q zkd#&|^KI5@E1eL7+6J?onuC9Q;}N3z*F%*47smfM9?uqDSMIiP?y2QM`6^%d=02}1 zD&2ycc=wK{RJu7nL!`_oa&tyr4e6!X17({d*Q?i@ym>;$!Yuwo2INwPd7QP zC=tnyCRjX7PqRCtWoOybF{^2_ip||MZ;F+Zorf<@`;H6CnX%m>siD%iYOh`W$>X1+ zs~*Y(`NaF?4R^+^?81HLwWm#Gz0Bg<@;7I z?&)Yx+t6{ueJEkQPbwdt**{SIp){wLxPI2@YOZF{mmie*DbdS9mp8oe|p_lH#LQ>0|733!sRW0 z2rWn)o><|?W7DN`qKPYQXgE!NUUV{nfD=_e<{}>|&~S%auQiUEck|X}k8LFj{X)n7L&L4S=GFA7l8y zXIt2{;i0Ro4$7b=WoqR>Oihm<1F6`!iphtA> zs?R;H=2d-lO~q(npg;JRyqA}YT(YS;c$N}>XI`g50~JcQ3=!GhO?PqlwU2oEkaA9`)> zEUmyc_$4KEz71!`jU0)Wj%IO#YdTI}B^}pr&~iG$#tJ>{r-m9Is6{CR^VJ_KtU~Tuy6H|@>iY%@@qOR=NI52%AAT64?Mbe z;;6t9uOpgI+7u22yUakDZgh&-@}}(5r1^#S6sS|KlZRvujPi%pebD+c8gFd*o1A4w z>U*A&?AA3I=>Y%zVZ+P$JEa5!IQj$!e)MyGBBL)G;=ALsqj$helivAaxWtHnYKrit z&AZy1y+3wPcdmS+dHBJXQdRO`jWy-K~K_iNO5wz*GEXQ3bUvf=gl zcPx8)<=GiNK_jC~@32V&?R|otZQ{CfLExhzF@xE^>;tM2!^F~A=tsS5_)t8%nG44T2?;)z4I&Ax zOB41cbai#5U5y%=Iw*4^BPqMLckL0kPd=O4cvTO~o%~8`k@Zu%4kP32j#Z{zf|+=G zj+f!u`(z$DFVGS6%Adcez^za-JovVC=ib!Ti7DiI)*E@exHzW-PCQd9mosOVlZla; z(tKxYCmME}6)hs(FPi2>0~0>zx^{GDINX7WU9yG4A>47GjfJPG{d;m_;b|)W0dFiG z$3h;1N1ZW>GDhBDvuKRGZQ%worQZ`B6L}0Y4bAbVsir*!1AoY0LsjMXgfU!Kotc`d zV{oi8rWoK}G(i8QQpds^15Z^==XW0dl)dU0lK5R-Dk^GNl5p23T#L%u?#8NrHM$Ib zLLMW{vCwcMavdvS&9S%`v;B{WIg<7-avckK41RUS%6%lwG5A$g8;fErewkJFlgLJ8 z@iV`w+G8X;!pG0J>dN%C@KeHnz}3(iqu$17Un*nCYb-o1dMEoS@3HW7#+R?EGJUZ6 zS9)U#bBugdwde!TztU4vruYAU;%ST_>oM|G(;Qzp)W_-|V@(NTGzZ*Rcw>#XW8jT7 ze2u733)6j$w z_vdMPOd0+GcdTI@H#Y9rGXDea7$ZCG59z9@jy1oJo$i>^;UCh~7)xEjnL66Tv=gs_ z>dnl~$(iOzQ&XR*qO7Q@tgJ$FM)$cJF|Gg|Bi;zJiDMrfp=dBB{b;=5KjMx45%1~~ zh_d)A4}gQR`4tDs?QEo~iLv;nIE>Cv5r$KsH&le#g8tT~zhUUc!Z0ku+lql_#lV9% zhG(Tn$FowTpiqKZ*Zw+)$nY|*^8}WPigA~;Px`WgUE-qzSpuzlc z;UVD>3COq&bU(PKH7FoFE{qlt7fXxqr@>w6VEx7?0&Z;uZ6Ve#=I02=+gCM+=I0X` zGJ3ZvcI!EI)4MO&4+Y&8D8pmXh3CnB(Xdkv_rm+o0-__}l6Q2Mzc<`aj_!bGUJ4KK z7%QX30&oHTs$sueV~)cTP#rtpAXVQ#@`Ub>4~v9b-O;EN;T;S&$z#7On6`pYEV9}J z*RDrK1ck>Uet(TaqZKIbqi{w8XW}s}{jkz9#5+O*10r^uhe<;h2>o_kCJanW#d?KD zgavtp(%}AF>|WoIIEJC25V+Wu35$&m`U!i)h5`#Nx((iohO`Fy?+(Nx9Tvm9BmSpY z6c+?H?D~OiD0F{3c0WF}6dD*wLbQ=yn5?kN@kiPKg0r*;ReIq@Y8VqN%?lC^_YVq( zJL(ZW5;kfiC_|7hHUtAaCKST{aP>a;D^@2JP!gM0D8<$?oo;*=lI-_?wF0|Oq}I(qLs!u!`#4fyu=;V%0&NPonj zFWqu4qW!lFL%=o_-FTB3(~cQUZnXQ#>*848U`Ar3V?zv#@uM_>N#4;xz5q3FvQ?qk zSr~)GGi*%2dWjLb&Kg0eI8!u4($GcN^e}e6HcQw(A~cEK0dF?xym8zlzFb}sUpgQ7S)S@wK-*2Hw}*ELxIS?I zu9HZQFt87TdI7T>xKF?j!`b&hIl%p|%F*x|@_X~M98fXGQ;zVUm~q;!i1ZlgbddH~ z<&K2%cY^z0mAhmTiLU`1OO;~Y@svA;VZXx4*pz9$1hbKsfZ12^23sxB(3e0JfYF~Z zj$<|@{9=QASm*G6l%zjM|@VB1A$M z`*DIyi(#+^3<`oifegujokXzs5&_ysT$nd3;xXnS76UaSbTnj3FoG@< z5Z1rS16FqYd}5fES6JK|5y)XWCr}cNuZ?#p@||k5DDAK&coio*&K)TQ)|#BJPeGD5!~9&0DGI**gLyH z7|rhp4l}nGn1k^cF+u_(Yz!!0AiCLLOdit#F%NdpKlp%#&P&WcWXDp5*l5i5%CB~a zz=UHQQeT+r1+wLXst@ty6Gpch;zjA*lNt^@1!7PMG9wNZH;pTyMt(qM(JSVCA=LCY_a}sWMOZP%y$@Dn3*^^ zJAs{A%#;T9_AqjEvv;A(%K)_kd25(K(6|9AF*3!1 zwKk+qkGpOn8NaN?TQ}G+4wXM1{8(=fSOy8hj4_WBpWewJeN-3Yq@i~}1`VS74`?Gp zP~ZH8miapu+AU_?E+z>~#f6O;yJM{5z%mO=O@1*rGTP zqkvIZvJHi?Dc&y>Dtt5s>>~SxMZk`ccbq>AW-Jl(WfYkAV2%Zwc|XP3o7k{mLR#D>`y9En6zF3ffy7P`G{*7TsPL6JyLrLXUf z&>%bBBLR?&p@rQ~VPuP2iv{9}cy>`^fxz!Iz=4Irkz~fy6T#dOn$H>iWfU3mj759E zU>Yziaum$yUL$GR89CXH#^P|Mur$vaHnRCCh%>h_Fk+3z)@MgjgSi`ZXviDn84fB0 zE(m_epmi459KpIgnqCotmyeGhvQvoAeS@NL{>aQD;ElF9keMxAKZZF1^MEFg>B}ZA z_L#?To+F>Mig9flBt>^x$c0T!eiI!B66m{+V1 zrfW0T@vwNm2yATv=0z`*Aj_`|Y|WKE!N3w9QwcRKWIS6-Y@h)6DLn~JJ7Mg@NG!r18-gT1jh z9eVyK4sGn9IP^wwu!+W`11}bby^X*wp0%}w!AQc8CliJe_JQ9zFs*qZKNF6&jTo$t zz)(gbxZoebWoFEhF3OmRi~Kgm8aUAVR29Q~HBgzsug3H{nHwN=o(=b_0sh%nMzpPQ z^eaCPs0P%laJXHdlp&><>DcUHUf)gPhPL<5yydX{LZeSFPsv|s*8YLU^Di`6grD;vG4hEl|1)oUp)h

uiRsnfZ)I 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

M>``uOnYUQ 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%0A^eA(3LhCD)r zgalzevV(#CtU9JC<}o zjqu&4gEL~RCa4(_ze0_K(+v4+dlRzFP!O`tMTYQXqpobeG=AK+S>iRkTFgH9?$PAk z3%@JR6>5Skc24F(9;g-yLiJE1&!lM-cF2Df_3~=$_0X+tt+}0gSiv8W`H;GK7jAFE zhdg(KyQw?Z;pciNNZ9WY#|O~;)U!rpc2HmO=lKac}{K|#oaKGFw?UNR_V!sI|cW!sMOY-hP4ACwCPpgO1tY90*sYiDIY z(uFc+e1qK`-_G)I)3&ca@=z^Q4>dqdkPr6;$c2pSn0A&QY`!qs+BAc_T|{|6D`$4G zJYd7WD8~;;*S!$v`G|ZjA$^}?{x`gyq-Py?KlP)5d_lnnDXUF{^DwgXS54zc17;uL z)q#zW^$1~SkruEPs>dyeTpi?Di5omAuV%3ECgg9UJfWsXF>fYp$Pd*)^V_=PtU}!%o6 zIk-cOxVw0!M;p;U^nEk_LFb(?EFj@S5RyCK4av1PRAY__>7BL^u{< zxC;mmKLOHGCxl-YW#S?}AF{Q`29b3m+k{*L;RXrUlZ&5G*zsdY`oLx}dy$25p{8lb zLN3ao7Q1f-h(8~8KXLepqn0=tiNiyla*4x7dfcSdO_;gJ*CXFZ`mKfVpr%r=3_jEZ z1OHNLXB_~NUof&v~&<;3yk`6~N_-P}&16l4(oqeba zqA%+R!`YAg2-@=V-UH|QFn5SCI0{fF>n@@jUZm>l5PqWPCHo=_&nwD(O}TKwg$Vt! zKNs5PyPI{tLLZ6YH;fz0p0~8U2xSmmVeSv41z5H}M+S)@*29Rh?0!eOy^Q~^JE?T; z4Q%IH=1?j3|6bqhx&o|+;n2uy=-lI}0|C1Xcs^40W5(+V95L$o%sK*Js1GrC$?vBvVj<jp&PDXX58q#uhbSEBX%m9*IkzO%uAkpv?D*;3s4UG zI5Yguy~`etAj?rWGqT;regT9Ku_I~rSOw{arzpqB?i1Xl*@g&WuM@Dlw9!qbS)9SE}=wNbvvL|ZA_Rg87`SdYM!nYs{$$U<2NAc7d8^e0@9{$*tw zT!p9uj>2q5G&{>K>de7%PWI&-h{3asa|p2$%(Ii6KP=nNV17I8Cg&P4h!DbvAc`2o zcFr?6A)=gbL^nL}!UsPB2-@qE8zMT$8zx2&MGRsG>2Sh@$ZnR&7bV8P2W#QlNBQu; z3m^OlAczpch#-m>#D2~s&jHoIJ+9|1VoH^?=?n}RV%5K+c8N?jri=Y~w3*H}jkUVei&0v~yNl;tM| z5QICPGT=$zJcs`-+Yp4Gydh#35d`j$j=&@KqYf`Z?Bikngi}%nqKHA**B-8W9)#`4 z^Nm>H5I$lIlX>QGOpFswh)G1a;YUxlMToANyrUvIC$rD|II(CQ`z(kP-g1;(o;oTJ z;YDyEbu6Mii)jPI66)=wi{r18izqQPhW3qP8*}ZyXCKkGhl}UW}kW6_bhJ8}@lZ zzNgfOFg$|K+He0S&HauDC;f9RiW6b_>LL2;^X|vig3piew&XsIAl$8paJD8LLAdBs zFta4~=S#-C=5tv(?oWC7xdKuAE{P8;JBjXflE_ds8SkHXhnbP_g^y)_rZ|z5^Z?7T zV(iO$I5XSfT}Ix@$%LO6;(g5q-rGcot|GjbD9UpH!tfQNUvAzh*ou>0lC+w≪_<9V(?es8KWZU@Yg0^6+WjUif{`e94#rc4%>(x z_z*w{5vck3EXwvsH}Vhztn)uwdEPWc-@-f}*l7?293n)Fv5#m)9}s5UP4vQ#pq+*& zx>8Qm&X2n+JLTrc5F;2D&A zfwvRyR(PLdf6nmaP5EE+F(;y=he!+C$m`>p60+IX8e)Kb+?3;+LwVUGaVbAPHzGQ+ zNTMvuE~1z9H!S;!Vj*qVNgIhVgpU%B(asZ$>q+`_ivGdP^Kl5#AbFOO{ts^Ft|;6o4*h^dqfF9PsU zZV-;$lz}j5&Lfm>$7$4oFy%)n+i{vatcMUqU?a;pPRaTc73de5Jlh0%>U%Q7kPqqzAv<^ z5_Nr|J#djHOq%yA$Q$IBWMZT_pOOx*%=!K=>HJ|uKYvs)@{Db?*N0#dK8I0P6tNxV ze{J^iTo6vny(%5|G0xu*+?>-vcye%VlkThM5MvPd-V{F*L&Pxhvm7PHaJVl0=8rQv zahGK`(UFCpOA+g^?j!nb1!y1ZL6(Cohlnd#j}W5>6*NUx*2RykvmE-Fa#$AB5AdwjoMdFpjfO{}8%JFr_QwJifyK{4I<=Nk{ElzycLVt--?xSArr=lD0fzX#_ z7ty;lPF&hddx+kxjOPx1UP25LBb(yH%1yj;C5p{l!&r6_?Pucu-m~y|+>Q~Vofad8 z5&XaD_VWL7G@(yT*~TBx^tEEF+t9Dp^rt;(ZSC>pb5UuY;Sm`@UprFvee(LqW1DV@ zb8R_ih+Bw`b@Y|x7|Ss`-X_l+>a)$@SkI;0EtDH%+j`2{O8p4Hem)Bk!*K25oH)mr zBe0L<{p7pFvAn}J&h22Bbkf`h$U_|w(gUPB&Qc~^)Z>8<0o!)=LCD5>^ct>U9%Zwi z{|4z-ae=ZBxJz00{->`&`Wr?lDfhHwe9l4yQ3R5+9?v>r@TDU{{Lb?x!f^k=_Kds_ z$;9V9h^LI_Gk#vd`Dy?0=*Vk6kFp%*UKBxS4bO-nU3d{h2=2A^*ywzJg6GX`#B*`t z@D9$K^PD#bUf^7U`y%HH!f;-S6BWthC;AG~R{ZZXuzi2t(2L_nnvZAV2wd%1uE_h8 z67&;c1WVH1QY@FYXd~+oWr*;UC0{xEg`llG+bU2GoRkx$?5NFt7NGpYJ!x+t@>F7s zNb`8umt`L@00-MbL>DnijM-^?mUh7d9|HLAy#VEfSho8UCf=oNk6kw9Mp+lts1sqh zJCn~(S@qZ#0mR^~PrqTmuZ$914bYJNA^0r)zn`fCEQ`jJ1BaLGP1u*Z{P^F#+3l#v zJE)+YR-HN+%NV?N-4NY~Y>Ob)o4G;s)L@)CP%cDa@)DgyyMF;-M@QNQ`~B{J z$B^j5fA3xB?|<*hc@J!l#dOMdQ%J!)vc2h%llMQ`rtTyznCk$29tf z&~)-5f+*ZvZ>MwJ^%BKg>Vue%1(XBPna@`Uw4j}c!P}D0KeM>@B5W_uX5Utf3xX`W zT9XH1mYs8$mx!?LY{RoBB0I>li+KshWzyLG-!++K{}t8|f%7W);NQ*so=e`glxri+ zeS`WDVm%6xNM3jlD#Nquc)lNk0795dT8zja5#t$B5+lm;thfJOyFI>7{ET~?YgG3J;=H<9mfz}*4@8z zUi`s${7L%}pr66N*q=Ux?0wUdPV^B&h{BVBec;(ao3Md$V&rjMqAjIq_fqaT5DV$Y z5!!|*97h>{M3#}~AIfA7IG3}G;0oGRg=0#LA-IyyMf(}Y1GMcRu?_De{^4g{_Av92=rIKz(q*%X#1-`Vc?}5yarL zzn{W(C&$f)2=#36&<~>jIc2<{47g$U-$S&2F5tD(jxnx9cyGpX6fy9HCf>QT58U?h zE7}A5-LCUBX|Uh%dWe1m5keSIh&PN0?C);5iQW_Jf0Ff6locTl{AXA`N89&OCp_ob z=K^{5f#`)FLD=uj!*|GYk9urX*@x)9Pd<*_f5(vJ2%PIVCd_3wQT#~#h#&_0=Z<#& zov9ex)Li!vg(nT?EbR7r;70%jyOjuIVPxGrR(oWtZnfa4#5;}+$> zdxUa!G8RXv+iuq`+R9k??eU-tAICS$^(I2zAln?fDVKFen7T-F-6ox}2qBCJqKH9k zBp>{g6GRwM2Hl!X7M`AzPxK>*Frwg( zwDDetXLUQm3qL~hD1#Wb*EdlnF))T}?MTKJZg}DEO1Gd8h9|8y=0yp(Vb8_6WGR}Nf_VMl`fDj@O z{H)oD5TDH>h{2JH&w22`hX6u|*vs@SWcQKxLEb%-k(+k19)rWhSirpv^uY_)X8H@U zntrm)hhR$jNetP(qg^v7o8=gsEIV?r9|DYln{}_fFY7)#jn7;m8)F(l42~kqLwMjr z03k#WgQFMn*h_NhYaSRZkz7T>uvxM#EnMI@_YPW}b zmJboO$KWQv;P`p$>v~Sw4`=cuTqpQBBVuq==KG`Yz=r@r_8k1o{!gfj^Vea|*|d~v z&xhY=-+hi191oaVJ(v$;`7BGmFz0a8#+(wPXfNFG!jB-rvw1g5j6#ei5B&4(`AI$m znNxl{B8(^m^FQ{H>p?%RA=DG9!gw*4g7&zL0&~cR0G#A?!$*1mLFR~ue)|x%=gS(# zi{%ia_PUFG;I<=k$vK^6MBtb~Bwq}^Sw0k;pH6maqI#JAvl4#OIi>i=2D2d zW0`4tdisbc$3bu$Ld>Nw?RJwEV=g!vGEd-v4*`S_K@5&YY=;Lv1Q0?5F@&kl$sBTI zqu<0B^T)xvNf$hDGmpH8F;5&nF^AxR4*`S_K@9dkVsXJk|9rfo@DT%uAi9ro_j9}v zLX0`)$jw;510TH1u_%2LJy>Uc1rWB!n{6S)ICmm;wDYFpc+a5DJd^=H%O0W+UdATK zx|3(g0P7({m|rnO80#1u#h5?vz=r@rh#&@so9*zx2PbWE@Eqcp!1)UgbIirM;P)Y% z@UiS=zW5QLz8Ip+FTv-45c4Ynzug|@R|t;0v>QS4J2|#Kj;)7v9|D{!5$29}Jb9jS ze9jW*Femsd>1#lGHTL7@hwf{*!Os%U@v}){6oDu|AH2o+BPS7o2fY7zNFMkRf%g&l zZj|1sBY`0lcfsJ;AxI%f0T!QWGg5OX;O=NIZn6ppVPHv|wt49;&XYf1S2 zc@q9q5$7oF_T=K+hBG%2VMHPFFy;usm6zudco9GpA|L7SAb>EUaO5W+^|%fC_mXqP zOv3-TNg^U}Sk#-0`hVtk=HX+GdmD3Zz~v=!e?Q0XnLUNPC0_i5j3|ssXoODahq0J} zf3O3GaSbtiL(;ABA{DZsBvV<@}h#gE8{!tkI4x?>n-V-t?!8lK@Rl7|^9 z6h;-aM0bq99Bjk^T);EL?THteQ4AimKrf8OT&%%PoWM0a!h0Bd={qu^3~Hh|IwOGP z*n)#NkJm`HFJ7caG1Ng1jKD0c#{rzjeSAdR{&&>ds25SwuT*YPjR1M%WJ z{DK@Pfof=sMD)UF%*HBg$8p@i3y6d9A_aaycDPX;P2htcXyQA#BGXoWTt|!aJy^X+M5LRun-c zG(jf}#T5L5tvG?Z_=Xf`;>GXCjdG}mMD)d2%)u(`$9dexJLqR=FLI$0YQT%O=!*Ur zfr*%n#aM?h4&gFx;R#;hE8@<@i+H4h6S+_j710DeF&;~>6X$Rn&+!4`Jo5>ukr72v z3(e3TJuwsk%*RUX#0fmWXC%EqzmOG$P#%rZ1^qD@%druAa2(h12(R%8`bFj`enD0g zK_xUqOLWFyjKef6#5x?pDO|@ByaoRhLnJ{OWJDemMoCmbZM26UBM`uJEXF$Q#u?ne zBfN#UOh1tde;^Oaq9$6R3x;75=3+BW;y&I(yAm%_A`1$j6e^=0TB0ikVhWZbgl#yE zD|mpHNO6_>7F=+nHacP`=3x^~-~nFZ8juMf?q}ttfyhNW?(QK?wVC0nee|q%FvbvS@_f2w)}l;s%~Wi*oHl zCKN|Kw8t<^#1d@9G2Frzq`bv74y8~VZ7=|nuo!!B57uqUMM=~`PXw?OJ8%=dQ%jhl!;zsI?boG6F7NJMXp$2@GpS-eB) z`^+s=h7ZHB97k~<+5_rFQPf5YbjKLX$5x!eJ$ym(hg`#u8x_$I&CwYHF&^`<7JG0C zckvwmBIzTJBXXb&8lekDVHy@=9d_e5F5&^+LVwIWLI&hUY1BY7bVMJF$6{>3aooTQ ze1h_X=NJ5r%qWCvXoo?VfW=seZHV9|p5ZONA?Z`vfb=MU%4mXa7=|fWjBPl9TX>0Y zNdAnufjlUUs%V5Z=!St9kC|AA4LFVm_=@DuX*)8bAWESsTB9e1BY=5WhV|Hm5#PIEUauQB;5zZO{dMF$s&X1IKV3_YuPf7%`p=kQGHy3C+$D5SMUnfd-{!BD22x8hY^^MEjWPlc#LoO?gP(9$csv7hB26l z^$6n(?&CG2kDOyjgN&$#9+-vI*o6yt0`ZA!CY;C$H>#lpdSX5f;xSVG%UnYZv_(&h z#%!!c7-#ShpAh$%HsCK5L3z|gXY|K7EXI25#tB@*Q+z?PFI;1g6~#~oiST0v*5Dv+ z;5|}&r7n~}4YY?Jldu8@aS;#k4k^BIF2M~ieDGr?w&OD1z!C}KPZUB0bi{DX#c~|P z6+DM7C5T^80Hx3foiG$L5yAmn#tZ0jf=G*esEW22gxT1F^LUBxl?0I+7109yFb7+3 z5a)0Quc4~^oj3fB+$e(v=!OxPi;Xye`}m6QwFLf;GyOvcjKLD@#d$o0qEjx?p%5CN zFBW4XBDjw)NHFZbA(tSEp*A{T2xemwB6x)qCgTMcN}&PTp&tU6kIguR>xjX$62z}4 zh_Yyi&KQ9?Sc`+WhF6G-V~mjtWzh)TFcR~z3CC~??~pV}g7^&u;6Y3D!FVjhcAUl| ze1esfJ|Hj3qZtNb0v2Esj^YwxNSciN$b+(IjCL4+@d#oKcH=yrLQ0+>enb|OKrJM~ zkBL}>O*o1u-Xckg1d$rKQ65du7Xd87R-C{ie8CU=bx#*cq82(}6c%C+uHhY0#4{g| z4<0l@PmIMvtiv(f#w&b5vV;V_8=WAsqd2OeDLP{yCSoBr;}EXkDc-|KNk5Pgg-``e z(FG$h7pt)gCvXEVpnR7gQsOVc6Y~{?Pyr3l7CkT?%di!va2Fq8rDnb$AIhQ;x?mv2V*%FV z0IuLEzT(F;vFs&Cmh8Fb<2b18496pAr8%ZALNFL|Y8NWGu&CT*5QRe^3|FA{z>$JZhsEI-(Co zU@8`34YuPjF5@viBgLOwQ;`!TQ60_D4MQ;n^RXJ6up38k0Z$D@`qRJ`BSggs=-|@Dy6+ z1o0CxBR?vlF?u3^?KqET(6W#h*-#qgQ6Fv41EVkn^RNSESCKAhMz;JZO&Y z7>Nbgj+1zR4~TOyp2&ytXpGJnj44=zwb+g0xQ=H~b8zhND{`U)s-iL4p)W=tfLU0L zO*o2Mc#02Daxxc?8h;@tilZXxpgH`QhP60=TljzY@$$VKSCu7mniw-oY%vIg0csf;#YFI2K|j&fx=+l%#wVLv+lBDjqY_^uSk6mFD9Lv+I^%*AG$#BC_0x!&P-6hVFT!YItcW}L(wyn^;O?LZEc zLVdKsV9dlOoWcXBWjNQ74-MeMXw1V-+=Nt?a~#=G7R@mL)3E}3aTD*5tQ_Ya3ZoJl zpdAKcGL~UGBDjgy(91K%$bw?1g_anExmbmLIE%aZfD{#&+sJ_;s0c55VhF}z33lNk z9^(tlikx@I3O8z@8MaP&IECAgs&MR305y?_p_qZy*oX7Dhj&Qk;dvHCQ3Gu;5HqnBNAM6* zRgNu>;<@fMEi+-Fb#B~TF! z&>6!q9m}yD7jYjiVbtK5A{X4KiKgg-iCB)EIEKr3gpY`;$+1CRR73-`MK6rSJgmb} zMDZSRwHRl(P!dfs0CTVgyAi=P+(QgskhC^+!G(gTh+0U5A7d~ZE3pelaRvAB0csu2 zL3{@%GNB;Kp&>fJj|o_Sb=ZfCc!bYLR+qLT8w%rZRDl;=F&eWF!fqVG1-wL(den(B zXpTMzU@`XM7DRoX(cnTER7E3n#xTslO6S6R{NA5y2%qhuWTJ24qALR6z@L#R$y8KiG})c!)1Z z*@5!|<zCMG#wY1P}2MDLT_H6hRHNKtGJZJgmhbT*Gt7 zT{vb)kNl{BdT4{57=h_nf{i$Ui+BdPEBhi3s-YtWVJg<(DDL1b%x?4_g;51wbjC2u z#7gYONnFJvd`7bFT$7L+Wzh&-F%%QA1e>rAr||&a;ON0Pz>S9JijfFnCAQ-*F5(fi zo*ZA~MJ2RAZ;Zf9EW;KY!$WAj=sU8YEWGHAF_?$#IE!cajJV$P0|ikV9WVd^%*Q4i z!bLp5XT0<1okLz!MIwe` zGL~Wk_Tn7w;yse}XCLH&2R@9(BCN+AT*4!Kgku2xMRpWJEwn;kjKgB=#5p{N=I5RY z7mA|>TA&9;VG(xW5@JX?kaHG=Q4w|FLw`)fBJ9KkJV)FhuGPqk5~zYk@L>?pq(kMPVATtW0DjFjZJuwyQaT*Vyj^^5if~bx*@MAW1 z;1b>-VGLu6a%h7-n1tonj6=AHXZV67W4XT}3ksql8lf9TU! zvnYV7XaXNbV=?yO2EHKmc>0UtsEnrQj`3K4^*D@6cnvGSF+g^dM@#g<1gyY%?88|+ z!8asKVBR4silIJwVhYybEFM9d$h%LJMGN@QALB6xA?(FjJj5p?o5VSbTquWnXpYVp zhFMsP!?=Ubh?`7%kOf6h4mHsdLofxaZ~)g4gE@tB6xs1N8Xyt zpfVc5hyDm)5jNrgPU9gyBgG8%MQ&6=bM(LnOvMuHz$rY$S0tIq`HJi)f(mGe?ih|) zScg40j~7s8G1rgh1t6U(s`CvX#Q5jUG-hfFAfDyWY(=z}qsiB$;WG;ZTP zlFZ>;L1q*|Wi&=d48=^W#a^7l6UcMf2L(_8jo`x|1TY^PupgK30PkVW<6eMlD30oA zhHe;*AU5C-uHq5iLk;rWj9-x*B~c44&;|W44nb_f5!}NkB$?0k4h2vKHP8-&F$ z%A*0=q7TMlF4kcWPUALS!(7dnAS;TX3R<8y#$i4-VjoW92A<<1tToJIxKIq0P#dk$ z8v!iDZk)s&yg^)u^9(MOMm2Q6NX*9;oWlzkYk7u6QB*`-bVPqlz#4>c3|H_F?-93- z>nAdyFsh*ydSWc*V->sbFc+&3Mg({99{L8Z_ehIu zD2~eTq6-FM9D-PjJvfJlc!#)+)Q$8gfbyt^MD)Z^OvGHQ#$H^*Gbo!l50D=DQ6BZt z0Ru1w^RNF_0S64FbuP?1RJm&`*0E$5XCdRf!NCVfaFMxbjXMTD1q{*iAHFNcIbhj7>g;G zgGE?@?Kpv3cm;JE?S&AMkcA>tp$T0W!sOd%aUu!-e>9m$E>iHX%Hjnh&HwfMUi=__ z6sg2dBDF{(eipxowBlFc6u*gd;&<@}-(dSoq!$@PMv+Nm7Fk4AkxgXh|1{(fIYlm! zTjUXWMLv;V6c7dZrdwfAL=+Xpgj*CBB}7S4N|Y9Vi!!3DC@0GEEx3xJlBg`I2#=^L zs)_2NhNvlOiQ1wL|E!~)s4p7u&oml|#=VSMXugcvDCiP2(= z7%Rq!@gg85h>2p7m@KA=e7iZV?uH#9pya>=y_4p5GyH zSR4^Y#W8VQoDe6)DgKwrX>mrJ73aixaY0-Zm&9eh3wV`(TXtRC5I03s+!D9N9dTFO z6Zgdf@lZSxkHr)Il#7pr?ycTc7Tk%f37azn&@k#tEK8r8ntN6y@mn2zI zBvsNRT{0w7vZOdEiIh}ICMB0rNDe7pN{~`Y-$~y~KS)1HsidEz)KVJhXXzIyt@Nwp zlzx-aNxw^fNPkLyN$I5wQbsA0lv&CmWtFl?*(H~hL&_=Tl5$IVq`Xo-DZf-eDkv3_ z3QI+#qEa!*EftqaNF}9GQfcXLsf<)sDkqhfDo7QjN>XL1isX^1O4X$5QVpr5R7MV7U zx=P)o?otn_r_@X8E%lN5O8un%(g4XX4U`5+gQX$TP-&PnTpA&bltxLTr7_Z2X`D1( z3P=;AiP9u#vNT1SDovB7OEaXI(kyAVG)I~%&69%Cd})ESP+BA{mX=6MrDf7T(sF5q zv{G6nt(MkEA!)6&PFgQ*kTy!2q|MS6X{)qN+Ai&oc1pXX-BMWEBkh&;N&BS((n0Bv zbXYnf9hHtr$E6d}N$Hdnkxolzq_fgF>AZA7x+q;x^zRjDMh7Q(rxLE zbXU43-IpFn52Z)aW9fomtIIQ>812adM&+?-b(MJ_tFRHqx4DoSNbe{k-kdb znEa9~%ZjYZnykx)Y|54#Cnu4U%E{#9athfY$IA(FO8Gnad-(_XM>&=Jlbl*kBmXS_ zBBzyqm7Vf$ayt2U`49O|`7b%WoI%bgXOc6^S>&v8HaWZOl5@y8-ZIggxI&L`)W z3&;iKLULibh+I@ICcEY0atXPlTuLr2|1Fo1%gW{C@^S^aqFhO?ELV{|a#gvSTwSgq z*OY6?wdFc;UAdlIUv3~blpD#7Wv|>sZYnpEo69ZamU1h(wcJK-D<{hB?*+lZVSA^4Bu|#7$W!HM@^pEIJX4+}&z9%NbLDw*P@XR@kQd5}Kebq*PX_C?2J% zQcbC@)KF?FwUpXQ9i^^PPpPjoP#P+Yl*WozX`(b$nkmhd7D`K{mC{;iqqJ2Lm3B&d zrGwH@@hP2@&Po@htI|#BuJllPD!r86N*|@K(ogBH3{d>aKxL3JSQ(-WRfZ|Ul@ZEF zWt1{n8KaC<#wp{KfHFaus7z8OD^rxI$~0xVGDDfE%u;46bCkKtJSC{iR~9G>l|{;8 zWr?y>S*HA>ELT=2E0tBsYGsWQQr0T#l=aF6Wuvl5*{p0)wkq3{?aB^ir?N}gt%Q|5 z%3fukvR^r%98?Y|hm|ABQRSF&TsfhfR8A=o<+O4}Ijfvg&MOy`i^?VCvT{Yas$5g9 zD>syzN>sU}+*a-=ca?j}edU4jP7P#nbgc`7B#DyP0g;l)EsI~ zHJ6%O&7bZMBYCSFNYkR~x7e)kbP#)vGp9o2t#!=4uPIrP@kut+r9y zs)=elwY}Ow?Wp?HPHJbhi`rG~rgm3*s6EwQYHziV+E?wT_E!g}es!QaNFA&WQHQF- z)Zyv~b)-5<9j%U0$ExGh@oGSwpiWdLsguQr@_I$fQi&Qxcqv(-83Ty>rrROhP; z)P?FIb+NicU8*iq|52B#E7XK=8kx=-D&9#9Xeht$LB5%s8gOg*liP*19-)QEaoJ)@pg&#C9t3+hGnl6qOa zqFz<6sn^vT>Pc8q|^^5vd{iX^{(qv81R87-#&CpEE(&DrvT2d{UmRw7rIkb2!K})H9 zr+u&ep#7+&(tgrXYiYEfwO_Qf+OL{Z`%O!y{jU9?{i*$>rPnfO8MRDWW-W`BRm-Mj z*IZf-EvJ@C%dO?n@@o0C{8|C6pjJpLtQFCUYQ;3SR$MEgmDEaUrM17cGFn-!oK{|| zpjFf=X_d7qnn$auRnw|#HME*qEv>dzN2{yV)9Pytw1!$Et+D3SnrKb6W?FNth1ODQ zrM1@DXl=Dbt)13h>!5Yid|D^1v(`oHs&&)4Ydy4{S}(1))<^5B_0#%m12n%jP#dHT z)`n<9wPD(DZG<*b8>Nlb#%N=;aoTt-piR&wYLm3d+7xZ7HcgwZ&Cq6Qv$WaT9Br;P zPYY`EwFTNjZIQNETcR!1mTCWJ%e58SN^O<4T3e%qw6)qgZN0WZ+o)~QHfvk7t=cwi zyS78ysqNBsYhi7VwpZJy?bi-y2em`mVeN=^R6C{}*G_0BwNqL|JFT73&T8kh^V$XN zqIOBUtXK7@gf8i_uIQ?+>AG&{rf%tRdJ;XUo=i`!r_ddG zyq=(^)W6fe*MHD|)Klp{>8bTJ`p^0=dRqNg-Kqbkr_+De|Iq)`|I*Xz8T5>LCOxyB zMbD~d)3fU?J%^rC&!y+q^XPf?e0qMpfL>59q!-qU=tcEnx?3-Xr1$dKKNHSJkWO)%6;BO}&<0Td$+n)$8f?^#*!Fy^-En_v%gbrg}5I zx!yu=skhQw>uvP5dZOM=Z?AXIJL*2YlipeHqIcE1>D~1ndQZKV-dpdZ_tpF9{q+I5 zUmvIs(g*89^r8ANeYieCAE}ShN9$wsvHCcDydKae=o9rx`ec2IK2@KlPuFMYGxb^e zY<-SCSD&W`_4)b&eWAWcU#u_Dm+H&(fAr=03Vo%%N?)z7(L?%LeVx8u-=J^QH|d-8 zE&5h{o4#G&q3_gp>AUr?zDM7y@6-3|2lRvbA^os^L_ew@(~s*X^ppB2J))o1&**3M zbNYGxf__oIq+iyr=vVb?`gQ$=ep8R?xAfck9sRC;Prt7}&>!lL^vC)W{i*&;f3CmK zWBN<|mHt|PqrcVP>F@Oq`bYhf{;&R7|Du1@zv;q|4B1c&)zA#xFbvbMj5s5Sk<>_L zBsWqR4kO-3Fj5-d8Q&W}7(W`RjGv6uMjGR1;};{X@vGr9elyY;zZ-uTe;R)o>5U9V zMkAAv*~nsKHL@Am4VRI_$Z6y zY2$CBj8WDoXOuT87!{35MrEUl;W4Tj)r{&!4Wp(}%cyPCG3pxijQU0cqoL8rXl!_m zCPq`EnbF*6VYD<_8Lf>rMq4A%XlJxHIv5=dpV7(aY;-ZY8r_WUMh~N>(aY#<^fCGx z{fz#`0K;z#GzJ-ijUmQRW0*1A7-5VwMj4}xF~(S9oH5=A7!!<%#w261F~yi_Of#k% zGmM$WEMvAY$Czu(GlIr^V}Y^ISY#|VmKaNoWyU|oa$|+D(pY7zHr5y+W392ySZ{1F zHX56Z&BhjEtFg`4ZtO628oP|$M%dV6>^1fo`;7y}LF15d*f?SwHI5m_jT6R6)*al^Q2M2%aQVM?ZKDyC{`rfwRhXCE5FKg>VP zzs&Sz1~a3X$;@nKF|(T4%K@4={Ad- zCCrj$DYLZsw^_z4YnC(1n-$E8W+k(-S;h32Rn2NYm|e|oW_PoP+0*Q0 z_BQ*Nea(Jme{+E8HwT)7%)#ambErAY9Bz&=0tOnIoX_I zPBo{Q)6E&?Ommhw+ni(0HRqW@bH2I2Txc#b7n@7WrRFm8A9K06!dz*tGFO{x%#gX( zTxYH~H<%mEP3C5Ei@DX@W^Olkm^;l~=58}=?lJe8`^^330rQ}F$UJNwF^`(Z%;V+> z^Q3vojF_j*Gv-F#$OSTkCwKPk& z49m1EE6z${CAE@S$*mNY!-}^Otd!Pw*7w#A){j;y>nAIh`j z@75pIpVnVidMksK(aL0Hwz61Rt!!3y%Vp)Ta$32p+*Tedua(crZxyf#T7|5_RuQYH zRm^f*#jO%nNvo7q+WOlnW0keaS>>$?Rz<6lRoSXyd912dHLJQ+!>Vc3vT9p(th!b` ztG?C1YG^gG8e3kgiPh9870mO@I?=KDG4 z%+GtTpwIihf4tB0zDlmop3j__IWu$S=bf3Ge{=pV`5W?Y&A%=Gm-!p>Z_mFY|IYle z{JZk+&c7#rQ~tgA_vPQ8zd8Sb{9olin7<|eq5OyQAITrje>DHG{KxaR=0B1DWd2k6 z+wz~zex*Yn@V-hck_4WznA}h{s;L}`5)$gl>c%5p8QYpKh6Ive{cTh`CsJ!Hh*9Km-%1i z|1N)j{_peukpIX01Nnc-|8xFd@~89vn*X=_zvq9Q|Bw7{^1sbLnE%iG@AChZe<=Uo z`Txm3oX-Wzg5^O+up(F)bOvVxtAczG1Yr;banKd44hq2|f-{3h25W*x1&$R|L(V6)Xnr;9ziNa40w&yfAoCa8>ZEzygqnC@W$Z!;7!4sgSP}X1aA%A7W`#!WAOIi z9l<+;W5K(EcL(nYZVKKTyf1ivaC7j1;ID!Y2Dbzs3O*csBsd;?H27HX@!;0r6Tv5g zPX)IHpAJ3~d^Wf}_+0S$;0wWt;ETbRf-eVm1YZfh8vJ!|XYjS)>%ljIyMn(7z8QQg zI2n99_)hTM;O^ji!S{n71gC-@20sdZ9NZK9B=~9Yv*6y~=fN+6zYXpSei{5K_`Bf# z;O~Qf2>vm6Ao!=?pM!r1P6z)Q{9Ewv!LNh=2!0d%Hh3`j&)|2#e+3T({~i2K@Nkd| zmxas2j&Mb|GVBb`2v>#qFbKmi3gfUVTpbp|M}%jFj||s@j|v|hJ|;XX{G;%(;U9-* zhkp`2E_{609X=s^V)&%+oN#T}6FxaSH+)KXUU+_ZLHN}0Y2nku-f&&m7p@OCgd4*P z!%gAl@S^Y;;WNXF!)Jxh4xbZl3H!sX;XpVT4u#vo?ct7aIDBq+NjMVj3`fJUa6Eio zI1x^U#c)@+JG?a96YdS4AHE>GEd0~(&%#o;FD!>s;dD3?R>IkEe>fLb!^^`1;e5Cd z*1~$&2(Jj6VJln=+u_0R%J5KlIDBFFqVTHl&%?h6UmP9@UlP7Fd|7yP`10@-;VZ*y z!dHc_4qp>q8@@KYE__{hG<<#dhVYHy_2HYsH-~QtZwTKSzAgOA@W$}%;XA^2hR4Ep zh3^jE6W$cQH+*0C{_y7T1L0qV9}I5^KNNmA{785_{Al>G@Z;gF;U~gRhMx*=3qKux zCj4x8d-%EV^Whi56X6%bFNI$Y?+CvVel`5-@XqjS;n%}&gm;C16Mi%NR(LY}cKDs} zyW!p8_rmXoKL}5SKMa2q{y4lR{7LxJ@Mqz@;m^Zggnt{}7ydH*Rrq(|{o&t-{}BFT z_(1qi;XjA}5}pqKHT<{m-@{*r{}KKs{B8JP_@CkL!v6{%3jaI&pYY)@7cGmHM;+0M zXl2wHoe`~y@=*|lQ53~dSF}1RM30Ehj2;=Si5?X_I(kfWR`f^FW1~Ng&W`>hdR+AQ zs5^Q>^u*{%(K*rDs3&@IbZ+#N=)CCs=z{2}(bJ-*N4?Rys4rR{ZHP8T7eTW6^l@yl5htjEd2& zXm@mJv?tmdJwJLubXoML(Vs=7XkS#0rlRR+CaOfU(f(*Isz#Sb2cr3CA*x07s1aQe zHKSIv7`3B=(UsAm=y3GH=ta?0(Vs_u5xqD%61^mPY4oz_>geUsE239M*F>+1ULCzA zx;A=kbY1ki=xFr%=nc^uqwAwLMQ@JY65SBJHF{h0m(h*U+oN|x?~IN`?~2|Xy(hXU zdT;c;=>5^n(FdZxiar?K5`8H8aP*Prc=XZeW6{T>Tcb}zpNu{g-4=a1`b_lM==SJy z(dVNtL?@yzMqi4)9NiIpCHiXg*U_EP*P^dS--zyt{wDfn^sVS*^zG<7(RZV}qwhuE zkA4uHihdaVDEe`9PxO=Mr_s-%d!wI6zli=ex-a@=^sDIaqWh!2kNzS0$LN9RpQ3+` z{v|pc{cH4Z(Z5H(j{YP1P4wI7!RSAu-$nlwJrwX5+9G@NkN&L9@@o{(jg!qZ^ zlj3vYwQ*1Uv1E#B5ua5crk9r z2jeT_L-FDGh4G8xtKvV8{~~^Id?bEJ{L=Vk@zwFm<5$G5jIW7b6~8)uO?++q+W5No zb@9>o_3<0x>E_|aV*RNb);(=zem>VfFfcSZSsEOg9GDm$FAk55mS&rkN)}#S%tC9G zD|7urlcnjY=~AV}feSx7wXSb-3Q7VAiN$8p(@e#NS(%>l{JZg0_g6f(dOH4kW3gJV zwOGAYWwE4!E*+>GHkb<1VC~wK&2q!AmYEz~SLz?#TcTW{-&==^rOD#N@aXo^^ju~7 zKnj&?O^EJ?8dDiTWI(m@LZ#GbR%_`9xeO8^*V+rEa%(!J1`?iyEhXz{w{u*j&q;~F zjKT)7N{x+;4E2wioEjS4wR32qzc@6gOpP>mK;(&N=wLc{2QuM1m`R+2E!In0MH<~9MoYGA?nUrNXlv;~0 zi~XMFsiIQ;6rNB`p+>Rc{*9>sET%nM#CjYp4s9QrC`~UkM4e#;%(N4L%{DD!%3T8{ z9u-C^7LzI3hf~(0yGBMF`(joH$czbXZ0mD}28yNWW~ID{hL5aKK~_fv=l~RJgBU0d znd(0}IJC_e`YYU)_ABBw;P1fzy-7QFu5~6P~78W1+&!fOjnwVrP=xNel&@c zYU7ZF)fO^E>(!Y|9448r4!&1Dk|-xxI}_1Sbfs){GROhfdE| z$~9fJ63Se5JO3 zan1`+pc2Z>gH6sUpH2hmBBjb9&l`&YEX}G$M+ql`2jA;?B)ge9TpAr7OuZ(J6l!GZ0`6rFh{w<=N(}#k5ga#N<;k*~9tW8goux#=H{+^?@dI zVr;;~IoZ!XO@3<5>xmdd;`di-m1cRq`ohZ0Vs$~8eR1#jknJUybMzobW2Nj!28E$d zsXo0}S#N`(WVf?PTZa!p0CYjk+`(8Of_NUF4wE;?6}xX~}^ zfQ)mKxvMz9`DsQd8gNR}Knsl$<#b6^CXL$+)`-zcg>JP`fK%eykI6#^NT|APb2>jz z0~BZ@HIRvS_weL!RvYc(Is_jzfuKF)USXj=)1FuMHdS-2mop88JzK3+7ir$08qjG> z56~;o_&vjQrmu?Oa9vD>7~Q;>9$ZWvA=VJmtOy$H;CcX2x|*gD z<61_maz)7|gE%)?i{<@&X6{G~5+!;f&l~d?%-WJRh%Gq-nQ}0Q(T-aYCy~;sEZBxy z^f7s|tGHuqVz{`sG(5U(tfbZ!B+5)Ds>qoRtbuX4WN7cOo-8InF9eYzzgzn!hX+an zW20zu`Z4gElu}5;@Sg@bgl*oE##XSiQx|S9YYYJN(gc3GD-*=3g%JG2I)v{_uR_3$ z`V?Ax*gCu&b7Jaww+@ey)}u5b;e2xeRto~<>FG*CWXrAEI_fFWxK(DWhuFWtTJ2d6 zqv(=yggJ84<@xz3vhwN0<~)Z+!$>`pCuOL5pfxzOSZY=lo1{B1Ba9!c4(3ub5V)dE zO_3I1mn)m7pQZina>9j^777b33EmSI5o&uy3W3d)t2O3kF$k=! zQ$MH5t;&TPG=nm!h$ge8>1t!nFbgwEq=r7Gw5T&~wp43losQy|oyklQ;MQEdJx>{~ zO9UO;Oo<1X?2+1c{iB2;W`@j0OsUkWPanY0n?wlpveE@g<)#!6fz*@G#6bI!UIP8* z42I(xoU5Zltx6t|r$)VL<6(WVayDkf1wom&>XMW2LqSX(rsXd!*5V&d8PTxK7~ukW zK~`xGiZ{8Ts}X34=IR_6G2@pEOl~rqQ_IMa3Z+r5O3@L39==9>IHi<$HaWx1N@*aG>!9?fF(ss3KPG(RMl=Q@z zJrH0U4|b<9qbNv@S#1o9rRt=VZ>fq|gj7HUP<`j{sLnge9yA@mK}W@dp2Dh_M@w5r zhDQf^@wr~ZPzMU8F`6cOFbWrKG5U8ZFGpS?b^xlmDi;&z;v88>sfu!TT&igu1WKxa zdf<6rAS!U#s1G%O`5(n=$eXf2i{Be8Zmu$4`Z zd~Dy=hoyC_xtQP0W?!Q|4|`IMn0UCqVXJ61tXpZOdN9eSWGaVHRUJRzQ!>a?PX>HS zW}yvZbHV|il4;fFF;2arO-+p>YT>kxEBq9-u4rb-a1L{RAxlaSLXYF*1!Y>F0(Op# z7P+{1{0%h>pbO0ay0{FW%FOVv7fOiBm*%O9WtQ+3g^i81&A4LOO)4%Y8#udP7 zeHe49Uvm;Cu!TmIFdnIy9|(XmL5<&d1OOQt{D9Crmk0B$E6WPOtOqU#Uq!2o6a+oZ zGz-yhttriUA+O9-XXR|OzEE1I*B1BJ7b-M594+mi=9HOi;T&KGUKgSU$jL&~%HC3~ ziiS|obr$1Rh$CXtjhC9c9V)}Z-T6|+rlZ3*Fa9+P6Fi%ktV zx+$`(uf53lm}DRt*dNtX1}xX^n$)Al_CZ;&gVY zVo=#mS#DfZ>x0Eke&1kU+fs-cRd4qQLKnrUYO98F}X4ddthbQzg0@ccA2oASFxG6VgS zMQ`Ci0B;e1A-#COjJtdwfLcIc#$Q5Uh_aVf4hHPf!NAZ&ad_MC0A8$*kBtlu3}aIU zH_KTL=o_+N%7=lS{a87{@JEk>EkG+{hLfpT%_IkQFmQZmZT%GuitvjiCA0 zE*YuuZ_M}GnBxtM?R2_l!*Mv|G+kf7B1Q`hF?H!8juwwB*+H6Uk=XAG=c`lpmrc~z zC>C&N34li5SaMMu=4Z@E>Ig>4sI!-MS+uNM-7ix*mZQ!CRTT3v@ke|M(?V=CaR7Ng z&mO9%<5-pEUPp%1DOe=LyDQE!+LUy=)s%U7%7rV19}L+|Myv$;;mp@D7~~M?m(3*R zbS9~!P@QB^Cux3Y${`(%IAETL4i-~SClp{bX7LcKl=dg;(A?4!Y}c$PFJG4CF{BU~ zQbHG}EDcy(mhA^7MoNRjsK?`DcIhw)k_9K^*hDAxju*#D#T^qv{exJvq;_f`iBUC5 zV(n&=R-BSJ*^{30rX1(WlxK;MD1A%%AV-)hhOX0@9vgM^C}hhLC=E@emI;qdUbH{U zv|S#m7d@5V>FEWMEt4H7IYE-XJ+uUGSS<5>WQVM`YGwK0@tPk9l8$MYk73o^AhKU< zomsopl7icPYCfJ+ZLW+}z*1kY30B_1)1n*3WvZg8?C>|c>2N)imS)!XnZOoXS=sNQ zx)IcIu#cpc;zMVkYBt5k%oLh8u6dRxBh zGlx-4rw?H5KnKxoBr{3n8LzNS&zD;*E$iw?zmpyrqu?>=Q^D^~S)@V|7U`pY5h%Ar zhWcox58c8^t|||%nJUO>L=@7jz=kjq@l)ZMvyybonTkx;-c)lyjwk`DzEwSfZDh0PO+1vG~kTv9*kc|r!MHD(9LE~G5&SS#r^Z5Uz{ zy!?s?XWKRIt&L%kB96$C?s!*`87D34${UGHuhuzHD=1!aTuLW$%M6h+Bvq9tG;*Mn z*b0UTCDHA_it)w`v?w#QC(C~&qKpdw$EiGL9=qQf_$K3xDqWmmjv<1pHd6m#0>kYxraN*Ijs#4 zFM+y7kaQ#Io!&H*Y$4Jr6qb#3nKbcgv_4ben6-6KFzUDTUP?2Kp%bT)bkI7cE>4+Z z#7VUrOGN^zLkyny1*lS}wbdh>lGggI{;JkA`P>>tN_A-sOP z1XYN90ccOnSEns+&1$m0G&#Io>8Kd-!#GC+7|Xf5;|*caZ?%<;Ih4)d4vNGEVhoK9 z4=x6mlC~BF8*{Nd^i)G~QbcP_s5U0R$~g2dwhJ&>cBx=DCK7W3Gugpg z|KLa_N#59G@k84ze%kDE?RTZ|Zq5QQ3~#N=0GGDjol#**N{6F@3TME133}m@s4p zQ=Y-dD21CmL~!%y&ZD|?E$Pt5U>u~{VsElT)ZE(-K zqqhibhU_=R>0YbRStd# zesW2K_S=dgT;YtGPW98yCTEQP~4_g}YbPEO~$BzQ#YDKJ>2?#7RN5NihoW&O9c1AGa|`DM zK2zE6WdO-yD+L-7PYez6V!2jdsG_}NJrmBf>a7}~7FL`}v-M^|FUkh2X;3Xtc}P*w z05UVwxiW7Jspu99FOi+1lZF(dXd9YXuL_!~E{-8(C7PUc9=Unv;!fV-O z%FOAfHgfuHhB{72Y~FY?%r&3GW&{ zDymVC*8)nmT5Hj$UPfK+|1Ox^{Y%yT(r>%N7_6Wds67I4{a86Qb2u$4TA*J zsWk1Q4J}j135d2VCDJB4FKt|CrOR~EjowIL#lxf*IGR4L{T5s(AHZ57=f4BW4r^(@ zL^s+cV?t6!DlXXWn$(CDr0q4vhaj}2Edjx|g~%-aSJ_E|nK>m*rYN?gkdvJxLk%cx zI6w#BmtQilB?S`!Vi6*h`&gLI$Z4P|UnholV`B$ZN@HOb;=xb}=asdLDgf1iRA>5V z1VZ_!k=7z0?$^okrrOo{#i}ZM)UCl`jJ}F{?flt8C^lDuBOBd5JWBT`AWZWU*;SjR zwH!Kyr(kqz6tBqW9VVJx!1l2gMzfXa_F{R;dgA@*T8NIAOyjUbg4bt|6s%siX^sa8 z5-BAZQ)cDD++@GYVj$}|^T5^>nCKrJ^myO@Bvv|xTz7TM!--LCl)*V@v}^kWAp`QeU`kHDunPLae_K?g0?Eyz&eP!fDZ>FMhOwmcx3?t}U zl9?h7Ui!^^#pV+r>JjDmi4&|?LS|;oR-05UY#6Ewvw*c#G8AesGXuhlX)he!mO{N9 z_2OBn7lHQFQtmRGvU>1=5J%AldF1|@#*%Ile3y*eObDQamiF%DIeW~Ej=-g2A~!!6 z?5uNR#7YTXXjL&nSJy$P7qXrVy$PPC4f)vC?_>kF5_;evxyA3@lnCdtZrsGKj4JGg zcV6WMY=v><_3Dj_c>@=TN0%U0_GC=xz=`oM+i-nQZ5!bXroMrF8j2dYIbkq@P|4>jcxt#+D{?wnT_^ z%TDpWfLl@|;1m$CUbzsENIFBwzKy}GzKtAIFXN^_cRYSd4C*Va;bh7jJljJurP@Ox z#Tw2?sCG(}rjx4D5(SzP@$AZVl~-JT?qv7B?2CI_V;lq}I#q&}=sej;rr^@-5n%gD z=Cb-qa*&2|iN4VaWcQ86J<-IbI$08QJ5l0)PY$PR3wg-sUfMNN)2+?9ptT?ebuG?^ zGsRtdbHp8Ub5O6IIe5Yf9hZa=Ixb7(P*TD(K|KYZnBe^-d{|N~Xn4>;J}f*$Sc_L5 zX60a|m6b`joVFx62}+xF0w`hj2#97wYUmGJCIG{Sv`-qnAvhU9NV&4K!fBBTehr81 z!Za>VK~`5D4pJ9lx2b7yJ{&K)WAAyhjAKyRNey6BxRNqQ8;GY>=la5@BSc=3$ta&t z<(Jqlh@%)OOin1^4Y(u7+v8KBypKAK$_}LzPVbD9k@0)DG>F$dNsy{VCQ7dy(!v>- zYJF0&$l-JVyT{Yu_A%`9PKn}vw+wJ#G9!R-oHa@Lr<3IC`m*s&X_)GJ2AY)%xXB_F z+pgg>wr6ASMZ4E$<7rgx1Wn^^REH7qLcHin9_i*4z7~Qcu(b|X4y0?J+I&k6$R1i3 zRx1xLmba+`5 zasXPSaaf*ufFGWm+=c5ICx<46`$tSDK5D}9VHKhe>TvO*bCgb>vwm7R4>X~As0!4> zI84;lew?824k8V?pv?1JgeGn|Po{Y49mvf4=^P69i5={O{E*>Tb3>OwST^dsXVi3lW# zQ_WaPL2}DXDLE{y5V;lIteoRnZIYDsQ1@=04 zDNkw7BsLL1wmRr;yioZQioZ)N)cH+#oq)(=o~G6Y?*YYp@dha~mJzOYppN z!AK9&0Y582tS_L>{gKEZ-cZg|w(=fy%iBoA-GnHt@1Hh1dL9g*V}&om+)y;15OG6R zOO&J}|8(N8yz$SFjlruPsP90Wx^6hPo&&UX91PF2OdSKjJJ*yZ2B*zMw)BWIxjw#i zNL5V_D$nniw=hT(i6~yZ4OO7q-;mHO)*v|-XxzHFZyc|g6g#vR9IyminrhY$sNR;O zrJL57?;$jNF}_)jhXf>S7#DJ*u#kuBZbLMjZtt{A<)x$1f1y9M}@5ENoPO z*75STHUR->war8DO5APiXa#7UEMz-kiA;bDBdLnzI(YTUI3(VuE5;fA|tfz&!L^Wl|uZ|4))lnd?-Z2CXdlRi8<6dQAgew#FX3>@7CXcO)?#->5 z>Dp(cQ+DgPkilg{kg_e~#Wzj^C-c)da2-c8oe_y&b&U^#>CTIEvh@~NZA`|CIAGOb znr5F%`t(Dswpw(Cg%wOR0bY54!6JfsEvchUCrcxV>L=?b?C7-W3Qe|i3Qja~E#CcT zHrLwZq0IeiDS%ro8A(=426_2gCkKc#rlFC9M*I%NFEZj1$u;9HwoEhfVlG*Hs?>ao zTB<00+{QYIMTu=@3Pqe5z)eCu>$E#D;z#$ZZww_%BUV=OIe*J^4PUv^D$xxAI1lcF zeH$D)i%CevpT?6K=V%`1@H`JT^%5!0rg`o-N@@9v`sm1>&$~*KyX#+gM`;E0IXViI z09>UZ;3*B>QyRRhG?kvKq~bI3oLwCCnRnDzyj5QVj`|9+>NDV|PrR!>@vi#BC)L+^ zK80IvRd&-)rJDT2y&q)QV07sCsRNqU2S&-hbr3$NZ7GGS#3gY_p@-^-Jus~T6|hQ$ zl_W5&fkZiyNKfGpEXN8cY0e zqjRlXl)~HK$kl|SS|Aa0Mh=*?o8bAk3S9jb+f|H;M{$xAVsw=J8)r$$uGH`K9^=KN zkKZOFbdKr(oCLa%6FVIQPN=ZnBwYDP#%wBsaW~nhkwlPQh&o##d&mZj`%*aRt(Ih4 zWqPJnW(Wf&xmlXrX&@>~)9RvS4N3=-02^20tqbP&^txwE4%$|N+S%z#-PGBY|?7G@-n5R(ddQiiJM%_Pz_fNzcI1m}TM=FXqu+7=*Q^>W3^?D&qdAaheTI z;@aFDxG|Fd@m}o`DgZ4M7>;LJhNGZm5uG71ZT`vjW`5CY0%nwb(JO0uIc@Ls6N|{e zVP6?272?PkLV)wm!432%qo-dSIsLFkPMnH-=io-jZ#427wfsg;exsJ>Ll@YDV?JCW zM?zCD+jI(rf+>u&ALVU5mky8OGCBFJ)}1t`Z^BfL#Nvpoa1s@VKtE;eS)6F#AlF}( zDoUCleFLTylAR<qyacb`v=iXLnoUeH{jSQpDh{YUJCOB@O{8dlCfroe&QQUOPlGrfN4JllQOWEuCNcE4jtuf@rB_A5$;j8j(}SDSw(KTHOy&%oi7djnsF!TPCn!DxhUE@&^- zXYnmM8b?uYL$|0*OY=jY5l?}I;dKj|fc3IN&-y5}T4;=c=y7 zadMtA6Z=ZNpp_PmO=u5}e!drO`FO?33&|Fh4#6!fvK_VWM)?9yV@w^kVo`9`2G|qj zq!l9jGoxC{Yi*R2k?X|n64J>KIf$g0wD1`)=*@FYR!{@{`86NWMozEWs4p4uqC zQtRL}wycV6jt`CEmPjf^jHB^+t@-_R4DRL@_~Ur9xv{0)YjwIK!AjusPwg58qRI!4 z_;K~O;ra6umTk0g#cl%?O3OFeFin&njr$c=EwAr`P-)yEv|UF#^Nd@ckyf8oFpjl4 z-{DZ*ZxB=myws_%k*f#*)sh$z(T8tY<;IHG6VH<__F*__Rt-z~7>27mwmKq92dhZC z{4}|%&$T6SSy*f3u%WS!R|}>4vMeI83`GLY7Zgt9}} zYxy}kA7nVTK7+`Gtv+ic>^1=sFxvz)qgI!gHM<5h$175raU^-t%ssnN&4*0v7G@<4 zK1F99sA-f>f>0b-NV4}l3&0=Gu5;2cn^waua-u$v-Z-d5T~dXm=(A0-or9!|avYDo zPLu@&aqrml;L`Z6tys?WFtw9K2aI#gxJb_KO>uEq|GfljAP$-e(=1-l3<^hSFy0;= z7_wgEGomI0*+1*Ed{+xEMw=|)lqJ<4&(H|lV3vY;Y1mUA!YTc!Y^}Cj(*3*kBoI#9 zc>nN35}z1JAQ)O(gg&NYl1iUUO_v^{*=bNtDUB7LEJ=cwDoy2Wn8OI+gS@N1F zT@7valg)*`R4KEcgrPE)VU>(8k%}cOfxM7Y+8UHgX4-wLAj!047&OB=tea~g2Gv$# z+dOGlJo`{k$~X+}YHmQsECkE23FF{rrH0et{vJ~hPu31BFGk?-iHe%(!b@yaXB^iI z%Tcb@Y!r}{ptNC#aLOtSoX!Aa44Ou2Bh55X;ls>Ln3@hV^WS;`7ch{@%%x4%cU9BLwK*F5|ks?p8MeXX5@?${j z&p@8vONMBSfjD*aJNp4m?(jhjgK2QBWr)RVpz1-|1Fd4DWU%TsMg^%swrH!dw3MS3 z&5|&$qn#Hx1v0IpAedJYRFuTeHgPS~%shYlJt^zC(VWTgM{ltl7W1_7JSEAbkpgd( zXDhB0@t8eGN=TEb^8UUsE{~?rabDi6fH*wp6n=hI{$;6vRa%5#B^>4 zBV&`>^61~JQ62S4+#Jsq7@kSXRXQ2cmjoJegCN122 z){v9EPC?>lgFeWm0_HHwZQSMz6n@Jy~uWf3PDOv-d?FkB?*NINH z@eJ1m+O_QH749owz=R62oZ$vb#owoFL90R-irO>Gt z7)!K8!FVwUs%O6rsWDZ-B@%eiNV%}Fq**!>Y!Kg_xL#R+Fd_$LX5CN@_OXVZPMb>o z#Uic+z|yL2tQ52xHwA3lYr(s$fJ}q~W!pY$~bu<*pwM8BZGUe3h`} z0GrIb*dS)=IcVH+tr0c0r}U);Jw z!PD6q`X;){5;)75N;s=cTM|EY9?BaQ?-uFeLOwQ5fFlpTV%%0LN8r^pqH^u{PaE2*U-oqPHJEJ2jPmQU->B&+!QC zhOJX;vyd-lm58Y=ACz4v7LYAkmY0Powr!H%%_m$`%&HI59M?F}#3-#Ti?%gLpnA8O za9D1}`*ii&8aErJBu9rpeXI#q`5;WK;nT;2aSJ!Di+9|X$U^d#&MQX!@;3%)^RK~| z*U%|1QJPzCGA7wIYEi4KP60&qX&~d57Hi2K9eq!e2JYLn{5~CtI5n20UP`yc@lx+4V9k!K9I;i|i!a8^H=~+}%baU-i z86Pu|pj{)g-#imHK9Y}e>s7MMQ;8^^a!;Lm=Pg{a>3JL-xac*D=G5!@#UijKAyk)4A z56f>DjQrqbZuzMY+RQ&7Xd|n|hg78-M9HPAp(k zp>A9WAq7#F5YGmB%qM;6w{aWB^2{KeNSM&S)V5d4a}QuyyJgm5>V<{3F2K9`eFP=y zE)N(9z3fSY83^!N%DR#+W&&^z7Qfw5GjSHOnD%B7wiS5XbJ6;BCHm$zy{aW&IND#M z+k=o_vk9Qayu5nme1o{`T_%rQ3F!wWTy&>|d~G5LU>gC4LT09qiEC3}zqAiccH@dy z=Ao_HeW*dlk4_2+Ik36~iCau+4A+&$`iI6j^0X83Z)um(!v5KHOE`1K_In-sQa({` z2m98iU@D3fi1+!Z2*??&vt<7g3344XG)p=Ax`}g!cH)rIPhhJdb^M|$4*{^{nH87S zL|acOF$y!akuW&~V5+l)Tq&xT8FoXkYd6F@wg47adTP^VwRkW<`q2+rj~yE*4&mij zaROa}lEH_cNJiZUNUNQnu7Ql&E6y80m`a>5bQ;qJlmy52W8sTefq z`X@Di{F_@kY?Tk#92_K|YNl&UhU&j@30&&wVKdD_#g`q$jh63C$v_`yp1cTxJ zfq`8U{R8s#BA4gLTz~?@h4syPE0>1xJ>WEqy&Cn}jE^IJ*Ei*g%X5Q}jzr*8Bm}#W z!0dFks>?aCKu+QF0TN2UVyjF(_}lIp=TQ?)K8>V7SayN}}x6T15RGF^wC%!N-swPEf#j%bi^I#Qw$J{t*j{^pB)kG}1aaDsh&j-(6eHHKx z8TrHkj0Tr1;2fvxgFjn_!Gs5Lq*bg-yOL^V>OnNU$KEqH1G!)XPv#kw0B`U@7&|Ao zmxg!Z<1tuhqlt9_(kAGNQ6bVMr=%=fXNyzdii^3qh_W~rlBuvV71x2wI3qH`7bG$| zSK#@l*NQazqh=22A=cUBsS!ymIns81olxT4-;^j`6~XQ?9T;Iw*oxJ=pH=t{O8cJE zsM*MwaFV@x36PfdeTa>Mw55oU6Lg;}4=Wro+2ZH`V#PFobwJ&)D@e+VLRRHOKU4Y3 zm5Nr2oP1GblGKD?PZI)Cnh==KMAiz_8Z>TJ6{WE$kZxI}0-h~b=dsWwt5mGM>&Q2! zCQ)4YmxOH9<~_s|xU~QkAZ4=J_vra2d=VEL^BSBRu*o|W042|Dt4vhnVA?AmU9!#c z#QfIDbAplLTeS2^L)?+#YDbYuJCf<*Hz!_@vI@kL!Bl{}wKJU+9GP{aWhz?;a)JqY zD|?TPmZ~k{xV_S#99O$Ly-eql;A;uBUYTX1tsBMS7E!{!;hNCeC`Ndy#MNjul?sJZ zrpc15)=fDqYK7I28eZU0Np~Tg11=^haS@du7xL1jSKZvk(O`ZHX<=z54ez#<2Gr^q zfU@4TcF#dIok`4TKeL=vBbw#pwxlU{)10PURGXT_xncFdMC5I#881Nc&PM=VT|z$o4UP@w^(aP^EA(6W^*I z+^Tl5tHqe2U=o}BraFRyfO1q+xy#o-bBd#hoc_)8vK;RER~w({=dR-L2yd6g-5*Jw zwhGa35@I|QqO0x`7&V_Mi0;Lo!VMqDEA6*hBhU}8jWUw8Cl!Hi=}fF><>940O*zB2 z#XwLs_G-C-0J?t@6xY@)HtYI>sElACK`za=5u;(`-o?>HpoG#E^!=uE@K*F%@v6%Fn6+wx?QtN;#ta}9~o}|*m^A<@*hQac58)FrhnYgs1U)8a3 zi)pi-SiO{_d@>}Rkb`hSJiSRyP)9v%0mkt&*Pc}9QYBS@RHIqrd3qb9Rbv#d@*N?s zkW~|FQd#P!aRk3lB`?DA@j-{Bser>KJafP0x}%|Rq^Y5BSSZ+=;7gbdiv;$64R765 z#P(3E>ziNHOK)?OKxB>b}ju9!fb zNCwSLy!j#FC!G&AOHGW()^(XNvV$8VzxT#j8*5DRDx4r4m60(q8N@aQ;*E~yB!gni z3yTpO7$%smA7YI-F;)^yKF>yNE>kbSkny1b&)3eO;tstff-{u-DbN!{W6+B}_aNrL z$_!OMWAFSh{;A=hd7}a7K%rrrxvRxw)1KvZRia4zM6m(TogB1&YCLFE%|=|@R|SFu zcqUJgIJmL)1a4-o$i+ESob^JB~t`6mT=6E!gq^jp}aUPO%(g^^4~Qmc#{c? z>RVWvnzY1##wbK?YP%FKC3_C^`7S-Sptg;)A`cnL5=@`W%M#b~I2$(BQEZ;@>qy!? zW!>>*9m~mZUwE_A#5TAF($f-H!07N`Lf&ySg=l@6R>?xvv@Avi!i%atyk8u)ppuw1@kP?4WIYCcmQqpa{=C`F{4JYB^3@&>|Lpa%7W)BnYh+mdvT_I zrLs95Sz$x+#IPLd;E)Ws*Rd31Mwzb0jxt?M-{-g*GjlL&XAVe4V@o#S;1;dpq|M2J zOg=c6Z!`&qRM7Nh6(_%KW5gb~6|XJglbAN|4Cb|;zBoDgx#s!uv&{4i9ER>160xd{ zkyZ^qi?NHciT=R0!5mg1%PF&2&`AwpyrPp%jpyX2hMef7e6}a;;`=dUPr22M4W4dl zw@LB})-O_QmEmukT4ATAa$2P~z!s#02+d`6AHjmK3z30(Lj$r~pN7Y@6IHbe%B4DU zh!W`4aOKpjV8~vcb^ugi!hzA1~m|rwx_b4?iA_q%y{J@bbktI0dcZ^A%H-I^~wY)%A}i zJKVzc%GGIkC``ZMv50PT2%)~n%Pc2ua!bZdm}+*MYNA8(hM5eSVW#G=P_0@*LhxRi zl4bMX9cfMs@x547mlN|C$Az@l-bGyZQ%T${e37JrN_kgcqPRT|lmM&74I0u|+L{PH_uB#W7qhW?t?mFeDS#zPFoA^ja9msk&u@^4w(rtCTXqvWU|)Bs{}~ z!`6nBbmsjwd(?&kL>&<4{Fk!%t3L=$UAc2tj+SFUmhfKg#5_cp9}|;4_U$S zTht6MPN(gsQW`hfCz9~RK5(iGi^$Wmrj8xKRLQ8rOy(J5e!U`SzFt3|yFl@58$97r zt>hjwuh0Zdlq5iE9;>0c-r9w_h?817ZMuDhtaz%)Dx+!MNXWqw)ESSgnB(M*K#4b{N*azkjXZgc9qYxryVJ4 z^yg;Nu8tyd@LA#`yPC0Wo);UrIXU6Ed99G=;+nnZkey)U+PaLC66_SB7ZAH~TT1&! z(@B+rFczBhyJVWkpJ%TrpSFQXJK2eW=fH?g9JYv0g3 z$VHdVAz4n1cJ^9dTcNnYk#RY$lfwo&HK+sbO=p;|Pq$RAQT5VG&{RkzjG|Qjr<}}k zUzQ72Y7R=)rCjZ5Vy08JPhCh}q+VA|fu%=1f+`D94CShsy*ii~tvi@MO4klf1Fa!5 zDkngdnVs1a=+2TXFFl=nV3G@#oYI4FMrEzmX@d4IkddK3x?J))Wh?dtXWGfGXgTVp zJWv|=7@ik{LHTQitheq*u%7`t?xC;h0EM@8-<&j{ks4fLgag@UfZm`zziZ)um z*(y%+c)n@o;na2&A)_22>zwu>%20f!pGkS;O;3zw%1CZFChTS*pO4eaknBK}N-qWo zU^xDQg}$zVQ?L39?)F7_>cG5uN`PZ;tFwVzFz%9x9@CoHr~~+$0Lg0^oq)cagClYQw<%5H zx;ahadJzzKa?K798#ujFp`e{0fZH`Ukz+ogffifBw^PRtuIGu9UfKbh=%#^CXpVql z-6*Y)8>5eUeTd_vs^CSX3;Rj~JNj`Z4KHzqC-H@qQt?uCAN-!BT&cNT%8lDdaojbr zdx(el%x)VV8X1&}?Zq=L6)yIVj_n*a(*l-rVH1%HQVh@6A89J%-YdRz7sZ8F61j3; zRrsONT|0*+`ti{pi|I3fMo67%C0>7pjb3!HkKytD!9ko!nDn{Q=l}y%I(nSLCtNnr zY5w|x^RqP7o^@GVs>L5$E&9U~+u8l-FBm*7p-MVI(dI%cUD84nFViV7RGqY+|^$S6)nsNk|%v3+_zB)({Q>pF$Y7 zhD#8Cu*khQg#~Hj*6_CB0W>#!>j-uY2#(D#_FHs6Q#FbGhFpCf`=j0q2 z`cRc+g)4DS1vRD_=DO0{wC6TKrD8>9sT{vm{nF}U;gj!>|Jkmqu&OirB-O1><+4~e7 zkg^ejN2?73a!FwVHFpj=xSPUFx*elrxtB4!LN4y)N8-{m6GH+whR9JQFIJN#Se(2# ztzwC*%OoD&Kw~UUF4WT3j)}xlH+4C#;!Oa#NSgE1Z!lH+sS|G6W$|WMn@kI7KVBDw zM#47k9EgXQaC}q+MPMp44R~G+Xnj)Ks3UZ4pt6w71H_}d30*1&F_1K-EM|rZhC@43oRBV+F{v~*6kUSsNQLGrMu?}F zQ?AMjcQH0VGI9N-IH8*%6V>0DopH zfx8*t&ul$+6NEdnWeI0yt9gHBt5F(Jo0%6tCT?nIW;=K_<0jKMVgnJxLunAs9+ zrl{Q4>)Ou&8K=a|*7L?QTMv<$Z4w&xgQQMY5Hqu7AMVVSfW*w!KwKFIIfUfQ*2?hA z*05@3Yj|||JScDhp4lb=W3q{vts|#qwjP4vsmJroHiaYuw=-KK>db5{W@feyWM;OE znVBtdc4n(Mnb`_sXSU4C%+~&tnXSW{nXQBAnXLoq+D4Nt+;gbf2;w$z&hRfiv(^6W z%+^E9%+^KK%+^BbnXPpj9UR)`MC(j+t&E!JCIB_j^-(*~wYZz$O;oUMk0hyeGQpYU z4%3|^uJ5EQc{wJC-4+urtUA)5y*Aqm&%av&9?%(W>%J=dn+nAe)Qw&LBnb{aBj!>1#u zlg#tv=dqIV)0J0qG8HH-4q8Dq*LK{TAl43t?t$818LpuI(c{*R~M)Cr1EtZR@1x+8&~dlQpE{$0{Yvn~Ajz#XvH0 zU@@L+n^1{Ub8UmExwhd^PBus?G}EnefP{F8IpwMZWUg%jq`9_XXs&G-FC0!Bf2>Z| z2MD%O@4PdxQjuQ<8W%e`RNlSUh}FJD3DnHC4ra_14<^TEK7bsasg$vweA-+wFMxOJ zJVWj!^#Z6{>Y4GcsTZgr8@!pJchTyOY`(A1fOyqScfAT&gB0$4t>xx%jvlYKaTbMs z)$u83^8>pM_Y=e089~)GUHC=&4v5fpExMJk<#Sxz+MT~dk&tpQBiqK8yYN{r4oV-4 zq+m_>{6mXls>j=Ucn2Kq0{2BBDy0$<}4F5>2zMvhje_Ad~@@q79bTWN|+!r^h$ zfslhbU!7GR!rVy|3%S5#3Za}lSZ-l8ueLaw%jK^A%$fLC{*HX^%v|AQlv{MLZvx8! zJN;QJx9am}=C1m7q`i6ceUQHn&+X(7e{a71%-qd*j^jCj=bLzbh37YTuEw(la_8ZB z2A)woQ+S$q4#I5~&kFo5fhrscycGs%yr@E#?y!A*?30qOyOzZIfCaMcs`8hB%b^68c!FV7*8J0Dm($6<#?9ip*Y^PY+JpF zGu=CJg&IE7)1S+Ieff55fLff{felpHiJRL_{5EXLE#kXKx!*1WH-H^bxS((+?VQcs zzhW|hT)uLW>(I|Qq{A&VrA1VW+^LS8^@9}(YUogZuDx>7I2G$00SV=PY<rgIt$I45~)kUOX67_AqGA4Id+?^XhleQ>ANYj}V=71b7 z99Q?n9bQ?iG*L?-rlH)&SMIJh7qLCJpPIv5?vt9|MlIDPxKLqeWPRV$X3!YrP9P5S zVg1urw5!buvV?94KwLi-T&bz>+_weYUa3vU#zD674nic&E{UP5+$>w^NTu$TPor8 z<~HOO?r|Q+hBVsL{OlFaYgd|w$16?RB3H&vxBgHHzJ3c`_hVu#ra*eE2-<*Oa4Z1FU}C%#F@)IfpW*; zpSo;_!Wh7*MSKfxeiFSg@-mk@-Z4_auDlc;EgR&)O46a|q%GmrUz?e1RBN1=>z+ zXO#QUA>_+6YD;;BvOSmEyKLxCl|7JfJ(-Ivf2XQ9Yv5BanGGeWlny_ z>*y~l%^|cPWzHkjq#@59T6rlV{Z7w&+BZ(#Vm4@D<;a-7P=|bqEb)!|AN0Q zovTkjGA`sAovT-^0UhsLeGbumovSYtM?H-*}1ww^jPQWBSepPu0Bfi zMCa<8h^jwi!0KDUqsd-gfq4WRo$cYw};UIzMo&>7Gw=n>G%L9YQl z0D24*opyXH=np~f23-Js02GaU{17O{RdLiE7d{MnHt1JDF93y^#p9qK0^J9C3+N)~ z6`7?pq~c49rOt3DbRaBe+~K)&^1qr3oixj1^pY)EufzPErNa) zbPn_s=poRTfgT0D8uTX6mxJC0`U=ofpsxgd0Q4Hrhd^%!jn0V+-vm7i^jo04peI2G zL0<)W8R)A)=RiLPdIa<}phrQk1-%*cE1*F0KFb`MNeFK6KFT+ z3DAo{-wb*g==VV9K)()p1oSPSH-O#%dNb%-L2n0r8|X>UFM_Uka$NXJ(6d2r1U(n@ z?Vwvg-vN3V=sQ7=fc^mVDCjZJFPsKG1p4_k$hYs}T)3>zji(SVE9}E_@(n8sS3L(dhUaQL*WkGp&rv+rzcfu6*3^xBo2 z2akZwEg)ZnvF8``dljer^xD?*T=7*!=(~+KKMm9Jh=&(Jpomf}&mQo(Dy{*nJcf?M3&kplBbv?*x4b=slolkGfBTqMhu1 z5ESiX_lhdFlig>5Ho$KHMLXC%0*ZF9`!diYpbb#8huud&7eSALwn2}9qCM=s4HWHR z_eoH+hu!ysqCM<>5ESiHcXTN1O0=5m*TKk@I#)88P^9+dKJfFAuF$^j3_ zK5|7acLU_cA6`~C@;}Q8;~mQx@6CaN--3taB7}Dua>rIJFQ9-6NAM7S9Q1g!ywDqi z;&~M0HXn!!TOPT*a2ikdqeN~Tbl+La3&-$~zZH<%2f4x@FE2Fk+>2-YZ1};m?{Uiu zNAZx{a_H9}xyLUrY{7F9PoW#Kc#c02{_v38GRWNxx$bj-x-ij{6U@ zy>&bYigNB)^+GPsjlmqOq;|}n!myVO54bXc)VP72&fWi(taxb#>unM}n5A;66)f@F8H~0xF ze|)r~a2gL_^LLr!Zb1Fx^utea!^48WQ)VDP19}Lw0(!0EpLFs63OR|)i_#ZyI7ltu zk~>1k^4#(*Ao#;C{ok@&`ahOnL6S0}+ROifqOy_y<+){Bax4BX{KtODKMd*r+yDJP zQT`|Z`lEuBKc`63rO!QMU?m-44&r~q8{Y`*|1balI~IHzZNZUZN8tpX?p+;)aXhE- z^u7SU@igcGpZlc9o&G~|ryuTe+aI)}T|3|x?Pu3zplFA>8lY&0x{iXPJ?**)v;lfM zDB8=eyFt-Dcbx`Bd)$@#6t}}&t3c82cAX1~_PmSwYqY;z8^EI-@7e;2cDHLE=p5)G zsInBaLg<^+!`SJESGsyapOt5A>!SEqo(qb0f8}OSgtL<7S#= z@vgiI6zN!b6cqZcJO+w%uDlf#`mekbl;gxdh3#F1(`!}~jy-xs;V9^FJSXvJcSBD< z9Ju-+{@{+C9DhLiLC=8nLp;Gr;LtN5J)w8-0C=P)$c?go0qF;QgEioxXK(>1^bAN( z=oh&9bzjm|IPvTih0|MB6z<(>^=b@3Upz)X{p0k*Yh68|&)OTtIKH*VK~WxS?*K)4 zt-S{ndab<=6zN&}ASmo&?OEfj=h|LSq-$*v6nd_m2SvZS_7Eu2xArJ#1N1gf=)LwX zP^5S51E5IH+OwX=`Lp(7P_5q8&TozVK6>jdU4`$W9lIU$2cUO={s{Cg(0f4d2K_1M zJ)qwPy$|&Jpbvol5cJoeKL&jW^e3PzKGaosD-16J{Tlc+pzj2KHt09Np96XqD8>N= zHy@ENg*|XX`U^9lM?nvPB7Y0CF7O7>Yr$iDTDTeXI#4Qqj8hADfX6tsa1ZF~2nT&5 zX!K#MX@GWvV%%D|7!>7E*aM1uEzo!xc2a17M>!O(1$`~(O`xv^CA&ho6>bF&yD!`c zigGEO0>yej;eODoK_3FeIJ|JyN4jVpT(|)AT2QJt7~d4gE-`*D3<7^8;h@)m&Vync zUAP7mlz-tKP?Ue+G$`t4VbyWAyTTgKBjC>k zeF^AhP}pH%2k6T{_kg}0bRP7jpjU%x+j!ukU4;uihIJu4`|zNA&UecP`EdS`PjLFr zzZMkvaX!_5l+XE8?~$+P-vr!*hu__gQgb5$Pd|K~8y@_fchx7^-+5G@5&n7Cf=9UL zQGOwv=TZGdI?tnckniW+0C&`b^KJvx@#H=QTY22d!oDZ0EcBjZub2BK?*K-Fb(${l0D9W+tK~UIXPvJA% zp7fjz3VZG$JB3~K^n!<7_6&l)1#}N6)-QVIK~XPyt^$Q!_go7KyYIOH^eE^pps>H5 z+dxt7J$Hekp7q=V3j6DM02J+3Pwum9|2=C!QQvyb1w}pT*#e64?b!ng`{_9Zs`Gy( zew6WS!E^oRx(YYqq3XR1kNR8I{RNg^-Yc|Yi_jJ0LRan++IdLm8P^M4b&JsaokD|C zLc{xo#w$*6xLs!pUAa z^nTC~^fYJ;`VeRr=&CPu6;^|;0i_7LLDztu3)&6Z3;G1m&7e;N9Rz(6=s4&(pqGKJ z1)T%!0d0Uj8T2a9r-NPt`V7#cpw9%o3G`yn+d-cNdJ6Q}puYxv4ruh{uEG}3ZqR;S!@X#91D#+dQ71Xac0>575j)0!PbM(!icu4MzC?JYo zE3_)tojd+Z#Q7`n(@h1Y{!ad#V9cI=xYKQ?-i;-L#!tBZcU}#OcBk`3P_$2-H-pZA z-VTa(q4Q4A1}Ke_P>(xLfycUJC-s|e2fZIW`m4?rKjr$|c{b?P;5UH29CQQ}?Mml7 zDEf;|>Q^hEN5Ny=v-2j<_ki9GihjD2*4f_+O6%+I13d{G?PTZupy;PMSNx3IyUw#g zUjn`t6#Z)FASn9n&dWgG4@&PdUIE$wkN&Uo8c?jab{+%08T2^lOF{1dMf=)$3Un5f z)}_(Dbv^+8ouCha9tB-Wi@XxVUp>PUg@Z1>61bzIf-{JSa z;d%Dz!YSB&)VXqbn9Ii z*YXt|T`TjQ|A)PI0kf(8|GxLI=j<>}IaagxOpPM5&ga9BatIBLLlPro$YE#{Qic>t zHBOPJAw^ORQIh0XDiuW}iKtYnQHrFxUu&VC-{F7#pZk99>w2F1xt_VM?LBMnJ$tY9 z{eHfm!~668E-8`fY3a$;swC8m)<{jSl2|i2f$l(3TC{3P^^_XblB=esB_vjfCe@6j zS4*u~BPF3~T9xEz^`uC8Vzf%l#MFdHN{y=N)v70_C6O0M7ur4ZAniC2&VzIeWL%|` zU&3*bvO&f{GC;0ZDge1&X*7uaNM#`FLJIP>f#6b(v14f+$oi0WfvgYd7>FH7(O*M* zmV!JByO8Q~OdORmLB?0=0AgoSe~|f-CV{LYX)eh8NNd3Jsb3-Ps)YY!}+8H z{)_WSS*nKa_3WQi{+07D@5^bBml3=#CmZDaa`HgFFQ)^@_vI9UoJYR_@4v=-9a};Epa-yv=f^o`e05VQF%|Yxkrvr#R=JW#b134uiej#TP$T;Q%*N;EQ zna}arK?uhy^OqikORWSMx70}caNJTeK*lXK z6J*>{9guNP%?G*e)czpjms$cceyOD(sqh05g)a7Kg_vS?dDKOwQUKppcw(Fu=m(tWyCNCugN}1xu5& zngm#$oFxQUk(|{!z|54af&hh-tRVp&OwO7V;D+R^xdHA-&RQPexgXX+);f+E|EwJ# zcAj;PXUGcT3G6bgUm}-A&5O^6@$!6);N%P$(jW+ z4_S*r<{@hx$UJ220GWrZBOrE>RS9B8SsC3!JI-njV#isnLF^@~5Ile0*jFrAk7Z!c zm*($cCAWm{k4*#Ta=a8IPQ`-j;W}fhIOcO=yFjipb_ARao&X;OtMv=7GiHE{M=T#C zUd4ib?IU0j$CJRI&w3vi^jYr*gFY+c6f5O*>^Byy@5x}$FP#Ghac&+sm)EC&LBDh= z81zfI?${chCtk(&gV=rS6!)g&_7D8x3Obu_@qm zupE34tN^EhTR_%dEbuF=r&!=0O2NQC%mnxI`YiAS_z)QMTk!|6CIiCxjR_$08|wfv zzp?%x^BbE4GQY98AoCkr4l=*7Eg$SeP6e9bjHkY=0jxKPh%1z`~?hv=9_hVwnLJC&iQicO=K!23VdFD-5tS zDK;*^NOEjSh$*r80hT4jmIqj#6k8WyMN({gfSJj$g8}BJ#3}>KONmAMf&%9mU?Jxj zU}bVl32+177hq;etXFuP6e|gEM^bD`fCrOf^FvIERRoxq9NQ3JMsjR>h$*on0am2M z&IDMN603_Hvc6-@1I$m3wGOa6IaUy0MRKet!1F(qe`R0jpRteZS&SEcIeR&XJ!WqK zvGeSMAoibq20Z`g&4*$G3sW-kmZW54EatH+B|~_gM`4wW4J%SI4)Qqv-haZ%zoHj@ zFP|GN=Ck;o=p>NukCuUae{?y>c|`+00Y4Glz%h0d-3wwz(Mk|IidGvI+EFy%8(3e_ zCLCi=Q3GT>McabKV1E$%kCuYidvq?ydWlwmtjFj!ungP}vRp5zG^TB+O^%X4yvHNH-h(Cx<0a=gHauB}|T?Mk9qT4{$Wpppdx{DqI@r%(S@)Z0) zG+G?4uV}z?F5tKU$E?3-bCC5A%>!A7(Ow|_C0YVL0Zsu~f6*YXWxYg~b6g5;0a=I9 z9Uy)zx*x=UM9+ZumuQ0#q2G)uU`g;k)-8T9+JR&IPP9LW|BQ|X@rThe5Wf*!4C0TX z8^FiG{UClIdJ4opMpH)q!%oPXaxa{3<|nskd^p~@qe13BH}Jz;SMDT^@n^a7LC!z7 z0%Tlrw}G5r?tTzE$vp*PC%J(?<$QA+l!o?_>wwrxZVwPYm0JX2H@WBXrQC5Gb3M6% z|KmJ!%Q$9ya+ibHQ|>m9`N$3Y9OIk2mt*WJH}H4(soYAAv8UW>6T=QBTm{75 za$AGgS#A#yyUHyBvA5h(5PQp=1~Tut4UuQ{Ojkj zeEC2A=KOQn5B~f6GFJTi`?!wu3$KIoOkX}Nw43w|AoG>J3*@}hkAm1?di0@iKGW-h z*j0K{koiw{KssvD5U-heNwh&jYc~^dSGnUegOW#(vX_KJBmWqyzz&0-44xmy^Z1eQCn$-6pWyi^JkL4`f1>9wczzboPdaxT z*jexsJinOdSvTQN(m5>T`Bgl>>fCYi14Nl{6 zetq%O-#@c>ekqS&4A+6%c?93LAFSjNj@6SH8FhIC-`5m0cm&_q7VO0%_`V{rgh%jw zEM6h1S04U!#xZ_4uyk2HSI2Mc*z zc#b?BS;u)FeV#dZA%p%5=fh(gkI0LR0gofE@!7m*?wX8@gY%d-=BMofbge5gGESBA zT|Bp8G3$iyE#kS>VD>70UkCre-_PRrRWI@2`R)9EjNhZH@n03Jg;y9`o?FUs%1S=t z)r^dCJ|mNB%jbJe@wvgA1!EHY6mLw+n7fvAhDUH5JRi;-xPjLycz)fv*MjHIzm~Bn zEn^$c??3liFqXk1_$lPIqdb4=+-t$uo_}ozuSL2320ViI24j7G9p-IL%V^5;%DLA9 zn>atV8wyi09G-7`?zLcE&i`E{f7gNMdz^bMn5Xk=rj*zE^Ze*@ukjMbpB9g-=le6# z;&lVeOp6NvmM6#a1FT4n_X;qQ8ZQcPLvp+%z~Yp6X^5%uX#wV?#^;Bxr^Z(WSeX>x z9$;B=e1CxXsqxAHOOxZ#H^B0gc!L1*QsPR0`6=<%0SYPc`~VA6AEtVoTQ z2AG!=pAz7Pr1<;*BgyfK05g;0+X58$z5oxV#*YS=ksLo0;Ev>YwGF}Z$??npE0g0! zfRU7VhX6BD;)MYUY4MT(^ZA|tD^lnyfW^u2H31fKT_L8#kA%-B#Vf<(mZio!1Sq7&dj*)88ZQYjgYgTnJT+b(U?eSG5nx_&d`EyAQsPGg zEK7=?3a~UOUTqUto)m8qU`0|~39yv$3o$ib5a7X-cu|0rDe-aPaZ6i8AegcxjF0iA;2e(gK=Pw_50JbwJ_K9{P5~Ez<=|7`DzFIL z0un#t`@yHdQ{XdTwXI?NjAw$x&v?K)5I^Gr$HdKeYj7GE=%>lw<2^Vg&x;p<4}g=v z`@vb@V_*e11Ka^F1`mRh!Ag*NAs%@%jN9=HkhmTXbkYxl*&I&+TZ6>ucn^?#H(m@< z7sMxlF;T z;9QXUBfbqJ{>S%&@2mfQfnO3b`R9M(r%L8O{O146p9g>UpU&fd<}?0JdvC&j^Hb$teyX1P zIe(r1I=|OVfW z?N8(|KNDlW`^S1X|Gx7$x@w(_yyQAzUvty3|N4FB-~Znu>+QezIs3Q&L6m>)ssH}7 z{||ac-&^`|ABTZOg9hI=WazNr#Ut2HH|mZ%M~}h71wSoYUCkYy+O%!g{<;nwJ6)gO zxyua&UAuMfabwT3um3;%Z$g!5n2s&3N^UrD%*5Ea^Lgg;v%f4PfCWDjo;-Laz`T1( zLtM)HH$JuRsm$QX|L`;6&$CbFox|1t7vJCV-1}eV{U0nkvZzty%SA^Q-SltY@b~B6 zvoQRN&Lpy(_x0YF8R@fc@IL9^-~Z9x0|$SLM8tc}|K-2E<$u!?|HY!<>9b$(|Mhk8 zfB1qpX9a%}09x>S@CbhT<8RxF|NUe9xt}85-+}l4R}cQ;HRyzafYp zX?6aoKE5#K1=oM!sf{A>{r`Xd-#P*bkp`R^kJ5iW!-Oy|6#m2WsZqEd-dvbhCvx|H zNM0O&^w1%h=l)MLH%DwCmWJtbr zozzttC5@M+OHWA8Nh_r{r1zzx(vQ;bQi^<;++6nLw(=nPc6p-wh`dyOQC=f&lE0Tv z%e9r5a=mhsa=UV$vP#*ge4>1(T%tBpUG;i3SJSkswT{|gZG?7@_MrBx_LBC7wpaUF zJFO+?>3Tc;2EC6yM4zgc=?nBF`ZoPT{eb?1{<~hqsA)7dG{ZI88wJKNW3+LfF~g`Z z)*5dbpBq0I31*5}+qBKjW`A>xxx{?k+-V**>sU=K$Leg|W6iRbTCZDk>_zr6dxgEu z-fZu*_u5D8pY7l6Dozcjo|ENV=~&J+PDiJ}DRc%pqnvThG-r&I1Ol~1tavMf+sytg>B)=+ekhja9Fp>?G%M?jz zr{pWWltId3HgZ2xfTSLEE&)0kDgY;5;vOZHU*FVt@>c{lo^bDiEk!1+RZN^CB9^*k{ zk@2jt+SnA1Xa=t^IRl&_&S+<%v(DM< zeBkVNes)efNp2mtw>!Wc;ojrUcIUfG-PP`2Zjx8qYvReC=gj zm@Zu=Ma19_fg5Mz6~JH{l#DgBxla4;!8NsvldwUt;5!j))}jg z-N?S&ma&F+?2qlk_Gvr8sqQp#x;VX@A}nBvS|^)kJyyw=`zUU#p*_f%*bo4tMBA@6(dw71TG+mGboL$Qky>NGV^ zKZ;eK&`;}WMuu^zahaiTWo?X(Mo*)VIhbTT!WBMetS~lU-ya+Mjqi-(MpZM_yvS@~ zUSZ}k9|h*kWCA}ruCS$*4kjbX>DgDzOa6>PFaa|x_z;oWec`uUt?cq53xtuqwRa_GW${c8GAV^ zW|RGaz1u!we`}w#|FD}lai^)%!nxMz;PiI-J0;FoXR`B-~@XPyFxv0%=>Q_K}rv76XSyai767$bdajXYbTS4TQ;a8!HO5A4{5Y$z7HjcZ=6$$1)m*_$e`0=N z{%S_7T2|c3wc0YreXYUPoy_sW)8IIlbJJKwNo_qboXC*5RbrMcJA>x>;Q@K$&Syu;qN-f{1g_m`LCSMxLcy39ut zKhxL!YyB?%&CJKW{uF2xwMKdi-PPOZ_vowii&;@cjNlUE zb>mN?j(L^Y-5kbxxyzhvK4!jc?l-?NZ?(o*Q>{m>{@yHai+957?oZ%axPW4ML_kbZ zq=8a*`4zc}@~xVNA1ybAm{aUFPA9K(@V?Tsxly|Cm+*s_B-O=(wUuhhGvw|{nWCsO z)GyVcT4Vh&y_wO*yw_B$8P=E9Lw1In?F)Vfe*qS}+dtz+%IM$madm_iLK`7XY%dmw zV;H?1;t_1Hw$x1;Esc{(rAg8hX_{1q4bGM3OK&Mrt-H2e`^ji-x@IS{+?;29VBK#I za~3*#{75;q2%p(Y7$wXSvc!(kE7H%>(@LuP3lUS-S{3pfT z;&^E?=e9`tQu5@U@&x$-c{*daMgBycj`5T+(R|T-jaeOO?X*@Bjo#IQ`n;N?Woox-rP`a?L9Gdv zHc)?6e@9PZtv-vD?KQqJ8k#aIvE8&-GNJ84=@N zW3llzk>P}qZQf*-nY+v%&GuFgyuh>8D*XF)JbNcR_W?W2S?pZou4MLVcx}ChiA&#j z)%})!iC^Z=^Pl$D`G@>SCHe_YqcOhI6*>wf!UMuWeC9{kqc8TrM~)H8#Z6=`H6%+K zAuW+UmrhAlQb)jOZBu`O{=42Yt1xKbF}NU8?_-}UbtF&7OQ-jG2LRkYaBBoME7CLZ4>Jw zD`HP~On0rj)162Lkr3KnaLy4iDyE3l#0;^nc%?X5+9`i5e=6rF^VGv?GtJYM;~y>~ z2il_ltlz`uUTMy<=34Wua%-{G-tKJoBJ1l<)F0v$;}=Ie(}VmZBOwSYk?Vy5p^wmC z_(6!vHg^4){F^*V*`fTYWU1p+Q7h5s=##D4jQD3(3*zPi`vv=R=RS8PE9O&I@p_OE zZ1X=i#Dr!mvmf;k_#$W;ynE253;1RBvL%AtR;ia zQ2XNvJ7{;1)$P}!dbU1Tf1OCt!kCALTZIj@Hv5`Sn9rGSnIbu_Y#Cg-{=Zr*_$F}{){ol#05+X}E_lxnL z*9qf<$A#s>G2ss(U2Gs;CC%(=? zXlE1~ql`z59mXExpz)UxHEWppM2inO=XA@qh7eibBCh^nRUvD<(e7r3_JdId4=ef?`a z(bUNIf)QM3uMF#&W47%~avmoW_gM2;-W9~?Ma1TWND<%NkO(tgI4m?51yKX!6@qbCNm5oMs*}bF6o))7I_wOmfmx=O*V4 zr!g6MA(k=DEp;ckQ`~9T_h9b{Z>zW6>*_!6@9=l|d;R_XLH`Igek_dH34yDPTq0yK z1O0@%h0lc=Vmq;~xJ2A09u|8@HOuREuef)|u;@pv}@&Xj@n-C$w6u-PU@4 zu5~fK=!hOQvW?b8e{%lCc%>uQT(;So*fEK*-ongAt!(o5{^ae8tu59OE6RFl&6rPO zeQzNjk2=|8ayuNV60$Hd;j**yyo*Y|E;HOsd`0}4EF#Ed3Z#itmmkZG)Yr9Lnxc2s zcj)PcPDOplIB8VjTPK(oetvg6;dElh7Uzf)bz8U#-IZQD{~`bNU>wU6B2$3vjNel* z2Ls7Y7LsEGeykzTXiW6w#CIe_N`N%6vpAV7>L;&;kFo z-1x+(N!{L-yr9s$)x6)FZLTqMv7;{Djo!O{dKEtMq*hh0t*c}`*N}yD)oZCZ; zsF~_I4V)%UCTp&j+Z9V(=hX;UpNuMz<&0-c(1aI-ZA8$S;HO6;x@Y0mjPYFuUxHXpF=wfEW0ohh96C+-=yiRXB|ym8)q??ya$B)>|?Uyl>= zm8nXcT-(EE@yCT#B29qm!eF7V`kY#wT;pEz0X~5zi>pKe4aRA5`rt0sb@_dlGFx9_ zo-`i|UN5T>)_RZO2VU0un>(yW?W-IgUL%MvQ>c)ib?$JNc#-ldVJ=v}I{8BURa~uJ zXz?jVHJF^bMo?YOgpJukPI;p}+`h{$hDUlB9%;F=f(-0^C&63ne-Qeuv*(;9bdfJL z9BPQ?jJJ#@@U)!MhANRBz?)(r-m^#@q81ZbMw4rn!WLAL?VU2tkQGN^J*$}+<_c>g z70)5-xRq?H)E8S}UxvU>ZFTp%_xkgxGC%bX`#<}U9aSQ&`P?zW65*h5QW%WwRmktj zyP4M!${b}I^-f1}iinYEG&Ky?@E#)(#;LJ2&D!D)@gE7!`(TwwaEgD5ms1<}h40u& zj{lDKy?!Z7MN?BSTfqr-W%PzPvz;~YW+||Krhk+FC^bfva36Ap@VT58%v+>tKmkS? z34$ubzBPU}lFaI?5YcQ&g**gq@IE5WGFZ&b=6kS%Ct(Nc zTFouhy2k2a6^jk_=Uobue64qb zce8g7IpZv{mN%#p_IjUt5kJ+x2#%$t-=6%jFR|`H^4vxKW`8?;*J0Lh)yU#-9I6YA zglwS;dE{-vNO-RK!n49l#KF&mZyBR{F#RpyxVnp{rMKlBRA~p8>5Iu=n!&*M%7e-b zSg2>H)AlRhD8DHYHJQr%M)g+pb{Ll@)o0X~)Hl`l$Yuh@CE%57h1Hrzt=2>9L+(6H zTdKXNy-W>IMNie6=*@@@J>c-~(kJRK>2K=qQKK9tDpWPnj9NwmL&U1CGj2788e@&g z%+*3>=|$sL;}7zlbbOh}dcF<6G2VQW`PpTD3dhwLe(MTLuv}Q&&eXSek_*kTp0J*_ z)=)#dX}!lxeQo_<{Z3Zikeqw~+34-|{X~duaF+X-qiiam)=qbr%4eMlEbATTbLS`L zV)sh&3d8lOF8aDf?r<{52i+O&ZdT1<_gmO7#j~lGulKq!LyKXp%-G$!5!@@FZ>Mc~&-&3(B zi&@mFH_;UsC5{v4i3`ahUKC#@bNC1j@_V{5)ue{fqsoERj}8?@19k zS*}ZVS|ksb?~w17C&9F=m$!zUgTwN-@^LvsxmdYMQ50M0q;#c&(2t(XSY@&@TbWNz zaaj3QIjJPWvN`J2^bu}_XInt-`W)HoHZ@(VtzD`$*IF~v!>Ky&)n;gq(XXk{*1$wG z3f693)zEK#PJN%kEW7j#j@cuf`OX(k%oqJu{tbTbU>x$RhCb&9;Wy#1m?Jf(CiqZ# zU)fFdoCqJVP<>IoRI{+B1=^Ejgty_zPFQteN-TSVJ>5Qn2Z<*B$rqu@0Ba%>Plm!KNa+QT$PJ3dk0lB@ug}c8@NpHg(1R3vf-bF92k=U;%eeVefU6LEUg;Gphh;omsJh( z#&r5WCty&{Fq2U^MXo0IRMt{QNA#$kqF2*1^tyTjR#YbSLQ}mt?69I6dUvy}^}dzw zz6QTnHL`_|%ZHojA@m~e=`R#<2E{Npqp5*Q$%m&1(}XhEzq$B@a$&Ksl)AV=SS73x z)(IQ1!fnEKVUM(%9MjXP{p~fEQ?ajtcV0*LVT-Yi9?K467wp!4YT_ftQTUjDk3e-< zy9?~Ay$!69ZPZ>nyj^&*{oX-x^`qV~uaa8*ly}Cf@L!=9ve*CG|1B81imH)g__1J( zSVBwT26*EU!o4t0(}nfIR`RH?gkQ+$Yl!uzP_L&(D<)r@F3u%S4%Wz*;t8>;RF51b z3y$<=X}EL`y`v|kXQbz)ebOQL&ML6;S@M;#2(Nb=t7Mw|IBeA_`8Ak;A7SM)luH#+ zG4O>Wl`;6kd8~}rlugRp%CE{FN;O!ktKk2xRXY-SC##RaTfL&b4F|o4>MmVtq+OvI z^fL>zo3w{vLzdtPx6*MtKt)?yZ-_Uv=xGN2a1a^#Gx{3+E&XG%(76dRu(8fmXD zRyQ%Lzse~}edY3SRowHM&Zw}-QOOl!!B%+)<=pj(*LV*M$&u65M5`>26_rlXf*w4i%)z0sQ( zS3)mumGPSKUf97q8{<6l8affTl8FSfI-6O2n<)3K`5O#VZFsQ`)(zGGtHioDoYkk8 z)jifXbm)@9S z;Xmd-=dWcIe@e&u8*)l=5ti^p!o@jxczgZ%@8rDMJ2$kfTv*dO#Aln$n z9dHkOVKEQF;~&+IX_c@dr$Wy+(RhGf#4O`6`d&{PFX4f9n|0g<^o%pTY_BO5qyTSe zV1aq`THAUZ=pq+*w|V2K#Fk-+?|FO3o__SAbgCNCF*N;|=x-;sS(> z{6Ez$#V6ZXK`(t675F%PGr7)wy1IYpHI0jmi;cdh6z=9~o(Na=df1hk<|SmuJ{pA{ ztm~&>(cYkHJIIRujk>lqxlJLRiwWeP^XT7wN%omw*C7rnwr#f}pP7kzVTHYcoaPgH z)j4FHSCeP=r%JgSzHgheo7&-5y43aEOWe!cLCo}h7p&hjI(wHhc5Pq)3gI7~^VWE8 z(P#Y<&m64X4*rdPkv|qCLy&1cORip(|3xPf=`JKo8x&J*$~Xw{Sq4mf9(h4qt%H`& z8adD5d3wWt;p@uiOV2egWDQen!yaX?vG+MeoL#9qnT&XoyU+c~&1Nod+Z zde3|B1pIp>8rDIUkRhK?i(zF(Yvbs@Owy*1d6vP^%w=_!(>Yqo%nYJmo=kqf*Q#yz zAw$2}Q9KW;o{DX3qZ5DHi}@Y>J^l&mi0E1FhNx2@j1}eyi=>yN_524pW93fFZ>Bz7 zU!fn;uYni)(dcfD#0M`jzc;_O#@S1q>)m_3OzIg_@vNwdK9e(@rJb+xfwGQYab()*+ZQZ4x!xeI->*|4N1~q5{|%%vagjbE_fT zh)paf%c=^$Rz=DqH(5a5UPt!HI~t+}$XAAQe(x!r)kMw4vX^LY;TON5vzbobm#5#2 zPdTM$8#j|5%%)CSNB-5y>`Bac+1zI)Svu9~bJji>@k}%uCHAv+b(AZIsGGZCQG47= zna!cpExXCQn&GQCxAJJnVO%7rLO0Y9&4|4t(K^U5RQ+JYc1u;1I?5%=oyz;fNlCp$ z-KW;q#^cqxqy5=verHN_7kj$X$%Hot{fvreqyrzDC|@P-Ca>-aCs|8xrC(+YpsM?d zcRvlQdpV5mY_ub@sfrWb=I$u;KwrAmysq#%tH}{B!}stZ8={e3K!R|E&{J3~>=!Ph zCovl~HIbTOptM?QCNHGx_6BVG-Pm+9+;y0?>w z%h#Z!xW&E3yNUWdaxfb98($=QX#{K5TI?gq%;{D6aSWD|5J>VR>oqZb?-Ol;b5#3wdn)u>DD|InYeCYFKqFiyEgjRrB$%o6w3}v9~>$=<>3C%x>viPv`AzR81d|8~o)) z(ctv+SNJ~$=a-on_OBKTE2$seXO6z58hcvIL@#(oYA=_{56koAW%6pd4*G{r$)Cs5 zudGU>oIv0DkUqk?!@A4bZKULbQhWoMALRBI8Z zy8TPkScK|uy;jOPf7$q+&ZJ^?gK?OLdg=gi_%c|A;noW4L+e+o8nL%CbM*vW^q+0X z=>}uD6K&HsP7Svic~iD0z~OK8cLf}9USc3Kh}46RxrXdw1y$e;RQ3-O6An?O)RrdF zhpa%)_7(YSefe?}Lw#XY7s)$O2-QXnGl1HBF&XNQN(G!t15HQS(jL9R5bb_#p|&CH z0@l_qgLAzNfBqKv#vc6_{VRCDGNRKe^HMrR3iCRg>~W&C3~r-96T|xQQj}DagwsL~aVq+# zSH;()ucZ${MN=j{ush%k-$NsDu{scr=r!z4)HS+z58=7~AQx_lT5p7LCk)+du!CbfyvjpDzJNT4e=Lahme`-n zWd`}m(=ZV0$%T*76}yreF`s@)9~krz@Miasd%UTCz|2;KF}ui!(=juRUU;SlQDts6 zcA^LTg1Gpb(FB(JI_ijf&FSW&Sip_()ZF&(w}JI>S5JECQv93kVnY($S<)XWprNC;TfM-Rx0Zm zvE8Vue?G`2?*S7hHPQ$JM8nSu1=h45Y7@DAlBg*g|S0b-+R% zrH}I}k$jJIExMr!d9D0De3OB;ubVQSzQh7$3F_QLy4+Wy&~2+;#WfV7d9G<)1hdo& z1?oI&8vXhUdm=lXM`Mde#b4wIm-WlY|u z4_8U$88vE9dm69`9q1(NG(LsXQeY9m6{?`P;P?I3eM;{JfD zH^Xa$FKj_|F_~5PIIO@{_^HG|@=Cp56Grod*oCa{dMfeP$i@OS-zN0~uH!n+?HKv% z30S@}PQ;D6DQ-14gD4QGI6Dt%LSt&mc8o}%dHYA_E)k|Ls&&!s(!SL^eJm_h3el}I z`N;@ssOeNt|LBS&*tP7KE#hH1Q$3FedBug)QX8?DL-ui0zqOng-f<^!h7LNpNMe{r zCkSy-r2pR;Pdx%(Fdc8O0u{_olmN%&1f>>QcM&x}U-WAeu+duR*VmFo78s4t&c14Y zXdfp^)JF}%XYNQ0YmS{T7{{dqc&V72zzUDSiMNCY>WiP8K=#>+TH_PA03EHyv&i^{4cd|_w0|0|@8f6rTe zWuUrN3r2mT@wHLkY-8SOzF}>%2Gi^9>%8Fp>Qa4XCWZ606&A4tEYlo$o1CiLh8ioP zTIy@$7M}JB>rO<6x6=5@P|b;EU8{mK%&_Y*-lObm@vdFTTav=Ow!Y9^yn`J3Yw0Vp z|3zeMx#}F^Lo00zQL{*Y5wCw-&ola=ysvFuk5Z}{S3Q#q?FJ&^5%dF(INKeanAeOr zogZYi)O$%`FD_dcK*y&#YLD*povTr6ERYUMY0P3r)W)Ng8>qob(Ve$8Cc^FhY79dK z%l#n2y7C43wM)#m7}v8b({tfYhk1C!o9Jy+_?5x;6eor2K@lDi-X<^Kf}NZYYvB`H zqA4js^SKJ$#|hLjS?pzKLqGdo7_}?lM7L=_pq=PPcDdgE$iCmXge>ELH^YC==YA03 zXEsBd9bdk$Ko$KlDTX} z%XTY@@dMt9;5^Hc!u))x__It>R zGODYAPEXWreS`1WkrehtBjPK>6$hN|Zx^p5oxy z@4rs2s?_9NZ;+FHN=NS`QRpJndJ>gECp4@>)w|TGSlxCypWNpptRj%C}NDh6_dhr@&>tp#wWx0}LspONb z+)ik)mN75KsT}GNYgNzpt_i!GgW(mQ^4^EzNb_s?jp=F53c18HFxqNJ#KClXx z(p9(>j_z)h`^)H8yuvEpC)5!ov8y-@jlvMr8=JAUtK`Wjt)Hgec$qqGHd?vGbRpCA zdio`FOEfCzYf(7$(O2r<;8!f;BUaQE@aFl{AdjH^+(~cuQnU$yitj~OsY+Ww@ARTm z=6&j24g2vJ+(&ZcDCc!l*nUpSb4HwUPJz8xS|_zb@4r&sO#FXPX-+TeZuJ55a^)z6 z58xj%w8ljK>$KZo8XjPcSJksnOB7NIJ%A#7k-nOU9Ye?4`J5hV1>KfI^!96^0Bebg zcmx`-h2-@+(ZD3or54HU`;yyFM+vr(>MiJ!DJY3c$RyUDQ+g_7J|)g9BK9s~YF$@x z3)~WS7D|wP=Tx5s?6R0e&a(^NuMrCVZGpWNCWpS@V)jhTCF@xte!$+OS*Y<3Dl^ol z)ECr+bi_aLlKtC#?k5xa_GQ9({mR?&F8Ky!gK`&^^*o)Clj^nFtJ*j`&1a|wT9SWE zH&>g#m<`DGd*Z_nSu@coe!z~KFYvb-{k7?=zN%Cr54#_-`WnFP-oja~Mvq_Q5BDeg zbNwgj8*MwQnXkvP^9PPU<`!d9*~|1_Vo+Q6j_L(w&WF4ZqEdzaDM>xyFVOY*Vg$QiyX zL#PLHd=0&|QFLt+QBJDpr3O&>&qn35Rm^9vTq!(Q1uR7#`ERj2N-oDTcc82&q^>K& zIyW$ym1Mrz>J@a@d$VI}D$(y%vbk^6hSUeGwRZ5EW3b_8;g>%_lUjq0pGj3P2tDLu zmEZp z_%;^v8{BA?-NL?!_!(vA))UT$bO%g#ushy;5wDl&^(G@e;N49AmK<`M-wM9Chz$5v z=@P2@)AC(ty7wx5v2s^?3$=bJdr|hAmykyW%=KF9BDsI{C*03x{Zcw z&VeVWPaZ##h#9Bz@+7Nlt-IALhG{BCOTP<+2KQ_V<4{yc4Lw>R@wtqC!v=bqC+LG` z!yOf{8*mae^%7!LYw3RJ54j56!!!C?G?CNj3554TcE`A1xH?Q;Eqdy2qk81r z51#$}M3lU1g%40VzawpztHZX;FeGaKZ>?7Lco>#HZI$ZzF8sl6n70n}1D^GK(#NzIrpXdo5e21T>(E{nH=U%bp-`}ygvIt57S#$*yWi+-TIL}oJ{qM zVVW}4`+Im%9Zk$B+j7P`TOEnc;Z(jQxa&;;r}~RHT6zn{qpqAo7X6!?PrZC$=ir1^ zR~PZrgHbhKf?dBuHged!k}lXldkKCb#d*Q`%&G3a;=uuNC$|bdGYd6EUwYkLVBglT zljDTgmDTn>n)x(%)%MC@SiPCb6IAG_Y7gRGprV=uXSfB9;sl&fHq1&vxaVXc+Qyyq zp%Un}i|icgk9VGfvU(S5tuDT~fF53;RNaMNu1oG)z#5x{Pu|5|nYyqo!x-tCsU&`~ z?{VU2ea5jTv=KX_#`p(fJt)s5k2|l2aES7)^?y|&RB3o3!GO* zpoe`3?(l8xSM72-e+Ag=G_s2=`WHmQuX!A_2&Wcr7Kdm2?(2K~BT=tolAdidEi zItAQAE}Xk(#RKf7nGSQg92Oy>M3oeF(Y&Bs&W@wQ+O04i+x4I$aV=hFmH8C=CDQCJ z?2LE=by*X3Rc5 z9A`0mp{qH0)K80?la5a8n+4CxJ=?3SH4zP&@7uf6&B6rt*0kVDh@6b!$NMYPE%_r)Bt12%+{XE%&c<^?5cB_ zndKMIjh%-_-gmb4$V-jv;@ktD+>?m4hKjF>sEK!xft(PVpzqfuhkEQ*X(l^UJIJ@f zzCA2|SZQyd25RCfbb9(xRnGF4uv?T0Ha|7Y`x~N1x{^BWdu*;qz89V)SP$RG zQAMSG9i!YsFLA!I4t46E^b{^vo5QNzsNO*iwGOuM7@p{2_|;Y@aR!iUPuCvRp466U zo9NPirTwW1dP`j~E`|x)Z|0LZ+o)oupxvy6mitny-^Wg0bOrB4th0gtSzuFzsbSx_ zSV%=bIf58nlRdyMv4f}?J;aw)AKq!UmP6EQk8^K; zmh{%Dl7VcNd$TJt119}r%|Ua1k?{ss`>WC2+2d@*GaL;x-5bvS{aeC?eBIgJX1aN$ znQmWcKW*Q{Dm1A%Dp==#xtF2wET>ocv)2&clp5x5m(el!OHjp`tg+K#3#lV~!jowD zvta}ul;6NhoM2yfp>nAjMD<40m@AA5#wQi_rwFCsP#ESJu%Rzu{b#js_3(Y0*?*B5 z-Xp>i=AgzqAji4KLsxcrys3P|-q^#`GNT{tNRGu-Lp!RWO{`4tR_~LbtU|;XluNDU@L;P@=dOcS-U6?-9Tn3qx;*<~B#*G??-(4(2{cV-P^(4l z6uX+8Vb?`x-2~lQHa)AC>_lv0rx*4iD$ma4y{I%+px5~vo-12yCblAfzMt;!71CJt z@LtdA*`s#TI?^?tuHRwSMECXxI$vyo|AsTr|2Nipd)zBFTq`dN-=iAcP36^^INp=& zeyRSlewEn~&M}#LCbULhywu*v-+$ti27TYmv~cg-yTW+!1NMm3XLs&2rJS9)Rkc$3 zE}dXNtDvjPb4H@O+JO2#8UKC@3YRbF?lz~-Jr5ta4{g$EdM=IpOMMFkaZl7#WBu{? z__gPKypR^|&1i%!r6)U1$CBUA6P_f;e**^OH2IGu_N3=L78T??aV;9*(_$lb z=CNCCA9;2oIxs!avAjSw+(@zTpJP!qu2uFar-`l>_X`eLO&^7McurRd20(Ryjl7H-Z1DLrE?#YT)7jfnT7JZ zaxK=wZQK{&ez>U%cMS$PXmfOX*OAZPtf!acuJ3IK3U>7MfKUCF zedq(xseXV`s*2T!{jyuA%D*FL?Fhs6JS@wnaG#A?8C~4ls1cup?cC3`{NY~hwPTl0 zf2y0O;NE^?jTHHJphPQYzr%;9tiKO3pwhI+8m_S^J%xL)q;+VaM!^TZAf7~jFa&-- z=&M(uTl+j6nzz{deTXh~HKn$4HP#eVgol+Y*n$2mSJRFB=N_(OBVP45R}y0nTLQZi zZo_|XGg_0`1-mbQG7Y?537%~gp6gpHhH~R-ba>N<9f#1;{>++Bcbd^7E8U)gEnmh46{cMjRAsch`vT;Sp*{3fbmFYS7oI91f9lcH(S`;kuquHyRDtOLV^0 zO+>}4!K3sbip-)`Tu)>;W@U4~k~6mAII!k3+5LUOsTbZaW+vVKT?vfadV26Dxi?Z5G@NJXVaVaVr6#Z&d?9`IJ=pl!@#~Mj ztdBPHY3?EPRd}a`jm|yp{qzv#;3r zFVmM*zLvYGwAMe<3(xJ<-30^EmPr2?QN09i=?n6=PTch==qtuioIOA#Q->aKKXj#w z(S5T^iP|hJ>`x`IJ83kQvWsZ7lMdKq`LuGadXhT+Dwv;P*2VN>=W~~#WcK?mah3#o z|KOm~!u>NN*ipHV9n3TFmr1bfXPJRb+&^MBs=}{`V)dB8sVHP#hRNBZeW7(?2K(q^ z^+(`We$?xSJK3(`-b#IpLG1K+4AsvLs`Ny&z8U9UO0DR%^`gqT10BUe>bX^{j;&!% zbdY@YICn%z#Fsf_K?USK_mJ((gu{Nx`j|YXA?u}=eGB{irlYUdVO9d&!5Z#7@~4xE z%KC&GL2Fw=Uiln(ca*#52)^wP^XCNnFeB+-^5V~6F!k&U+cCg%!&SoQhv7`D=`bFHytg|=FyN@dSweY@Eb^R=O?7{5% zd<;czaHp9F|J&*grlmF-r7P*QvSzs>S4Zv-Fbbx78lCv3(SNLGH_txldhR{+K0dJ$w(fPh%+=in?xkqCf;&D1 zYMq?{a$1mB`HOY`cmAFhMf1$MGG(cm_A3y(pM zI+;6`%%+Nb8ddNbSlrE_&ih+*-jU4o@SYV%(NpDcKe~=oy|>Au*#-3l_gy-T_ix61 z)9zAK_E4^evHBAB?+@5ylbpH>byjaQ{R>%5DfHm;P%8B?hO-mnQ54&oxUv{d(Tcbt~&1RnqQ zJrTa*9zp_)q(KMc8S6)9AUx{?MlKPJ^KRxF^$7V|dbnod^hLU`{_p2b7^~rjKjVH6 ze+rkAJ$56H8%+K-lju{y>>eY73^Y(pxbs>&c3O-?rTPGO{9DDWCdoDAYvtbZFm!$Q zaW9`0)Z}jvgN{=5{Dy`#4!0sJhSG;zt(bjQPlpPhP0Dr@9#z$v=zE$`7j=MleVsel zT+etfr=qN>$JsqGoIUGv*%7l6Kf4{>{Bh=>8FSE${`UxDJo^C3VO?K0d~*@Z=Snx< z3+^)&$xjb!*4;vH?niSgS27I!>K)|6$GKa{Jt*w%=jR5kzU#;F)TshM3j_0nVVdZX>`H4K?5d4G|fK5yb>SUFuMi zs;!5LqBi~ABdxQW&7Vz3GEm?PUowgHzRz>-x#ygFUjHrr^LZ*U=F8>5Lp=8$rrw`W zm)?2k7VcCI#{U-EbxZ7#zWWS*@mS!E_})GUyL@Zl60mccq{4qVbYn11p43_Frl&@} zI;uRM^d50(pYjh4UXCyNR=m!ChO6l!yg;8Md*M7-mh0)spT^TwBg61tnUP(GyP4pA zL$lcb;1|7wc`J_6a1C|$BO{+-C*WKV$a~pPd|cj({dbQz3wy+A#6XBQv-!}&6!lzo3!@~PeQ59s?#w1#9#?TNx314#i(L2EV{I`pHNy!Y6D9Q#qbf7bU%gRBhv0A%}We(hC**E5-0 zMOx3zOuoa7Fi7X%XMQnA_w0l3KlmrOX+J~H=*Cz1S@`ysn>1XeTaV#GrKcTTlI>Z+SZes^+d*FFEA;xhl z{OQnbpw4}P1A$Rc=f#27a8}}h6s-TRp$?}>m$>KPD@i%J60gg<=vg;0*KgzZe%hhE z?D{?T&;d4!jvl%c->&^FA3gL%yb7;{k-H)IVsz9$CzarPc(Ec$_jU~}w;N{dLe!EQ(NTYd7wGNG*Iznx8K?JFwl(j;hnPUK z_%htu_vw_+$8Y#Kkla&`q+xmPJaR8;+{Z%SVB7Wucmt-{t38IJ!giXAyi3R9)|tGH z6ZuBe)Y{PN&_nkHpB?Nc>vNKN{8`+7he2L{gsS;1*r(@=Tr~2x-0S;}JeLi&0;t=A z|6>O3W@Yq?qgSK5fE>_W+}ii~3eJJM{pYX+eaXO;)QL5IZH;N+)o@*v!74~P7I-$y z_Bd{&Kji&<7P_Gge|al`n8d7j@(U>!~c%BU_)LCn|v6R|I#DxB=rJTgGuUEyfk;S1GIJI zEb=N3unBaSo%zey{JK8$h0s5R?h8Ga%%q8sYdNbVJ0hq0is|UHoorS>?-yd)dz6dYv`-b-5L|G>BX9_K~pNyy& z9%jpldOy#wz^=_E&+X~VkT(bI9A!C0SzN&P;tmMox84eU_-Gu=f0OMcMcmSi-^vVV zd(_{hv;7K5j>7{N4_r>V>LUNuACk||tF7rv@eF=~lf60kOwu;4pqKsq(4DBu9}F~6 z$nF~c+Tp92J)Xwz`W70^HQc0oa3lT~_|1FtMX=eU=o(QN!YyVxo>9!LoR4Rb+;p7T z{zm^d{O6LN(M!tI0ExOsz)r@_{1tcVzX!5t5dShbIP`inxixyV9Qu)woAGpi9ggCk zNuU}!@=D&qd+?@L>26`vg+yro=!@BRdJ~fd^K!y1UF1&x5g3;_{+=N^{96aVH+X=l z@~)w;1>SP-FsCGmp5mn2_wX+N?aWMPll<|FgKuCn^$K>_D%|o0+iTs2Ux*rTAz0Zq zQg38F{t{ErJ@}3Hj=X}I*!BN$r^Ha>n zJA*?cv0a8*a0697Pp`TKWKtRWM>2^26Lj)wT#+k*AZf!FvZZzzF8Tz$`g-ninY;W$ zk{mC>4{|wG|Bnt`K(#S1;MKvmbF)4aIu8yj4obfk2I7xlu|9@g=T^VDlehgYCd)-8 zndZP*Jf{nIqSrF3_mGMF5*W8u;G^tc+zN`g5d3gk@NC}av&ro|fL`<}oD!Bx{B54v z*)Xc_M5(`NjOsG3MDP`aB+jyV#4K zpqpB5>F*Ex4JzVUIFz4*L-}IzZgT8Gd>2;j$0!Sa*n>CI!9PH{!|$;9^n6s3tB2PP zJ@xSUOtim6W&LF67FY|;cG)cqF~*kJ&7`G%9^U=m*uH+*;HA`neLP?OnW|eFS$&|v ztlz}3*UpJ?JbN|IZjsX1AR(?9XyKCVI_Nqj^Q+C?`Pst?k~t8Drx*tvMo3;dq0z@r zNjjN@gYtp#_bS`1i5lX8Kk%W#hYwG%LpjY(U5Yw7M=seC`9`ZG{%(*Kw1W=gCi}K; z#LwI|&fFG*u};EN8+tFm=2$jjjV{%Ifp)<>_j3P(M;17<1vX!cI3r5*lSkTRcaC+j zH|g$VqB{P)s!O(;Xj_Q|WhL0Yt8Kd4j;q5?e+6g32CmVrpbNgKhdsQQGE8PkFR63S zTB!BLk(keR4Chpo`(_!EX&5O7bm`$&g+{{S2)XV#bk}#7yI8U-%3BRu;J6WcaLz>eB z+XplJm1#UjIdFLqWWE;ku<_r|UzyY!n5P~Tc?V_Q!MZY=n$#})Ykl;$kQ4;d4oo#L zy)cw?Gb~FbUZSTlS!l94ZJ4m<7!zwPJs;-a?w+Xk{wEWe` zUU7?VvV(0Jo4{XUc?y=Ku)@B&&EqzScY~Sz?8jv$d1VbI|P}^Lq8tiN!$P_s=?x*Q`{?z zZVu7}Z@&)Xv&AhnZ-?DPC%n(uv478l@QU|4O_Lzm*+4-akSY$4P5Rf)!4~RkI|Ho2 z&W}x};ozgueG=&88KpxNc>g8RiEV1z;qALf-0DG9@q=&1LgS$*soXPkxiq|Fo)b|- zX<5bRSOXteKDUeP0zd5XI4*=Kux3K1Bg@H{Kia;hUNUv;985EdJCS{kn>%xQ+EpKK zu%9Hx5YI5eQ;ZHyF(Xa$G*3+wJHgcMoRZ>U@7CK%`07`_R}j{5K`gHEx9gzJ9hhlj z-h8}c^Y)sjcZN5U=K0PA^4!k$8{XheSv7T$oM_e4>gG5%)#_vlyqd$+w17`-g^Whq z46&V%u3^`(ceqE}+F=-b+t7~Vu1~Qyouw`DTUU_MhY z4q5omdGZODa6+x%Z)sPpO)A0;6H*shSKZXEKKf>W_dQ01n50HbQzeeG=`~9Z(;R6c zi{#KPv$eVkhFB*7VUx|u9V%QGnN{6Xxjxm85Or<>U)2=#d#mcH@Tap|_%(sqv{8agh*4I0AEkBDK~?cHpO|&!spDhRkTDsTA?CUaB*yKDz`b8 zEvk~6y3~WGqo0!*;%rWUzNXm3pTXgg;&f)wYUWk7mP0F?(F&(@gYEon`0N(^m{Z&* zy(XjTaRTSm*&y8-a5`x)C!eDePFt%N;nT8;Q}8nxRgX0gP?Zx_8`_}eZ^G1UGtb#+ zYjxa3-arqPrB5f%Pe(9cd0Ew@!sg*R&Q3dXRvk|63Tz$M-Q=3g!HU+uK zd+Wz>65}n|-qafJq(v^D)rM&}*F4X=g1>&9r`+Bm@=^(cxKSqP5;Js(dHTaLT;n=e zzH8KlGd)O-La(Fmdh6}^g4MQYtCxf{c7Qu!~!X!006@1i(DNfunUCB@h@3y|rBFUXF z*eX7hqF*oage%;&9qM^cz;E|y_qpX!P#3i2w55GLdscR9!ptHWX3E9u@?CR026uLrbfx2OG^3)IXaHM4xUSJ

    )I|1 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%0DV27}lF-1e=| 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�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 z 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 literal 0 HcmV?d00001 diff --git a/src/3rdparty/win32_bin/ssl-43.dll b/src/3rdparty/win32_bin/ssl-43.dll new file mode 100644 index 0000000000000000000000000000000000000000..e566961c35d1df3f7009448e11b84768bdab4f24 GIT binary patch literal 290816 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 >^uY_EABd$HnksB^mh)0jI$)E} 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 literal 0 HcmV?d00001 diff --git a/src/3rdparty/win32_bin/tls-15.dll b/src/3rdparty/win32_bin/tls-15.dll new file mode 100644 index 0000000000000000000000000000000000000000..492d15d3e92daa297d1ff589dff6d21b1fc61cea GIT binary patch literal 116736 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, et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +pkginclude_HEADERS = \ + curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ + typecheck-gcc.h curlbuild.h curlrules.h + +pkgincludedir= $(includedir)/curl + +# curlbuild.h does not exist in the git tree. When the original libcurl +# source code distribution archive file is created, curlbuild.h.dist is +# renamed to curlbuild.h and included in the tarball so that it can be +# used directly on non-configure systems. +# +# The distributed curlbuild.h will be overwritten on configure systems +# when the configure script runs, with one that is suitable and specific +# to the library being configured and built. +# +# curlbuild.h.in is the distributed template file from which the configure +# script creates curlbuild.h at library configuration time, overwiting the +# one included in the distribution archive. +# +# curlbuild.h.dist is not included in the source code distribution archive. + +EXTRA_DIST = curlbuild.h.in + +DISTCLEANFILES = curlbuild.h + +checksrc: + @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST) + +if CURLDEBUG +# for debug builds, we scan the sources on all regular make invokes +all-local: checksrc +endif diff --git a/src/3rdparty/win32_include/curl/Makefile.in b/src/3rdparty/win32_include/curl/Makefile.in new file mode 100644 index 000000000..dc790db56 --- /dev/null +++ b/src/3rdparty/win32_include/curl/Makefile.in @@ -0,0 +1,707 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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@ +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/curl +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \ + $(top_srcdir)/m4/curl-confopts.m4 \ + $(top_srcdir)/m4/curl-functions.m4 \ + $(top_srcdir)/m4/curl-openssl.m4 \ + $(top_srcdir)/m4/curl-override.m4 \ + $(top_srcdir)/m4/curl-reentrant.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)/m4/xc-am-iface.m4 \ + $(top_srcdir)/m4/xc-cc-check.m4 \ + $(top_srcdir)/m4/xc-lt-iface.m4 \ + $(top_srcdir)/m4/xc-translit.m4 \ + $(top_srcdir)/m4/xc-val-flgs.m4 \ + $(top_srcdir)/m4/zz40-xc-ovr.m4 \ + $(top_srcdir)/m4/zz50-xc-ovr.m4 \ + $(top_srcdir)/m4/zz60-xc-ovr.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/lib/curl_config.h curlbuild.h +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)$(pkgincludedir)" +HEADERS = $(pkginclude_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)curlbuild.h.in +# 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 $(srcdir)/curlbuild.h.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +pkgincludedir = $(includedir)/curl +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BLANK_AT_MAKETIME = @BLANK_AT_MAKETIME@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_CURL_SYMBOL_HIDING = @CFLAG_CURL_SYMBOL_HIDING@ +CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAG_CURL_STATICLIB = @CPPFLAG_CURL_STATICLIB@ +CURLVERSION = @CURLVERSION@ +CURL_CA_BUNDLE = @CURL_CA_BUNDLE@ +CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@ +CURL_DISABLE_DICT = @CURL_DISABLE_DICT@ +CURL_DISABLE_FILE = @CURL_DISABLE_FILE@ +CURL_DISABLE_FTP = @CURL_DISABLE_FTP@ +CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@ +CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@ +CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@ +CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@ +CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ +CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ +CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ +CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMB = @CURL_DISABLE_SMB@ +CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ +CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ +CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ +CURL_LT_SHLIB_VERSIONED_FLAVOUR = @CURL_LT_SHLIB_VERSIONED_FLAVOUR@ +CURL_NETWORK_AND_TIME_LIBS = @CURL_NETWORK_AND_TIME_LIBS@ +CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@ +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@ +ENABLE_SHARED = @ENABLE_SHARED@ +ENABLE_STATIC = @ENABLE_STATIC@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ +HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ +HAVE_LIBZ = @HAVE_LIBZ@ +HAVE_OPENSSL_SRP = @HAVE_OPENSSL_SRP@ +IDN_ENABLED = @IDN_ENABLED@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IPV6_ENABLED = @IPV6_ENABLED@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBMETALINK_CPPFLAGS = @LIBMETALINK_CPPFLAGS@ +LIBMETALINK_LDFLAGS = @LIBMETALINK_LDFLAGS@ +LIBMETALINK_LIBS = @LIBMETALINK_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MANOPT = @MANOPT@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NROFF = @NROFF@ +NSS_LIBS = @NSS_LIBS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +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@ +PERL = @PERL@ +PKGADD_NAME = @PKGADD_NAME@ +PKGADD_PKG = @PKGADD_PKG@ +PKGADD_VENDOR = @PKGADD_VENDOR@ +PKGCONFIG = @PKGCONFIG@ +RANDOM_FILE = @RANDOM_FILE@ +RANLIB = @RANLIB@ +REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SSL_ENABLED = @SSL_ENABLED@ +SSL_LIBS = @SSL_LIBS@ +STRIP = @STRIP@ +SUPPORT_FEATURES = @SUPPORT_FEATURES@ +SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@ +USE_ARES = @USE_ARES@ +USE_AXTLS = @USE_AXTLS@ +USE_CYASSL = @USE_CYASSL@ +USE_DARWINSSL = @USE_DARWINSSL@ +USE_GNUTLS = @USE_GNUTLS@ +USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@ +USE_LIBRTMP = @USE_LIBRTMP@ +USE_LIBSSH2 = @USE_LIBSSH2@ +USE_MBEDTLS = @USE_MBEDTLS@ +USE_NGHTTP2 = @USE_NGHTTP2@ +USE_NSS = @USE_NSS@ +USE_OPENLDAP = @USE_OPENLDAP@ +USE_POLARSSL = @USE_POLARSSL@ +USE_SCHANNEL = @USE_SCHANNEL@ +USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@ +USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ +VERSION = @VERSION@ +VERSIONNUM = @VERSIONNUM@ +ZLIB_LIBS = @ZLIB_LIBS@ +ZSH_FUNCTIONS_DIR = @ZSH_FUNCTIONS_DIR@ +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@ +libext = @libext@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +pkginclude_HEADERS = \ + curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ + typecheck-gcc.h curlbuild.h curlrules.h + + +# curlbuild.h does not exist in the git tree. When the original libcurl +# source code distribution archive file is created, curlbuild.h.dist is +# renamed to curlbuild.h and included in the tarball so that it can be +# used directly on non-configure systems. +# +# The distributed curlbuild.h will be overwritten on configure systems +# when the configure script runs, with one that is suitable and specific +# to the library being configured and built. +# +# curlbuild.h.in is the distributed template file from which the configure +# script creates curlbuild.h at library configuration time, overwiting the +# one included in the distribution archive. +# +# curlbuild.h.dist is not included in the source code distribution archive. +EXTRA_DIST = curlbuild.h.in +DISTCLEANFILES = curlbuild.h +all: curlbuild.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(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) --gnu include/curl/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu include/curl/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_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +curlbuild.h: stamp-h2 + @test -f $@ || rm -f stamp-h2 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h2 + +stamp-h2: $(srcdir)/curlbuild.h.in $(top_builddir)/config.status + @rm -f stamp-h2 + cd $(top_builddir) && $(SHELL) ./config.status include/curl/curlbuild.h + +distclean-hdr: + -rm -f curlbuild.h stamp-h2 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || 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)$(pkgincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgincludedir)'; $(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 +@CURLDEBUG_FALSE@all-local: +all-am: Makefile $(HEADERS) curlbuild.h all-local +installdirs: + for dir in "$(DESTDIR)$(pkgincludedir)"; 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) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +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-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pkgincludeHEADERS + +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-pkgincludeHEADERS + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ + clean-generic clean-libtool cscopelist-am ctags ctags-am \ + distclean distclean-generic distclean-hdr 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-pdf install-pdf-am install-pkgincludeHEADERS \ + 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-pkgincludeHEADERS + +.PRECIOUS: Makefile + + +checksrc: + @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST) + +# for debug builds, we scan the sources on all regular make invokes +@CURLDEBUG_TRUE@all-local: checksrc + +# 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/src/3rdparty/win32_include/curl/curl.h b/src/3rdparty/win32_include/curl/curl.h new file mode 100644 index 000000000..467bb0240 --- /dev/null +++ b/src/3rdparty/win32_include/curl/curl.h @@ -0,0 +1,2536 @@ +#ifndef __CURL_CURL_H +#define __CURL_CURL_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * If you have libcurl problems, all docs and details are found here: + * https://curl.haxx.se/libcurl/ + * + * curl-library mailing list subscription and unsubscription web interface: + * https://cool.haxx.se/mailman/listinfo/curl-library/ + */ + +#ifdef CURL_NO_OLDIES +#define CURL_STRICTER +#endif + +#include "curlver.h" /* libcurl version defines */ +#include "curlbuild.h" /* libcurl build definitions */ +#include "curlrules.h" /* libcurl rules enforcement */ + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && \ + !defined(WIN32) && !defined(__SYMBIAN32__) +#define WIN32 +#endif + +#include +#include + +#if defined(__FreeBSD__) && (__FreeBSD__ >= 2) +/* Needed for __FreeBSD_version symbol definition */ +#include +#endif + +/* The include stuff here below is mainly for time_t! */ +#include +#include + +#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \ + defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) +/* The check above prevents the winsock2 inclusion if winsock.h already was + included, since they can't co-exist without problems */ +#include +#include +#endif +#endif + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on systems that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ + (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) +#include +#endif + +#if !defined(WIN32) && !defined(_WIN32_WCE) +#include +#endif + +#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) +#include +#endif + +#ifdef __BEOS__ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_easy CURL; +typedef struct Curl_share CURLSH; +#else +typedef void CURL; +typedef void CURLSH; +#endif + +/* + * libcurl external API function linkage decorations. + */ + +#ifdef CURL_STATICLIB +# define CURL_EXTERN +#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) +# if defined(BUILDING_LIBCURL) +# define CURL_EXTERN __declspec(dllexport) +# else +# define CURL_EXTERN __declspec(dllimport) +# endif +#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS) +# define CURL_EXTERN CURL_EXTERN_SYMBOL +#else +# define CURL_EXTERN +#endif + +#ifndef curl_socket_typedef +/* socket typedef */ +#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H) +typedef SOCKET curl_socket_t; +#define CURL_SOCKET_BAD INVALID_SOCKET +#else +typedef int curl_socket_t; +#define CURL_SOCKET_BAD -1 +#endif +#define curl_socket_typedef +#endif /* curl_socket_typedef */ + +struct curl_httppost { + struct curl_httppost *next; /* next entry in the list */ + char *name; /* pointer to allocated name */ + long namelength; /* length of name length */ + char *contents; /* pointer to allocated data contents */ + long contentslength; /* length of contents field, see also + CURL_HTTPPOST_LARGE */ + char *buffer; /* pointer to allocated buffer contents */ + long bufferlength; /* length of buffer field */ + char *contenttype; /* Content-Type */ + struct curl_slist *contentheader; /* list of extra headers for this form */ + struct curl_httppost *more; /* if one field name has more than one + file, this link should link to following + files */ + long flags; /* as defined below */ + +/* specified content is a file name */ +#define CURL_HTTPPOST_FILENAME (1<<0) +/* specified content is a file name */ +#define CURL_HTTPPOST_READFILE (1<<1) +/* name is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRNAME (1<<2) +/* contents is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRCONTENTS (1<<3) +/* upload file from buffer */ +#define CURL_HTTPPOST_BUFFER (1<<4) +/* upload file from pointer contents */ +#define CURL_HTTPPOST_PTRBUFFER (1<<5) +/* upload file contents by using the regular read callback to get the data and + pass the given pointer as custom pointer */ +#define CURL_HTTPPOST_CALLBACK (1<<6) +/* use size in 'contentlen', added in 7.46.0 */ +#define CURL_HTTPPOST_LARGE (1<<7) + + char *showfilename; /* The file name to show. If not set, the + actual file name will be used (if this + is a file part) */ + void *userp; /* custom pointer used for + HTTPPOST_CALLBACK posts */ + curl_off_t contentlen; /* alternative length of contents + field. Used if CURL_HTTPPOST_LARGE is + set. Added in 7.46.0 */ +}; + +/* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered + deprecated but was the only choice up until 7.31.0 */ +typedef int (*curl_progress_callback)(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +/* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in + 7.32.0, it avoids floating point and provides more detailed information. */ +typedef int (*curl_xferinfo_callback)(void *clientp, + curl_off_t dltotal, + curl_off_t dlnow, + curl_off_t ultotal, + curl_off_t ulnow); + +#ifndef CURL_MAX_READ_SIZE + /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */ +#define CURL_MAX_READ_SIZE 524288 +#endif + +#ifndef CURL_MAX_WRITE_SIZE + /* Tests have proven that 20K is a very bad buffer size for uploads on + Windows, while 16K for some odd reason performed a lot better. + We do the ifndef check to allow this value to easier be changed at build + time for those who feel adventurous. The practical minimum is about + 400 bytes since libcurl uses a buffer of this size as a scratch area + (unrelated to network send operations). */ +#define CURL_MAX_WRITE_SIZE 16384 +#endif + +#ifndef CURL_MAX_HTTP_HEADER +/* The only reason to have a max limit for this is to avoid the risk of a bad + server feeding libcurl with a never-ending header that will cause reallocs + infinitely */ +#define CURL_MAX_HTTP_HEADER (100*1024) +#endif + +/* This is a magic return code for the write callback that, when returned, + will signal libcurl to pause receiving on the current transfer. */ +#define CURL_WRITEFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_write_callback)(char *buffer, + size_t size, + size_t nitems, + void *outstream); + + + +/* enumeration of file types */ +typedef enum { + CURLFILETYPE_FILE = 0, + CURLFILETYPE_DIRECTORY, + CURLFILETYPE_SYMLINK, + CURLFILETYPE_DEVICE_BLOCK, + CURLFILETYPE_DEVICE_CHAR, + CURLFILETYPE_NAMEDPIPE, + CURLFILETYPE_SOCKET, + CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ + + CURLFILETYPE_UNKNOWN /* should never occur */ +} curlfiletype; + +#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) +#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) +#define CURLFINFOFLAG_KNOWN_TIME (1<<2) +#define CURLFINFOFLAG_KNOWN_PERM (1<<3) +#define CURLFINFOFLAG_KNOWN_UID (1<<4) +#define CURLFINFOFLAG_KNOWN_GID (1<<5) +#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) +#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) + +/* Content of this structure depends on information which is known and is + achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man + page for callbacks returning this structure -- some fields are mandatory, + some others are optional. The FLAG field has special meaning. */ +struct curl_fileinfo { + char *filename; + curlfiletype filetype; + time_t time; + unsigned int perm; + int uid; + int gid; + curl_off_t size; + long int hardlinks; + + struct { + /* If some of these fields is not NULL, it is a pointer to b_data. */ + char *time; + char *perm; + char *user; + char *group; + char *target; /* pointer to the target filename of a symlink */ + } strings; + + unsigned int flags; + + /* used internally */ + char *b_data; + size_t b_size; + size_t b_used; +}; + +/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ +#define CURL_CHUNK_BGN_FUNC_OK 0 +#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ +#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ + +/* if splitting of data transfer is enabled, this callback is called before + download of an individual chunk started. Note that parameter "remains" works + only for FTP wildcard downloading (for now), otherwise is not used */ +typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, + void *ptr, + int remains); + +/* return codes for CURLOPT_CHUNK_END_FUNCTION */ +#define CURL_CHUNK_END_FUNC_OK 0 +#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ + +/* If splitting of data transfer is enabled this callback is called after + download of an individual chunk finished. + Note! After this callback was set then it have to be called FOR ALL chunks. + Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. + This is the reason why we don't need "transfer_info" parameter in this + callback and we are not interested in "remains" parameter too. */ +typedef long (*curl_chunk_end_callback)(void *ptr); + +/* return codes for FNMATCHFUNCTION */ +#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ +#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ +#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ + +/* callback type for wildcard downloading pattern matching. If the + string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ +typedef int (*curl_fnmatch_callback)(void *ptr, + const char *pattern, + const char *string); + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ +typedef int (*curl_seek_callback)(void *instream, + curl_off_t offset, + int origin); /* 'whence' */ + +/* This is a return code for the read callback that, when returned, will + signal libcurl to immediately abort the current transfer. */ +#define CURL_READFUNC_ABORT 0x10000000 +/* This is a return code for the read callback that, when returned, will + signal libcurl to pause sending data on the current transfer. */ +#define CURL_READFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_read_callback)(char *buffer, + size_t size, + size_t nitems, + void *instream); + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +/* The return code from the sockopt_callback can signal information back + to libcurl: */ +#define CURL_SOCKOPT_OK 0 +#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return + CURLE_ABORTED_BY_CALLBACK */ +#define CURL_SOCKOPT_ALREADY_CONNECTED 2 + +typedef int (*curl_sockopt_callback)(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it + turned really ugly and painful on the systems that + lack this type */ + struct sockaddr addr; +}; + +typedef curl_socket_t +(*curl_opensocket_callback)(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +typedef int +(*curl_closesocket_callback)(void *clientp, curl_socket_t item); + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +typedef curlioerr (*curl_ioctl_callback)(CURL *handle, + int cmd, + void *clientp); + +#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS +/* + * The following typedef's are signatures of malloc, free, realloc, strdup and + * calloc respectively. Function pointers of these types can be passed to the + * curl_global_init_mem() function to set user defined memory management + * callback routines. + */ +typedef void *(*curl_malloc_callback)(size_t size); +typedef void (*curl_free_callback)(void *ptr); +typedef void *(*curl_realloc_callback)(void *ptr, size_t size); +typedef char *(*curl_strdup_callback)(const char *str); +typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); + +#define CURL_DID_MEMORY_FUNC_TYPEDEFS +#endif + +/* the kind of data that is passed to information_callback*/ +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +typedef int (*curl_debug_callback) + (CURL *handle, /* the handle/transfer this concerns */ + curl_infotype type, /* what kind of data */ + char *data, /* points to the data */ + size_t size, /* size of the data pointed to */ + void *userptr); /* whatever the user please */ + +/* All possible error codes from all sorts of curl functions. Future versions + may return other values, stay prepared. + + Always add new return codes last. Never *EVER* remove any. The return + codes must remain the same! + */ + +typedef enum { + CURLE_OK = 0, + CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ + CURLE_FAILED_INIT, /* 2 */ + CURLE_URL_MALFORMAT, /* 3 */ + CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for + 7.17.0, reused in April 2011 for 7.21.5] */ + CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ + CURLE_COULDNT_RESOLVE_HOST, /* 6 */ + CURLE_COULDNT_CONNECT, /* 7 */ + CURLE_WEIRD_SERVER_REPLY, /* 8 */ + CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server + due to lack of access - when login fails + this is not returned. */ + CURLE_FTP_ACCEPT_FAILED, /* 10 - [was obsoleted in April 2006 for + 7.15.4, reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ + CURLE_FTP_ACCEPT_TIMEOUT, /* 12 - timeout occurred accepting server + [was obsoleted in August 2007 for 7.17.0, + reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ + CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ + CURLE_FTP_CANT_GET_HOST, /* 15 */ + CURLE_HTTP2, /* 16 - A problem in the http2 framing layer. + [was obsoleted in August 2007 for 7.17.0, + reused in July 2014 for 7.38.0] */ + CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ + CURLE_PARTIAL_FILE, /* 18 */ + CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ + CURLE_OBSOLETE20, /* 20 - NOT USED */ + CURLE_QUOTE_ERROR, /* 21 - quote command failure */ + CURLE_HTTP_RETURNED_ERROR, /* 22 */ + CURLE_WRITE_ERROR, /* 23 */ + CURLE_OBSOLETE24, /* 24 - NOT USED */ + CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ + CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ + CURLE_OUT_OF_MEMORY, /* 27 */ + /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error + instead of a memory allocation error if CURL_DOES_CONVERSIONS + is defined + */ + CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ + CURLE_OBSOLETE29, /* 29 - NOT USED */ + CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ + CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ + CURLE_OBSOLETE32, /* 32 - NOT USED */ + CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ + CURLE_HTTP_POST_ERROR, /* 34 */ + CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ + CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ + CURLE_FILE_COULDNT_READ_FILE, /* 37 */ + CURLE_LDAP_CANNOT_BIND, /* 38 */ + CURLE_LDAP_SEARCH_FAILED, /* 39 */ + CURLE_OBSOLETE40, /* 40 - NOT USED */ + CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */ + CURLE_ABORTED_BY_CALLBACK, /* 42 */ + CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ + CURLE_OBSOLETE44, /* 44 - NOT USED */ + CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ + CURLE_OBSOLETE46, /* 46 - NOT USED */ + CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */ + CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ + CURLE_TELNET_OPTION_SYNTAX, /* 49 - Malformed telnet option */ + CURLE_OBSOLETE50, /* 50 - NOT USED */ + CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint + wasn't verified fine */ + CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ + CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ + CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as + default */ + CURLE_SEND_ERROR, /* 55 - failed sending network data */ + CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ + CURLE_OBSOLETE57, /* 57 - NOT IN USE */ + CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ + CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ + CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */ + CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ + CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ + CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ + CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ + CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind + that failed */ + CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ + CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not + accepted and we failed to login */ + CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ + CURLE_TFTP_PERM, /* 69 - permission problem on server */ + CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ + CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ + CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ + CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ + CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ + CURLE_CONV_FAILED, /* 75 - conversion failed */ + CURLE_CONV_REQD, /* 76 - caller must register conversion + callbacks using curl_easy_setopt options + CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOPT_CONV_TO_NETWORK_FUNCTION, and + CURLOPT_CONV_FROM_UTF8_FUNCTION */ + CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing + or wrong format */ + CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ + CURLE_SSH, /* 79 - error from the SSH layer, somewhat + generic so the error message will be of + interest when this has happened */ + + CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL + connection */ + CURLE_AGAIN, /* 81 - socket is not ready for send/recv, + wait till it's ready and try again (Added + in 7.18.2) */ + CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or + wrong format (Added in 7.19.0) */ + CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in + 7.19.0) */ + CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ + CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ + CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ + CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ + CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ + CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the + session will be queued */ + CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not + match */ + CURLE_SSL_INVALIDCERTSTATUS, /* 91 - invalid certificate status */ + CURLE_HTTP2_STREAM, /* 92 - stream error in HTTP/2 framing layer + */ + CURL_LAST /* never use! */ +} CURLcode; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Previously obsolete error code re-used in 7.38.0 */ +#define CURLE_OBSOLETE16 CURLE_HTTP2 + +/* Previously obsolete error codes re-used in 7.24.0 */ +#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED +#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT + +/* compatibility with older names */ +#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING +#define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY + +/* The following were added in 7.21.5, April 2011 */ +#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION + +/* The following were added in 7.17.1 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.17.0 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */ +#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 +#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 +#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 +#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 +#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 +#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 +#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 +#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 +#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 +#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 +#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 +#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN + +#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED +#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE +#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR +#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL +#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS +#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR +#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED + +/* The following were added earlier */ + +#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT + +#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR +#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED +#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED + +#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE +#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME + +/* This was the error code 50 in 7.7.3 and a few earlier versions, this + is no longer used by libcurl but is instead #defined here only to not + make programs break */ +#define CURLE_ALREADY_COMPLETE 99999 + +/* Provide defines for really old option names */ +#define CURLOPT_FILE CURLOPT_WRITEDATA /* name changed in 7.9.7 */ +#define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */ +#define CURLOPT_WRITEHEADER CURLOPT_HEADERDATA + +/* Since long deprecated options with no code in the lib that does anything + with them. */ +#define CURLOPT_WRITEINFO CURLOPT_OBSOLETE40 +#define CURLOPT_CLOSEPOLICY CURLOPT_OBSOLETE72 + +#endif /*!CURL_NO_OLDIES*/ + +/* This prototype applies to all conversion callbacks */ +typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); + +typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ + void *ssl_ctx, /* actually an + OpenSSL SSL_CTX */ + void *userptr); + +typedef enum { + CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use + CONNECT HTTP/1.1 */ + CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT + HTTP/1.0 */ + CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ + CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already + in 7.10 */ + CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ + CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ + CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the + host name rather than the IP address. added + in 7.18.0 */ +} curl_proxytype; /* this enum was added in 7.10 */ + +/* + * Bitmasks for CURLOPT_HTTPAUTH and CURLOPT_PROXYAUTH options: + * + * CURLAUTH_NONE - No HTTP authentication + * CURLAUTH_BASIC - HTTP Basic authentication (default) + * CURLAUTH_DIGEST - HTTP Digest authentication + * CURLAUTH_NEGOTIATE - HTTP Negotiate (SPNEGO) authentication + * CURLAUTH_GSSNEGOTIATE - Alias for CURLAUTH_NEGOTIATE (deprecated) + * CURLAUTH_NTLM - HTTP NTLM authentication + * CURLAUTH_DIGEST_IE - HTTP Digest authentication with IE flavour + * CURLAUTH_NTLM_WB - HTTP NTLM authentication delegated to winbind helper + * CURLAUTH_ONLY - Use together with a single other type to force no + * authentication or just that single type + * CURLAUTH_ANY - All fine types set + * CURLAUTH_ANYSAFE - All fine types except Basic + */ + +#define CURLAUTH_NONE ((unsigned long)0) +#define CURLAUTH_BASIC (((unsigned long)1)<<0) +#define CURLAUTH_DIGEST (((unsigned long)1)<<1) +#define CURLAUTH_NEGOTIATE (((unsigned long)1)<<2) +/* Deprecated since the advent of CURLAUTH_NEGOTIATE */ +#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE +#define CURLAUTH_NTLM (((unsigned long)1)<<3) +#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4) +#define CURLAUTH_NTLM_WB (((unsigned long)1)<<5) +#define CURLAUTH_ONLY (((unsigned long)1)<<31) +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) + +#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ +#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ +#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ +#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ +#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ +#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ +#define CURLSSH_AUTH_AGENT (1<<4) /* agent (ssh-agent, pageant...) */ +#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY + +#define CURLGSSAPI_DELEGATION_NONE 0 /* no delegation (default) */ +#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* if permitted by policy */ +#define CURLGSSAPI_DELEGATION_FLAG (1<<1) /* delegate always */ + +#define CURL_ERROR_SIZE 256 + +enum curl_khtype { + CURLKHTYPE_UNKNOWN, + CURLKHTYPE_RSA1, + CURLKHTYPE_RSA, + CURLKHTYPE_DSS +}; + +struct curl_khkey { + const char *key; /* points to a zero-terminated string encoded with base64 + if len is zero, otherwise to the "raw" data */ + size_t len; + enum curl_khtype keytype; +}; + +/* this is the set of return values expected from the curl_sshkeycallback + callback */ +enum curl_khstat { + CURLKHSTAT_FINE_ADD_TO_FILE, + CURLKHSTAT_FINE, + CURLKHSTAT_REJECT, /* reject the connection, return an error */ + CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so + this causes a CURLE_DEFER error but otherwise the + connection will be left intact etc */ + CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ +}; + +/* this is the set of status codes pass in to the callback */ +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ + CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ +}; + +typedef int + (*curl_sshkeycallback) (CURL *easy, /* easy handle */ + const struct curl_khkey *knownkey, /* known */ + const struct curl_khkey *foundkey, /* found */ + enum curl_khmatch, /* libcurl's view on the keys */ + void *clientp); /* custom pointer passed from app */ + +/* parameter for the CURLOPT_USE_SSL option */ +typedef enum { + CURLUSESSL_NONE, /* do not attempt to use SSL */ + CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ + CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ + CURLUSESSL_ALL, /* SSL for all communication or fail */ + CURLUSESSL_LAST /* not an option, never use */ +} curl_usessl; + +/* Definition of bits for the CURLOPT_SSL_OPTIONS argument: */ + +/* - ALLOW_BEAST tells libcurl to allow the BEAST SSL vulnerability in the + name of improving interoperability with older servers. Some SSL libraries + have introduced work-arounds for this flaw but those work-arounds sometimes + make the SSL communication fail. To regain functionality with those broken + servers, a user can this way allow the vulnerability back. */ +#define CURLSSLOPT_ALLOW_BEAST (1<<0) + +/* - NO_REVOKE tells libcurl to disable certificate revocation checks for those + SSL backends where such behavior is present. */ +#define CURLSSLOPT_NO_REVOKE (1<<1) + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2009 */ + +#define CURLFTPSSL_NONE CURLUSESSL_NONE +#define CURLFTPSSL_TRY CURLUSESSL_TRY +#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL +#define CURLFTPSSL_ALL CURLUSESSL_ALL +#define CURLFTPSSL_LAST CURLUSESSL_LAST +#define curl_ftpssl curl_usessl +#endif /*!CURL_NO_OLDIES*/ + +/* parameter for the CURLOPT_FTP_SSL_CCC option */ +typedef enum { + CURLFTPSSL_CCC_NONE, /* do not send CCC */ + CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ + CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ + CURLFTPSSL_CCC_LAST /* not an option, never use */ +} curl_ftpccc; + +/* parameter for the CURLOPT_FTPSSLAUTH option */ +typedef enum { + CURLFTPAUTH_DEFAULT, /* let libcurl decide */ + CURLFTPAUTH_SSL, /* use "AUTH SSL" */ + CURLFTPAUTH_TLS, /* use "AUTH TLS" */ + CURLFTPAUTH_LAST /* not an option, never use */ +} curl_ftpauth; + +/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ +typedef enum { + CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ + CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD + again if MKD succeeded, for SFTP this does + similar magic */ + CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD + again even if MKD failed! */ + CURLFTP_CREATE_DIR_LAST /* not an option, never use */ +} curl_ftpcreatedir; + +/* parameter for the CURLOPT_FTP_FILEMETHOD option */ +typedef enum { + CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ + CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ + CURLFTPMETHOD_NOCWD, /* no CWD at all */ + CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ + CURLFTPMETHOD_LAST /* not an option, never use */ +} curl_ftpmethod; + +/* bitmask defines for CURLOPT_HEADEROPT */ +#define CURLHEADER_UNIFIED 0 +#define CURLHEADER_SEPARATE (1<<0) + +/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ +#define CURLPROTO_HTTP (1<<0) +#define CURLPROTO_HTTPS (1<<1) +#define CURLPROTO_FTP (1<<2) +#define CURLPROTO_FTPS (1<<3) +#define CURLPROTO_SCP (1<<4) +#define CURLPROTO_SFTP (1<<5) +#define CURLPROTO_TELNET (1<<6) +#define CURLPROTO_LDAP (1<<7) +#define CURLPROTO_LDAPS (1<<8) +#define CURLPROTO_DICT (1<<9) +#define CURLPROTO_FILE (1<<10) +#define CURLPROTO_TFTP (1<<11) +#define CURLPROTO_IMAP (1<<12) +#define CURLPROTO_IMAPS (1<<13) +#define CURLPROTO_POP3 (1<<14) +#define CURLPROTO_POP3S (1<<15) +#define CURLPROTO_SMTP (1<<16) +#define CURLPROTO_SMTPS (1<<17) +#define CURLPROTO_RTSP (1<<18) +#define CURLPROTO_RTMP (1<<19) +#define CURLPROTO_RTMPT (1<<20) +#define CURLPROTO_RTMPE (1<<21) +#define CURLPROTO_RTMPTE (1<<22) +#define CURLPROTO_RTMPS (1<<23) +#define CURLPROTO_RTMPTS (1<<24) +#define CURLPROTO_GOPHER (1<<25) +#define CURLPROTO_SMB (1<<26) +#define CURLPROTO_SMBS (1<<27) +#define CURLPROTO_ALL (~0) /* enable everything */ + +/* long may be 32 or 64 bits, but we should never depend on anything else + but 32 */ +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_STRINGPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 + +/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the + string options from the header file */ + +/* name is uppercase CURLOPT_, + type is one of the defined CURLOPTTYPE_ + number is unique identifier */ +#ifdef CINIT +#undef CINIT +#endif + +#ifdef CURL_ISOCPP +#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define STRINGPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLOPT_/**/name = type + number +#endif + +/* + * This macro-mania below setups the CURLOPT_[what] enum, to be used with + * curl_easy_setopt(). The first argument in the CINIT() macro is the [what] + * word. + */ + +typedef enum { + /* This is the FILE * or void * the regular output should be written to. */ + CINIT(WRITEDATA, OBJECTPOINT, 1), + + /* The full URL to get/put */ + CINIT(URL, STRINGPOINT, 2), + + /* Port number to connect to, if other than default. */ + CINIT(PORT, LONG, 3), + + /* Name of proxy to use. */ + CINIT(PROXY, STRINGPOINT, 4), + + /* "user:password;options" to use when fetching. */ + CINIT(USERPWD, STRINGPOINT, 5), + + /* "user:password" to use with proxy. */ + CINIT(PROXYUSERPWD, STRINGPOINT, 6), + + /* Range to get, specified as an ASCII string. */ + CINIT(RANGE, STRINGPOINT, 7), + + /* not used */ + + /* Specified file stream to upload from (use as input): */ + CINIT(READDATA, OBJECTPOINT, 9), + + /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE + * bytes big. If this is not used, error messages go to stderr instead: */ + CINIT(ERRORBUFFER, OBJECTPOINT, 10), + + /* Function that will be called to store the output (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), + + /* Function that will be called to read the input (instead of fread). The + * parameters will use fread() syntax, make sure to follow them. */ + CINIT(READFUNCTION, FUNCTIONPOINT, 12), + + /* Time-out the read operation after this amount of seconds */ + CINIT(TIMEOUT, LONG, 13), + + /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about + * how large the file being sent really is. That allows better error + * checking and better verifies that the upload was successful. -1 means + * unknown size. + * + * For large file support, there is also a _LARGE version of the key + * which takes an off_t type, allowing platforms with larger off_t + * sizes to handle larger files. See below for INFILESIZE_LARGE. + */ + CINIT(INFILESIZE, LONG, 14), + + /* POST static input fields. */ + CINIT(POSTFIELDS, OBJECTPOINT, 15), + + /* Set the referrer page (needed by some CGIs) */ + CINIT(REFERER, STRINGPOINT, 16), + + /* Set the FTP PORT string (interface name, named or numerical IP address) + Use i.e '-' to use default address. */ + CINIT(FTPPORT, STRINGPOINT, 17), + + /* Set the User-Agent string (examined by some CGIs) */ + CINIT(USERAGENT, STRINGPOINT, 18), + + /* If the download receives less than "low speed limit" bytes/second + * during "low speed time" seconds, the operations is aborted. + * You could i.e if you have a pretty high speed connection, abort if + * it is less than 2000 bytes/sec during 20 seconds. + */ + + /* Set the "low speed limit" */ + CINIT(LOW_SPEED_LIMIT, LONG, 19), + + /* Set the "low speed time" */ + CINIT(LOW_SPEED_TIME, LONG, 20), + + /* Set the continuation offset. + * + * Note there is also a _LARGE version of this key which uses + * off_t types, allowing for large file offsets on platforms which + * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. + */ + CINIT(RESUME_FROM, LONG, 21), + + /* Set cookie in request: */ + CINIT(COOKIE, STRINGPOINT, 22), + + /* This points to a linked list of headers, struct curl_slist kind. This + list is also used for RTSP (in spite of its name) */ + CINIT(HTTPHEADER, OBJECTPOINT, 23), + + /* This points to a linked list of post entries, struct curl_httppost */ + CINIT(HTTPPOST, OBJECTPOINT, 24), + + /* name of the file keeping your private SSL-certificate */ + CINIT(SSLCERT, STRINGPOINT, 25), + + /* password for the SSL or SSH private key */ + CINIT(KEYPASSWD, STRINGPOINT, 26), + + /* send TYPE parameter? */ + CINIT(CRLF, LONG, 27), + + /* send linked-list of QUOTE commands */ + CINIT(QUOTE, OBJECTPOINT, 28), + + /* send FILE * or void * to store headers to, if you use a callback it + is simply passed to the callback unmodified */ + CINIT(HEADERDATA, OBJECTPOINT, 29), + + /* point to a file to read the initial cookies from, also enables + "cookie awareness" */ + CINIT(COOKIEFILE, STRINGPOINT, 31), + + /* What version to specifically try to use. + See CURL_SSLVERSION defines below. */ + CINIT(SSLVERSION, LONG, 32), + + /* What kind of HTTP time condition to use, see defines */ + CINIT(TIMECONDITION, LONG, 33), + + /* Time to use with the above condition. Specified in number of seconds + since 1 Jan 1970 */ + CINIT(TIMEVALUE, LONG, 34), + + /* 35 = OBSOLETE */ + + /* Custom request, for customizing the get command like + HTTP: DELETE, TRACE and others + FTP: to use a different list command + */ + CINIT(CUSTOMREQUEST, STRINGPOINT, 36), + + /* FILE handle to use instead of stderr */ + CINIT(STDERR, OBJECTPOINT, 37), + + /* 38 is not used */ + + /* send linked-list of post-transfer QUOTE commands */ + CINIT(POSTQUOTE, OBJECTPOINT, 39), + + CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */ + + CINIT(VERBOSE, LONG, 41), /* talk a lot */ + CINIT(HEADER, LONG, 42), /* throw the header out too */ + CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */ + CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */ + CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 400 */ + CINIT(UPLOAD, LONG, 46), /* this is an upload */ + CINIT(POST, LONG, 47), /* HTTP POST method */ + CINIT(DIRLISTONLY, LONG, 48), /* bare names when listing directories */ + + CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */ + + /* Specify whether to read the user+password from the .netrc or the URL. + * This must be one of the CURL_NETRC_* enums below. */ + CINIT(NETRC, LONG, 51), + + CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */ + + CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ + CINIT(PUT, LONG, 54), /* HTTP PUT */ + + /* 55 = OBSOLETE */ + + /* DEPRECATED + * Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_progress_callback + * prototype defines. */ + CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), + + /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION + callbacks */ + CINIT(PROGRESSDATA, OBJECTPOINT, 57), +#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA + + /* We want the referrer field set automatically when following locations */ + CINIT(AUTOREFERER, LONG, 58), + + /* Port of the proxy, can be set in the proxy string as well with: + "[host]:[port]" */ + CINIT(PROXYPORT, LONG, 59), + + /* size of the POST input data, if strlen() is not good to use */ + CINIT(POSTFIELDSIZE, LONG, 60), + + /* tunnel non-http operations through a HTTP proxy */ + CINIT(HTTPPROXYTUNNEL, LONG, 61), + + /* Set the interface string to use as outgoing network interface */ + CINIT(INTERFACE, STRINGPOINT, 62), + + /* Set the krb4/5 security level, this also enables krb4/5 awareness. This + * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string + * is set but doesn't match one of these, 'private' will be used. */ + CINIT(KRBLEVEL, STRINGPOINT, 63), + + /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ + CINIT(SSL_VERIFYPEER, LONG, 64), + + /* The CApath or CAfile used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAINFO, STRINGPOINT, 65), + + /* 66 = OBSOLETE */ + /* 67 = OBSOLETE */ + + /* Maximum number of http redirects to follow */ + CINIT(MAXREDIRS, LONG, 68), + + /* Pass a long set to 1 to get the date of the requested document (if + possible)! Pass a zero to shut it off. */ + CINIT(FILETIME, LONG, 69), + + /* This points to a linked list of telnet options */ + CINIT(TELNETOPTIONS, OBJECTPOINT, 70), + + /* Max amount of cached alive connections */ + CINIT(MAXCONNECTS, LONG, 71), + + CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */ + + /* 73 = OBSOLETE */ + + /* Set to explicitly use a new connection for the upcoming transfer. + Do not use this unless you're absolutely sure of this, as it makes the + operation slower and is less friendly for the network. */ + CINIT(FRESH_CONNECT, LONG, 74), + + /* Set to explicitly forbid the upcoming transfer's connection to be re-used + when done. Do not use this unless you're absolutely sure of this, as it + makes the operation slower and is less friendly for the network. */ + CINIT(FORBID_REUSE, LONG, 75), + + /* Set to a file name that contains random data for libcurl to use to + seed the random engine when doing SSL connects. */ + CINIT(RANDOM_FILE, STRINGPOINT, 76), + + /* Set to the Entropy Gathering Daemon socket pathname */ + CINIT(EGDSOCKET, STRINGPOINT, 77), + + /* Time-out connect operations after this amount of seconds, if connects are + OK within this time, then fine... This only aborts the connect phase. */ + CINIT(CONNECTTIMEOUT, LONG, 78), + + /* Function that will be called to store headers (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), + + /* Set this to force the HTTP request to get back to GET. Only really usable + if POST, PUT or a custom request have been used first. + */ + CINIT(HTTPGET, LONG, 80), + + /* Set if we should verify the Common name from the peer certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches the + * provided hostname. */ + CINIT(SSL_VERIFYHOST, LONG, 81), + + /* Specify which file name to write all known cookies in after completed + operation. Set file name to "-" (dash) to make it go to stdout. */ + CINIT(COOKIEJAR, STRINGPOINT, 82), + + /* Specify which SSL ciphers to use */ + CINIT(SSL_CIPHER_LIST, STRINGPOINT, 83), + + /* Specify which HTTP version to use! This must be set to one of the + CURL_HTTP_VERSION* enums set below. */ + CINIT(HTTP_VERSION, LONG, 84), + + /* Specifically switch on or off the FTP engine's use of the EPSV command. By + default, that one will always be attempted before the more traditional + PASV command. */ + CINIT(FTP_USE_EPSV, LONG, 85), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ + CINIT(SSLCERTTYPE, STRINGPOINT, 86), + + /* name of the file keeping your private SSL-key */ + CINIT(SSLKEY, STRINGPOINT, 87), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ + CINIT(SSLKEYTYPE, STRINGPOINT, 88), + + /* crypto engine for the SSL-sub system */ + CINIT(SSLENGINE, STRINGPOINT, 89), + + /* set the crypto engine for the SSL-sub system as default + the param has no meaning... + */ + CINIT(SSLENGINE_DEFAULT, LONG, 90), + + /* Non-zero value means to use the global dns cache */ + CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* DEPRECATED, do not use! */ + + /* DNS cache timeout */ + CINIT(DNS_CACHE_TIMEOUT, LONG, 92), + + /* send linked-list of pre-transfer QUOTE commands */ + CINIT(PREQUOTE, OBJECTPOINT, 93), + + /* set the debug function */ + CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94), + + /* set the data for the debug function */ + CINIT(DEBUGDATA, OBJECTPOINT, 95), + + /* mark this as start of a cookie session */ + CINIT(COOKIESESSION, LONG, 96), + + /* The CApath directory used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAPATH, STRINGPOINT, 97), + + /* Instruct libcurl to use a smaller receive buffer */ + CINIT(BUFFERSIZE, LONG, 98), + + /* Instruct libcurl to not use any signal/alarm handlers, even when using + timeouts. This option is useful for multi-threaded applications. + See libcurl-the-guide for more background information. */ + CINIT(NOSIGNAL, LONG, 99), + + /* Provide a CURLShare for mutexing non-ts data */ + CINIT(SHARE, OBJECTPOINT, 100), + + /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), + CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and + CURLPROXY_SOCKS5. */ + CINIT(PROXYTYPE, LONG, 101), + + /* Set the Accept-Encoding string. Use this to tell a server you would like + the response to be compressed. Before 7.21.6, this was known as + CURLOPT_ENCODING */ + CINIT(ACCEPT_ENCODING, STRINGPOINT, 102), + + /* Set pointer to private data */ + CINIT(PRIVATE, OBJECTPOINT, 103), + + /* Set aliases for HTTP 200 in the HTTP Response header */ + CINIT(HTTP200ALIASES, OBJECTPOINT, 104), + + /* Continue to send authentication (user+password) when following locations, + even when hostname changed. This can potentially send off the name + and password to whatever host the server decides. */ + CINIT(UNRESTRICTED_AUTH, LONG, 105), + + /* Specifically switch on or off the FTP engine's use of the EPRT command ( + it also disables the LPRT attempt). By default, those ones will always be + attempted before the good old traditional PORT command. */ + CINIT(FTP_USE_EPRT, LONG, 106), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_USERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(HTTPAUTH, LONG, 107), + + /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx + in second argument. The function must be matching the + curl_ssl_ctx_callback proto. */ + CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108), + + /* Set the userdata for the ssl context callback function's third + argument */ + CINIT(SSL_CTX_DATA, OBJECTPOINT, 109), + + /* FTP Option that causes missing dirs to be created on the remote server. + In 7.19.4 we introduced the convenience enums for this option using the + CURLFTP_CREATE_DIR prefix. + */ + CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(PROXYAUTH, LONG, 111), + + /* FTP option that changes the timeout, in seconds, associated with + getting a response. This is different from transfer timeout time and + essentially places a demand on the FTP server to acknowledge commands + in a timely manner. */ + CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112), +#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT + + /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to + tell libcurl to resolve names to those IP versions only. This only has + affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ + CINIT(IPRESOLVE, LONG, 113), + + /* Set this option to limit the size of a file that will be downloaded from + an HTTP or FTP server. + + Note there is also _LARGE version which adds large file support for + platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ + CINIT(MAXFILESIZE, LONG, 114), + + /* See the comment for INFILESIZE above, but in short, specifies + * the size of the file being uploaded. -1 means unknown. + */ + CINIT(INFILESIZE_LARGE, OFF_T, 115), + + /* Sets the continuation offset. There is also a LONG version of this; + * look above for RESUME_FROM. + */ + CINIT(RESUME_FROM_LARGE, OFF_T, 116), + + /* Sets the maximum size of data that will be downloaded from + * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. + */ + CINIT(MAXFILESIZE_LARGE, OFF_T, 117), + + /* Set this option to the file name of your .netrc file you want libcurl + to parse (using the CURLOPT_NETRC option). If not set, libcurl will do + a poor attempt to find the user's home directory and check for a .netrc + file in there. */ + CINIT(NETRC_FILE, STRINGPOINT, 118), + + /* Enable SSL/TLS for FTP, pick one of: + CURLUSESSL_TRY - try using SSL, proceed anyway otherwise + CURLUSESSL_CONTROL - SSL for the control connection or fail + CURLUSESSL_ALL - SSL for all communication or fail + */ + CINIT(USE_SSL, LONG, 119), + + /* The _LARGE version of the standard POSTFIELDSIZE option */ + CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120), + + /* Enable/disable the TCP Nagle algorithm */ + CINIT(TCP_NODELAY, LONG, 121), + + /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 123 OBSOLETE. Gone in 7.16.0 */ + /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 127 OBSOLETE. Gone in 7.16.0 */ + /* 128 OBSOLETE. Gone in 7.16.0 */ + + /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option + can be used to change libcurl's default action which is to first try + "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK + response has been received. + + Available parameters are: + CURLFTPAUTH_DEFAULT - let libcurl decide + CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS + CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL + */ + CINIT(FTPSSLAUTH, LONG, 129), + + CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130), + CINIT(IOCTLDATA, OBJECTPOINT, 131), + + /* 132 OBSOLETE. Gone in 7.16.0 */ + /* 133 OBSOLETE. Gone in 7.16.0 */ + + /* zero terminated string for pass on to the FTP server when asked for + "account" info */ + CINIT(FTP_ACCOUNT, STRINGPOINT, 134), + + /* feed cookie into cookie engine */ + CINIT(COOKIELIST, STRINGPOINT, 135), + + /* ignore Content-Length */ + CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), + + /* Set to non-zero to skip the IP address received in a 227 PASV FTP server + response. Typically used for FTP-SSL purposes but is not restricted to + that. libcurl will then instead use the same IP address it used for the + control connection. */ + CINIT(FTP_SKIP_PASV_IP, LONG, 137), + + /* Select "file method" to use when doing FTP, see the curl_ftpmethod + above. */ + CINIT(FTP_FILEMETHOD, LONG, 138), + + /* Local port number to bind the socket to */ + CINIT(LOCALPORT, LONG, 139), + + /* Number of ports to try, including the first one set with LOCALPORT. + Thus, setting it to 1 will make no additional attempts but the first. + */ + CINIT(LOCALPORTRANGE, LONG, 140), + + /* no transfer, set up connection and let application use the socket by + extracting it with CURLINFO_LASTSOCKET */ + CINIT(CONNECT_ONLY, LONG, 141), + + /* Function that will be called to convert from the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142), + + /* Function that will be called to convert to the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143), + + /* Function that will be called to convert from UTF8 + (instead of using the iconv calls in libcurl) + Note that this is used only for SSL certificate processing */ + CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144), + + /* if the connection proceeds too quickly then need to slow it down */ + /* limit-rate: maximum number of bytes per second to send or receive */ + CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145), + CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146), + + /* Pointer to command string to send if USER/PASS fails. */ + CINIT(FTP_ALTERNATIVE_TO_USER, STRINGPOINT, 147), + + /* callback function for setting socket options */ + CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148), + CINIT(SOCKOPTDATA, OBJECTPOINT, 149), + + /* set to 0 to disable session ID re-use for this transfer, default is + enabled (== 1) */ + CINIT(SSL_SESSIONID_CACHE, LONG, 150), + + /* allowed SSH authentication methods */ + CINIT(SSH_AUTH_TYPES, LONG, 151), + + /* Used by scp/sftp to do public/private key authentication */ + CINIT(SSH_PUBLIC_KEYFILE, STRINGPOINT, 152), + CINIT(SSH_PRIVATE_KEYFILE, STRINGPOINT, 153), + + /* Send CCC (Clear Command Channel) after authentication */ + CINIT(FTP_SSL_CCC, LONG, 154), + + /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ + CINIT(TIMEOUT_MS, LONG, 155), + CINIT(CONNECTTIMEOUT_MS, LONG, 156), + + /* set to zero to disable the libcurl's decoding and thus pass the raw body + data to the application even when it is encoded/compressed */ + CINIT(HTTP_TRANSFER_DECODING, LONG, 157), + CINIT(HTTP_CONTENT_DECODING, LONG, 158), + + /* Permission used when creating new files and directories on the remote + server for protocols that support it, SFTP/SCP/FILE */ + CINIT(NEW_FILE_PERMS, LONG, 159), + CINIT(NEW_DIRECTORY_PERMS, LONG, 160), + + /* Set the behaviour of POST when redirecting. Values must be set to one + of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ + CINIT(POSTREDIR, LONG, 161), + + /* used by scp/sftp to verify the host's public key */ + CINIT(SSH_HOST_PUBLIC_KEY_MD5, STRINGPOINT, 162), + + /* Callback function for opening socket (instead of socket(2)). Optionally, + callback is able change the address or refuse to connect returning + CURL_SOCKET_BAD. The callback should have type + curl_opensocket_callback */ + CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163), + CINIT(OPENSOCKETDATA, OBJECTPOINT, 164), + + /* POST volatile input fields. */ + CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), + + /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ + CINIT(PROXY_TRANSFER_MODE, LONG, 166), + + /* Callback function for seeking in the input stream */ + CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167), + CINIT(SEEKDATA, OBJECTPOINT, 168), + + /* CRL file */ + CINIT(CRLFILE, STRINGPOINT, 169), + + /* Issuer certificate */ + CINIT(ISSUERCERT, STRINGPOINT, 170), + + /* (IPv6) Address scope */ + CINIT(ADDRESS_SCOPE, LONG, 171), + + /* Collect certificate chain info and allow it to get retrievable with + CURLINFO_CERTINFO after the transfer is complete. */ + CINIT(CERTINFO, LONG, 172), + + /* "name" and "pwd" to use when fetching. */ + CINIT(USERNAME, STRINGPOINT, 173), + CINIT(PASSWORD, STRINGPOINT, 174), + + /* "name" and "pwd" to use with Proxy when fetching. */ + CINIT(PROXYUSERNAME, STRINGPOINT, 175), + CINIT(PROXYPASSWORD, STRINGPOINT, 176), + + /* Comma separated list of hostnames defining no-proxy zones. These should + match both hostnames directly, and hostnames within a domain. For + example, local.com will match local.com and www.local.com, but NOT + notlocal.com or www.notlocal.com. For compatibility with other + implementations of this, .local.com will be considered to be the same as + local.com. A single * is the only valid wildcard, and effectively + disables the use of proxy. */ + CINIT(NOPROXY, STRINGPOINT, 177), + + /* block size for TFTP transfers */ + CINIT(TFTP_BLKSIZE, LONG, 178), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_SERVICE, STRINGPOINT, 179), /* DEPRECATED, do not use! */ + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_NEC, LONG, 180), + + /* set the bitmask for the protocols that are allowed to be used for the + transfer, which thus helps the app which takes URLs from users or other + external inputs and want to restrict what protocol(s) to deal + with. Defaults to CURLPROTO_ALL. */ + CINIT(PROTOCOLS, LONG, 181), + + /* set the bitmask for the protocols that libcurl is allowed to follow to, + as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs + to be set in both bitmasks to be allowed to get redirected to. Defaults + to all protocols except FILE and SCP. */ + CINIT(REDIR_PROTOCOLS, LONG, 182), + + /* set the SSH knownhost file name to use */ + CINIT(SSH_KNOWNHOSTS, STRINGPOINT, 183), + + /* set the SSH host key callback, must point to a curl_sshkeycallback + function */ + CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184), + + /* set the SSH host key callback custom pointer */ + CINIT(SSH_KEYDATA, OBJECTPOINT, 185), + + /* set the SMTP mail originator */ + CINIT(MAIL_FROM, STRINGPOINT, 186), + + /* set the list of SMTP mail receiver(s) */ + CINIT(MAIL_RCPT, OBJECTPOINT, 187), + + /* FTP: send PRET before PASV */ + CINIT(FTP_USE_PRET, LONG, 188), + + /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ + CINIT(RTSP_REQUEST, LONG, 189), + + /* The RTSP session identifier */ + CINIT(RTSP_SESSION_ID, STRINGPOINT, 190), + + /* The RTSP stream URI */ + CINIT(RTSP_STREAM_URI, STRINGPOINT, 191), + + /* The Transport: header to use in RTSP requests */ + CINIT(RTSP_TRANSPORT, STRINGPOINT, 192), + + /* Manually initialize the client RTSP CSeq for this handle */ + CINIT(RTSP_CLIENT_CSEQ, LONG, 193), + + /* Manually initialize the server RTSP CSeq for this handle */ + CINIT(RTSP_SERVER_CSEQ, LONG, 194), + + /* The stream to pass to INTERLEAVEFUNCTION. */ + CINIT(INTERLEAVEDATA, OBJECTPOINT, 195), + + /* Let the application define a custom write method for RTP data */ + CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196), + + /* Turn on wildcard matching */ + CINIT(WILDCARDMATCH, LONG, 197), + + /* Directory matching callback called before downloading of an + individual file (chunk) started */ + CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198), + + /* Directory matching callback called after the file (chunk) + was downloaded, or skipped */ + CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199), + + /* Change match (fnmatch-like) callback for wildcard matching */ + CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200), + + /* Let the application define custom chunk data pointer */ + CINIT(CHUNK_DATA, OBJECTPOINT, 201), + + /* FNMATCH_FUNCTION user pointer */ + CINIT(FNMATCH_DATA, OBJECTPOINT, 202), + + /* send linked-list of name:port:address sets */ + CINIT(RESOLVE, OBJECTPOINT, 203), + + /* Set a username for authenticated TLS */ + CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204), + + /* Set a password for authenticated TLS */ + CINIT(TLSAUTH_PASSWORD, STRINGPOINT, 205), + + /* Set authentication type for authenticated TLS */ + CINIT(TLSAUTH_TYPE, STRINGPOINT, 206), + + /* Set to 1 to enable the "TE:" header in HTTP requests to ask for + compressed transfer-encoded responses. Set to 0 to disable the use of TE: + in outgoing requests. The current default is 0, but it might change in a + future libcurl release. + + libcurl will ask for the compressed methods it knows of, and if that + isn't any, it will not ask for transfer-encoding at all even if this + option is set to 1. + + */ + CINIT(TRANSFER_ENCODING, LONG, 207), + + /* Callback function for closing socket (instead of close(2)). The callback + should have type curl_closesocket_callback */ + CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208), + CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209), + + /* allow GSSAPI credential delegation */ + CINIT(GSSAPI_DELEGATION, LONG, 210), + + /* Set the name servers to use for DNS resolution */ + CINIT(DNS_SERVERS, STRINGPOINT, 211), + + /* Time-out accept operations (currently for FTP only) after this amount + of miliseconds. */ + CINIT(ACCEPTTIMEOUT_MS, LONG, 212), + + /* Set TCP keepalive */ + CINIT(TCP_KEEPALIVE, LONG, 213), + + /* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */ + CINIT(TCP_KEEPIDLE, LONG, 214), + CINIT(TCP_KEEPINTVL, LONG, 215), + + /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ + CINIT(SSL_OPTIONS, LONG, 216), + + /* Set the SMTP auth originator */ + CINIT(MAIL_AUTH, STRINGPOINT, 217), + + /* Enable/disable SASL initial response */ + CINIT(SASL_IR, LONG, 218), + + /* Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_xferinfo_callback + * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ + CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219), + + /* The XOAUTH2 bearer token */ + CINIT(XOAUTH2_BEARER, STRINGPOINT, 220), + + /* Set the interface string to use as outgoing network + * interface for DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_INTERFACE, STRINGPOINT, 221), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP4, STRINGPOINT, 222), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP6, STRINGPOINT, 223), + + /* Set authentication options directly */ + CINIT(LOGIN_OPTIONS, STRINGPOINT, 224), + + /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */ + CINIT(SSL_ENABLE_NPN, LONG, 225), + + /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */ + CINIT(SSL_ENABLE_ALPN, LONG, 226), + + /* Time to wait for a response to a HTTP request containing an + * Expect: 100-continue header before sending the data anyway. */ + CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227), + + /* This points to a linked list of headers used for proxy requests only, + struct curl_slist kind */ + CINIT(PROXYHEADER, OBJECTPOINT, 228), + + /* Pass in a bitmask of "header options" */ + CINIT(HEADEROPT, LONG, 229), + + /* The public key in DER form used to validate the peer public key + this option is used only if SSL_VERIFYPEER is true */ + CINIT(PINNEDPUBLICKEY, STRINGPOINT, 230), + + /* Path to Unix domain socket */ + CINIT(UNIX_SOCKET_PATH, STRINGPOINT, 231), + + /* Set if we should verify the certificate status. */ + CINIT(SSL_VERIFYSTATUS, LONG, 232), + + /* Set if we should enable TLS false start. */ + CINIT(SSL_FALSESTART, LONG, 233), + + /* Do not squash dot-dot sequences */ + CINIT(PATH_AS_IS, LONG, 234), + + /* Proxy Service Name */ + CINIT(PROXY_SERVICE_NAME, STRINGPOINT, 235), + + /* Service Name */ + CINIT(SERVICE_NAME, STRINGPOINT, 236), + + /* Wait/don't wait for pipe/mutex to clarify */ + CINIT(PIPEWAIT, LONG, 237), + + /* Set the protocol used when curl is given a URL without a protocol */ + CINIT(DEFAULT_PROTOCOL, STRINGPOINT, 238), + + /* Set stream weight, 1 - 256 (default is 16) */ + CINIT(STREAM_WEIGHT, LONG, 239), + + /* Set stream dependency on another CURL handle */ + CINIT(STREAM_DEPENDS, OBJECTPOINT, 240), + + /* Set E-xclusive stream dependency on another CURL handle */ + CINIT(STREAM_DEPENDS_E, OBJECTPOINT, 241), + + /* Do not send any tftp option requests to the server */ + CINIT(TFTP_NO_OPTIONS, LONG, 242), + + /* Linked-list of host:port:connect-to-host:connect-to-port, + overrides the URL's host:port (only for the network layer) */ + CINIT(CONNECT_TO, OBJECTPOINT, 243), + + /* Set TCP Fast Open */ + CINIT(TCP_FASTOPEN, LONG, 244), + + /* Continue to send data if the server responds early with an + * HTTP status code >= 300 */ + CINIT(KEEP_SENDING_ON_ERROR, LONG, 245), + + /* The CApath or CAfile used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_CAINFO, STRINGPOINT, 246), + + /* The CApath directory used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_CAPATH, STRINGPOINT, 247), + + /* Set if we should verify the proxy in ssl handshake, + set 1 to verify. */ + CINIT(PROXY_SSL_VERIFYPEER, LONG, 248), + + /* Set if we should verify the Common name from the proxy certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches + * the provided hostname. */ + CINIT(PROXY_SSL_VERIFYHOST, LONG, 249), + + /* What version to specifically try to use for proxy. + See CURL_SSLVERSION defines below. */ + CINIT(PROXY_SSLVERSION, LONG, 250), + + /* Set a username for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_USERNAME, STRINGPOINT, 251), + + /* Set a password for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_PASSWORD, STRINGPOINT, 252), + + /* Set authentication type for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_TYPE, STRINGPOINT, 253), + + /* name of the file keeping your private SSL-certificate for proxy */ + CINIT(PROXY_SSLCERT, STRINGPOINT, 254), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for + proxy */ + CINIT(PROXY_SSLCERTTYPE, STRINGPOINT, 255), + + /* name of the file keeping your private SSL-key for proxy */ + CINIT(PROXY_SSLKEY, STRINGPOINT, 256), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for + proxy */ + CINIT(PROXY_SSLKEYTYPE, STRINGPOINT, 257), + + /* password for the SSL private key for proxy */ + CINIT(PROXY_KEYPASSWD, STRINGPOINT, 258), + + /* Specify which SSL ciphers to use for proxy */ + CINIT(PROXY_SSL_CIPHER_LIST, STRINGPOINT, 259), + + /* CRL file for proxy */ + CINIT(PROXY_CRLFILE, STRINGPOINT, 260), + + /* Enable/disable specific SSL features with a bitmask for proxy, see + CURLSSLOPT_* */ + CINIT(PROXY_SSL_OPTIONS, LONG, 261), + + /* Name of pre proxy to use. */ + CINIT(PRE_PROXY, STRINGPOINT, 262), + + /* The public key in DER form used to validate the proxy public key + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263), + + /* Path to an abstract Unix domain socket */ + CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264), + + CURLOPT_LASTENTRY /* the last unused */ +} CURLoption; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2011 */ + +/* This was added in version 7.19.1 */ +#define CURLOPT_POST301 CURLOPT_POSTREDIR + +/* These are scheduled to disappear by 2009 */ + +/* The following were added in 7.17.0 */ +#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_FTPAPPEND CURLOPT_APPEND +#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY +#define CURLOPT_FTP_SSL CURLOPT_USE_SSL + +/* The following were added earlier */ + +#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL + +#else +/* This is set if CURL_NO_OLDIES is defined at compile-time */ +#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ +#endif + + + /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host + name resolves addresses using more than one IP protocol version, this + option might be handy to force libcurl to use a specific IP version. */ +#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP + versions that your system allows */ +#define CURL_IPRESOLVE_V4 1 /* resolve to IPv4 addresses */ +#define CURL_IPRESOLVE_V6 2 /* resolve to IPv6 addresses */ + + /* three convenient "aliases" that follow the name scheme better */ +#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER + + /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ +enum { + CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd + like the library to choose the best possible + for us! */ + CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ + CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ + CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */ + CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */ + CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1 + Upgrade */ + + CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ +}; + +/* Convenience definition simple because the name of the version is HTTP/2 and + not 2.0. The 2_0 version of the enum name was set while the version was + still planned to be 2.0 and we stick to it for compatibility. */ +#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0 + +/* + * Public API enums for RTSP requests + */ +enum { + CURL_RTSPREQ_NONE, /* first in list */ + CURL_RTSPREQ_OPTIONS, + CURL_RTSPREQ_DESCRIBE, + CURL_RTSPREQ_ANNOUNCE, + CURL_RTSPREQ_SETUP, + CURL_RTSPREQ_PLAY, + CURL_RTSPREQ_PAUSE, + CURL_RTSPREQ_TEARDOWN, + CURL_RTSPREQ_GET_PARAMETER, + CURL_RTSPREQ_SET_PARAMETER, + CURL_RTSPREQ_RECORD, + CURL_RTSPREQ_RECEIVE, + CURL_RTSPREQ_LAST /* last in list */ +}; + + /* These enums are for use with the CURLOPT_NETRC option. */ +enum CURL_NETRC_OPTION { + CURL_NETRC_IGNORED, /* The .netrc will never be read. + * This is the default. */ + CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred + * to one in the .netrc. */ + CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. + * Unless one is set programmatically, the .netrc + * will be queried. */ + CURL_NETRC_LAST +}; + +enum { + CURL_SSLVERSION_DEFAULT, + CURL_SSLVERSION_TLSv1, /* TLS 1.x */ + CURL_SSLVERSION_SSLv2, + CURL_SSLVERSION_SSLv3, + CURL_SSLVERSION_TLSv1_0, + CURL_SSLVERSION_TLSv1_1, + CURL_SSLVERSION_TLSv1_2, + CURL_SSLVERSION_TLSv1_3, + + CURL_SSLVERSION_LAST /* never use, keep last */ +}; + +enum CURL_TLSAUTH { + CURL_TLSAUTH_NONE, + CURL_TLSAUTH_SRP, + CURL_TLSAUTH_LAST /* never use, keep last */ +}; + +/* symbols to use with CURLOPT_POSTREDIR. + CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303 + can be bitwise ORed so that CURL_REDIR_POST_301 | CURL_REDIR_POST_302 + | CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */ + +#define CURL_REDIR_GET_ALL 0 +#define CURL_REDIR_POST_301 1 +#define CURL_REDIR_POST_302 2 +#define CURL_REDIR_POST_303 4 +#define CURL_REDIR_POST_ALL \ + (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303) + +typedef enum { + CURL_TIMECOND_NONE, + + CURL_TIMECOND_IFMODSINCE, + CURL_TIMECOND_IFUNMODSINCE, + CURL_TIMECOND_LASTMOD, + + CURL_TIMECOND_LAST +} curl_TimeCond; + + +/* curl_strequal() and curl_strnequal() are subject for removal in a future + libcurl, see lib/README.curlx for details + + !checksrc! disable SPACEBEFOREPAREN 2 +*/ +CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2); +CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n); + +/* name is uppercase CURLFORM_ */ +#ifdef CFINIT +#undef CFINIT +#endif + +#ifdef CURL_ISOCPP +#define CFINIT(name) CURLFORM_ ## name +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define CFINIT(name) CURLFORM_/**/name +#endif + +typedef enum { + CFINIT(NOTHING), /********* the first one is unused ************/ + + /* */ + CFINIT(COPYNAME), + CFINIT(PTRNAME), + CFINIT(NAMELENGTH), + CFINIT(COPYCONTENTS), + CFINIT(PTRCONTENTS), + CFINIT(CONTENTSLENGTH), + CFINIT(FILECONTENT), + CFINIT(ARRAY), + CFINIT(OBSOLETE), + CFINIT(FILE), + + CFINIT(BUFFER), + CFINIT(BUFFERPTR), + CFINIT(BUFFERLENGTH), + + CFINIT(CONTENTTYPE), + CFINIT(CONTENTHEADER), + CFINIT(FILENAME), + CFINIT(END), + CFINIT(OBSOLETE2), + + CFINIT(STREAM), + CFINIT(CONTENTLEN), /* added in 7.46.0, provide a curl_off_t length */ + + CURLFORM_LASTENTRY /* the last unused */ +} CURLformoption; + +#undef CFINIT /* done */ + +/* structure to be used as parameter for CURLFORM_ARRAY */ +struct curl_forms { + CURLformoption option; + const char *value; +}; + +/* use this for multipart formpost building */ +/* Returns code for curl_formadd() + * + * Returns: + * CURL_FORMADD_OK on success + * CURL_FORMADD_MEMORY if the FormInfo allocation fails + * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form + * CURL_FORMADD_NULL if a null pointer was given for a char + * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed + * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used + * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) + * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated + * CURL_FORMADD_MEMORY if some allocation for string copying failed. + * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array + * + ***************************************************************************/ +typedef enum { + CURL_FORMADD_OK, /* first, no error */ + + CURL_FORMADD_MEMORY, + CURL_FORMADD_OPTION_TWICE, + CURL_FORMADD_NULL, + CURL_FORMADD_UNKNOWN_OPTION, + CURL_FORMADD_INCOMPLETE, + CURL_FORMADD_ILLEGAL_ARRAY, + CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ + + CURL_FORMADD_LAST /* last */ +} CURLFORMcode; + +/* + * NAME curl_formadd() + * + * DESCRIPTION + * + * Pretty advanced function for building multi-part formposts. Each invoke + * adds one part that together construct a full post. Then use + * CURLOPT_HTTPPOST to send it off to libcurl. + */ +CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, + struct curl_httppost **last_post, + ...); + +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to + * curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on + * success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, + size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); +/* + * NAME curl_formfree() + * + * DESCRIPTION + * + * Free a multipart formpost previously built with curl_formadd(). + */ +CURL_EXTERN void curl_formfree(struct curl_httppost *form); + +/* + * NAME curl_getenv() + * + * DESCRIPTION + * + * Returns a malloc()'ed string that MUST be curl_free()ed after usage is + * complete. DEPRECATED - see lib/README.curlx + */ +CURL_EXTERN char *curl_getenv(const char *variable); + +/* + * NAME curl_version() + * + * DESCRIPTION + * + * Returns a static ascii string of the libcurl version. + */ +CURL_EXTERN char *curl_version(void); + +/* + * NAME curl_easy_escape() + * + * DESCRIPTION + * + * Escapes URL strings (converts all letters consider illegal in URLs to their + * %XX versions). This function returns a new allocated string or NULL if an + * error occurred. + */ +CURL_EXTERN char *curl_easy_escape(CURL *handle, + const char *string, + int length); + +/* the previous version: */ +CURL_EXTERN char *curl_escape(const char *string, + int length); + + +/* + * NAME curl_easy_unescape() + * + * DESCRIPTION + * + * Unescapes URL encoding in strings (converts all %XX codes to their 8bit + * versions). This function returns a new allocated string or NULL if an error + * occurred. + * Conversion Note: On non-ASCII platforms the ASCII %XX codes are + * converted into the host encoding. + */ +CURL_EXTERN char *curl_easy_unescape(CURL *handle, + const char *string, + int length, + int *outlength); + +/* the previous version */ +CURL_EXTERN char *curl_unescape(const char *string, + int length); + +/* + * NAME curl_free() + * + * DESCRIPTION + * + * Provided for de-allocation in the same translation unit that did the + * allocation. Added in libcurl 7.10 + */ +CURL_EXTERN void curl_free(void *p); + +/* + * NAME curl_global_init() + * + * DESCRIPTION + * + * curl_global_init() should be invoked exactly once for each application that + * uses libcurl and before any call of other libcurl functions. + * + * This function is not thread-safe! + */ +CURL_EXTERN CURLcode curl_global_init(long flags); + +/* + * NAME curl_global_init_mem() + * + * DESCRIPTION + * + * curl_global_init() or curl_global_init_mem() should be invoked exactly once + * for each application that uses libcurl. This function can be used to + * initialize libcurl and set user defined memory management callback + * functions. Users can implement memory management routines to check for + * memory leaks, check for mis-use of the curl library etc. User registered + * callback routines with be invoked by this library instead of the system + * memory management routines like malloc, free etc. + */ +CURL_EXTERN CURLcode curl_global_init_mem(long flags, + curl_malloc_callback m, + curl_free_callback f, + curl_realloc_callback r, + curl_strdup_callback s, + curl_calloc_callback c); + +/* + * NAME curl_global_cleanup() + * + * DESCRIPTION + * + * curl_global_cleanup() should be invoked exactly once for each application + * that uses libcurl + */ +CURL_EXTERN void curl_global_cleanup(void); + +/* linked-list structure for the CURLOPT_QUOTE option (and other) */ +struct curl_slist { + char *data; + struct curl_slist *next; +}; + +/* + * NAME curl_slist_append() + * + * DESCRIPTION + * + * Appends a string to a linked list. If no list exists, it will be created + * first. Returns the new list, after appending. + */ +CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, + const char *); + +/* + * NAME curl_slist_free_all() + * + * DESCRIPTION + * + * free a previously built curl_slist. + */ +CURL_EXTERN void curl_slist_free_all(struct curl_slist *); + +/* + * NAME curl_getdate() + * + * DESCRIPTION + * + * Returns the time, in seconds since 1 Jan 1970 of the time string given in + * the first argument. The time argument in the second parameter is unused + * and should be set to NULL. + */ +CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); + +/* info about the certificate chain, only for OpenSSL builds. Asked + for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ +struct curl_certinfo { + int num_of_certs; /* number of certificates with information */ + struct curl_slist **certinfo; /* for each index in this array, there's a + linked list with textual information in the + format "name: value" */ +}; + +/* enum for the different supported SSL backends */ +typedef enum { + CURLSSLBACKEND_NONE = 0, + CURLSSLBACKEND_OPENSSL = 1, + CURLSSLBACKEND_GNUTLS = 2, + CURLSSLBACKEND_NSS = 3, + CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */ + CURLSSLBACKEND_GSKIT = 5, + CURLSSLBACKEND_POLARSSL = 6, + CURLSSLBACKEND_CYASSL = 7, + CURLSSLBACKEND_SCHANNEL = 8, + CURLSSLBACKEND_DARWINSSL = 9, + CURLSSLBACKEND_AXTLS = 10, + CURLSSLBACKEND_MBEDTLS = 11 +} curl_sslbackend; + +/* aliases for library clones and renames */ +#define CURLSSLBACKEND_LIBRESSL 1 +#define CURLSSLBACKEND_BORINGSSL 1 +#define CURLSSLBACKEND_WOLFSSL 6 + +/* Information about the SSL library used and the respective internal SSL + handle, which can be used to obtain further information regarding the + connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */ +struct curl_tlssessioninfo { + curl_sslbackend backend; + void *internals; +}; + +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_SOCKET 0x500000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 + +typedef enum { + CURLINFO_NONE, /* first, never use this */ + CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, + CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, + CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, + CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, + CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, + CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, + CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, + CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, + CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, + CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, + CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, + CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, + CURLINFO_FILETIME = CURLINFO_LONG + 14, + CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, + CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, + CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, + CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, + CURLINFO_PRIVATE = CURLINFO_STRING + 21, + CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, + CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, + CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, + CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, + CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, + CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, + CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, + CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, + CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, + CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, + CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, + CURLINFO_CERTINFO = CURLINFO_SLIST + 34, + CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, + CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, + CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, + CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, + CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, + CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, + CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, + CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, + CURLINFO_TLS_SESSION = CURLINFO_SLIST + 43, + CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, + CURLINFO_TLS_SSL_PTR = CURLINFO_SLIST + 45, + CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, + CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, + CURLINFO_PROTOCOL = CURLINFO_LONG + 48, + CURLINFO_SCHEME = CURLINFO_STRING + 49, + /* Fill in new entries below here! */ + + CURLINFO_LASTONE = 49 +} CURLINFO; + +/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as + CURLINFO_HTTP_CODE */ +#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE + +typedef enum { + CURLCLOSEPOLICY_NONE, /* first, never use this */ + + CURLCLOSEPOLICY_OLDEST, + CURLCLOSEPOLICY_LEAST_RECENTLY_USED, + CURLCLOSEPOLICY_LEAST_TRAFFIC, + CURLCLOSEPOLICY_SLOWEST, + CURLCLOSEPOLICY_CALLBACK, + + CURLCLOSEPOLICY_LAST /* last, never use this */ +} curl_closepolicy; + +#define CURL_GLOBAL_SSL (1<<0) +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURL_GLOBAL_NOTHING 0 +#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL +#define CURL_GLOBAL_ACK_EINTR (1<<2) + + +/***************************************************************************** + * Setup defines, protos etc for the sharing stuff. + */ + +/* Different data locks for a single share */ +typedef enum { + CURL_LOCK_DATA_NONE = 0, + /* CURL_LOCK_DATA_SHARE is used internally to say that + * the locking is just made to change the internal state of the share + * itself. + */ + CURL_LOCK_DATA_SHARE, + CURL_LOCK_DATA_COOKIE, + CURL_LOCK_DATA_DNS, + CURL_LOCK_DATA_SSL_SESSION, + CURL_LOCK_DATA_CONNECT, + CURL_LOCK_DATA_LAST +} curl_lock_data; + +/* Different lock access types */ +typedef enum { + CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ + CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ + CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ + CURL_LOCK_ACCESS_LAST /* never use */ +} curl_lock_access; + +typedef void (*curl_lock_function)(CURL *handle, + curl_lock_data data, + curl_lock_access locktype, + void *userptr); +typedef void (*curl_unlock_function)(CURL *handle, + curl_lock_data data, + void *userptr); + + +typedef enum { + CURLSHE_OK, /* all is fine */ + CURLSHE_BAD_OPTION, /* 1 */ + CURLSHE_IN_USE, /* 2 */ + CURLSHE_INVALID, /* 3 */ + CURLSHE_NOMEM, /* 4 out of memory */ + CURLSHE_NOT_BUILT_IN, /* 5 feature not present in lib */ + CURLSHE_LAST /* never use */ +} CURLSHcode; + +typedef enum { + CURLSHOPT_NONE, /* don't use */ + CURLSHOPT_SHARE, /* specify a data type to share */ + CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ + CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ + CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ + CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock + callback functions */ + CURLSHOPT_LAST /* never use */ +} CURLSHoption; + +CURL_EXTERN CURLSH *curl_share_init(void); +CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); +CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); + +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +typedef enum { + CURLVERSION_FIRST, + CURLVERSION_SECOND, + CURLVERSION_THIRD, + CURLVERSION_FOURTH, + CURLVERSION_LAST /* never actually use this */ +} CURLversion; + +/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by + basically all programs ever that want to get version information. It is + meant to be a built-in version number for what kind of struct the caller + expects. If the struct ever changes, we redefine the NOW to another enum + from above. */ +#define CURLVERSION_NOW CURLVERSION_FOURTH + +typedef struct { + CURLversion age; /* age of the returned struct */ + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + const char *host; /* OS/host/cpu/machine when configured */ + int features; /* bitmask, see defines below */ + const char *ssl_version; /* human readable string */ + long ssl_version_num; /* not used anymore, always 0 */ + const char *libz_version; /* human readable string */ + /* protocols is terminated by an entry with a NULL protoname */ + const char * const *protocols; + + /* The fields below this were added in CURLVERSION_SECOND */ + const char *ares; + int ares_num; + + /* This field was added in CURLVERSION_THIRD */ + const char *libidn; + + /* These field were added in CURLVERSION_FOURTH */ + + /* Same as '_libiconv_version' if built with HAVE_ICONV */ + int iconv_ver_num; + + const char *libssh_version; /* human readable string */ + +} curl_version_info_data; + +#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ +#define CURL_VERSION_KERBEROS4 (1<<1) /* Kerberos V4 auth is supported + (deprecated) */ +#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ +#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ +#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ +#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth is supported + (deprecated) */ +#define CURL_VERSION_DEBUG (1<<6) /* Built with debug capabilities */ +#define CURL_VERSION_ASYNCHDNS (1<<7) /* Asynchronous DNS resolves */ +#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth is supported */ +#define CURL_VERSION_LARGEFILE (1<<9) /* Supports files larger than 2GB */ +#define CURL_VERSION_IDN (1<<10) /* Internationized Domain Names are + supported */ +#define CURL_VERSION_SSPI (1<<11) /* Built against Windows SSPI */ +#define CURL_VERSION_CONV (1<<12) /* Character conversions supported */ +#define CURL_VERSION_CURLDEBUG (1<<13) /* Debug memory tracking supported */ +#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ +#define CURL_VERSION_NTLM_WB (1<<15) /* NTLM delegation to winbind helper + is suported */ +#define CURL_VERSION_HTTP2 (1<<16) /* HTTP2 support built-in */ +#define CURL_VERSION_GSSAPI (1<<17) /* Built against a GSS-API library */ +#define CURL_VERSION_KERBEROS5 (1<<18) /* Kerberos V5 auth is supported */ +#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */ +#define CURL_VERSION_PSL (1<<20) /* Mozilla's Public Suffix List, used + for cookie domain verification */ +#define CURL_VERSION_HTTPS_PROXY (1<<21) /* HTTPS-proxy support built-in */ + + /* + * NAME curl_version_info() + * + * DESCRIPTION + * + * This function returns a pointer to a static copy of the version info + * struct. See above. + */ +CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); + +/* + * NAME curl_easy_strerror() + * + * DESCRIPTION + * + * The curl_easy_strerror function may be used to turn a CURLcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_easy_strerror(CURLcode); + +/* + * NAME curl_share_strerror() + * + * DESCRIPTION + * + * The curl_share_strerror function may be used to turn a CURLSHcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_share_strerror(CURLSHcode); + +/* + * NAME curl_easy_pause() + * + * DESCRIPTION + * + * The curl_easy_pause function pauses or unpauses transfers. Select the new + * state by setting the bitmask, use the convenience defines below. + * + */ +CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); + +#define CURLPAUSE_RECV (1<<0) +#define CURLPAUSE_RECV_CONT (0) + +#define CURLPAUSE_SEND (1<<2) +#define CURLPAUSE_SEND_CONT (0) + +#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) +#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) + +#ifdef __cplusplus +} +#endif + +/* unfortunately, the easy.h and multi.h include files need options and info + stuff before they can be included! */ +#include "easy.h" /* nothing in curl is fun without the easy stuff */ +#include "multi.h" + +/* the typechecker doesn't work in C++ (yet) */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ + !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) +#include "typecheck-gcc.h" +#else +#if defined(__STDC__) && (__STDC__ >= 1) +/* This preprocessor magic that replaces a call with the exact same call is + only done to make sure application authors pass exactly three arguments + to these functions. */ +#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) +#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) +#endif /* __STDC__ >= 1 */ +#endif /* gcc >= 4.3 && !__cplusplus */ + +#endif /* __CURL_CURL_H */ diff --git a/src/3rdparty/win32_include/curl/curlbuild.h b/src/3rdparty/win32_include/curl/curlbuild.h new file mode 100644 index 000000000..ae95095fa --- /dev/null +++ b/src/3rdparty/win32_include/curl/curlbuild.h @@ -0,0 +1,586 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * See file include/curl/curlbuild.h.in, run configure, and forget + * that this file exists it is only used for non-configure systems. + * But you can keep reading if you want ;-) + * + */ + +/* ================================================================ */ +/* NOTES FOR NON-CONFIGURE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * Try to keep one section per platform, compiler and architecture, + * otherwise, if an existing section is reused for a different one and + * later on the original is adjusted, probably the piggybacking one can + * be adversely changed. + * + * In order to differentiate between platforms/compilers/architectures + * use only compiler built in predefined preprocessor symbols. + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * For any given platform/compiler curl_off_t must be typedef'ed to a + * 64-bit wide signed integral data type. The width of this data type + * must remain constant and independent of any possible large file + * support settings. + * + * As an exception to the above, curl_off_t shall be typedef'ed to a + * 32-bit wide signed integral data type if there is no 64-bit type. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This + * rule shall only be violated if off_t is the only 64-bit data type + * available and the size of off_t is independent of large file support + * settings. Keep your build on the safe side avoiding an off_t gating. + * If you have a 64-bit off_t then take for sure that another 64-bit + * data type exists, dig deeper and you will find it. + * + * NOTE 3: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.dist or + * at file include/curl/curlbuild.h, this is due to the following reason: + * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h + * when the libcurl source code distribution archive file is created. + * + * File include/curl/curlbuild.h.dist is not included in the distribution + * archive. File include/curl/curlbuild.h is not present in the git tree. + * + * The distributed include/curl/curlbuild.h file is only intended to be used + * on systems which can not run the also distributed configure script. + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + * If you check out from git on a non-configure platform, you must run the + * appropriate buildconf* script to set up curlbuild.h and other local files. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ +/* ================================================================ */ + +#if defined(__DJGPP__) || defined(__GO32__) +# if defined(__DJGPP__) && (__DJGPP__ > 1) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SALFORDC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__BORLANDC__) +# if (__BORLANDC__ < 0x520) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__TURBOC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__WATCOMC__) +# if defined(__386__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__POCC__) +# if (__POCC__ < 280) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# elif defined(_MSC_VER) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__LCC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SYMBIAN32__) +# if defined(__EABI__) /* Treat all ARM compilers equally */ +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__CW32__) +# pragma longlong on +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__VC32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MWERKS__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(_WIN32_WCE) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MINGW32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__OS400__) +# if defined(__ILEC400__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__MVS__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) +# if !defined(__LP64__) && (defined(__ILP32__) || \ + defined(__i386__) || defined(__ppc__) || defined(__arm__) || \ + defined(__sparc__) || defined(__mips__) || defined(__sh__)) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64__) || \ + defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +# error "Unknown non-configure build target!" + Error Compilation_aborted_Unknown_non_configure_build_target +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +#endif /* __CURL_CURLBUILD_H */ diff --git a/src/3rdparty/win32_include/curl/curlbuild.h.cmake b/src/3rdparty/win32_include/curl/curlbuild.h.cmake new file mode 100644 index 000000000..bbb31a940 --- /dev/null +++ b/src/3rdparty/win32_include/curl/curlbuild.h.cmake @@ -0,0 +1,197 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +#cmakedefine CURL_PULL_WS2TCPIP_H +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_TYPES_H +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#cmakedefine CURL_PULL_STDINT_H +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#cmakedefine CURL_PULL_INTTYPES_H +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_SOCKET_H +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/poll.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_POLL_H +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#define CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} + +/* Integral data type used for curl_socklen_t. */ +#define CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T} + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#define CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_CURL_OFF_T} + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#define CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" + +/* The size of `curl_off_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} + +/* curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} + +/* unsigned curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} + +#endif /* __CURL_CURLBUILD_H */ diff --git a/src/3rdparty/win32_include/curl/curlbuild.h.in b/src/3rdparty/win32_include/curl/curlbuild.h.in new file mode 100644 index 000000000..ffab35670 --- /dev/null +++ b/src/3rdparty/win32_include/curl/curlbuild.h.in @@ -0,0 +1,197 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +#undef CURL_PULL_WS2TCPIP_H +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#undef CURL_PULL_SYS_TYPES_H +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#undef CURL_PULL_STDINT_H +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#undef CURL_PULL_INTTYPES_H +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#undef CURL_PULL_SYS_SOCKET_H +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/poll.h must be included by the external interface. */ +#undef CURL_PULL_SYS_POLL_H +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#undef CURL_SIZEOF_LONG + +/* Integral data type used for curl_socklen_t. */ +#undef CURL_TYPEOF_CURL_SOCKLEN_T + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#undef CURL_SIZEOF_CURL_SOCKLEN_T + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#undef CURL_TYPEOF_CURL_OFF_T + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#undef CURL_FORMAT_CURL_OFF_T + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#undef CURL_FORMAT_CURL_OFF_TU + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#undef CURL_FORMAT_OFF_T + +/* The size of `curl_off_t', as computed by sizeof. */ +#undef CURL_SIZEOF_CURL_OFF_T + +/* curl_off_t constant suffix. */ +#undef CURL_SUFFIX_CURL_OFF_T + +/* unsigned curl_off_t constant suffix. */ +#undef CURL_SUFFIX_CURL_OFF_TU + +#endif /* __CURL_CURLBUILD_H */ diff --git a/src/3rdparty/win32_include/curl/curlrules.h b/src/3rdparty/win32_include/curl/curlrules.h new file mode 100644 index 000000000..55d21f68f --- /dev/null +++ b/src/3rdparty/win32_include/curl/curlrules.h @@ -0,0 +1,262 @@ +#ifndef __CURL_CURLRULES_H +#define __CURL_CURLRULES_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* COMPILE TIME SANITY CHECKS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * All checks done in this file are intentionally placed in a public + * header file which is pulled by curl/curl.h when an application is + * being built using an already built libcurl library. Additionally + * this file is also included and used when building the library. + * + * If compilation fails on this file it is certainly sure that the + * problem is elsewhere. It could be a problem in the curlbuild.h + * header file, or simply that you are using different compilation + * settings than those used to build the library. + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * Do not deactivate any check, these are done to make sure that the + * library is properly built and used. + * + * You can find further help on the libcurl development mailing list: + * https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * NOTE 2 + * ------ + * + * Some of the following compile time checks are based on the fact + * that the dimension of a constant array can not be a negative one. + * In this way if the compile time verification fails, the compilation + * will fail issuing an error. The error description wording is compiler + * dependent but it will be quite similar to one of the following: + * + * "negative subscript or subscript is too large" + * "array must have at least one element" + * "-1 is an illegal array size" + * "size of array is negative" + * + * If you are building an application which tries to use an already + * built libcurl library and you are getting this kind of errors on + * this file, it is a clear indication that there is a mismatch between + * how the library was built and how you are trying to use it for your + * application. Your already compiled or binary library provider is the + * only one who can give you the details you need to properly use it. + */ + +/* + * Verify that some macros are actually defined. + */ + +#ifndef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing +#endif + +#ifndef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_OFF_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing +#endif + +/* + * Macros private to this header file. + */ + +#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1 + +#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 + +/* + * Verify that the size previously defined and expected for long + * is the same as the one reported by sizeof() at compile time. + */ + +typedef char + __curl_rule_01__ + [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; + +/* + * Verify that the size previously defined and expected for + * curl_off_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_02__ + [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)]; + +/* + * Verify at compile time that the size of curl_off_t as reported + * by sizeof() is greater or equal than the one reported for long + * for the current compilation. + */ + +typedef char + __curl_rule_03__ + [CurlchkszGE(curl_off_t, long)]; + +/* + * Verify that the size previously defined and expected for + * curl_socklen_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_04__ + [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)]; + +/* + * Verify at compile time that the size of curl_socklen_t as reported + * by sizeof() is greater or equal than the one reported for int for + * the current compilation. + */ + +typedef char + __curl_rule_05__ + [CurlchkszGE(curl_socklen_t, int)]; + +/* ================================================================ */ +/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ +/* ================================================================ */ + +/* + * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow + * these to be visible and exported by the external libcurl interface API, + * while also making them visible to the library internals, simply including + * curl_setup.h, without actually needing to include curl.h internally. + * If some day this section would grow big enough, all this should be moved + * to its own header file. + */ + +/* + * Figure out if we can use the ## preprocessor operator, which is supported + * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ + * or __cplusplus so we need to carefully check for them too. + */ + +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ + defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ + defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ + defined(__ILEC400__) + /* This compiler is believed to have an ISO compatible preprocessor */ +#define CURL_ISOCPP +#else + /* This compiler is believed NOT to have an ISO compatible preprocessor */ +#undef CURL_ISOCPP +#endif + +/* + * Macros for minimum-width signed and unsigned curl_off_t integer constants. + */ + +#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) +# define __CURL_OFF_T_C_HLPR2(x) x +# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) +#else +# ifdef CURL_ISOCPP +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix +# else +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix +# endif +# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) +#endif + +/* + * Get rid of macros private to this header file. + */ + +#undef CurlchkszEQ +#undef CurlchkszGE + +/* + * Get rid of macros not intended to exist beyond this point. + */ + +#undef CURL_PULL_WS2TCPIP_H +#undef CURL_PULL_SYS_TYPES_H +#undef CURL_PULL_SYS_SOCKET_H +#undef CURL_PULL_SYS_POLL_H +#undef CURL_PULL_STDINT_H +#undef CURL_PULL_INTTYPES_H + +#undef CURL_TYPEOF_CURL_SOCKLEN_T +#undef CURL_TYPEOF_CURL_OFF_T + +#ifdef CURL_NO_OLDIES +#undef CURL_FORMAT_OFF_T /* not required since 7.19.0 - obsoleted in 7.20.0 */ +#endif + +#endif /* __CURL_CURLRULES_H */ diff --git a/src/3rdparty/win32_include/curl/curlver.h b/src/3rdparty/win32_include/curl/curlver.h new file mode 100644 index 000000000..2bc146f7d --- /dev/null +++ b/src/3rdparty/win32_include/curl/curlver.h @@ -0,0 +1,77 @@ +#ifndef __CURL_CURLVER_H +#define __CURL_CURLVER_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* This header file contains nothing but libcurl version info, generated by + a script at release-time. This was made its own header file in 7.11.2 */ + +/* This is the global package copyright */ +#define LIBCURL_COPYRIGHT "1996 - 2017 Daniel Stenberg, ." + +/* This is the version number of the libcurl package from which this header + file origins: */ +#define LIBCURL_VERSION "7.53.1" + +/* The numeric version number is also available "in parts" by using these + defines: */ +#define LIBCURL_VERSION_MAJOR 7 +#define LIBCURL_VERSION_MINOR 53 +#define LIBCURL_VERSION_PATCH 1 + +/* This is the numeric version of the libcurl version number, meant for easier + parsing and comparions by programs. The LIBCURL_VERSION_NUM define will + always follow this syntax: + + 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal (using 8 bits each). All three numbers are always represented + using two digits. 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit (24 bits) hexadecimal number does not show pre-release number, + and it is always a greater number in a more recent release. It makes + comparisons with greater than and less than work. + + Note: This define is the full hex number and _does not_ use the + CURL_VERSION_BITS() macro since curl's own configure script greps for it + and needs it to contain the full number. +*/ +#define LIBCURL_VERSION_NUM 0x073501 + +/* + * This is the date and time when the full source package was created. The + * timestamp is not stored in git, as the timestamp is properly set in the + * tarballs by the maketgz script. + * + * The format of the date should follow this template: + * + * "Mon Feb 12 11:35:33 UTC 2007" + */ +#define LIBCURL_TIMESTAMP "Fri Feb 24 07:49:42 UTC 2017" + +#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z) +#define CURL_AT_LEAST_VERSION(x,y,z) \ + (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) + +#endif /* __CURL_CURLVER_H */ diff --git a/src/3rdparty/win32_include/curl/easy.h b/src/3rdparty/win32_include/curl/easy.h new file mode 100644 index 000000000..752c5049f --- /dev/null +++ b/src/3rdparty/win32_include/curl/easy.h @@ -0,0 +1,102 @@ +#ifndef __CURL_EASY_H +#define __CURL_EASY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN CURL *curl_easy_init(void); +CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); +CURL_EXTERN void curl_easy_cleanup(CURL *curl); + +/* + * NAME curl_easy_getinfo() + * + * DESCRIPTION + * + * Request internal information from the curl session with this function. The + * third argument MUST be a pointer to a long, a pointer to a char * or a + * pointer to a double (as the documentation describes elsewhere). The data + * pointed to will be filled in accordingly and can be relied upon only if the + * function returns CURLE_OK. This function is intended to get used *AFTER* a + * performed transfer, all results from this function are undefined until the + * transfer is completed. + */ +CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); + + +/* + * NAME curl_easy_duphandle() + * + * DESCRIPTION + * + * Creates a new curl session handle with the same options set for the handle + * passed in. Duplicating a handle could only be a matter of cloning data and + * options, internal state info and things like persistent connections cannot + * be transferred. It is useful in multithreaded applications when you can run + * curl_easy_duphandle() for each new thread to avoid a series of identical + * curl_easy_setopt() invokes in every thread. + */ +CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl); + +/* + * NAME curl_easy_reset() + * + * DESCRIPTION + * + * Re-initializes a CURL handle to the default values. This puts back the + * handle to the same state as it was in when it was just created. + * + * It does keep: live connections, the Session ID cache, the DNS cache and the + * cookies. + */ +CURL_EXTERN void curl_easy_reset(CURL *curl); + +/* + * NAME curl_easy_recv() + * + * DESCRIPTION + * + * Receives data from the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, + size_t *n); + +/* + * NAME curl_easy_send() + * + * DESCRIPTION + * + * Sends data over the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, + size_t buflen, size_t *n); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/curl/mprintf.h b/src/3rdparty/win32_include/curl/mprintf.h new file mode 100644 index 000000000..e20f546e1 --- /dev/null +++ b/src/3rdparty/win32_include/curl/mprintf.h @@ -0,0 +1,50 @@ +#ifndef __CURL_MPRINTF_H +#define __CURL_MPRINTF_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include +#include /* needed for FILE */ +#include "curl.h" /* for CURL_EXTERN */ + +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN int curl_mprintf(const char *format, ...); +CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); +CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); +CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, + const char *format, ...); +CURL_EXTERN int curl_mvprintf(const char *format, va_list args); +CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); +CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); +CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, + const char *format, va_list args); +CURL_EXTERN char *curl_maprintf(const char *format, ...); +CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); + +#ifdef __cplusplus +} +#endif + +#endif /* __CURL_MPRINTF_H */ diff --git a/src/3rdparty/win32_include/curl/multi.h b/src/3rdparty/win32_include/curl/multi.h new file mode 100644 index 000000000..d1e00cc5d --- /dev/null +++ b/src/3rdparty/win32_include/curl/multi.h @@ -0,0 +1,439 @@ +#ifndef __CURL_MULTI_H +#define __CURL_MULTI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + This is an "external" header file. Don't give away any internals here! + + GOALS + + o Enable a "pull" interface. The application that uses libcurl decides where + and when to ask libcurl to get/send data. + + o Enable multiple simultaneous transfers in the same thread without making it + complicated for the application. + + o Enable the application to select() on its own file descriptors and curl's + file descriptors simultaneous easily. + +*/ + +/* + * This header file should not really need to include "curl.h" since curl.h + * itself includes this file and we expect user applications to do #include + * without the need for especially including multi.h. + * + * For some reason we added this include here at one point, and rather than to + * break existing (wrongly written) libcurl applications, we leave it as-is + * but with this warning attached. + */ +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_multi CURLM; +#else +typedef void CURLM; +#endif + +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or + curl_multi_socket*() soon */ + CURLM_OK, + CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ + CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ + CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ + CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ + CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ + CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ + CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was + attempted to get added - again */ + CURLM_LAST +} CURLMcode; + +/* just to make code nicer when using curl_multi_socket() you can now check + for CURLM_CALL_MULTI_SOCKET too in the same style it works for + curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ +#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM + +/* bitmask bits for CURLMOPT_PIPELINING */ +#define CURLPIPE_NOTHING 0L +#define CURLPIPE_HTTP1 1L +#define CURLPIPE_MULTIPLEX 2L + +typedef enum { + CURLMSG_NONE, /* first, not used */ + CURLMSG_DONE, /* This easy handle has completed. 'result' contains + the CURLcode of the transfer */ + CURLMSG_LAST /* last, not used */ +} CURLMSG; + +struct CURLMsg { + CURLMSG msg; /* what this message means */ + CURL *easy_handle; /* the handle it concerns */ + union { + void *whatever; /* message-specific data */ + CURLcode result; /* return code for transfer */ + } data; +}; +typedef struct CURLMsg CURLMsg; + +/* Based on poll(2) structure and values. + * We don't use pollfd and POLL* constants explicitly + * to cover platforms without poll(). */ +#define CURL_WAIT_POLLIN 0x0001 +#define CURL_WAIT_POLLPRI 0x0002 +#define CURL_WAIT_POLLOUT 0x0004 + +struct curl_waitfd { + curl_socket_t fd; + short events; + short revents; /* not supported yet */ +}; + +/* + * Name: curl_multi_init() + * + * Desc: inititalize multi-style curl usage + * + * Returns: a new CURLM handle to use in all 'curl_multi' functions. + */ +CURL_EXTERN CURLM *curl_multi_init(void); + +/* + * Name: curl_multi_add_handle() + * + * Desc: add a standard curl handle to the multi stack + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_remove_handle() + * + * Desc: removes a curl handle from the multi stack again + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_fdset() + * + * Desc: Ask curl for its fd_set sets. The app can use these to select() or + * poll() on. We want curl_multi_perform() called as soon as one of + * them are ready. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + +/* + * Name: curl_multi_wait() + * + * Desc: Poll on all fds within a CURLM set as well as any + * additional fds passed to the function. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle, + struct curl_waitfd extra_fds[], + unsigned int extra_nfds, + int timeout_ms, + int *ret); + + /* + * Name: curl_multi_perform() + * + * Desc: When the app thinks there's data available for curl it calls this + * function to read/write whatever there is right now. This returns + * as soon as the reads and writes are done. This function does not + * require that there actually is data available for reading or that + * data can be written, it can be called just in case. It returns + * the number of handles that still transfer data in the second + * argument's integer-pointer. + * + * Returns: CURLMcode type, general multi error code. *NOTE* that this only + * returns errors etc regarding the whole multi stack. There might + * still have occurred problems on invidual transfers even when this + * returns OK. + */ +CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, + int *running_handles); + + /* + * Name: curl_multi_cleanup() + * + * Desc: Cleans up and removes a whole multi stack. It does not free or + * touch any individual easy handles in any way. We need to define + * in what state those handles will be if this function is called + * in the middle of a transfer. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); + +/* + * Name: curl_multi_info_read() + * + * Desc: Ask the multi handle if there's any messages/informationals from + * the individual transfers. Messages include informationals such as + * error code from the transfer or just the fact that a transfer is + * completed. More details on these should be written down as well. + * + * Repeated calls to this function will return a new struct each + * time, until a special "end of msgs" struct is returned as a signal + * that there is no more to get at this point. + * + * The data the returned pointer points to will not survive calling + * curl_multi_cleanup(). + * + * The 'CURLMsg' struct is meant to be very simple and only contain + * very basic informations. If more involved information is wanted, + * we will provide the particular "transfer handle" in that struct + * and that should/could/would be used in subsequent + * curl_easy_getinfo() calls (or similar). The point being that we + * must never expose complex structs to applications, as then we'll + * undoubtably get backwards compatibility problems in the future. + * + * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out + * of structs. It also writes the number of messages left in the + * queue (after this read) in the integer the second argument points + * to. + */ +CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, + int *msgs_in_queue); + +/* + * Name: curl_multi_strerror() + * + * Desc: The curl_multi_strerror function may be used to turn a CURLMcode + * value into the equivalent human readable error string. This is + * useful for printing meaningful error messages. + * + * Returns: A pointer to a zero-terminated error message. + */ +CURL_EXTERN const char *curl_multi_strerror(CURLMcode); + +/* + * Name: curl_multi_socket() and + * curl_multi_socket_all() + * + * Desc: An alternative version of curl_multi_perform() that allows the + * application to pass in one of the file descriptors that have been + * detected to have "action" on them and let libcurl perform. + * See man page for details. + */ +#define CURL_POLL_NONE 0 +#define CURL_POLL_IN 1 +#define CURL_POLL_OUT 2 +#define CURL_POLL_INOUT 3 +#define CURL_POLL_REMOVE 4 + +#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD + +#define CURL_CSELECT_IN 0x01 +#define CURL_CSELECT_OUT 0x02 +#define CURL_CSELECT_ERR 0x04 + +typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp); /* private socket + pointer */ +/* + * Name: curl_multi_timer_callback + * + * Desc: Called by libcurl whenever the library detects a change in the + * maximum number of milliseconds the app is allowed to wait before + * curl_multi_socket() or curl_multi_perform() must be called + * (to allow libcurl's timed events to take place). + * + * Returns: The callback should return zero. + */ +typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback + pointer */ + +CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, + curl_socket_t s, + int ev_bitmask, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, + int *running_handles); + +#ifndef CURL_ALLOW_OLD_MULTI_SOCKET +/* This macro below was added in 7.16.3 to push users who recompile to use + the new curl_multi_socket_action() instead of the old curl_multi_socket() +*/ +#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) +#endif + +/* + * Name: curl_multi_timeout() + * + * Desc: Returns the maximum number of milliseconds the app is allowed to + * wait before curl_multi_socket() or curl_multi_perform() must be + * called (to allow libcurl's timed events to take place). + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, + long *milliseconds); + +#undef CINIT /* re-using the same name as in curl.h */ + +#ifdef CURL_ISOCPP +#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLMOPT_/**/name = type + number +#endif + +typedef enum { + /* This is the socket callback function pointer */ + CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1), + + /* This is the argument passed to the socket callback */ + CINIT(SOCKETDATA, OBJECTPOINT, 2), + + /* set to 1 to enable pipelining for this multi handle */ + CINIT(PIPELINING, LONG, 3), + + /* This is the timer callback function pointer */ + CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4), + + /* This is the argument passed to the timer callback */ + CINIT(TIMERDATA, OBJECTPOINT, 5), + + /* maximum number of entries in the connection cache */ + CINIT(MAXCONNECTS, LONG, 6), + + /* maximum number of (pipelining) connections to one host */ + CINIT(MAX_HOST_CONNECTIONS, LONG, 7), + + /* maximum number of requests in a pipeline */ + CINIT(MAX_PIPELINE_LENGTH, LONG, 8), + + /* a connection with a content-length longer than this + will not be considered for pipelining */ + CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9), + + /* a connection with a chunk length longer than this + will not be considered for pipelining */ + CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10), + + /* a list of site names(+port) that are blacklisted from + pipelining */ + CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11), + + /* a list of server types that are blacklisted from + pipelining */ + CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12), + + /* maximum number of open connections in total */ + CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13), + + /* This is the server push callback function pointer */ + CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14), + + /* This is the argument passed to the server push callback */ + CINIT(PUSHDATA, OBJECTPOINT, 15), + + CURLMOPT_LASTENTRY /* the last unused */ +} CURLMoption; + + +/* + * Name: curl_multi_setopt() + * + * Desc: Sets options for the multi handle. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, + CURLMoption option, ...); + + +/* + * Name: curl_multi_assign() + * + * Desc: This function sets an association in the multi handle between the + * given socket and a private pointer of the application. This is + * (only) useful for curl_multi_socket uses. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, + curl_socket_t sockfd, void *sockp); + + +/* + * Name: curl_push_callback + * + * Desc: This callback gets called when a new stream is being pushed by the + * server. It approves or denies the new stream. + * + * Returns: CURL_PUSH_OK or CURL_PUSH_DENY. + */ +#define CURL_PUSH_OK 0 +#define CURL_PUSH_DENY 1 + +struct curl_pushheaders; /* forward declaration only */ + +CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h, + size_t num); +CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h, + const char *name); + +typedef int (*curl_push_callback)(CURL *parent, + CURL *easy, + size_t num_headers, + struct curl_pushheaders *headers, + void *userp); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/src/3rdparty/win32_include/curl/stdcheaders.h b/src/3rdparty/win32_include/curl/stdcheaders.h new file mode 100644 index 000000000..027b6f421 --- /dev/null +++ b/src/3rdparty/win32_include/curl/stdcheaders.h @@ -0,0 +1,33 @@ +#ifndef __STDC_HEADERS_H +#define __STDC_HEADERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include + +size_t fread(void *, size_t, size_t, FILE *); +size_t fwrite(const void *, size_t, size_t, FILE *); + +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + +#endif /* __STDC_HEADERS_H */ diff --git a/src/3rdparty/win32_include/curl/typecheck-gcc.h b/src/3rdparty/win32_include/curl/typecheck-gcc.h new file mode 100644 index 000000000..3d683152b --- /dev/null +++ b/src/3rdparty/win32_include/curl/typecheck-gcc.h @@ -0,0 +1,624 @@ +#ifndef __CURL_TYPECHECK_GCC_H +#define __CURL_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(_curl_is_sometype_option(_curl_opt)) + * if(!_curl_is_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define _curl_is_sometype_option, _curl_is_sometype and + * _curl_easy_setopt_err_sometype below + * + * NOTE: We use two nested 'if' statements here instead of the && operator, in + * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x + * when compiling with -Wlogical-op. + * + * To add an option that uses the same type as an existing option, you'll just + * need to extend the appropriate _curl_*_option macro + */ +#define curl_easy_setopt(handle, option, value) \ +__extension__ ({ \ + __typeof__(option) _curl_opt = option; \ + if(__builtin_constant_p(_curl_opt)) { \ + if(_curl_is_long_option(_curl_opt)) \ + if(!_curl_is_long(value)) \ + _curl_easy_setopt_err_long(); \ + if(_curl_is_off_t_option(_curl_opt)) \ + if(!_curl_is_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if(_curl_is_string_option(_curl_opt)) \ + if(!_curl_is_string(value)) \ + _curl_easy_setopt_err_string(); \ + if(_curl_is_write_cb_option(_curl_opt)) \ + if(!_curl_is_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if((_curl_opt) == CURLOPT_READFUNCTION) \ + if(!_curl_is_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ + if(!_curl_is_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ + if(!_curl_is_sockopt_cb(value)) \ + _curl_easy_setopt_err_sockopt_cb(); \ + if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ + if(!_curl_is_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ + if(!_curl_is_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ + if(!_curl_is_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ + if(!_curl_is_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if(_curl_is_conv_cb_option(_curl_opt)) \ + if(!_curl_is_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ + if(!_curl_is_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if(_curl_is_cb_data_option(_curl_opt)) \ + if(!_curl_is_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if((_curl_opt) == CURLOPT_ERRORBUFFER) \ + if(!_curl_is_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if((_curl_opt) == CURLOPT_STDERR) \ + if(!_curl_is_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if(_curl_is_postfields_option(_curl_opt)) \ + if(!_curl_is_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if((_curl_opt) == CURLOPT_HTTPPOST) \ + if(!_curl_is_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if(_curl_is_slist_option(_curl_opt)) \ + if(!_curl_is_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if((_curl_opt) == CURLOPT_SHARE) \ + if(!_curl_is_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + } \ + curl_easy_setopt(handle, _curl_opt, value); \ +}) + +/* wraps curl_easy_getinfo() with typechecking */ +/* FIXME: don't allow const pointers */ +#define curl_easy_getinfo(handle, info, arg) \ +__extension__ ({ \ + __typeof__(info) _curl_info = info; \ + if(__builtin_constant_p(_curl_info)) { \ + if(_curl_is_string_info(_curl_info)) \ + if(!_curl_is_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if(_curl_is_long_info(_curl_info)) \ + if(!_curl_is_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if(_curl_is_double_info(_curl_info)) \ + if(!_curl_is_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if(_curl_is_slist_info(_curl_info)) \ + if(!_curl_is_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + } \ + curl_easy_getinfo(handle, _curl_info, arg); \ +}) + +/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(), + * for now just make sure that the functions are called with three + * arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define _CURL_WARNING(id, message) \ + static void __attribute__((__warning__(message))) \ + __attribute__((__unused__)) __attribute__((__noinline__)) \ + id(void) { __asm__(""); } + +_CURL_WARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a " + "string ('char *' or char[]) argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a " + "curl_opensocket_callback argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a " + "private data pointer as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a " + "char buffer of CURL_ERROR_SIZE as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a 'FILE *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a 'void *' or 'char *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a 'struct curl_httppost *' " + "argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a 'struct curl_slist *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument for this option") + +_CURL_WARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to 'char *' for this info") +_CURL_WARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long for this info") +_CURL_WARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* To add a new option to one of the groups, just add + * (option) == CURLOPT_SOMETHING + * to the or-expression. If the option takes a long or curl_off_t, you don't + * have to do anything + */ + +/* evaluates to true if option takes a long argument */ +#define _curl_is_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define _curl_is_off_t_option(option) \ + ((option) > CURLOPTTYPE_OFF_T) + +/* evaluates to true if option takes a char* argument */ +#define _curl_is_string_option(option) \ + ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ + (option) == CURLOPT_ACCEPT_ENCODING || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_DEFAULT_PROTOCOL || \ + (option) == CURLOPT_DNS_INTERFACE || \ + (option) == CURLOPT_DNS_LOCAL_IP4 || \ + (option) == CURLOPT_DNS_LOCAL_IP6 || \ + (option) == CURLOPT_DNS_SERVERS || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_ISSUERCERT || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_LOGIN_OPTIONS || \ + (option) == CURLOPT_MAIL_AUTH || \ + (option) == CURLOPT_MAIL_FROM || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_PROXY_SERVICE_NAME || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_RTSP_SESSION_ID || \ + (option) == CURLOPT_RTSP_STREAM_URI || \ + (option) == CURLOPT_RTSP_TRANSPORT || \ + (option) == CURLOPT_SERVICE_NAME || \ + (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_KNOWNHOSTS || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_TLSAUTH_TYPE || \ + (option) == CURLOPT_TLSAUTH_USERNAME || \ + (option) == CURLOPT_UNIX_SOCKET_PATH || \ + (option) == CURLOPT_URL || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_XOAUTH2_BEARER || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define _curl_is_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define _curl_is_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define _curl_is_cb_data_option(option) \ + ((option) == CURLOPT_CHUNK_DATA || \ + (option) == CURLOPT_CLOSESOCKETDATA || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_FNMATCH_DATA || \ + (option) == CURLOPT_HEADERDATA || \ + (option) == CURLOPT_INTERLEAVEDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PRIVATE || \ + (option) == CURLOPT_PROGRESSDATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_SSH_KEYDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_WRITEDATA || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define _curl_is_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define _curl_is_slist_option(option) \ + ((option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_MAIL_RCPT || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_PROXYHEADER || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_RESOLVE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define _curl_is_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) + +/* evaluates to true if info expects a pointer to long argument */ +#define _curl_is_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define _curl_is_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define _curl_is_slist_info(info) \ + (CURLINFO_SLIST < (info)) + + +/* typecheck helpers -- check whether given expression has requested type*/ + +/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true iff expr is a pointer */ +#define _curl_is_any_ptr(expr) \ + (sizeof(expr) == sizeof(void *)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define _curl_is_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define _curl_is_ptr(expr, type) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define _curl_is_arr(expr, type) \ + (_curl_is_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define _curl_is_string(expr) \ + (_curl_is_arr((expr), char) || \ + _curl_is_arr((expr), signed char) || \ + _curl_is_arr((expr), unsigned char)) + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define _curl_is_long(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char)) + +/* evaluates to true if expr is of type curl_off_t */ +#define _curl_is_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define _curl_is_error_buffer(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define _curl_is_cb_data(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_ptr((expr), FILE)) +#else /* be less strict */ +#define _curl_is_cb_data(expr) \ + _curl_is_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define _curl_is_FILE(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *)) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define _curl_is_postfields(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_arr((expr), char)) + +/* FIXME: the whole callback checking is messy... + * The idea is to tolerate char vs. void and const vs. not const + * pointers in arguments at least + */ +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define _curl_callback_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func), type*)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define _curl_is_read_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) || \ + _curl_callback_compatible((expr), _curl_read_callback1) || \ + _curl_callback_compatible((expr), _curl_read_callback2) || \ + _curl_callback_compatible((expr), _curl_read_callback3) || \ + _curl_callback_compatible((expr), _curl_read_callback4) || \ + _curl_callback_compatible((expr), _curl_read_callback5) || \ + _curl_callback_compatible((expr), _curl_read_callback6)) +typedef size_t (_curl_read_callback1)(char *, size_t, size_t, void *); +typedef size_t (_curl_read_callback2)(char *, size_t, size_t, const void *); +typedef size_t (_curl_read_callback3)(char *, size_t, size_t, FILE *); +typedef size_t (_curl_read_callback4)(void *, size_t, size_t, void *); +typedef size_t (_curl_read_callback5)(void *, size_t, size_t, const void *); +typedef size_t (_curl_read_callback6)(void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define _curl_is_write_cb(expr) \ + (_curl_is_read_cb(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) || \ + _curl_callback_compatible((expr), _curl_write_callback1) || \ + _curl_callback_compatible((expr), _curl_write_callback2) || \ + _curl_callback_compatible((expr), _curl_write_callback3) || \ + _curl_callback_compatible((expr), _curl_write_callback4) || \ + _curl_callback_compatible((expr), _curl_write_callback5) || \ + _curl_callback_compatible((expr), _curl_write_callback6)) +typedef size_t (_curl_write_callback1)(const char *, size_t, size_t, void *); +typedef size_t (_curl_write_callback2)(const char *, size_t, size_t, + const void *); +typedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE *); +typedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void *); +typedef size_t (_curl_write_callback5)(const void *, size_t, size_t, + const void *); +typedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define _curl_is_ioctl_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (_curl_ioctl_callback1)(CURL *, int, void *); +typedef curlioerr (_curl_ioctl_callback2)(CURL *, int, const void *); +typedef curlioerr (_curl_ioctl_callback3)(CURL *, curliocmd, void *); +typedef curlioerr (_curl_ioctl_callback4)(CURL *, curliocmd, const void *); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define _curl_is_sockopt_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback2)) +typedef int (_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or + "similar" */ +#define _curl_is_opensocket_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\ + _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define _curl_is_progress_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) || \ + _curl_callback_compatible((expr), _curl_progress_callback1) || \ + _curl_callback_compatible((expr), _curl_progress_callback2)) +typedef int (_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define _curl_is_debug_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) || \ + _curl_callback_compatible((expr), _curl_debug_callback1) || \ + _curl_callback_compatible((expr), _curl_debug_callback2) || \ + _curl_callback_compatible((expr), _curl_debug_callback3) || \ + _curl_callback_compatible((expr), _curl_debug_callback4) || \ + _curl_callback_compatible((expr), _curl_debug_callback5) || \ + _curl_callback_compatible((expr), _curl_debug_callback6) || \ + _curl_callback_compatible((expr), _curl_debug_callback7) || \ + _curl_callback_compatible((expr), _curl_debug_callback8)) +typedef int (_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); +typedef int (_curl_debug_callback5) (CURL *, + curl_infotype, unsigned char *, size_t, void *); +typedef int (_curl_debug_callback6) (CURL *, + curl_infotype, unsigned char *, size_t, const void *); +typedef int (_curl_debug_callback7) (CURL *, + curl_infotype, const unsigned char *, size_t, void *); +typedef int (_curl_debug_callback8) (CURL *, + curl_infotype, const unsigned char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define _curl_is_ssl_ctx_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we're included before OpenSSL headers... + */ +typedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); +typedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, + const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define _curl_is_conv_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) || \ + _curl_callback_compatible((expr), _curl_conv_callback1) || \ + _curl_callback_compatible((expr), _curl_conv_callback2) || \ + _curl_callback_compatible((expr), _curl_conv_callback3) || \ + _curl_callback_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define _curl_is_seek_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) || \ + _curl_callback_compatible((expr), _curl_seek_callback1) || \ + _curl_callback_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + + +#endif /* __CURL_TYPECHECK_GCC_H */ diff --git a/src/3rdparty/win32_include/openssl/Makefile.am b/src/3rdparty/win32_include/openssl/Makefile.am new file mode 100644 index 000000000..7585184e8 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/Makefile.am @@ -0,0 +1,74 @@ +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 += 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/src/3rdparty/win32_include/openssl/Makefile.in b/src/3rdparty/win32_include/openssl/Makefile.in new file mode 100644 index 000000000..bd15cda48 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/Makefile.in @@ -0,0 +1,582 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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 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/src/3rdparty/win32_include/openssl/aes.h b/src/3rdparty/win32_include/openssl/aes.h new file mode 100644 index 000000000..c904485d8 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/aes.h @@ -0,0 +1,126 @@ +/* $OpenBSD: aes.h,v 1.14 2014/07/09 09:10:07 miod Exp $ */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_AES_H +#define HEADER_AES_H + +#include + +#ifdef OPENSSL_NO_AES +#error AES is disabled. +#endif + +#include + +#define AES_ENCRYPT 1 +#define AES_DECRYPT 0 + +/* Because array size can't be a const in C, the following two are macros. + Both sizes are in bytes. */ +#define AES_MAXNR 14 +#define AES_BLOCK_SIZE 16 + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st { + unsigned int rd_key[4 *(AES_MAXNR + 1)]; + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +const char *AES_options(void); + +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); + +void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key, const int enc); +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, unsigned char *ivec, const int enc); +void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, unsigned char *ivec, int *num, + const int enc); +void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, unsigned char *ivec, int *num, + const int enc); +void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, unsigned char *ivec, int *num, + const int enc); +void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, unsigned char *ivec, int *num); +void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, unsigned char ivec[AES_BLOCK_SIZE], + unsigned char ecount_buf[AES_BLOCK_SIZE], unsigned int *num); +/* NB: the IV is _two_ blocks long */ +void AES_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, unsigned char *ivec, const int enc); + +int AES_wrap_key(AES_KEY *key, const unsigned char *iv, unsigned char *out, + const unsigned char *in, unsigned int inlen); +int AES_unwrap_key(AES_KEY *key, const unsigned char *iv, unsigned char *out, + const unsigned char *in, unsigned int inlen); + + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_AES_H */ diff --git a/src/3rdparty/win32_include/openssl/asn1.h b/src/3rdparty/win32_include/openssl/asn1.h new file mode 100644 index 000000000..e35c865e1 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/asn1.h @@ -0,0 +1,1459 @@ +/* $OpenBSD: asn1.h,v 1.42 2016/12/30 16:29:45 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_H +#define HEADER_ASN1_H + +#include + +#include + +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include + +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define V_ASN1_UNIVERSAL 0x00 +#define V_ASN1_APPLICATION 0x40 +#define V_ASN1_CONTEXT_SPECIFIC 0x80 +#define V_ASN1_PRIVATE 0xc0 + +#define V_ASN1_CONSTRUCTED 0x20 +#define V_ASN1_PRIMITIVE_TAG 0x1f +#define V_ASN1_PRIMATIVE_TAG 0x1f + +#define V_ASN1_APP_CHOOSE -2 /* let the recipient choose */ +#define V_ASN1_OTHER -3 /* used in ASN1_TYPE */ +#define V_ASN1_ANY -4 /* used in ASN1 template code */ + +#define V_ASN1_NEG 0x100 /* negative flag */ + +#define V_ASN1_UNDEF -1 +#define V_ASN1_EOC 0 +#define V_ASN1_BOOLEAN 1 /**/ +#define V_ASN1_INTEGER 2 +#define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +#define V_ASN1_BIT_STRING 3 +#define V_ASN1_OCTET_STRING 4 +#define V_ASN1_NULL 5 +#define V_ASN1_OBJECT 6 +#define V_ASN1_OBJECT_DESCRIPTOR 7 +#define V_ASN1_EXTERNAL 8 +#define V_ASN1_REAL 9 +#define V_ASN1_ENUMERATED 10 +#define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) +#define V_ASN1_UTF8STRING 12 +#define V_ASN1_SEQUENCE 16 +#define V_ASN1_SET 17 +#define V_ASN1_NUMERICSTRING 18 /**/ +#define V_ASN1_PRINTABLESTRING 19 +#define V_ASN1_T61STRING 20 +#define V_ASN1_TELETEXSTRING 20 /* alias */ +#define V_ASN1_VIDEOTEXSTRING 21 /**/ +#define V_ASN1_IA5STRING 22 +#define V_ASN1_UTCTIME 23 +#define V_ASN1_GENERALIZEDTIME 24 /**/ +#define V_ASN1_GRAPHICSTRING 25 /**/ +#define V_ASN1_ISO64STRING 26 /**/ +#define V_ASN1_VISIBLESTRING 26 /* alias */ +#define V_ASN1_GENERALSTRING 27 /**/ +#define V_ASN1_UNIVERSALSTRING 28 /**/ +#define V_ASN1_BMPSTRING 30 + +/* For use with d2i_ASN1_type_bytes() */ +#define B_ASN1_NUMERICSTRING 0x0001 +#define B_ASN1_PRINTABLESTRING 0x0002 +#define B_ASN1_T61STRING 0x0004 +#define B_ASN1_TELETEXSTRING 0x0004 +#define B_ASN1_VIDEOTEXSTRING 0x0008 +#define B_ASN1_IA5STRING 0x0010 +#define B_ASN1_GRAPHICSTRING 0x0020 +#define B_ASN1_ISO64STRING 0x0040 +#define B_ASN1_VISIBLESTRING 0x0040 +#define B_ASN1_GENERALSTRING 0x0080 +#define B_ASN1_UNIVERSALSTRING 0x0100 +#define B_ASN1_OCTET_STRING 0x0200 +#define B_ASN1_BIT_STRING 0x0400 +#define B_ASN1_BMPSTRING 0x0800 +#define B_ASN1_UNKNOWN 0x1000 +#define B_ASN1_UTF8STRING 0x2000 +#define B_ASN1_UTCTIME 0x4000 +#define B_ASN1_GENERALIZEDTIME 0x8000 +#define B_ASN1_SEQUENCE 0x10000 + +/* For use with ASN1_mbstring_copy() */ +#define MBSTRING_FLAG 0x1000 +#define MBSTRING_UTF8 (MBSTRING_FLAG) +#define MBSTRING_ASC (MBSTRING_FLAG|1) +#define MBSTRING_BMP (MBSTRING_FLAG|2) +#define MBSTRING_UNIV (MBSTRING_FLAG|4) + +#define SMIME_OLDMIME 0x400 +#define SMIME_CRLFEOL 0x800 +#define SMIME_STREAM 0x1000 + +struct X509_algor_st; +DECLARE_STACK_OF(X509_ALGOR) + +#define DECLARE_ASN1_SET_OF(type) /* filled in by mkstack.pl */ +#define IMPLEMENT_ASN1_SET_OF(type) /* nothing, no longer needed */ + +/* We MUST make sure that, except for constness, asn1_ctx_st and + asn1_const_ctx are exactly the same. Fortunately, as soon as + the old ASN1 parsing macros are gone, we can throw this away + as well... */ +typedef struct asn1_ctx_st { + unsigned char *p;/* work char pointer */ + int eos; /* end of sequence read for indefinite encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + unsigned char *max; /* largest value of p allowed */ + unsigned char *q;/* temporary variable */ + unsigned char **pp;/* variable */ + int line; /* used in error processing */ +} ASN1_CTX; + +typedef struct asn1_const_ctx_st { + const unsigned char *p;/* work char pointer */ + int eos; /* end of sequence read for indefinite encoding */ + int error; /* error code to use when returning an error */ + int inf; /* constructed if 0x20, indefinite is 0x21 */ + int tag; /* tag from last 'get object' */ + int xclass; /* class from last 'get object' */ + long slen; /* length of last 'get object' */ + const unsigned char *max; /* largest value of p allowed */ + const unsigned char *q;/* temporary variable */ + const unsigned char **pp;/* variable */ + int line; /* used in error processing */ +} ASN1_const_CTX; + +/* These are used internally in the ASN1_OBJECT to keep track of + * whether the names and data need to be free()ed */ +#define ASN1_OBJECT_FLAG_DYNAMIC 0x01 /* internal use */ +#define ASN1_OBJECT_FLAG_CRITICAL 0x02 /* critical x509v3 object id */ +#define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04 /* internal use */ +#define ASN1_OBJECT_FLAG_DYNAMIC_DATA 0x08 /* internal use */ +typedef struct asn1_object_st { + const char *sn, *ln; + int nid; + int length; + const unsigned char *data; /* data remains const after init */ + int flags; /* Should we free this one */ +} ASN1_OBJECT; + +#define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */ +/* This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should + * be inserted in the memory buffer + */ +#define ASN1_STRING_FLAG_NDEF 0x010 + +/* This flag is used by the CMS code to indicate that a string is not + * complete and is a place holder for content when it had all been + * accessed. The flag will be reset when content has been written to it. + */ + +#define ASN1_STRING_FLAG_CONT 0x020 +/* This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING + * type. + */ +#define ASN1_STRING_FLAG_MSTRING 0x040 +/* This is the base type that holds just about everything :-) */ +struct asn1_string_st { + int length; + int type; + unsigned char *data; + /* The value of the following field depends on the type being + * held. It is mostly being used for BIT_STRING so if the + * input data has a non-zero 'unused bits' value, it will be + * handled correctly */ + long flags; +}; + +/* ASN1_ENCODING structure: this is used to save the received + * encoding of an ASN1 type. This is useful to get round + * problems with invalid encodings which can break signatures. + */ + +typedef struct ASN1_ENCODING_st { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ +} ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +#define ASN1_LONG_UNDEF 0x7fffffffL + +#define STABLE_FLAGS_MALLOC 0x01 +#define STABLE_NO_MASK 0x02 +#define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING) +#define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING) + +typedef struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +} ASN1_STRING_TABLE; + +DECLARE_STACK_OF(ASN1_STRING_TABLE) + +/* size limits: this stuff is taken straight from RFC2459 */ + +#define ub_name 32768 +#define ub_common_name 64 +#define ub_locality_name 128 +#define ub_state_name 128 +#define ub_organization_name 64 +#define ub_organization_unit_name 64 +#define ub_title 64 +#define ub_email_address 128 + +/* Declarations for template structures: for full definitions + * see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +#ifndef LIBRESSL_INTERNAL + +/* Declare ASN1 functions: the implement macro in in asn1t.h */ + +#define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type) + +#define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type) + +#define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) + +#define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(itname) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + type *d2i_##name(type **a, const unsigned char **in, long len); \ + int i2d_##name(const type *a, unsigned char **out); \ + DECLARE_ASN1_ITEM(name) + +#define DECLARE_ASN1_NDEF_FUNCTION(name) \ + int i2d_##name##_NDEF(name *a, unsigned char **out); + +#define DECLARE_ASN1_FUNCTIONS_const(name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS(name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name) + +#define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + type *name##_new(void); \ + void name##_free(type *a); + +#define DECLARE_ASN1_PRINT_FUNCTION(stname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname(stname, stname) + +#define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx); + +#endif /* !LIBRESSL_INTERNAL */ + +#define D2I_OF(type) type *(*)(type **,const unsigned char **,long) +#define I2D_OF(type) int (*)(type *,unsigned char **) +#define I2D_OF_const(type) int (*)(const type *,unsigned char **) + +#define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) +#define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) +#define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) +#define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +#define CHECKED_PPTR_OF(type, p) \ + ((void**) (1 ? p : (type**)0)) + +#define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) +#define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **) +#define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) + +TYPEDEF_D2I2D_OF(void); + +/* The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM ASN1_ITEM_EXP; + +#ifndef LIBRESSL_INTERNAL + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +#define ASN1_ITEM_ptr(iptr) (iptr) + +/* Macro to include ASN1_ITEM pointer from base type */ +#define ASN1_ITEM_ref(iptr) (&(iptr##_it)) + +#define ASN1_ITEM_rptr(ref) (&(ref##_it)) + +#define DECLARE_ASN1_ITEM(name) \ + extern const ASN1_ITEM name##_it; + +#endif /* !LIBRESSL_INTERNAL */ + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* These determine which characters to escape: + * RFC2253 special characters, control characters and + * MSB set characters + */ + +#define ASN1_STRFLGS_ESC_2253 1 +#define ASN1_STRFLGS_ESC_CTRL 2 +#define ASN1_STRFLGS_ESC_MSB 4 + + +/* This flag determines how we do escaping: normally + * RC2253 backslash only, set this to use backslash and + * quote. + */ + +#define ASN1_STRFLGS_ESC_QUOTE 8 + + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +#define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +#define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +#define CHARTYPE_LAST_ESC_2253 0x40 + +/* NB the internal flags are safely reused below by flags + * handled at the top level. + */ + +/* If this is set we convert all character strings + * to UTF8 first + */ + +#define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* If this is set we don't attempt to interpret content: + * just assume all strings are 1 byte per character. This + * will produce some pretty odd looking output! + */ + +#define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +#define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* This determines which strings to display and which to + * 'dump' (hex dump of content octets or DER encoding). We can + * only dump non character strings or everything. If we + * don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to + * the usual escaping options. + */ + +#define ASN1_STRFLGS_DUMP_ALL 0x80 +#define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* These determine what 'dumping' does, we can dump the + * content octets or the DER encoding: both use the + * RFC2253 #NNNNN notation. + */ + +#define ASN1_STRFLGS_DUMP_DER 0x200 + +/* All the string flags consistent with RFC2253, + * escaping control characters isn't essential in + * RFC2253 but it is advisable anyway. + */ + +#define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \ + ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + ASN1_STRFLGS_UTF8_CONVERT | \ + ASN1_STRFLGS_DUMP_UNKNOWN | \ + ASN1_STRFLGS_DUMP_DER) + +DECLARE_STACK_OF(ASN1_INTEGER) + +DECLARE_STACK_OF(ASN1_GENERALSTRING) + +typedef struct asn1_type_st { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING * asn1_string; + ASN1_OBJECT * object; + ASN1_INTEGER * integer; + ASN1_ENUMERATED * enumerated; + ASN1_BIT_STRING * bit_string; + ASN1_OCTET_STRING * octet_string; + ASN1_PRINTABLESTRING * printablestring; + ASN1_T61STRING * t61string; + ASN1_IA5STRING * ia5string; + ASN1_GENERALSTRING * generalstring; + ASN1_BMPSTRING * bmpstring; + ASN1_UNIVERSALSTRING * universalstring; + ASN1_UTCTIME * utctime; + ASN1_GENERALIZEDTIME * generalizedtime; + ASN1_VISIBLESTRING * visiblestring; + ASN1_UTF8STRING * utf8string; + /* set and sequence are left complete and still + * contain the set or sequence bytes */ + ASN1_STRING * set; + ASN1_STRING * sequence; + ASN1_VALUE * asn1_value; + } value; +} ASN1_TYPE; + +DECLARE_STACK_OF(ASN1_TYPE) + +typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; + +ASN1_SEQUENCE_ANY *d2i_ASN1_SEQUENCE_ANY(ASN1_SEQUENCE_ANY **a, const unsigned char **in, long len); +int i2d_ASN1_SEQUENCE_ANY(const ASN1_SEQUENCE_ANY *a, unsigned char **out); +extern const ASN1_ITEM ASN1_SEQUENCE_ANY_it; +ASN1_SEQUENCE_ANY *d2i_ASN1_SET_ANY(ASN1_SEQUENCE_ANY **a, const unsigned char **in, long len); +int i2d_ASN1_SET_ANY(const ASN1_SEQUENCE_ANY *a, unsigned char **out); +extern const ASN1_ITEM ASN1_SET_ANY_it; + +typedef struct NETSCAPE_X509_st { + ASN1_OCTET_STRING *header; + X509 *cert; +} NETSCAPE_X509; + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + +#ifndef LIBRESSL_INTERNAL + +#define M_ASN1_STRING_length(x) ((x)->length) +#define M_ASN1_STRING_length_set(x, n) ((x)->length = (n)) +#define M_ASN1_STRING_type(x) ((x)->type) +#define M_ASN1_STRING_data(x) ((x)->data) + +/* Macros for string operations */ +#define M_ASN1_BIT_STRING_new() (ASN1_BIT_STRING *)\ + ASN1_STRING_type_new(V_ASN1_BIT_STRING) +#define M_ASN1_BIT_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_BIT_STRING_dup(a) (ASN1_BIT_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +#define M_ASN1_BIT_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +#define M_ASN1_BIT_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) + +#define M_ASN1_INTEGER_new() (ASN1_INTEGER *)\ + ASN1_STRING_type_new(V_ASN1_INTEGER) +#define M_ASN1_INTEGER_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_INTEGER_dup(a) (ASN1_INTEGER *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +#define M_ASN1_INTEGER_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +#define M_ASN1_ENUMERATED_new() (ASN1_ENUMERATED *)\ + ASN1_STRING_type_new(V_ASN1_ENUMERATED) +#define M_ASN1_ENUMERATED_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +#define M_ASN1_ENUMERATED_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) + +#define M_ASN1_OCTET_STRING_new() (ASN1_OCTET_STRING *)\ + ASN1_STRING_type_new(V_ASN1_OCTET_STRING) +#define M_ASN1_OCTET_STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_OCTET_STRING_dup(a) (ASN1_OCTET_STRING *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) +#define M_ASN1_OCTET_STRING_cmp(a,b) ASN1_STRING_cmp(\ + (const ASN1_STRING *)a,(const ASN1_STRING *)b) +#define M_ASN1_OCTET_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c) +#define M_ASN1_OCTET_STRING_print(a,b) ASN1_STRING_print(a,(ASN1_STRING *)b) +#define M_i2d_ASN1_OCTET_STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_OCTET_STRING,\ + V_ASN1_UNIVERSAL) + +#define M_ASN1_PRINTABLE_new() ASN1_STRING_type_new(V_ASN1_T61STRING) +#define M_ASN1_PRINTABLE_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_PRINTABLE(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_PRINTABLE(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_PRINTABLE) + +#define M_DIRECTORYSTRING_new() ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +#define M_DIRECTORYSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_DIRECTORYSTRING(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +#define M_d2i_DIRECTORYSTRING(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DIRECTORYSTRING) + +#define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +#define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_DISPLAYTEXT(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\ + pp,a->type,V_ASN1_UNIVERSAL) +#define M_d2i_DISPLAYTEXT(a,pp,l) \ + d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \ + B_ASN1_DISPLAYTEXT) + +#define M_ASN1_PRINTABLESTRING_new() (ASN1_PRINTABLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING) +#define M_ASN1_PRINTABLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_PRINTABLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_PRINTABLESTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_PRINTABLESTRING(a,pp,l) \ + (ASN1_PRINTABLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_PRINTABLESTRING) + +#define M_ASN1_T61STRING_new() (ASN1_T61STRING *)\ + ASN1_STRING_type_new(V_ASN1_T61STRING) +#define M_ASN1_T61STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_T61STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_T61STRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_T61STRING(a,pp,l) \ + (ASN1_T61STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_T61STRING) + +#define M_ASN1_IA5STRING_new() (ASN1_IA5STRING *)\ + ASN1_STRING_type_new(V_ASN1_IA5STRING) +#define M_ASN1_IA5STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_IA5STRING_dup(a) \ + (ASN1_IA5STRING *)ASN1_STRING_dup((const ASN1_STRING *)a) +#define M_i2d_ASN1_IA5STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_IA5STRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_IA5STRING(a,pp,l) \ + (ASN1_IA5STRING *)d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l,\ + B_ASN1_IA5STRING) + +#define M_ASN1_UTCTIME_new() (ASN1_UTCTIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +#define M_ASN1_UTCTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_UTCTIME_dup(a) (ASN1_UTCTIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +#define M_ASN1_GENERALIZEDTIME_new() (ASN1_GENERALIZEDTIME *)\ + ASN1_STRING_type_new(V_ASN1_GENERALIZEDTIME) +#define M_ASN1_GENERALIZEDTIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_GENERALIZEDTIME_dup(a) (ASN1_GENERALIZEDTIME *)ASN1_STRING_dup(\ + (const ASN1_STRING *)a) + +#define M_ASN1_TIME_new() (ASN1_TIME *)\ + ASN1_STRING_type_new(V_ASN1_UTCTIME) +#define M_ASN1_TIME_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_ASN1_TIME_dup(a) (ASN1_TIME *)\ + ASN1_STRING_dup((const ASN1_STRING *)a) + +#define M_ASN1_GENERALSTRING_new() (ASN1_GENERALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_GENERALSTRING) +#define M_ASN1_GENERALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_GENERALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_GENERALSTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_GENERALSTRING(a,pp,l) \ + (ASN1_GENERALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_GENERALSTRING) + +#define M_ASN1_UNIVERSALSTRING_new() (ASN1_UNIVERSALSTRING *)\ + ASN1_STRING_type_new(V_ASN1_UNIVERSALSTRING) +#define M_ASN1_UNIVERSALSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_UNIVERSALSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UNIVERSALSTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_UNIVERSALSTRING(a,pp,l) \ + (ASN1_UNIVERSALSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UNIVERSALSTRING) + +#define M_ASN1_BMPSTRING_new() (ASN1_BMPSTRING *)\ + ASN1_STRING_type_new(V_ASN1_BMPSTRING) +#define M_ASN1_BMPSTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_BMPSTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_BMPSTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_BMPSTRING(a,pp,l) \ + (ASN1_BMPSTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_BMPSTRING) + +#define M_ASN1_VISIBLESTRING_new() (ASN1_VISIBLESTRING *)\ + ASN1_STRING_type_new(V_ASN1_VISIBLESTRING) +#define M_ASN1_VISIBLESTRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_VISIBLESTRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_VISIBLESTRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_VISIBLESTRING(a,pp,l) \ + (ASN1_VISIBLESTRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_VISIBLESTRING) + +#define M_ASN1_UTF8STRING_new() (ASN1_UTF8STRING *)\ + ASN1_STRING_type_new(V_ASN1_UTF8STRING) +#define M_ASN1_UTF8STRING_free(a) ASN1_STRING_free((ASN1_STRING *)a) +#define M_i2d_ASN1_UTF8STRING(a,pp) \ + i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UTF8STRING,\ + V_ASN1_UNIVERSAL) +#define M_d2i_ASN1_UTF8STRING(a,pp,l) \ + (ASN1_UTF8STRING *)d2i_ASN1_type_bytes\ + ((ASN1_STRING **)a,pp,l,B_ASN1_UTF8STRING) + +#endif /* !LIBRESSL_INTERNAL */ + +#define B_ASN1_TIME \ + B_ASN1_UTCTIME | \ + B_ASN1_GENERALIZEDTIME + +#define B_ASN1_PRINTABLE \ + B_ASN1_NUMERICSTRING| \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_T61STRING| \ + B_ASN1_IA5STRING| \ + B_ASN1_BIT_STRING| \ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING|\ + B_ASN1_SEQUENCE|\ + B_ASN1_UNKNOWN + +#define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_TELETEXSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_UTF8STRING + +#define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING| \ + B_ASN1_VISIBLESTRING| \ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING + +/* for the is_set parameter to i2d_ASN1_SET */ +#define IS_SEQUENCE 0 +#define IS_SET 1 + +ASN1_TYPE *ASN1_TYPE_new(void); +void ASN1_TYPE_free(ASN1_TYPE *a); +ASN1_TYPE *d2i_ASN1_TYPE(ASN1_TYPE **a, const unsigned char **in, long len); +int i2d_ASN1_TYPE(ASN1_TYPE *a, unsigned char **out); +extern const ASN1_ITEM ASN1_ANY_it; + +int ASN1_TYPE_get(ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(ASN1_TYPE *a, ASN1_TYPE *b); + +ASN1_OBJECT *ASN1_OBJECT_new(void ); +void ASN1_OBJECT_free(ASN1_OBJECT *a); +int i2d_ASN1_OBJECT(ASN1_OBJECT *a, unsigned char **pp); +ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); +ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, + long length); + +extern const ASN1_ITEM ASN1_OBJECT_it; + +DECLARE_STACK_OF(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); +ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *a); +ASN1_STRING *ASN1_STRING_type_new(int type ); +int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); + /* Since this is used to store all sorts of things, via macros, for now, make + its data void * */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +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); + +ASN1_BIT_STRING *ASN1_BIT_STRING_new(void); +void ASN1_BIT_STRING_free(ASN1_BIT_STRING *a); +ASN1_BIT_STRING *d2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, const unsigned char **in, long len); +int i2d_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_BIT_STRING_it; +int i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp); +ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, + const unsigned char **pp, long length); +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length ); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(ASN1_BIT_STRING *a, + unsigned char *flags, int flags_len); + +#ifndef OPENSSL_NO_BIO +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +#endif +int ASN1_BIT_STRING_num_asc(char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, char *name, int value, + BIT_STRING_BITNAME *tbl); + +int i2d_ASN1_BOOLEAN(int a, unsigned char **pp); +int d2i_ASN1_BOOLEAN(int *a, const unsigned char **pp, long length); + +ASN1_INTEGER *ASN1_INTEGER_new(void); +void ASN1_INTEGER_free(ASN1_INTEGER *a); +ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **in, long len); +int i2d_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **out); +extern const ASN1_ITEM ASN1_INTEGER_it; +int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp); +ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +ASN1_INTEGER * ASN1_INTEGER_dup(const ASN1_INTEGER *x); +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +ASN1_ENUMERATED *ASN1_ENUMERATED_new(void); +void ASN1_ENUMERATED_free(ASN1_ENUMERATED *a); +ASN1_ENUMERATED *d2i_ASN1_ENUMERATED(ASN1_ENUMERATED **a, const unsigned char **in, long len); +int i2d_ASN1_ENUMERATED(ASN1_ENUMERATED *a, unsigned char **out); +extern const ASN1_ITEM ASN1_ENUMERATED_it; + +int ASN1_UTCTIME_check(ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); + +#ifndef LIBRESSL_INTERNAL +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); +#endif /* !LIBRESSL_INTERNAL */ + +int ASN1_GENERALIZEDTIME_check(ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); + +ASN1_OCTET_STRING *ASN1_OCTET_STRING_new(void); +void ASN1_OCTET_STRING_free(ASN1_OCTET_STRING *a); +ASN1_OCTET_STRING *d2i_ASN1_OCTET_STRING(ASN1_OCTET_STRING **a, const unsigned char **in, long len); +int i2d_ASN1_OCTET_STRING(ASN1_OCTET_STRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_OCTET_STRING_it; +ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(const ASN1_OCTET_STRING *a); +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +ASN1_VISIBLESTRING *ASN1_VISIBLESTRING_new(void); +void ASN1_VISIBLESTRING_free(ASN1_VISIBLESTRING *a); +ASN1_VISIBLESTRING *d2i_ASN1_VISIBLESTRING(ASN1_VISIBLESTRING **a, const unsigned char **in, long len); +int i2d_ASN1_VISIBLESTRING(ASN1_VISIBLESTRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_VISIBLESTRING_it; +ASN1_UNIVERSALSTRING *ASN1_UNIVERSALSTRING_new(void); +void ASN1_UNIVERSALSTRING_free(ASN1_UNIVERSALSTRING *a); +ASN1_UNIVERSALSTRING *d2i_ASN1_UNIVERSALSTRING(ASN1_UNIVERSALSTRING **a, const unsigned char **in, long len); +int i2d_ASN1_UNIVERSALSTRING(ASN1_UNIVERSALSTRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_UNIVERSALSTRING_it; +ASN1_UTF8STRING *ASN1_UTF8STRING_new(void); +void ASN1_UTF8STRING_free(ASN1_UTF8STRING *a); +ASN1_UTF8STRING *d2i_ASN1_UTF8STRING(ASN1_UTF8STRING **a, const unsigned char **in, long len); +int i2d_ASN1_UTF8STRING(ASN1_UTF8STRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_UTF8STRING_it; +ASN1_NULL *ASN1_NULL_new(void); +void ASN1_NULL_free(ASN1_NULL *a); +ASN1_NULL *d2i_ASN1_NULL(ASN1_NULL **a, const unsigned char **in, long len); +int i2d_ASN1_NULL(ASN1_NULL *a, unsigned char **out); +extern const ASN1_ITEM ASN1_NULL_it; +ASN1_BMPSTRING *ASN1_BMPSTRING_new(void); +void ASN1_BMPSTRING_free(ASN1_BMPSTRING *a); +ASN1_BMPSTRING *d2i_ASN1_BMPSTRING(ASN1_BMPSTRING **a, const unsigned char **in, long len); +int i2d_ASN1_BMPSTRING(ASN1_BMPSTRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_BMPSTRING_it; + +ASN1_STRING *ASN1_PRINTABLE_new(void); +void ASN1_PRINTABLE_free(ASN1_STRING *a); +ASN1_STRING *d2i_ASN1_PRINTABLE(ASN1_STRING **a, const unsigned char **in, long len); +int i2d_ASN1_PRINTABLE(ASN1_STRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_PRINTABLE_it; + +ASN1_STRING *DIRECTORYSTRING_new(void); +void DIRECTORYSTRING_free(ASN1_STRING *a); +ASN1_STRING *d2i_DIRECTORYSTRING(ASN1_STRING **a, const unsigned char **in, long len); +int i2d_DIRECTORYSTRING(ASN1_STRING *a, unsigned char **out); +extern const ASN1_ITEM DIRECTORYSTRING_it; +ASN1_STRING *DISPLAYTEXT_new(void); +void DISPLAYTEXT_free(ASN1_STRING *a); +ASN1_STRING *d2i_DISPLAYTEXT(ASN1_STRING **a, const unsigned char **in, long len); +int i2d_DISPLAYTEXT(ASN1_STRING *a, unsigned char **out); +extern const ASN1_ITEM DISPLAYTEXT_it; +ASN1_PRINTABLESTRING *ASN1_PRINTABLESTRING_new(void); +void ASN1_PRINTABLESTRING_free(ASN1_PRINTABLESTRING *a); +ASN1_PRINTABLESTRING *d2i_ASN1_PRINTABLESTRING(ASN1_PRINTABLESTRING **a, const unsigned char **in, long len); +int i2d_ASN1_PRINTABLESTRING(ASN1_PRINTABLESTRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_PRINTABLESTRING_it; +ASN1_T61STRING *ASN1_T61STRING_new(void); +void ASN1_T61STRING_free(ASN1_T61STRING *a); +ASN1_T61STRING *d2i_ASN1_T61STRING(ASN1_T61STRING **a, const unsigned char **in, long len); +int i2d_ASN1_T61STRING(ASN1_T61STRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_T61STRING_it; +ASN1_IA5STRING *ASN1_IA5STRING_new(void); +void ASN1_IA5STRING_free(ASN1_IA5STRING *a); +ASN1_IA5STRING *d2i_ASN1_IA5STRING(ASN1_IA5STRING **a, const unsigned char **in, long len); +int i2d_ASN1_IA5STRING(ASN1_IA5STRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_IA5STRING_it; +ASN1_GENERALSTRING *ASN1_GENERALSTRING_new(void); +void ASN1_GENERALSTRING_free(ASN1_GENERALSTRING *a); +ASN1_GENERALSTRING *d2i_ASN1_GENERALSTRING(ASN1_GENERALSTRING **a, const unsigned char **in, long len); +int i2d_ASN1_GENERALSTRING(ASN1_GENERALSTRING *a, unsigned char **out); +extern const ASN1_ITEM ASN1_GENERALSTRING_it; +ASN1_UTCTIME *ASN1_UTCTIME_new(void); +void ASN1_UTCTIME_free(ASN1_UTCTIME *a); +ASN1_UTCTIME *d2i_ASN1_UTCTIME(ASN1_UTCTIME **a, const unsigned char **in, long len); +int i2d_ASN1_UTCTIME(ASN1_UTCTIME *a, unsigned char **out); +extern const ASN1_ITEM ASN1_UTCTIME_it; +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_new(void); +void ASN1_GENERALIZEDTIME_free(ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *d2i_ASN1_GENERALIZEDTIME(ASN1_GENERALIZEDTIME **a, const unsigned char **in, long len); +int i2d_ASN1_GENERALIZEDTIME(ASN1_GENERALIZEDTIME *a, unsigned char **out); +extern const ASN1_ITEM ASN1_GENERALIZEDTIME_it; +ASN1_TIME *ASN1_TIME_new(void); +void ASN1_TIME_free(ASN1_TIME *a); +ASN1_TIME *d2i_ASN1_TIME(ASN1_TIME **a, const unsigned char **in, long len); +int i2d_ASN1_TIME(ASN1_TIME *a, unsigned char **out); +extern const ASN1_ITEM ASN1_TIME_it; + +extern const ASN1_ITEM ASN1_OCTET_STRING_NDEF_it; + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, int offset_day, + long offset_sec); +int ASN1_TIME_check(ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, + ASN1_GENERALIZEDTIME **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); + +int i2d_ASN1_SET(STACK_OF(OPENSSL_BLOCK) *a, unsigned char **pp, + i2d_of_void *i2d, int ex_tag, int ex_class, int is_set); +STACK_OF(OPENSSL_BLOCK) *d2i_ASN1_SET(STACK_OF(OPENSSL_BLOCK) **a, + const unsigned char **pp, long length, d2i_of_void *d2i, + void (*free_func)(OPENSSL_BLOCK), int ex_tag, int ex_class); + +#ifndef OPENSSL_NO_BIO +int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type); +#endif +int i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(const ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai, BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +int i2d_ASN1_bytes(ASN1_STRING *a, unsigned char **pp, int tag, int xclass); +ASN1_STRING *d2i_ASN1_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int Ptag, int Pclass); +unsigned long ASN1_tag2bit(int tag); +/* type is one or more of the B_ASN1_ values. */ +ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a, const unsigned char **pp, + long length, int type); + +/* PARSING */ +int asn1_Finish(ASN1_CTX *c); +int asn1_const_Finish(ASN1_const_CTX *c); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p, long len); +int ASN1_const_check_infinite_end(const unsigned char **p, long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag, + int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +void *ASN1_item_dup(const ASN1_ITEM *it, void *x); + +#ifndef LIBRESSL_INTERNAL + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, void *x); + +#define ASN1_dup_of(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(type, x))) + +#define ASN1_dup_of_const(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +/* ASN1 alloc/free macros for when a type is only used internally */ + +#define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) +#define M_ASN1_free_of(x, type) \ + ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) + +#endif /* !LIBRESSL_INTERNAL */ + +void *ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x); + +#define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x); + +#define ASN1_i2d_fp_of(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +#define ASN1_i2d_fp_of_const(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags); + +int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in); + +#ifndef OPENSSL_NO_BIO +void *ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x); + +#define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); +int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x); + +#define ASN1_i2d_bio_of(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(type, x))) + +#define ASN1_i2d_bio_of_const(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); +int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *fp, const ASN1_TIME *a); +int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags); +int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, + unsigned char *buf, int off); +int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); +int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, int dump); +#endif +const char *ASN1_tag2str(int tag); + +/* Used to load and write netscape format cert */ + +NETSCAPE_X509 *NETSCAPE_X509_new(void); +void NETSCAPE_X509_free(NETSCAPE_X509 *a); +NETSCAPE_X509 *d2i_NETSCAPE_X509(NETSCAPE_X509 **a, const unsigned char **in, long len); +int i2d_NETSCAPE_X509(NETSCAPE_X509 *a, unsigned char **out); +extern const ASN1_ITEM NETSCAPE_X509_it; + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(ASN1_TYPE *a, unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, unsigned char *data, + int len); +int ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a, long *num, unsigned char *data, + int max_len); + +STACK_OF(OPENSSL_BLOCK) *ASN1_seq_unpack(const unsigned char *buf, int len, + d2i_of_void *d2i, void (*free_func)(OPENSSL_BLOCK)); +unsigned char *ASN1_seq_pack(STACK_OF(OPENSSL_BLOCK) *safes, i2d_of_void *i2d, + unsigned char **buf, int *len ); +void *ASN1_unpack_string(ASN1_STRING *oct, d2i_of_void *d2i); +void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it); +ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d, + ASN1_OCTET_STRING **oct); + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, + ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(const char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE * ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it); +int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); + +ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf); + +/* ASN1 Print flags */ + +/* Indicate missing OPTIONAL fields */ +#define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 +/* Mark start and end of SEQUENCE */ +#define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 +/* Mark start and end of SEQUENCE/SET OF */ +#define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 +/* Show the ASN1 type of primitives */ +#define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 +/* Don't show ASN1 type of ANY */ +#define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 +/* Don't show ASN1 type of MSTRINGs */ +#define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 +/* Don't show field names in SEQUENCE */ +#define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 +/* Show structure names of each SEQUENCE field */ +#define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 +/* Don't show structure name even at top level */ +#define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 + +int ASN1_item_print(BIO *out, ASN1_VALUE *ifld, int indent, + const ASN1_ITEM *it, const ASN1_PCTX *pctx); +ASN1_PCTX *ASN1_PCTX_new(void); +void ASN1_PCTX_free(ASN1_PCTX *p); +unsigned long ASN1_PCTX_get_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +BIO_METHOD *BIO_f_asn1(void); + +BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); + +int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const ASN1_ITEM *it); +int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const char *hdr, const ASN1_ITEM *it); +int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, STACK_OF(X509_ALGOR) *mdalgs, + const ASN1_ITEM *it); +ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +/* 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. + */ +void ERR_load_ASN1_strings(void); + +/* Error codes for the ASN1 functions. */ + +/* Function codes. */ +#define ASN1_F_A2D_ASN1_OBJECT 100 +#define ASN1_F_A2I_ASN1_ENUMERATED 101 +#define ASN1_F_A2I_ASN1_INTEGER 102 +#define ASN1_F_A2I_ASN1_STRING 103 +#define ASN1_F_APPEND_EXP 176 +#define ASN1_F_ASN1_BIT_STRING_SET_BIT 183 +#define ASN1_F_ASN1_CB 177 +#define ASN1_F_ASN1_CHECK_TLEN 104 +#define ASN1_F_ASN1_COLLATE_PRIMITIVE 105 +#define ASN1_F_ASN1_COLLECT 106 +#define ASN1_F_ASN1_D2I_EX_PRIMITIVE 108 +#define ASN1_F_ASN1_D2I_FP 109 +#define ASN1_F_ASN1_D2I_READ_BIO 107 +#define ASN1_F_ASN1_DIGEST 184 +#define ASN1_F_ASN1_DO_ADB 110 +#define ASN1_F_ASN1_DUP 111 +#define ASN1_F_ASN1_ENUMERATED_SET 112 +#define ASN1_F_ASN1_ENUMERATED_TO_BN 113 +#define ASN1_F_ASN1_EX_C2I 204 +#define ASN1_F_ASN1_FIND_END 190 +#define ASN1_F_ASN1_GENERALIZEDTIME_ADJ 216 +#define ASN1_F_ASN1_GENERALIZEDTIME_SET 185 +#define ASN1_F_ASN1_GENERATE_V3 178 +#define ASN1_F_ASN1_GET_OBJECT 114 +#define ASN1_F_ASN1_HEADER_NEW 115 +#define ASN1_F_ASN1_I2D_BIO 116 +#define ASN1_F_ASN1_I2D_FP 117 +#define ASN1_F_ASN1_INTEGER_SET 118 +#define ASN1_F_ASN1_INTEGER_TO_BN 119 +#define ASN1_F_ASN1_ITEM_D2I_FP 206 +#define ASN1_F_ASN1_ITEM_DUP 191 +#define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW 121 +#define ASN1_F_ASN1_ITEM_EX_D2I 120 +#define ASN1_F_ASN1_ITEM_I2D_BIO 192 +#define ASN1_F_ASN1_ITEM_I2D_FP 193 +#define ASN1_F_ASN1_ITEM_PACK 198 +#define ASN1_F_ASN1_ITEM_SIGN 195 +#define ASN1_F_ASN1_ITEM_SIGN_CTX 220 +#define ASN1_F_ASN1_ITEM_UNPACK 199 +#define ASN1_F_ASN1_ITEM_VERIFY 197 +#define ASN1_F_ASN1_MBSTRING_NCOPY 122 +#define ASN1_F_ASN1_OBJECT_NEW 123 +#define ASN1_F_ASN1_OUTPUT_DATA 214 +#define ASN1_F_ASN1_PACK_STRING 124 +#define ASN1_F_ASN1_PCTX_NEW 205 +#define ASN1_F_ASN1_PKCS5_PBE_SET 125 +#define ASN1_F_ASN1_SEQ_PACK 126 +#define ASN1_F_ASN1_SEQ_UNPACK 127 +#define ASN1_F_ASN1_SIGN 128 +#define ASN1_F_ASN1_STR2TYPE 179 +#define ASN1_F_ASN1_STRING_SET 186 +#define ASN1_F_ASN1_STRING_TABLE_ADD 129 +#define ASN1_F_ASN1_STRING_TYPE_NEW 130 +#define ASN1_F_ASN1_TEMPLATE_EX_D2I 132 +#define ASN1_F_ASN1_TEMPLATE_NEW 133 +#define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I 131 +#define ASN1_F_ASN1_TIME_ADJ 217 +#define ASN1_F_ASN1_TIME_SET 175 +#define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING 134 +#define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 135 +#define ASN1_F_ASN1_UNPACK_STRING 136 +#define ASN1_F_ASN1_UTCTIME_ADJ 218 +#define ASN1_F_ASN1_UTCTIME_SET 187 +#define ASN1_F_ASN1_VERIFY 137 +#define ASN1_F_B64_READ_ASN1 209 +#define ASN1_F_B64_WRITE_ASN1 210 +#define ASN1_F_BIO_NEW_NDEF 208 +#define ASN1_F_BITSTR_CB 180 +#define ASN1_F_BN_TO_ASN1_ENUMERATED 138 +#define ASN1_F_BN_TO_ASN1_INTEGER 139 +#define ASN1_F_C2I_ASN1_BIT_STRING 189 +#define ASN1_F_C2I_ASN1_INTEGER 194 +#define ASN1_F_C2I_ASN1_OBJECT 196 +#define ASN1_F_COLLECT_DATA 140 +#define ASN1_F_D2I_ASN1_BIT_STRING 141 +#define ASN1_F_D2I_ASN1_BOOLEAN 142 +#define ASN1_F_D2I_ASN1_BYTES 143 +#define ASN1_F_D2I_ASN1_GENERALIZEDTIME 144 +#define ASN1_F_D2I_ASN1_HEADER 145 +#define ASN1_F_D2I_ASN1_INTEGER 146 +#define ASN1_F_D2I_ASN1_OBJECT 147 +#define ASN1_F_D2I_ASN1_SET 148 +#define ASN1_F_D2I_ASN1_TYPE_BYTES 149 +#define ASN1_F_D2I_ASN1_UINTEGER 150 +#define ASN1_F_D2I_ASN1_UTCTIME 151 +#define ASN1_F_D2I_AUTOPRIVATEKEY 207 +#define ASN1_F_D2I_NETSCAPE_RSA 152 +#define ASN1_F_D2I_NETSCAPE_RSA_2 153 +#define ASN1_F_D2I_PRIVATEKEY 154 +#define ASN1_F_D2I_PUBLICKEY 155 +#define ASN1_F_D2I_RSA_NET 200 +#define ASN1_F_D2I_RSA_NET_2 201 +#define ASN1_F_D2I_X509 156 +#define ASN1_F_D2I_X509_CINF 157 +#define ASN1_F_D2I_X509_PKEY 159 +#define ASN1_F_I2D_ASN1_BIO_STREAM 211 +#define ASN1_F_I2D_ASN1_SET 188 +#define ASN1_F_I2D_ASN1_TIME 160 +#define ASN1_F_I2D_DSA_PUBKEY 161 +#define ASN1_F_I2D_EC_PUBKEY 181 +#define ASN1_F_I2D_PRIVATEKEY 163 +#define ASN1_F_I2D_PUBLICKEY 164 +#define ASN1_F_I2D_RSA_NET 162 +#define ASN1_F_I2D_RSA_PUBKEY 165 +#define ASN1_F_LONG_C2I 166 +#define ASN1_F_OID_MODULE_INIT 174 +#define ASN1_F_PARSE_TAGGING 182 +#define ASN1_F_PKCS5_PBE2_SET_IV 167 +#define ASN1_F_PKCS5_PBE_SET 202 +#define ASN1_F_PKCS5_PBE_SET0_ALGOR 215 +#define ASN1_F_PKCS5_PBKDF2_SET 219 +#define ASN1_F_SMIME_READ_ASN1 212 +#define ASN1_F_SMIME_TEXT 213 +#define ASN1_F_X509_CINF_NEW 168 +#define ASN1_F_X509_CRL_ADD0_REVOKED 169 +#define ASN1_F_X509_INFO_NEW 170 +#define ASN1_F_X509_NAME_ENCODE 203 +#define ASN1_F_X509_NAME_EX_D2I 158 +#define ASN1_F_X509_NAME_EX_NEW 171 +#define ASN1_F_X509_NEW 172 +#define ASN1_F_X509_PKEY_NEW 173 + +/* Reason codes. */ +#define ASN1_R_ADDING_OBJECT 171 +#define ASN1_R_ASN1_PARSE_ERROR 203 +#define ASN1_R_ASN1_SIG_PARSE_ERROR 204 +#define ASN1_R_AUX_ERROR 100 +#define ASN1_R_BAD_CLASS 101 +#define ASN1_R_BAD_OBJECT_HEADER 102 +#define ASN1_R_BAD_PASSWORD_READ 103 +#define ASN1_R_BAD_TAG 104 +#define ASN1_R_BMPSTRING_IS_WRONG_LENGTH 214 +#define ASN1_R_BN_LIB 105 +#define ASN1_R_BOOLEAN_IS_WRONG_LENGTH 106 +#define ASN1_R_BUFFER_TOO_SMALL 107 +#define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 108 +#define ASN1_R_CONTEXT_NOT_INITIALISED 217 +#define ASN1_R_DATA_IS_WRONG 109 +#define ASN1_R_DECODE_ERROR 110 +#define ASN1_R_DECODING_ERROR 111 +#define ASN1_R_DEPTH_EXCEEDED 174 +#define ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED 198 +#define ASN1_R_ENCODE_ERROR 112 +#define ASN1_R_ERROR_GETTING_TIME 173 +#define ASN1_R_ERROR_LOADING_SECTION 172 +#define ASN1_R_ERROR_PARSING_SET_ELEMENT 113 +#define ASN1_R_ERROR_SETTING_CIPHER_PARAMS 114 +#define ASN1_R_EXPECTING_AN_INTEGER 115 +#define ASN1_R_EXPECTING_AN_OBJECT 116 +#define ASN1_R_EXPECTING_A_BOOLEAN 117 +#define ASN1_R_EXPECTING_A_TIME 118 +#define ASN1_R_EXPLICIT_LENGTH_MISMATCH 119 +#define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED 120 +#define ASN1_R_FIELD_MISSING 121 +#define ASN1_R_FIRST_NUM_TOO_LARGE 122 +#define ASN1_R_HEADER_TOO_LONG 123 +#define ASN1_R_ILLEGAL_BITSTRING_FORMAT 175 +#define ASN1_R_ILLEGAL_BOOLEAN 176 +#define ASN1_R_ILLEGAL_CHARACTERS 124 +#define ASN1_R_ILLEGAL_FORMAT 177 +#define ASN1_R_ILLEGAL_HEX 178 +#define ASN1_R_ILLEGAL_IMPLICIT_TAG 179 +#define ASN1_R_ILLEGAL_INTEGER 180 +#define ASN1_R_ILLEGAL_NESTED_TAGGING 181 +#define ASN1_R_ILLEGAL_NULL 125 +#define ASN1_R_ILLEGAL_NULL_VALUE 182 +#define ASN1_R_ILLEGAL_OBJECT 183 +#define ASN1_R_ILLEGAL_OPTIONAL_ANY 126 +#define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170 +#define ASN1_R_ILLEGAL_TAGGED_ANY 127 +#define ASN1_R_ILLEGAL_TIME_VALUE 184 +#define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 +#define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 +#define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 +#define ASN1_R_INVALID_BMPSTRING_LENGTH 129 +#define ASN1_R_INVALID_DIGIT 130 +#define ASN1_R_INVALID_MIME_TYPE 205 +#define ASN1_R_INVALID_MODIFIER 186 +#define ASN1_R_INVALID_NUMBER 187 +#define ASN1_R_INVALID_OBJECT_ENCODING 216 +#define ASN1_R_INVALID_SEPARATOR 131 +#define ASN1_R_INVALID_TIME_FORMAT 132 +#define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 +#define ASN1_R_INVALID_UTF8STRING 134 +#define ASN1_R_IV_TOO_LARGE 135 +#define ASN1_R_LENGTH_ERROR 136 +#define ASN1_R_LIST_ERROR 188 +#define ASN1_R_MIME_NO_CONTENT_TYPE 206 +#define ASN1_R_MIME_PARSE_ERROR 207 +#define ASN1_R_MIME_SIG_PARSE_ERROR 208 +#define ASN1_R_MISSING_EOC 137 +#define ASN1_R_MISSING_SECOND_NUMBER 138 +#define ASN1_R_MISSING_VALUE 189 +#define ASN1_R_MSTRING_NOT_UNIVERSAL 139 +#define ASN1_R_MSTRING_WRONG_TAG 140 +#define ASN1_R_NESTED_ASN1_STRING 197 +#define ASN1_R_NON_HEX_CHARACTERS 141 +#define ASN1_R_NOT_ASCII_FORMAT 190 +#define ASN1_R_NOT_ENOUGH_DATA 142 +#define ASN1_R_NO_CONTENT_TYPE 209 +#define ASN1_R_NO_DEFAULT_DIGEST 201 +#define ASN1_R_NO_MATCHING_CHOICE_TYPE 143 +#define ASN1_R_NO_MULTIPART_BODY_FAILURE 210 +#define ASN1_R_NO_MULTIPART_BOUNDARY 211 +#define ASN1_R_NO_SIG_CONTENT_TYPE 212 +#define ASN1_R_NULL_IS_WRONG_LENGTH 144 +#define ASN1_R_OBJECT_NOT_ASCII_FORMAT 191 +#define ASN1_R_ODD_NUMBER_OF_CHARS 145 +#define ASN1_R_PRIVATE_KEY_HEADER_MISSING 146 +#define ASN1_R_SECOND_NUMBER_TOO_LARGE 147 +#define ASN1_R_SEQUENCE_LENGTH_MISMATCH 148 +#define ASN1_R_SEQUENCE_NOT_CONSTRUCTED 149 +#define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG 192 +#define ASN1_R_SHORT_LINE 150 +#define ASN1_R_SIG_INVALID_MIME_TYPE 213 +#define ASN1_R_STREAMING_NOT_SUPPORTED 202 +#define ASN1_R_STRING_TOO_LONG 151 +#define ASN1_R_STRING_TOO_SHORT 152 +#define ASN1_R_TAG_VALUE_TOO_HIGH 153 +#define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 +#define ASN1_R_TIME_NOT_ASCII_FORMAT 193 +#define ASN1_R_TOO_LONG 155 +#define ASN1_R_TYPE_NOT_CONSTRUCTED 156 +#define ASN1_R_UNABLE_TO_DECODE_RSA_KEY 157 +#define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY 158 +#define ASN1_R_UNEXPECTED_EOC 159 +#define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH 215 +#define ASN1_R_UNKNOWN_FORMAT 160 +#define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM 161 +#define ASN1_R_UNKNOWN_OBJECT_TYPE 162 +#define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE 163 +#define ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM 199 +#define ASN1_R_UNKNOWN_TAG 194 +#define ASN1_R_UNKOWN_FORMAT 195 +#define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 +#define ASN1_R_UNSUPPORTED_CIPHER 165 +#define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM 166 +#define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 +#define ASN1_R_UNSUPPORTED_TYPE 196 +#define ASN1_R_WRONG_PUBLIC_KEY_TYPE 200 +#define ASN1_R_WRONG_TAG 168 +#define ASN1_R_WRONG_TYPE 169 + + +int ASN1_time_parse(const char *_bytes, size_t _len, struct tm *_tm, int _mode); +int ASN1_time_tm_cmp(struct tm *_tm1, struct tm *_tm2); +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/asn1_mac.h b/src/3rdparty/win32_include/openssl/asn1_mac.h new file mode 100644 index 000000000..fd524dc21 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/asn1_mac.h @@ -0,0 +1,426 @@ +/* $OpenBSD: asn1_mac.h,v 1.14 2014/06/27 04:41:09 miod Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ASN1_MAC_H +#define HEADER_ASN1_MAC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ASN1_MAC_ERR_LIB +#define ASN1_MAC_ERR_LIB ERR_LIB_ASN1 +#endif + +#define ASN1_MAC_H_err(f,r,line) \ + ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line)) + +#define M_ASN1_D2I_vars(a,type,func) \ + ASN1_const_CTX c; \ + type ret=NULL; \ + \ + c.pp=(const unsigned char **)pp; \ + c.q= *(const unsigned char **)pp; \ + c.error=ERR_R_NESTED_ASN1_ERROR; \ + if ((a == NULL) || ((*a) == NULL)) \ + { if ((ret=(type)func()) == NULL) \ + { c.line=__LINE__; goto err; } } \ + else ret=(*a); + +#define M_ASN1_D2I_Init() \ + c.p= *(const unsigned char **)pp; \ + c.max=(length == 0)?0:(c.p+length); + +#define M_ASN1_D2I_Finish_2(a) \ + if (!asn1_const_Finish(&c)) \ + { c.line=__LINE__; goto err; } \ + *(const unsigned char **)pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); + +#define M_ASN1_D2I_Finish(a,func,e) \ + M_ASN1_D2I_Finish_2(a); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +#define M_ASN1_D2I_start_sequence() \ + if (!asn1_GetSequence(&c,&length)) \ + { c.line=__LINE__; goto err; } +/* Begin reading ASN1 without a surrounding sequence */ +#define M_ASN1_D2I_begin() \ + c.slen = length; + +/* End reading ASN1 with no check on length */ +#define M_ASN1_D2I_Finish_nolen(a, func, e) \ + *pp=c.p; \ + if (a != NULL) (*a)=ret; \ + return(ret); \ +err:\ + ASN1_MAC_H_err((e),c.error,c.line); \ + asn1_add_error(*pp,(int)(c.q- *pp)); \ + if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \ + return(NULL) + +#define M_ASN1_D2I_end_sequence() \ + (((c.inf&1) == 0)?(c.slen <= 0): \ + (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen))) + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +#define M_ASN1_D2I_get(b, func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* Don't use this with d2i_ASN1_BOOLEAN() */ +#define M_ASN1_D2I_get_x(type,b,func) \ + c.q=c.p; \ + if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +/* use this instead () */ +#define M_ASN1_D2I_get_int(b,func) \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) < 0) \ + {c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +#define M_ASN1_D2I_get_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get(b,func); \ + } + +#define M_ASN1_D2I_get_int_opt(b,func,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \ + == (V_ASN1_UNIVERSAL|(type)))) \ + { \ + M_ASN1_D2I_get_int(b,func); \ + } + +#define M_ASN1_D2I_get_imp(b,func, type) \ + M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \ + c.q=c.p; \ + if (func(&(b),&c.p,c.slen) == NULL) \ + {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \ + c.slen-=(c.p-c.q);\ + M_ASN1_next_prev=_tmp; + +#define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \ + if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \ + (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \ + { \ + unsigned char _tmp = M_ASN1_next; \ + M_ASN1_D2I_get_imp(b,func, type);\ + } + +#define M_ASN1_D2I_get_set_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \ + V_ASN1_SET,V_ASN1_UNIVERSAL); + +#define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SET)))\ + { M_ASN1_D2I_get_set_type(type,r,func,free_func); } + +#define M_ASN1_I2D_len_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SET(a,f); + +#define M_ASN1_I2D_put_SET_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SET(a,f); + +#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +#define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE_type(type,a,f); + +#define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \ + if ((c.slen != 0) && \ + (M_ASN1_next == \ + (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\ + { \ + M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\ + tag,V_ASN1_CONTEXT_SPECIFIC); \ + } + +#define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +#define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \ + if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \ + V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\ + { M_ASN1_D2I_get_seq_type(type,r,func,free_func); } + +#define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \ + M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\ + x,V_ASN1_CONTEXT_SPECIFIC); + +#define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\ + free_func,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +#define M_ASN1_D2I_get_set_strings(r,func,a,b) \ + c.q=c.p; \ + if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \ + { c.line=__LINE__; goto err; } \ + c.slen-=(c.p-c.q); + +#define M_ASN1_D2I_get_EXP_opt(r,func,tag) \ + if ((c.slen != 0L) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (func(&(r),&c.p,Tlen) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +#define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \ + if ((c.slen != 0) && (M_ASN1_next == \ + (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \ + { \ + int Tinf,Ttag,Tclass; \ + long Tlen; \ + \ + c.q=c.p; \ + Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \ + if (Tinf & 0x80) \ + { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \ + c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) \ + Tlen = c.slen - (c.p - c.q) - 2; \ + if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \ + free_func,b,V_ASN1_UNIVERSAL) == NULL) \ + { c.line=__LINE__; goto err; } \ + if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \ + Tlen = c.slen - (c.p - c.q); \ + if(!ASN1_check_infinite_end(&c.p, Tlen)) \ + { c.error=ERR_R_MISSING_ASN1_EOS; \ + c.line=__LINE__; goto err; } \ + }\ + c.slen-=(c.p-c.q); \ + } + +/* BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately, + some macros that use ASN1_const_CTX still insist on writing in the input + stream. ARGH! ARGH! ARGH! Let's get rid of this macro package. + Please? -- Richard Levitte */ +#define M_ASN1_next (*((unsigned char *)(c.p))) +#define M_ASN1_next_prev (*((unsigned char *)(c.q))) + +/*************************************************/ + +#define M_ASN1_I2D_vars(a) int r=0,ret=0; \ + unsigned char *p; \ + if (a == NULL) return(0) + +/* Length Macros */ +#define M_ASN1_I2D_len(a,f) ret+=f(a,NULL) +#define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f) + +#define M_ASN1_I2D_len_SET_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \ + V_ASN1_UNIVERSAL,IS_SET); + +#define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \ + V_ASN1_UNIVERSAL,IS_SEQUENCE) + +#define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE(a,f); + +#define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + M_ASN1_I2D_len_SEQUENCE_type(type,a,f); + +#define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +#define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC,IS_SET); + +#define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); + +#define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \ + if (a != NULL)\ + { \ + v=f(a,NULL); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +#define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0))\ + { \ + v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \ + V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + ret+=ASN1_object_size(1,v,mtag); \ + } + +/* Put Macros */ +#define M_ASN1_I2D_put(a,f) f(a,&p) + +#define M_ASN1_I2D_put_IMP_opt(a,f,t) \ + if (a != NULL) \ + { \ + unsigned char *q=p; \ + f(a,&p); \ + *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\ + } + +#define M_ASN1_I2D_put_SET_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET) +#define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \ + i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET) + +#define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \ + i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE) + +#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \ + if ((a != NULL) && (sk_num(a) != 0)) \ + M_ASN1_I2D_put_SEQUENCE(a,f); + +#define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SET); } + +#define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { i2d_ASN1_SET_OF_##type(a,&p,f,x, \ + V_ASN1_CONTEXT_SPECIFIC, \ + IS_SEQUENCE); } + +#define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \ + if (a != NULL) \ + { \ + ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \ + f(a,&p); \ + } + +#define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \ + if ((a != NULL) && (sk_##type##_num(a) != 0)) \ + { \ + ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \ + i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \ + IS_SEQUENCE); \ + } + +#define M_ASN1_I2D_seq_total() \ + r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \ + if (pp == NULL) return(r); \ + p= *pp; \ + ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL) + +#define M_ASN1_I2D_INF_seq_start(tag,ctx) \ + *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \ + *(p++)=0x80 + +#define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00 + +#define M_ASN1_I2D_finish() *pp=p; \ + return(r); + +int asn1_GetSequence(ASN1_const_CTX *c, long *length); +void asn1_add_error(const unsigned char *address, int offset); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/asn1t.h b/src/3rdparty/win32_include/openssl/asn1t.h new file mode 100644 index 000000000..ba380bdf4 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/asn1t.h @@ -0,0 +1,880 @@ +/* $OpenBSD: asn1t.h,v 1.14 2016/12/27 15:12:51 jsing Exp $ */ +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ASN1T_H +#define HEADER_ASN1T_H + +#include + +#include + +#include + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef LIBRESSL_INTERNAL + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr)) + + +/* Macros for start and end of ASN1_ITEM definition */ + +#define ASN1_ITEM_start(itname) \ + const ASN1_ITEM itname##_it = { + +#define ASN1_ITEM_end(itname) \ + }; + + + +/* Macros to aid ASN1 template writing */ + +#define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +#define ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE,\ + -1,\ + &tname##_item_tt,\ + 0,\ + NULL,\ + 0,\ + #tname \ + ASN1_ITEM_end(tname) + + +/* This is a ASN1 type which just embeds a template */ + +/* This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +#define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +#define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +#define ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +#define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +#define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ + ASN1_SEQUENCE_cb(tname, cb) + +#define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_SEQUENCE(tname) + +#define ASN1_BROKEN_SEQUENCE(tname) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_ref(tname, cb, lck) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \ + ASN1_SEQUENCE(tname) + +#define ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(tname),\ + #tname \ + ASN1_ITEM_end(tname) + +#define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname) + +#define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +#define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +#define ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +#define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + + +/* This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +#define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +#define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \ + ASN1_CHOICE(tname) + +#define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +#define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +#define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +#define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +#define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0,\ + #name, ASN1_ITEM_ref(type) } + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +#define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field),\ + #field, ASN1_ITEM_ref(type) } + +/* used when the structure is combined with the parent */ + +#define ASN1_EX_COMBINE(flags, tag, type) { \ + (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } + +/* implicit and explicit helper macros */ + +#define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type) + +#define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) } +/* Plain simple type */ +#define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) + +/* OPTIONAL simple type */ +#define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +#define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) + +/* IMPLICIT tagged OPTIONAL simple type */ +#define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* Same as above but EXPLICIT */ + +#define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +#define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) + +/* SEQUENCE OF type */ +#define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +#define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +#define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +#define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +#define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +#define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +#define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +#define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +#define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +#define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +#define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +#define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +/* EXPLICIT using indefinite length constructed form */ +#define ASN1_NDEF_EXP(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +#define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +#define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + + +#define ASN1_ADB_END(name, flags, field, app_table, def, none) \ + ;\ + static const ASN1_ADB name##_adb = {\ + flags,\ + offsetof(name, field),\ + app_table,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + } + + +#define ADB_ENTRY(val, template) {val, template} + +#define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +#endif /* !LIBRESSL_INTERNAL */ + +/* This is the ASN1 template structure that defines + * a wrapper round the actual type. It determines the + * actual position of the field in the value structure, + * various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { +unsigned long flags; /* Various flags */ +long tag; /* tag, not used if no tagging */ +unsigned long offset; /* Offset of this field in structure */ +#ifndef NO_ASN1_FIELD_NAMES +const char *field_name; /* Field name */ +#endif +ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +#define ASN1_TEMPLATE_item(t) (t->item_ptr) +#define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +#define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +#define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +#define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* Special case: this refers to a SET OF that + * will be sorted into DER order when encoded *and* + * the corresponding STACK will be modified to match + * the new order. + */ +#define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +#define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* These flags mean the tag should be taken from the + * tag field. If EXPLICIT then the underlying type + * is used for the inner tag. + */ + +/* IMPLICIT tagging */ +#define ASN1_TFLG_IMPTAG (0x1 << 3) + + +/* EXPLICIT tagging, inner tag from underlying type */ +#define ASN1_TFLG_EXPTAG (0x2 << 3) + +#define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +#define ASN1_TFLG_IMPLICIT ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT + +/* context specific EXPLICIT */ +#define ASN1_TFLG_EXPLICIT ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT + +/* If tagging is in force these determine the + * type of tag to use. Otherwise the tag is + * determined by the underlying type. These + * values reflect the actual octet format. + */ + +/* Universal tag */ +#define ASN1_TFLG_UNIVERSAL (0x0<<6) +/* Application tag */ +#define ASN1_TFLG_APPLICATION (0x1<<6) +/* Context specific tag */ +#define ASN1_TFLG_CONTEXT (0x2<<6) +/* Private tag */ +#define ASN1_TFLG_PRIVATE (0x3<<6) + +#define ASN1_TFLG_TAG_CLASS (0x3<<6) + +/* These are for ANY DEFINED BY type. In this case + * the 'item' field points to an ASN1_ADB structure + * which contains a table of values to decode the + * relevant type + */ + +#define ASN1_TFLG_ADB_MASK (0x3<<8) + +#define ASN1_TFLG_ADB_OID (0x1<<8) + +#define ASN1_TFLG_ADB_INT (0x1<<9) + +/* This flag means a parent structure is passed + * instead of the field: this is useful is a + * SEQUENCE is being combined with a CHOICE for + * example. Since this means the structure and + * item name will differ we need to use the + * ASN1_CHOICE_END_name() macro for example. + */ + +#define ASN1_TFLG_COMBINE (0x1<<10) + +/* This flag when present in a SEQUENCE OF, SET OF + * or EXPLICIT causes indefinite length constructed + * encoding to be used if required. + */ + +#define ASN1_TFLG_NDEF (0x1<<11) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { +char itype; /* The item type, primitive, SEQUENCE, CHOICE or extern */ +long utype; /* underlying type */ +const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains the contents */ +long tcount; /* Number of templates if SEQUENCE or CHOICE */ +const void *funcs; /* functions that handle this type */ +long size; /* Structure size (usually)*/ +#ifndef NO_ASN1_FIELD_NAMES +const char *sname; /* Structure name */ +#endif +}; + +/* These are values for the itype field and + * determine how the type is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application + * specific functions. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +#define ASN1_ITYPE_PRIMITIVE 0x0 + +#define ASN1_ITYPE_SEQUENCE 0x1 + +#define ASN1_ITYPE_CHOICE 0x2 + +#define ASN1_ITYPE_EXTERN 0x4 + +#define ASN1_ITYPE_MSTRING 0x5 + +#define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* Cache for ASN1 tag and length, so we + * don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st{ + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ + +typedef ASN1_VALUE * ASN1_new_func(void); +typedef void ASN1_free_func(ASN1_VALUE *a); +typedef ASN1_VALUE * ASN1_d2i_func(ASN1_VALUE **a, const unsigned char ** in, long length); +typedef int ASN1_i2d_func(ASN1_VALUE * a, unsigned char **in); + +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, + int tag, int aclass, char opt, ASN1_TLC *ctx); + +typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, + int indent, const char *fname, + const ASN1_PCTX *pctx); + +typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); +typedef int ASN1_primitive_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent, const ASN1_PCTX *pctx); + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; + ASN1_ex_print_func *asn1_ex_print; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; + ASN1_primitive_print *prim_print; +} ASN1_PRIMITIVE_FUNCS; + +/* This is the ASN1_AUX structure: it handles various + * miscellaneous requirements. For example the use of + * reference counts and an informational callback. + * + * The "informational callback" is called at various + * points during the ASN1 encoding and decoding. It can + * be used to provide minor customisation of the structures + * used. This is most useful where the supplied routines + * *almost* do the right thing but need some extra help + * at a few points. If the callback returns zero then + * it is assumed a fatal error has occurred and the + * main operation should be abandoned. + * + * If major changes in the default behaviour are required + * then an external type is more appropriate. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, + void *exarg); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Lock type to use */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ +} ASN1_AUX; + +/* For print related callbacks exarg points to this structure */ +typedef struct ASN1_PRINT_ARG_st { + BIO *out; + int indent; + const ASN1_PCTX *pctx; +} ASN1_PRINT_ARG; + +/* For streaming related callbacks exarg points to this structure */ +typedef struct ASN1_STREAM_ARG_st { + /* BIO to stream through */ + BIO *out; + /* BIO with filters appended */ + BIO *ndef_bio; + /* Streaming I/O boundary */ + unsigned char **boundary; +} ASN1_STREAM_ARG; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +#define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +#define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +#define ASN1_AFLG_BROKEN 4 + +/* operation values for asn1_cb */ + +#define ASN1_OP_NEW_PRE 0 +#define ASN1_OP_NEW_POST 1 +#define ASN1_OP_FREE_PRE 2 +#define ASN1_OP_FREE_POST 3 +#define ASN1_OP_D2I_PRE 4 +#define ASN1_OP_D2I_POST 5 +#define ASN1_OP_I2D_PRE 6 +#define ASN1_OP_I2D_POST 7 +#define ASN1_OP_PRINT_PRE 8 +#define ASN1_OP_PRINT_POST 9 +#define ASN1_OP_STREAM_PRE 10 +#define ASN1_OP_STREAM_POST 11 +#define ASN1_OP_DETACHED_PRE 12 +#define ASN1_OP_DETACHED_POST 13 + +#ifndef LIBRESSL_INTERNAL + +/* Macro to implement a primitive type */ +#define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +#define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +#define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ + ASN1_ITEM_end(itname) +#define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +#define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +#define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +#define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ + pre stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + pre void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +#define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ + } + +/* This includes evil casts to remove const: they will go away when full + * ASN1 constification is done. + */ +#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname * stname##_dup(stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +#define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ + IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ + int fname##_print_ctx(BIO *out, stname *x, int indent, \ + const ASN1_PCTX *pctx) \ + { \ + return ASN1_item_print(out, (ASN1_VALUE *)x, indent, \ + ASN1_ITEM_rptr(itname), pctx); \ + } + +#define IMPLEMENT_ASN1_FUNCTIONS_const(name) \ + IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name) + +#define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +#endif /* !LIBRESSL_INTERNAL */ + +/* external definitions for primitive types */ + +extern const ASN1_ITEM ASN1_BOOLEAN_it; +extern const ASN1_ITEM ASN1_TBOOLEAN_it; +extern const ASN1_ITEM ASN1_FBOOLEAN_it; +extern const ASN1_ITEM ASN1_SEQUENCE_it; +extern const ASN1_ITEM CBIGNUM_it; +extern const ASN1_ITEM BIGNUM_it; +extern const ASN1_ITEM LONG_it; +extern const ASN1_ITEM ZLONG_it; + +DECLARE_STACK_OF(ASN1_VALUE) + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it); + +void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); +int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt); +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, + int tag, int aclass, char opt, ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); +int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_TEMPLATE *tt); +void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it); + +int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it); + +ASN1_VALUE ** asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); + +const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, int nullerr); + +int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it); + +void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it); +void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, const ASN1_ITEM *it); +int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, const ASN1_ITEM *it); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/bio.h b/src/3rdparty/win32_include/openssl/bio.h new file mode 100644 index 000000000..9a9472c72 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/bio.h @@ -0,0 +1,792 @@ +/* $OpenBSD: bio.h,v 1.29 2015/06/20 01:17:27 doug Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BIO_H +#define HEADER_BIO_H +#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__OpenBSD__) +#define __bounded__(x, y, z) +#endif +#include + +# include +#include + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +/* These are the 'types' of BIOs */ +#define BIO_TYPE_NONE 0 +#define BIO_TYPE_MEM (1|0x0400) +#define BIO_TYPE_FILE (2|0x0400) + +#define BIO_TYPE_FD (4|0x0400|0x0100) +#define BIO_TYPE_SOCKET (5|0x0400|0x0100) +#define BIO_TYPE_NULL (6|0x0400) +#define BIO_TYPE_SSL (7|0x0200) +#define BIO_TYPE_MD (8|0x0200) /* passive filter */ +#define BIO_TYPE_BUFFER (9|0x0200) /* filter */ +#define BIO_TYPE_CIPHER (10|0x0200) /* filter */ +#define BIO_TYPE_BASE64 (11|0x0200) /* filter */ +#define BIO_TYPE_CONNECT (12|0x0400|0x0100) /* socket - connect */ +#define BIO_TYPE_ACCEPT (13|0x0400|0x0100) /* socket for accept */ +#define BIO_TYPE_PROXY_CLIENT (14|0x0200) /* client proxy BIO */ +#define BIO_TYPE_PROXY_SERVER (15|0x0200) /* server proxy BIO */ +#define BIO_TYPE_NBIO_TEST (16|0x0200) /* server proxy BIO */ +#define BIO_TYPE_NULL_FILTER (17|0x0200) +#define BIO_TYPE_BER (18|0x0200) /* BER -> bin filter */ +#define BIO_TYPE_BIO (19|0x0400) /* (half a) BIO pair */ +#define BIO_TYPE_LINEBUFFER (20|0x0200) /* filter */ +#define BIO_TYPE_DGRAM (21|0x0400|0x0100) +#define BIO_TYPE_ASN1 (22|0x0200) /* filter */ +#define BIO_TYPE_COMP (23|0x0200) /* filter */ + +#define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ +#define BIO_TYPE_FILTER 0x0200 +#define BIO_TYPE_SOURCE_SINK 0x0400 + +/* BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); */ +#define BIO_NOCLOSE 0x00 +#define BIO_CLOSE 0x01 + +/* These are used in the following macros and are passed to + * BIO_ctrl() */ +#define BIO_CTRL_RESET 1 /* opt - rewind/zero etc */ +#define BIO_CTRL_EOF 2 /* opt - are we at the eof */ +#define BIO_CTRL_INFO 3 /* opt - extra tit-bits */ +#define BIO_CTRL_SET 4 /* man - set the 'IO' type */ +#define BIO_CTRL_GET 5 /* man - get the 'IO' type */ +#define BIO_CTRL_PUSH 6 /* opt - internal, used to signify change */ +#define BIO_CTRL_POP 7 /* opt - internal, used to signify change */ +#define BIO_CTRL_GET_CLOSE 8 /* man - set the 'close' on free */ +#define BIO_CTRL_SET_CLOSE 9 /* man - set the 'close' on free */ +#define BIO_CTRL_PENDING 10 /* opt - is their more data buffered */ +#define BIO_CTRL_FLUSH 11 /* opt - 'flush' buffered output */ +#define BIO_CTRL_DUP 12 /* man - extra stuff for 'duped' BIO */ +#define BIO_CTRL_WPENDING 13 /* opt - number of bytes still to write */ +/* callback is int cb(BIO *bio,state,ret); */ +#define BIO_CTRL_SET_CALLBACK 14 /* opt - set callback function */ +#define BIO_CTRL_GET_CALLBACK 15 /* opt - set callback function */ + +#define BIO_CTRL_SET_FILENAME 30 /* BIO_s_file special */ + +/* dgram BIO stuff */ +#define BIO_CTRL_DGRAM_CONNECT 31 /* BIO dgram special */ +#define BIO_CTRL_DGRAM_SET_CONNECTED 32 /* allow for an externally + * connected socket to be + * passed in */ +#define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33 /* setsockopt, essentially */ +#define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34 /* getsockopt, essentially */ +#define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35 /* setsockopt, essentially */ +#define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36 /* getsockopt, essentially */ + +#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ +#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */ + +/* #ifdef IP_MTU_DISCOVER */ +#define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ +/* #endif */ + +#define BIO_CTRL_DGRAM_QUERY_MTU 40 /* as kernel for current MTU */ +#define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +#define BIO_CTRL_DGRAM_GET_MTU 41 /* get cached value for MTU */ +#define BIO_CTRL_DGRAM_SET_MTU 42 /* set cached value for + * MTU. want to use this + * if asking the kernel + * fails */ + +#define BIO_CTRL_DGRAM_MTU_EXCEEDED 43 /* check whether the MTU + * was exceed in the + * previous write + * operation */ + +#define BIO_CTRL_DGRAM_GET_PEER 46 +#define BIO_CTRL_DGRAM_SET_PEER 44 /* Destination for the data */ + +#define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45 /* Next DTLS handshake timeout to + * adjust socket timeouts */ + + +/* modifiers */ +#define BIO_FP_READ 0x02 +#define BIO_FP_WRITE 0x04 +#define BIO_FP_APPEND 0x08 +#define BIO_FP_TEXT 0x10 + +#define BIO_FLAGS_READ 0x01 +#define BIO_FLAGS_WRITE 0x02 +#define BIO_FLAGS_IO_SPECIAL 0x04 +#define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) +#define BIO_FLAGS_SHOULD_RETRY 0x08 + +/* Used in BIO_gethostbyname() */ +#define BIO_GHBN_CTRL_HITS 1 +#define BIO_GHBN_CTRL_MISSES 2 +#define BIO_GHBN_CTRL_CACHE_SIZE 3 +#define BIO_GHBN_CTRL_GET_ENTRY 4 +#define BIO_GHBN_CTRL_FLUSH 5 + +/* Mostly used in the SSL BIO */ +/* Not used anymore + * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10 + * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20 + * #define BIO_FLAGS_PROTOCOL_STARTUP 0x40 + */ + +#define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* This is used with memory BIOs: it means we shouldn't free up or change the + * data in any way. + */ +#define BIO_FLAGS_MEM_RDONLY 0x200 + +typedef struct bio_st BIO; + +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +#define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +#define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) +#define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY)) +#define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +#define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) +#define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +#define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +#define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +#define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +#define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +#define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* The next three are used in conjunction with the + * BIO_should_io_special() condition. After this returns true, + * BIO *BIO_get_retry_BIO(BIO *bio, int *reason); will walk the BIO + * stack and return the 'reason' for the special and the offending BIO. + * Given a BIO, BIO_get_retry_reason(bio) will return the code. */ +/* Returned from the SSL bio when the certificate retrieval code had an error */ +#define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +#define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +#define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +#define BIO_CB_FREE 0x01 +#define BIO_CB_READ 0x02 +#define BIO_CB_WRITE 0x03 +#define BIO_CB_PUTS 0x04 +#define BIO_CB_GETS 0x05 +#define BIO_CB_CTRL 0x06 + +/* The callback is called before and after the underling operation, + * The BIO_CB_RETURN flag indicates if it is after the call */ +#define BIO_CB_RETURN 0x80 +#define BIO_CB_return(a) ((a)|BIO_CB_RETURN)) +#define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) +#define BIO_cb_post(a) ((a)&BIO_CB_RETURN) + +long (*BIO_get_callback(const BIO *b))(struct bio_st *, int, const char *, + int, long, long); +void BIO_set_callback(BIO *b, + long (*callback)(struct bio_st *, int, const char *, int, long, long)); +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +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 struct bio_method_st { + int type; + const char *name; + int (*bwrite)(BIO *, const char *, int); + int (*bread)(BIO *, char *, int); + int (*bputs)(BIO *, const char *); + int (*bgets)(BIO *, char *, int); + long (*ctrl)(BIO *, int, long, void *); + int (*create)(BIO *); + int (*destroy)(BIO *); + long (*callback_ctrl)(BIO *, int, bio_info_cb *); +} BIO_METHOD; + +struct bio_st { + BIO_METHOD *method; + /* bio, mode, argp, argi, argl, ret */ + long (*callback)(struct bio_st *, int, const char *, int, long, long); + char *cb_arg; /* first argument for the callback */ + + int init; + int shutdown; + int flags; /* extra storage */ + int retry_reason; + int num; + void *ptr; + struct bio_st *next_bio; /* used by filter BIOs */ + struct bio_st *prev_bio; /* used by filter BIOs */ + int references; + unsigned long num_read; + unsigned long num_write; + + CRYPTO_EX_DATA ex_data; +}; + +DECLARE_STACK_OF(BIO) + +typedef struct bio_f_buffer_ctx_struct { + /* Buffers are setup like this: + * + * <---------------------- size -----------------------> + * +---------------------------------------------------+ + * | consumed | remaining | free space | + * +---------------------------------------------------+ + * <-- off --><------- len -------> + */ + + /* BIO *bio; */ /* this is now in the BIO struct */ + int ibuf_size; /* how big is the input buffer */ + int obuf_size; /* how big is the output buffer */ + + char *ibuf; /* the char array */ + int ibuf_len; /* how many bytes are in it */ + int ibuf_off; /* write/read offset */ + + char *obuf; /* the char array */ + int obuf_len; /* how many bytes are in it */ + int obuf_off; /* write/read offset */ +} BIO_F_BUFFER_CTX; + +/* Prefix and suffix callback in ASN1 BIO */ +typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, void *parg); + + +/* connect BIO stuff */ +#define BIO_CONN_S_BEFORE 1 +#define BIO_CONN_S_GET_IP 2 +#define BIO_CONN_S_GET_PORT 3 +#define BIO_CONN_S_CREATE_SOCKET 4 +#define BIO_CONN_S_CONNECT 5 +#define BIO_CONN_S_OK 6 +#define BIO_CONN_S_BLOCKED_CONNECT 7 +#define BIO_CONN_S_NBIO 8 +/*#define BIO_CONN_get_param_hostname BIO_ctrl */ + +#define BIO_C_SET_CONNECT 100 +#define BIO_C_DO_STATE_MACHINE 101 +#define BIO_C_SET_NBIO 102 +#define BIO_C_SET_PROXY_PARAM 103 +#define BIO_C_SET_FD 104 +#define BIO_C_GET_FD 105 +#define BIO_C_SET_FILE_PTR 106 +#define BIO_C_GET_FILE_PTR 107 +#define BIO_C_SET_FILENAME 108 +#define BIO_C_SET_SSL 109 +#define BIO_C_GET_SSL 110 +#define BIO_C_SET_MD 111 +#define BIO_C_GET_MD 112 +#define BIO_C_GET_CIPHER_STATUS 113 +#define BIO_C_SET_BUF_MEM 114 +#define BIO_C_GET_BUF_MEM_PTR 115 +#define BIO_C_GET_BUFF_NUM_LINES 116 +#define BIO_C_SET_BUFF_SIZE 117 +#define BIO_C_SET_ACCEPT 118 +#define BIO_C_SSL_MODE 119 +#define BIO_C_GET_MD_CTX 120 +#define BIO_C_GET_PROXY_PARAM 121 +#define BIO_C_SET_BUFF_READ_DATA 122 /* data to read first */ +#define BIO_C_GET_CONNECT 123 +#define BIO_C_GET_ACCEPT 124 +#define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +#define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +#define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 +#define BIO_C_FILE_SEEK 128 +#define BIO_C_GET_CIPHER_CTX 129 +#define BIO_C_SET_BUF_MEM_EOF_RETURN 130/*return end of input value*/ +#define BIO_C_SET_BIND_MODE 131 +#define BIO_C_GET_BIND_MODE 132 +#define BIO_C_FILE_TELL 133 +#define BIO_C_GET_SOCKS 134 +#define BIO_C_SET_SOCKS 135 + +#define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ +#define BIO_C_GET_WRITE_BUF_SIZE 137 +#define BIO_C_MAKE_BIO_PAIR 138 +#define BIO_C_DESTROY_BIO_PAIR 139 +#define BIO_C_GET_WRITE_GUARANTEE 140 +#define BIO_C_GET_READ_REQUEST 141 +#define BIO_C_SHUTDOWN_WR 142 +#define BIO_C_NREAD0 143 +#define BIO_C_NREAD 144 +#define BIO_C_NWRITE0 145 +#define BIO_C_NWRITE 146 +#define BIO_C_RESET_READ_REQUEST 147 +#define BIO_C_SET_MD_CTX 148 + +#define BIO_C_SET_PREFIX 149 +#define BIO_C_GET_PREFIX 150 +#define BIO_C_SET_SUFFIX 151 +#define BIO_C_GET_SUFFIX 152 + +#define BIO_C_SET_EX_ARG 153 +#define BIO_C_GET_EX_ARG 154 + +#define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) +#define BIO_get_app_data(s) BIO_get_ex_data(s,0) + +/* BIO_s_connect() and BIO_s_socks4a_connect() */ +#define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) +#define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) +#define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) +#define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) +#define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) +#define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) +#define BIO_get_conn_ip(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2) +#define BIO_get_conn_int_port(b) BIO_int_ctrl(b,BIO_C_GET_CONNECT,3,0) + + +#define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) + +/* BIO_s_accept_socket() */ +#define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name) +#define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +#define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?(void *)"a":NULL) +#define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) + +#define BIO_BIND_NORMAL 0 +#define BIO_BIND_REUSEADDR_IF_UNUSED 1 +#define BIO_BIND_REUSEADDR 2 +#define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) +#define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) + +#define BIO_do_connect(b) BIO_do_handshake(b) +#define BIO_do_accept(b) BIO_do_handshake(b) +#define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) + +/* BIO_s_proxy_client() */ +#define BIO_set_url(b,url) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,(char *)(url)) +#define BIO_set_proxies(b,p) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,1,(char *)(p)) +/* BIO_set_nbio(b,n) */ +#define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) +/* BIO *BIO_get_filter_bio(BIO *bio); */ +#define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)())) +#define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) +#define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) + +#define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp) +#define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p)) +#define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url)) +#define BIO_get_no_connect_return(b) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL) + +#define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) +#define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c) + +#define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) +#define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp) + +#define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL) +#define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL) + +/* name is cast to lose const, but might be better to route through a function + so we can do it safely */ +#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ,(char *)name) +#define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_WRITE,name) +#define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_APPEND,name) +#define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name) + +/* WARNING WARNING, this ups the reference count on the read bio of the + * SSL structure. This is because the ssl read BIO is now pointed to by + * the next_bio field in the bio. So when you free the BIO, make sure + * you are doing a BIO_free_all() to catch the underlying BIO. */ +#define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl) +#define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp) +#define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) +#define BIO_set_ssl_renegotiate_bytes(b,num) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL); +#define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL); +#define BIO_set_ssl_renegotiate_timeout(b,seconds) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL); + +/* defined in evp.h */ +/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ + +#define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp) +#define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm) +#define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp) +#define BIO_set_mem_eof_return(b,v) \ + BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL) + +/* For the BIO_f_buffer() type */ +#define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) +#define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) +#define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) +#define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) +#define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) + +/* Don't use the next one unless you know what you are doing :-) */ +#define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) + +#define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) +#define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) +#define BIO_set_close(b,c) (int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL) +#define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) +#define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) +#define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +#define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) +#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ + cbp) +#define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) + +/* For the BIO_f_buffer() type */ +#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) + +/* For BIO_s_bio() */ +#define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) +#define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) +#define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) +#define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) +#define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +#define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) +#define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +#define BIO_ctrl_dgram_connect(b,peer) \ + (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)peer) +#define BIO_ctrl_set_connected(b, state, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, state, (char *)peer) +#define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +#define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +#define BIO_dgram_get_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)peer) +#define BIO_dgram_set_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)peer) + +/* These two aren't currently implemented */ +/* int BIO_get_ex_num(BIO *bio); */ +/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */ +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(BIO *bio, int idx); +int +BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, +CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +unsigned long BIO_number_read(BIO *bio); +unsigned long BIO_number_written(BIO *bio); + +/* For BIO_f_asn1() */ +int +BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, +asn1_ps_func *prefix_free); +int +BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, +asn1_ps_func **pprefix_free); +int +BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, +asn1_ps_func *suffix_free); +int +BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, +asn1_ps_func **psuffix_free); + +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); +# define BIO_s_file_internal BIO_s_file +BIO * BIO_new(BIO_METHOD *type); +int BIO_set(BIO *a, BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_vfree(BIO *a); +int BIO_read(BIO *b, void *data, int len) + __attribute__((__bounded__(__buffer__,2,3))); +int BIO_gets(BIO *bp, char *buf, int size) + __attribute__((__bounded__ (__string__,2,3))); +int BIO_write(BIO *b, const void *data, int len) + __attribute__((__bounded__(__buffer__,2,3))); +int BIO_puts(BIO *bp, const char *buf); +int BIO_indent(BIO *b, int indent, int max); +long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, + void (*fp)(struct bio_st *, int, const char *, int, long, long)); +char * BIO_ptr_ctrl(BIO *bp, int cmd, long larg); +long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); +BIO * BIO_push(BIO *b, BIO *append); +BIO * BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO * BIO_find_type(BIO *b, int bio_type); +BIO * BIO_next(BIO *b); +BIO * BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +BIO * BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +long BIO_debug_callback(BIO *bio, int cmd, const char *argp, int argi, + long argl, long ret); + +BIO_METHOD *BIO_s_mem(void); +BIO *BIO_new_mem_buf(void *buf, int len); +BIO_METHOD *BIO_s_socket(void); +BIO_METHOD *BIO_s_connect(void); +BIO_METHOD *BIO_s_accept(void); +BIO_METHOD *BIO_s_fd(void); +BIO_METHOD *BIO_s_log(void); +BIO_METHOD *BIO_s_bio(void); +BIO_METHOD *BIO_s_null(void); +BIO_METHOD *BIO_f_null(void); +BIO_METHOD *BIO_f_buffer(void); +BIO_METHOD *BIO_f_nbio_test(void); +#ifndef OPENSSL_NO_DGRAM +BIO_METHOD *BIO_s_datagram(void); +#endif + +/* BIO_METHOD *BIO_f_ber(void); */ + +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int _error); +int BIO_dgram_non_fatal_error(int _error); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int _error); +int +BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), +void *u, const char *s, int len); +int +BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), +void *u, const char *s, int len, int indent); +int BIO_dump(BIO *b, const char *bytes, int len); +int BIO_dump_indent(BIO *b, const char *bytes, int len, int indent); +int BIO_dump_fp(FILE *fp, const char *s, int len); +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); +struct hostent *BIO_gethostbyname(const char *name); +/* We might want a thread-safe interface too: + * struct hostent *BIO_gethostbyname_r(const char *name, + * struct hostent *result, void *buffer, size_t buflen); + * or something similar (caller allocates a struct hostent, + * pointed to by "result", and additional buffer space for the various + * substructures; if the buffer does not suffice, NULL is returned + * and an appropriate error code is set). + */ +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd, int mode); +int BIO_get_port(const char *str, unsigned short *port_ptr); +int BIO_get_host_ip(const char *str, unsigned char *ip); +int BIO_get_accept_socket(char *host_port, int mode); +int BIO_accept(int sock, char **ip_port); +int BIO_sock_init(void ); +void BIO_sock_cleanup(void); +int BIO_set_tcp_ndelay(int sock, int turn_on); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_dgram(int fd, int close_flag); +BIO *BIO_new_fd(int fd, int close_flag); +BIO *BIO_new_connect(char *host_port); +BIO *BIO_new_accept(char *host_port); + +int +BIO_new_bio_pair(BIO **bio1, size_t writebuf1, +BIO **bio2, size_t writebuf2); +/* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. + * Size 0 uses default value. + */ + +void BIO_copy_next_retry(BIO *b); + +/*long BIO_ghbn_ctrl(int cmd,int iarg,char *parg);*/ + +#ifdef __MINGW_PRINTF_FORMAT +int +BIO_printf(BIO *bio, const char *format, ...) + __attribute__((__format__(__MINGW_PRINTF_FORMAT, 2, 3), __nonnull__(2))); +int +BIO_vprintf(BIO *bio, const char *format, va_list args) + __attribute__((__format__(__MINGW_PRINTF_FORMAT, 2, 0), __nonnull__(2))); +int +BIO_snprintf(char *buf, size_t n, const char *format, ...) + __attribute__((__deprecated__, __format__(__MINGW_PRINTF_FORMAT, 3, 4), + __nonnull__(3))); +int +BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) + __attribute__((__deprecated__, __format__(__MINGW_PRINTF_FORMAT, 3, 0), + __nonnull__(3))); +#else +int +BIO_printf(BIO *bio, const char *format, ...) + __attribute__((__format__(__printf__, 2, 3), __nonnull__(2))); +int +BIO_vprintf(BIO *bio, const char *format, va_list args) + __attribute__((__format__(__printf__, 2, 0), __nonnull__(2))); +int +BIO_snprintf(char *buf, size_t n, const char *format, ...) + __attribute__((__deprecated__, __format__(__printf__, 3, 4), + __nonnull__(3))); +int +BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) + __attribute__((__deprecated__, __format__(__printf__, 3, 0), + __nonnull__(3))); +#endif + + +/* 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. + */ +void ERR_load_BIO_strings(void); + +/* Error codes for the BIO functions. */ + +/* Function codes. */ +#define BIO_F_ACPT_STATE 100 +#define BIO_F_BIO_ACCEPT 101 +#define BIO_F_BIO_BER_GET_HEADER 102 +#define BIO_F_BIO_CALLBACK_CTRL 131 +#define BIO_F_BIO_CTRL 103 +#define BIO_F_BIO_GETHOSTBYNAME 120 +#define BIO_F_BIO_GETS 104 +#define BIO_F_BIO_GET_ACCEPT_SOCKET 105 +#define BIO_F_BIO_GET_HOST_IP 106 +#define BIO_F_BIO_GET_PORT 107 +#define BIO_F_BIO_MAKE_PAIR 121 +#define BIO_F_BIO_NEW 108 +#define BIO_F_BIO_NEW_FILE 109 +#define BIO_F_BIO_NEW_MEM_BUF 126 +#define BIO_F_BIO_NREAD 123 +#define BIO_F_BIO_NREAD0 124 +#define BIO_F_BIO_NWRITE 125 +#define BIO_F_BIO_NWRITE0 122 +#define BIO_F_BIO_PUTS 110 +#define BIO_F_BIO_READ 111 +#define BIO_F_BIO_SOCK_INIT 112 +#define BIO_F_BIO_WRITE 113 +#define BIO_F_BUFFER_CTRL 114 +#define BIO_F_CONN_CTRL 127 +#define BIO_F_CONN_STATE 115 +#define BIO_F_DGRAM_SCTP_READ 132 +#define BIO_F_FILE_CTRL 116 +#define BIO_F_FILE_READ 130 +#define BIO_F_LINEBUFFER_CTRL 129 +#define BIO_F_MEM_READ 128 +#define BIO_F_MEM_WRITE 117 +#define BIO_F_SSL_NEW 118 +#define BIO_F_WSASTARTUP 119 + +/* Reason codes. */ +#define BIO_R_ACCEPT_ERROR 100 +#define BIO_R_BAD_FOPEN_MODE 101 +#define BIO_R_BAD_HOSTNAME_LOOKUP 102 +#define BIO_R_BROKEN_PIPE 124 +#define BIO_R_CONNECT_ERROR 103 +#define BIO_R_EOF_ON_MEMORY_BIO 127 +#define BIO_R_ERROR_SETTING_NBIO 104 +#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 +#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 +#define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 +#define BIO_R_INVALID_ARGUMENT 125 +#define BIO_R_INVALID_IP_ADDRESS 108 +#define BIO_R_INVALID_PORT_NUMBER 129 +#define BIO_R_IN_USE 123 +#define BIO_R_KEEPALIVE 109 +#define BIO_R_NBIO_CONNECT_ERROR 110 +#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 +#define BIO_R_NO_HOSTNAME_SPECIFIED 112 +#define BIO_R_NO_PORT_DEFINED 113 +#define BIO_R_NO_PORT_SPECIFIED 114 +#define BIO_R_NO_SUCH_FILE 128 +#define BIO_R_NULL_PARAMETER 115 +#define BIO_R_TAG_MISMATCH 116 +#define BIO_R_UNABLE_TO_BIND_SOCKET 117 +#define BIO_R_UNABLE_TO_CREATE_SOCKET 118 +#define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 +#define BIO_R_UNINITIALIZED 120 +#define BIO_R_UNSUPPORTED_METHOD 121 +#define BIO_R_WRITE_TO_READ_ONLY_BIO 126 +#define BIO_R_WSASTARTUP 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/blowfish.h b/src/3rdparty/win32_include/openssl/blowfish.h new file mode 100644 index 000000000..4d2db8055 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/blowfish.h @@ -0,0 +1,112 @@ +/* $OpenBSD: blowfish.h,v 1.14 2014/07/10 09:01:04 miod Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BLOWFISH_H +#define HEADER_BLOWFISH_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_BF +#error BF is disabled. +#endif + +#define BF_ENCRYPT 1 +#define BF_DECRYPT 0 + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! BF_LONG has to be at least 32 bits wide. If it's wider, then ! + * ! BF_LONG_LOG2 has to be defined along. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#define BF_LONG unsigned int + +#define BF_ROUNDS 16 +#define BF_BLOCK 8 + +typedef struct bf_key_st + { + BF_LONG P[BF_ROUNDS+2]; + BF_LONG S[4*256]; + } BF_KEY; + +void BF_set_key(BF_KEY *key, int len, const unsigned char *data); + +void BF_encrypt(BF_LONG *data,const BF_KEY *key); +void BF_decrypt(BF_LONG *data,const BF_KEY *key); + +void BF_ecb_encrypt(const unsigned char *in, unsigned char *out, + const BF_KEY *key, int enc); +void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int enc); +void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int *num, int enc); +void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, long length, + const BF_KEY *schedule, unsigned char *ivec, int *num); +const char *BF_options(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/bn.h b/src/3rdparty/win32_include/openssl/bn.h new file mode 100644 index 000000000..0dde08a36 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/bn.h @@ -0,0 +1,714 @@ +/* $OpenBSD: bn.h,v 1.36 2017/01/25 06:15:44 beck Exp $ */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the Eric Young open source + * license provided above. + * + * The binary polynomial arithmetic software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_BN_H +#define HEADER_BN_H + +#include +#include + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These preprocessor symbols control various aspects of the bignum headers and + * library code. They're not defined by any "normal" configuration, as they are + * intended for development and testing purposes. NB: defining all three can be + * useful for debugging application code as well as openssl itself. + * + * BN_DEBUG - turn on various debugging alterations to the bignum code + * BN_DEBUG_RAND - uses random poisoning of unused words to trip up + * mismanagement of bignum internals. You must also define BN_DEBUG. + */ +/* #define BN_DEBUG */ +/* #define BN_DEBUG_RAND */ + +#ifndef OPENSSL_SMALL_FOOTPRINT +#define BN_MUL_COMBA +#define BN_SQR_COMBA +#define BN_RECURSION +#endif + +/* This next option uses the C libraries (2 word)/(1 word) function. + * If it is not defined, I use my C version (which is slower). + * The reason for this flag is that when the particular C compiler + * library routine is used, and the library is linked with a different + * compiler, the library is missing. This mostly happens when the + * library is built with gcc and then linked using normal cc. This would + * be a common occurrence because gcc normally produces code that is + * 2 times faster than system compilers for the big number stuff. + * For machines with only one compiler (or shared libraries), this should + * be on. Again this in only really a problem on machines + * using "long long's", are 32bit, and are not using my assembler code. */ +/* #define BN_DIV2W */ + +#ifdef _LP64 +#undef BN_LLONG +#define BN_ULONG unsigned long +#define BN_LONG long +#define BN_BITS 128 +#define BN_BYTES 8 +#define BN_BITS2 64 +#define BN_BITS4 32 +#define BN_MASK2 (0xffffffffffffffffL) +#define BN_MASK2l (0xffffffffL) +#define BN_MASK2h (0xffffffff00000000L) +#define BN_MASK2h1 (0xffffffff80000000L) +#define BN_TBIT (0x8000000000000000L) +#define BN_DEC_CONV (10000000000000000000UL) +#define BN_DEC_FMT1 "%lu" +#define BN_DEC_FMT2 "%019lu" +#define BN_DEC_NUM 19 +#define BN_HEX_FMT1 "%lX" +#define BN_HEX_FMT2 "%016lX" +#else +#define BN_ULLONG unsigned long long +#define BN_LLONG +#define BN_ULONG unsigned int +#define BN_LONG int +#define BN_BITS 64 +#define BN_BYTES 4 +#define BN_BITS2 32 +#define BN_BITS4 16 +#define BN_MASK (0xffffffffffffffffLL) +#define BN_MASK2 (0xffffffffL) +#define BN_MASK2l (0xffff) +#define BN_MASK2h1 (0xffff8000L) +#define BN_MASK2h (0xffff0000L) +#define BN_TBIT (0x80000000L) +#define BN_DEC_CONV (1000000000L) +#define BN_DEC_FMT1 "%u" +#define BN_DEC_FMT2 "%09u" +#define BN_DEC_NUM 9 +#define BN_HEX_FMT1 "%X" +#define BN_HEX_FMT2 "%08X" +#endif + +#define BN_FLG_MALLOCED 0x01 +#define BN_FLG_STATIC_DATA 0x02 +#define BN_FLG_CONSTTIME 0x04 /* avoid leaking exponent information through timing, + * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, + * BN_div() will call BN_div_no_branch, + * BN_mod_inverse() will call BN_mod_inverse_no_branch. + */ + +#ifndef OPENSSL_NO_DEPRECATED +#define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME /* deprecated name for the flag */ + /* avoid leaking exponent information through timings + * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) */ +#endif + +#ifndef OPENSSL_NO_DEPRECATED +#define BN_FLG_FREE 0x8000 /* used for debuging */ +#endif +#define BN_set_flags(b,n) ((b)->flags|=(n)) +#define BN_get_flags(b,n) ((b)->flags&(n)) + +/* get a clone of a BIGNUM with changed flags, for *temporary* use only + * (the two BIGNUMs cannot not be used in parallel!) */ +#define BN_with_flags(dest,b,n) ((dest)->d=(b)->d, \ + (dest)->top=(b)->top, \ + (dest)->dmax=(b)->dmax, \ + (dest)->neg=(b)->neg, \ + (dest)->flags=(((dest)->flags & BN_FLG_MALLOCED) \ + | ((b)->flags & ~BN_FLG_MALLOCED) \ + | BN_FLG_STATIC_DATA \ + | (n))) + +struct bignum_st { + BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */ + int top; /* Index of last used d +1. */ + /* The next are internal book keeping for bn_expand. */ + int dmax; /* Size of the d array. */ + int neg; /* one if the number is negative */ + int flags; +}; + +/* Used for montgomery multiplication */ +struct bn_mont_ctx_st { + int ri; /* number of bits in R */ + BIGNUM RR; /* used to convert to montgomery form */ + BIGNUM N; /* The modulus */ + BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 + * (Ni is only stored for bignum algorithm) */ + BN_ULONG n0[2];/* least significant word(s) of Ni; + (type changed with 0.9.9, was "BN_ULONG n0;" before) */ + int flags; +}; + +/* Used for reciprocal division/mod functions + * It cannot be shared between threads + */ +struct bn_recp_ctx_st { + BIGNUM N; /* the divisor */ + BIGNUM Nr; /* the reciprocal */ + int num_bits; + int shift; + int flags; +}; + +/* Used for slow "generation" functions. */ +struct bn_gencb_st { + unsigned int ver; /* To handle binary (in)compatibility */ + void *arg; /* callback-specific data */ + union { + /* if(ver==1) - handles old style callbacks */ + void (*cb_1)(int, int, void *); + /* if(ver==2) - new callback style */ + int (*cb_2)(int, int, 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 */ +#define BN_GENCB_set_old(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 1; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_1 = (callback); } +/* Macro to populate a BN_GENCB structure with a "new"-style callback */ +#define BN_GENCB_set(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 2; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_2 = (callback); } + +#define BN_prime_checks 0 /* default: select number of iterations + based on the size of the number */ + +/* number of Miller-Rabin iterations for an error rate of less than 2^-80 + * for random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook + * of Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; + * original paper: Damgaard, Landrock, Pomerance: Average case error estimates + * for the strong probable prime test. -- Math. Comp. 61 (1993) 177-194) */ +#define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \ + (b) >= 850 ? 3 : \ + (b) >= 650 ? 4 : \ + (b) >= 550 ? 5 : \ + (b) >= 450 ? 6 : \ + (b) >= 400 ? 7 : \ + (b) >= 350 ? 8 : \ + (b) >= 300 ? 9 : \ + (b) >= 250 ? 12 : \ + (b) >= 200 ? 15 : \ + (b) >= 150 ? 18 : \ + /* b >= 100 */ 27) + +#define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) + +/* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ +#define BN_abs_is_word(a,w) ((((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w))) || \ + (((w) == 0) && ((a)->top == 0))) +#define BN_is_zero(a) ((a)->top == 0) +#define BN_is_one(a) (BN_abs_is_word((a),1) && !(a)->neg) +#define BN_is_word(a,w) (BN_abs_is_word((a),(w)) && (!(w) || !(a)->neg)) +#define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1)) + +#define BN_one(a) (BN_set_word((a),1)) +#define BN_zero_ex(a) \ + do { \ + BIGNUM *_tmp_bn = (a); \ + _tmp_bn->top = 0; \ + _tmp_bn->neg = 0; \ + } while(0) + +#ifdef OPENSSL_NO_DEPRECATED +#define BN_zero(a) BN_zero_ex(a) +#else +#define BN_zero(a) (BN_set_word((a),0)) +#endif + +const BIGNUM *BN_value_one(void); +char * BN_options(void); +BN_CTX *BN_CTX_new(void); +#ifndef OPENSSL_NO_DEPRECATED +void BN_CTX_init(BN_CTX *c); +#endif +void BN_CTX_free(BN_CTX *c); +void BN_CTX_start(BN_CTX *ctx); +BIGNUM *BN_CTX_get(BN_CTX *ctx); +void BN_CTX_end(BN_CTX *ctx); +int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_num_bits(const BIGNUM *a); +int BN_num_bits_word(BN_ULONG); +BIGNUM *BN_new(void); +void BN_init(BIGNUM *); +void BN_clear_free(BIGNUM *a); +BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); +void BN_swap(BIGNUM *a, BIGNUM *b); +BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2bin(const BIGNUM *a, unsigned char *to); +BIGNUM *BN_mpi2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2mpi(const BIGNUM *a, unsigned char *to); +int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); +/** BN_set_negative sets sign of a BIGNUM + * \param b pointer to the BIGNUM object + * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise + */ +void BN_set_negative(BIGNUM *b, int n); +/** BN_is_negative returns 1 if the BIGNUM is negative + * \param a pointer to the BIGNUM object + * \return 1 if a < 0 and 0 otherwise + */ +#define BN_is_negative(a) ((a)->neg != 0) + +#ifndef LIBRESSL_INTERNAL +int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, + BN_CTX *ctx); +#define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx)) +#endif +int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); +int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m); +int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m); +int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); +int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); + +BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); +BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); +int BN_mul_word(BIGNUM *a, BN_ULONG w); +int BN_add_word(BIGNUM *a, BN_ULONG w); +int BN_sub_word(BIGNUM *a, BN_ULONG w); +int BN_set_word(BIGNUM *a, BN_ULONG w); +BN_ULONG BN_get_word(const BIGNUM *a); + +int BN_cmp(const BIGNUM *a, const BIGNUM *b); +void BN_free(BIGNUM *a); +int BN_is_bit_set(const BIGNUM *a, int n); +int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_lshift1(BIGNUM *r, const BIGNUM *a); +int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +#ifndef LIBRESSL_INTERNAL +int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +#endif +int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont); +int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, + const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, + BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); + +int BN_mask_bits(BIGNUM *a, int n); +int BN_print_fp(FILE *fp, const BIGNUM *a); +int BN_print(BIO *fp, const BIGNUM *a); +int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); +int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_rshift1(BIGNUM *r, const BIGNUM *a); +void BN_clear(BIGNUM *a); +BIGNUM *BN_dup(const BIGNUM *a); +int BN_ucmp(const BIGNUM *a, const BIGNUM *b); +int BN_set_bit(BIGNUM *a, int n); +int BN_clear_bit(BIGNUM *a, int n); +char * BN_bn2hex(const BIGNUM *a); +char * BN_bn2dec(const BIGNUM *a); +int BN_hex2bn(BIGNUM **a, const char *str); +int BN_dec2bn(BIGNUM **a, const char *str); +int BN_asc2bn(BIGNUM **a, const char *str); +#ifndef LIBRESSL_INTERNAL +int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +#endif +int BN_kronecker(const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx); /* returns -2 for error */ +#ifndef LIBRESSL_INTERNAL +BIGNUM *BN_mod_inverse(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); +#endif +BIGNUM *BN_mod_sqrt(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); + +void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords); + +/* Deprecated versions */ +#ifndef OPENSSL_NO_DEPRECATED +BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, + const BIGNUM *add, const BIGNUM *rem, + void (*callback)(int, int, void *), void *cb_arg); +int BN_is_prime(const BIGNUM *p, int nchecks, + void (*callback)(int, int, void *), + BN_CTX *ctx, void *cb_arg); +int BN_is_prime_fasttest(const BIGNUM *p, int nchecks, + void (*callback)(int, int, void *), BN_CTX *ctx, void *cb_arg, + int do_trial_division); +#endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* Newer versions */ +int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, + const BIGNUM *rem, BN_GENCB *cb); +int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); +int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, + int do_trial_division, BN_GENCB *cb); + +int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); + +int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, + const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2, + const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb); +int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, + BIGNUM *Xp1, BIGNUM *Xp2, + const BIGNUM *Xp, + const BIGNUM *e, BN_CTX *ctx, + BN_GENCB *cb); + +BN_MONT_CTX *BN_MONT_CTX_new(void ); +void BN_MONT_CTX_init(BN_MONT_CTX *ctx); +int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +#define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\ + (r),(a),&((mont)->RR),(mont),(ctx)) +int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, + BN_MONT_CTX *mont, BN_CTX *ctx); +void BN_MONT_CTX_free(BN_MONT_CTX *mont); +int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx); +BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from); +BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock, + const BIGNUM *mod, BN_CTX *ctx); + +/* BN_BLINDING flags */ +#define BN_BLINDING_NO_UPDATE 0x00000001 +#define BN_BLINDING_NO_RECREATE 0x00000002 + +BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod); +void BN_BLINDING_free(BN_BLINDING *b); +int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); +int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, BN_CTX *); +#ifndef OPENSSL_NO_DEPRECATED +unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *); +void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long); +#endif +CRYPTO_THREADID *BN_BLINDING_thread_id(BN_BLINDING *); +unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); +void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); +BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, + const BIGNUM *e, BIGNUM *m, BN_CTX *ctx, + int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx), + BN_MONT_CTX *m_ctx); + +#ifndef OPENSSL_NO_DEPRECATED +void BN_set_params(int mul, int high, int low, int mont); +int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */ +#endif + +void BN_RECP_CTX_init(BN_RECP_CTX *recp); +BN_RECP_CTX *BN_RECP_CTX_new(void); +void BN_RECP_CTX_free(BN_RECP_CTX *recp); +int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); +int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp, BN_CTX *ctx); +int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + BN_RECP_CTX *recp, BN_CTX *ctx); + +#ifndef OPENSSL_NO_EC2M + +/* Functions for arithmetic over binary polynomials represented by BIGNUMs. + * + * The BIGNUM::neg property of BIGNUMs representing binary polynomials is + * ignored. + * + * Note that input arguments are not const so that their bit arrays can + * be expanded to the appropriate size if needed. + */ + +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); /*r = a + b*/ +#define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); /*r=a mod p*/ +int +BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); /* r = (a * b) mod p */ +int +BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r = (a * a) mod p */ +int +BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, + BN_CTX *ctx); /* r = (1 / b) mod p */ +int +BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); /* r = (a / b) mod p */ +int +BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); /* r = (a ^ b) mod p */ +int +BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r = sqrt(a) mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); /* r^2 + r = a mod p */ +#define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) +/* Some functions allow for representation of the irreducible polynomials + * as an unsigned int[], say p. The irreducible f(t) is then of the form: + * t^p[0] + t^p[1] + ... + t^p[k] + * where m = p[0] > p[1] > ... > p[k] = 0. + */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); +/* r = a mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); /* r = (a * b) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], + BN_CTX *ctx); /* r = (a * a) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], + BN_CTX *ctx); /* r = (1 / b) mod p */ +int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); /* r = (a / b) mod p */ +int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); /* r = (a ^ b) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); /* r^2 + r = a mod p */ +int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); +int BN_GF2m_arr2poly(const int p[], BIGNUM *a); + +#endif + +/* faster mod functions for the 'NIST primes' + * 0 <= a < p^2 */ +int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +const BIGNUM *BN_get0_nist_prime_192(void); +const BIGNUM *BN_get0_nist_prime_224(void); +const BIGNUM *BN_get0_nist_prime_256(void); +const BIGNUM *BN_get0_nist_prime_384(void); +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); + +/* Primes from RFC 3526 */ +BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn); +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); + +/* 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. + */ +void ERR_load_BN_strings(void); + +/* Error codes for the BN functions. */ + +/* Function codes. */ +#define BN_F_BNRAND 127 +#define BN_F_BN_BLINDING_CONVERT_EX 100 +#define BN_F_BN_BLINDING_CREATE_PARAM 128 +#define BN_F_BN_BLINDING_INVERT_EX 101 +#define BN_F_BN_BLINDING_NEW 102 +#define BN_F_BN_BLINDING_UPDATE 103 +#define BN_F_BN_BN2DEC 104 +#define BN_F_BN_BN2HEX 105 +#define BN_F_BN_CTX_GET 116 +#define BN_F_BN_CTX_NEW 106 +#define BN_F_BN_CTX_START 129 +#define BN_F_BN_DIV 107 +#define BN_F_BN_DIV_NO_BRANCH 138 +#define BN_F_BN_DIV_RECP 130 +#define BN_F_BN_EXP 123 +#define BN_F_BN_EXPAND2 108 +#define BN_F_BN_GENERATE_PRIME_EX 140 +#define BN_F_BN_EXPAND_INTERNAL 120 +#define BN_F_BN_GF2M_MOD 131 +#define BN_F_BN_GF2M_MOD_EXP 132 +#define BN_F_BN_GF2M_MOD_MUL 133 +#define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134 +#define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135 +#define BN_F_BN_GF2M_MOD_SQR 136 +#define BN_F_BN_GF2M_MOD_SQRT 137 +#define BN_F_BN_MOD_EXP2_MONT 118 +#define BN_F_BN_MOD_EXP_MONT 109 +#define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124 +#define BN_F_BN_MOD_EXP_MONT_WORD 117 +#define BN_F_BN_MOD_EXP_RECP 125 +#define BN_F_BN_MOD_EXP_SIMPLE 126 +#define BN_F_BN_MOD_INVERSE 110 +#define BN_F_BN_MOD_INVERSE_NO_BRANCH 139 +#define BN_F_BN_MOD_LSHIFT_QUICK 119 +#define BN_F_BN_MOD_MUL_RECIPROCAL 111 +#define BN_F_BN_MOD_SQRT 121 +#define BN_F_BN_MPI2BN 112 +#define BN_F_BN_NEW 113 +#define BN_F_BN_RAND 114 +#define BN_F_BN_RAND_RANGE 122 +#define BN_F_BN_USUB 115 + +/* Reason codes. */ +#define BN_R_ARG2_LT_ARG3 100 +#define BN_R_BAD_RECIPROCAL 101 +#define BN_R_BIGNUM_TOO_LONG 114 +#define BN_R_BITS_TOO_SMALL 117 +#define BN_R_CALLED_WITH_EVEN_MODULUS 102 +#define BN_R_DIV_BY_ZERO 103 +#define BN_R_ENCODING_ERROR 104 +#define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105 +#define BN_R_INPUT_NOT_REDUCED 110 +#define BN_R_INVALID_LENGTH 106 +#define BN_R_INVALID_RANGE 115 +#define BN_R_NOT_A_SQUARE 111 +#define BN_R_NOT_INITIALIZED 107 +#define BN_R_NO_INVERSE 108 +#define BN_R_NO_SOLUTION 116 +#define BN_R_P_IS_NOT_PRIME 112 +#define BN_R_TOO_MANY_ITERATIONS 113 +#define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/buffer.h b/src/3rdparty/win32_include/openssl/buffer.h new file mode 100644 index 000000000..ed6dac0e6 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/buffer.h @@ -0,0 +1,122 @@ +/* $OpenBSD: buffer.h,v 1.15 2015/06/24 10:05:14 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_BUFFER_H +#define HEADER_BUFFER_H +#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__OpenBSD__) +#define __bounded__(x, y, z) +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* Already declared in ossl_typ.h */ +/* typedef struct buf_mem_st BUF_MEM; */ + +struct buf_mem_st { + size_t length; /* current number of bytes */ + char *data; + size_t max; /* size of buffer */ +}; + +BUF_MEM *BUF_MEM_new(void); +void BUF_MEM_free(BUF_MEM *a); +int BUF_MEM_grow(BUF_MEM *str, size_t len); +int BUF_MEM_grow_clean(BUF_MEM *str, size_t len); + +#ifndef LIBRESSL_INTERNAL +char * BUF_strdup(const char *str); +char * BUF_strndup(const char *str, size_t siz); +void * BUF_memdup(const void *data, size_t siz); +void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); + +/* safe string functions */ +size_t BUF_strlcpy(char *dst, const char *src, size_t siz) + __attribute__ ((__bounded__(__string__,1,3))); +size_t BUF_strlcat(char *dst, const char *src, size_t siz) + __attribute__ ((__bounded__(__string__,1,3))); +#endif + +/* 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. + */ +void ERR_load_BUF_strings(void); + +/* Error codes for the BUF functions. */ + +/* Function codes. */ +#define BUF_F_BUF_MEMDUP 103 +#define BUF_F_BUF_MEM_GROW 100 +#define BUF_F_BUF_MEM_GROW_CLEAN 105 +#define BUF_F_BUF_MEM_NEW 101 +#define BUF_F_BUF_STRDUP 102 +#define BUF_F_BUF_STRNDUP 104 + +/* Reason codes. */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/camellia.h b/src/3rdparty/win32_include/openssl/camellia.h new file mode 100644 index 000000000..b9b5f792b --- /dev/null +++ b/src/3rdparty/win32_include/openssl/camellia.h @@ -0,0 +1,125 @@ +/* $OpenBSD: camellia.h,v 1.5 2014/11/13 20:01:58 miod Exp $ */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_CAMELLIA_H +#define HEADER_CAMELLIA_H + +#include + +#ifdef OPENSSL_NO_CAMELLIA +#error CAMELLIA is disabled. +#endif + +#include + +#define CAMELLIA_ENCRYPT 1 +#define CAMELLIA_DECRYPT 0 + +/* Because array size can't be a const in C, the following two are macros. + Both sizes are in bytes. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ + +#define CAMELLIA_BLOCK_SIZE 16 +#define CAMELLIA_TABLE_BYTE_LEN 272 +#define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) + +typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; /* to match with WORD */ + +struct camellia_key_st { + union { + double d; /* ensures 64-bit align */ + KEY_TABLE_TYPE rd_key; + } u; + int grand_rounds; +}; +typedef struct camellia_key_st CAMELLIA_KEY; + +int Camellia_set_key(const unsigned char *userKey, const int bits, + CAMELLIA_KEY *key); + +void Camellia_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); +void Camellia_decrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key); + +void Camellia_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key, const int enc); +void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, const int enc); +void Camellia_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Camellia_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char *ivec, int *num); +void Camellia_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char ivec[CAMELLIA_BLOCK_SIZE], + unsigned char ecount_buf[CAMELLIA_BLOCK_SIZE], + unsigned int *num); + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_Camellia_H */ diff --git a/src/3rdparty/win32_include/openssl/cast.h b/src/3rdparty/win32_include/openssl/cast.h new file mode 100644 index 000000000..1043c7f24 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/cast.h @@ -0,0 +1,104 @@ +/* $OpenBSD: cast.h,v 1.12 2014/07/10 22:45:56 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CAST_H +#define HEADER_CAST_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_CAST +#error CAST is disabled. +#endif + +#define CAST_ENCRYPT 1 +#define CAST_DECRYPT 0 + +#define CAST_LONG unsigned int + +#define CAST_BLOCK 8 +#define CAST_KEY_LENGTH 16 + +typedef struct cast_key_st + { + CAST_LONG data[32]; + int short_key; /* Use reduced rounds for short key */ + } CAST_KEY; + +void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +void CAST_ecb_encrypt(const unsigned char *in, unsigned char *out, const CAST_KEY *key, + int enc); +void CAST_encrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_decrypt(CAST_LONG *data, const CAST_KEY *key); +void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + const CAST_KEY *ks, unsigned char *iv, int enc); +void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, unsigned char *ivec, + int *num, int enc); +void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, unsigned char *ivec, + int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/chacha.h b/src/3rdparty/win32_include/openssl/chacha.h new file mode 100644 index 000000000..8d94e626f --- /dev/null +++ b/src/3rdparty/win32_include/openssl/chacha.h @@ -0,0 +1,54 @@ +/* $OpenBSD: chacha.h,v 1.7 2015/12/09 14:07:55 bcook 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. + */ + +#ifndef HEADER_CHACHA_H +#define HEADER_CHACHA_H + +#include + +#if defined(OPENSSL_NO_CHACHA) +#error ChaCha is disabled. +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned int input[16]; + unsigned char ks[64]; + unsigned char unused; +} ChaCha_ctx; + +void ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, + unsigned int keybits); +void ChaCha_set_iv(ChaCha_ctx *ctx, const unsigned char *iv, + const unsigned char *counter); +void ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, + size_t len); + +void CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, + const unsigned char key[32], const unsigned char iv[8], uint64_t counter); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_CHACHA_H */ diff --git a/src/3rdparty/win32_include/openssl/cmac.h b/src/3rdparty/win32_include/openssl/cmac.h new file mode 100644 index 000000000..cb6d64b02 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/cmac.h @@ -0,0 +1,82 @@ +/* $OpenBSD: cmac.h,v 1.3 2014/06/21 13:42:14 jsing Exp $ */ +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project. + */ +/* ==================================================================== + * Copyright (c) 2010 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + + +#ifndef HEADER_CMAC_H +#define HEADER_CMAC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Opaque */ +typedef struct CMAC_CTX_st CMAC_CTX; + +CMAC_CTX *CMAC_CTX_new(void); +void CMAC_CTX_cleanup(CMAC_CTX *ctx); +void CMAC_CTX_free(CMAC_CTX *ctx); +EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx); +int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in); + +int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen, + const EVP_CIPHER *cipher, ENGINE *impl); +int CMAC_Update(CMAC_CTX *ctx, const void *data, size_t dlen); +int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen); +int CMAC_resume(CMAC_CTX *ctx); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/comp.h b/src/3rdparty/win32_include/openssl/comp.h new file mode 100644 index 000000000..fe7397f8e --- /dev/null +++ b/src/3rdparty/win32_include/openssl/comp.h @@ -0,0 +1,73 @@ +/* $OpenBSD: comp.h,v 1.8 2014/11/03 16:58:28 tedu Exp $ */ + +#ifndef HEADER_COMP_H +#define HEADER_COMP_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct comp_ctx_st COMP_CTX; + +typedef struct comp_method_st { + int type; /* NID for compression library */ + const char *name; /* A text string to identify the library */ + int (*init)(COMP_CTX *ctx); + void (*finish)(COMP_CTX *ctx); + int (*compress)(COMP_CTX *ctx, unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + int (*expand)(COMP_CTX *ctx, unsigned char *out, unsigned int olen, + unsigned char *in, unsigned int ilen); + /* The following two do NOTHING, but are kept for backward compatibility */ + long (*ctrl)(void); + long (*callback_ctrl)(void); +} COMP_METHOD; + +struct comp_ctx_st { + COMP_METHOD *meth; + unsigned long compress_in; + unsigned long compress_out; + unsigned long expand_in; + unsigned long expand_out; + + CRYPTO_EX_DATA ex_data; +}; + + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +void COMP_CTX_free(COMP_CTX *ctx); +int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +COMP_METHOD *COMP_rle(void ); +COMP_METHOD *COMP_zlib(void ); +void COMP_zlib_cleanup(void); + +#ifdef HEADER_BIO_H +#ifdef ZLIB +BIO_METHOD *BIO_f_zlib(void); +#endif +#endif + +void ERR_load_COMP_strings(void); + +/* Error codes for the COMP functions. */ + +/* Function codes. */ +#define COMP_F_BIO_ZLIB_FLUSH 99 +#define COMP_F_BIO_ZLIB_NEW 100 +#define COMP_F_BIO_ZLIB_READ 101 +#define COMP_F_BIO_ZLIB_WRITE 102 + +/* Reason codes. */ +#define COMP_R_ZLIB_DEFLATE_ERROR 99 +#define COMP_R_ZLIB_INFLATE_ERROR 100 +#define COMP_R_ZLIB_NOT_SUPPORTED 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/conf.h b/src/3rdparty/win32_include/openssl/conf.h new file mode 100644 index 000000000..095066d31 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/conf.h @@ -0,0 +1,249 @@ +/* $OpenBSD: conf.h,v 1.14 2015/02/07 13:19:15 doug Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_H +#define HEADER_CONF_H + +#include + +#include +#include +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char *section; + char *name; + char *value; +} CONF_VALUE; + +DECLARE_STACK_OF(CONF_VALUE) +DECLARE_LHASH_OF(CONF_VALUE); + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +struct conf_method_st { + const char *name; + CONF *(*create)(CONF_METHOD *meth); + int (*init)(CONF *conf); + int (*destroy)(CONF *conf); + int (*destroy_data)(CONF *conf); + int (*load_bio)(CONF *conf, BIO *bp, long *eline); + int (*dump)(const CONF *conf, BIO *bp); + int (*is_number)(const CONF *conf, char c); + int (*to_int)(const CONF *conf, char c); + int (*load)(CONF *conf, const char *name, long *eline); +}; + +/* Module definitions */ + +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +DECLARE_STACK_OF(CONF_MODULE) +DECLARE_STACK_OF(CONF_IMODULE) + +/* DSO module function typedefs */ +typedef int conf_init_func(CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func(CONF_IMODULE *md); + +#define CONF_MFLAGS_IGNORE_ERRORS 0x1 +#define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +#define CONF_MFLAGS_SILENT 0x4 +#define CONF_MFLAGS_NO_DSO 0x8 +#define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +#define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); +LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, + long *eline); +LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, + long *eline); +LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, + const char *section); +char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +void CONF_free(LHASH_OF(CONF_VALUE) *conf); +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); + +void OPENSSL_config(const char *config_name); +void OPENSSL_no_config(void); + +/* New conf code. The semantics are different from the functions above. + If that wasn't the case, the above functions would have been replaced */ + +struct conf_st { + CONF_METHOD *meth; + void *meth_data; + LHASH_OF(CONF_VALUE) *data; +}; + +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +CONF_METHOD *NCONF_WIN32(void); +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); +int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, const char *section); +char *NCONF_get_string(const CONF *conf, const char *group, const char *name); +int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, + long *result); +int NCONF_dump_fp(const CONF *conf, FILE *out); +int NCONF_dump_bio(const CONF *conf, BIO *out); + +#define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +void CONF_modules_free(void); +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb)(const char *elem, int len, void *usr), void *arg); + +void OPENSSL_load_builtin_modules(void); + +/* 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. + */ +void ERR_load_CONF_strings(void); + +/* Error codes for the CONF functions. */ + +/* Function codes. */ +#define CONF_F_CONF_DUMP_FP 104 +#define CONF_F_CONF_LOAD 100 +#define CONF_F_CONF_LOAD_BIO 102 +#define CONF_F_CONF_LOAD_FP 103 +#define CONF_F_CONF_MODULES_LOAD 116 +#define CONF_F_CONF_PARSE_LIST 119 +#define CONF_F_DEF_LOAD 120 +#define CONF_F_DEF_LOAD_BIO 121 +#define CONF_F_MODULE_INIT 115 +#define CONF_F_MODULE_LOAD_DSO 117 +#define CONF_F_MODULE_RUN 118 +#define CONF_F_NCONF_DUMP_BIO 105 +#define CONF_F_NCONF_DUMP_FP 106 +#define CONF_F_NCONF_GET_NUMBER 107 +#define CONF_F_NCONF_GET_NUMBER_E 112 +#define CONF_F_NCONF_GET_SECTION 108 +#define CONF_F_NCONF_GET_STRING 109 +#define CONF_F_NCONF_LOAD 113 +#define CONF_F_NCONF_LOAD_BIO 110 +#define CONF_F_NCONF_LOAD_FP 114 +#define CONF_F_NCONF_NEW 111 +#define CONF_F_STR_COPY 101 + +/* Reason codes. */ +#define CONF_R_ERROR_LOADING_DSO 110 +#define CONF_R_LIST_CANNOT_BE_NULL 115 +#define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100 +#define CONF_R_MISSING_EQUAL_SIGN 101 +#define CONF_R_MISSING_FINISH_FUNCTION 111 +#define CONF_R_MISSING_INIT_FUNCTION 112 +#define CONF_R_MODULE_INITIALIZATION_ERROR 109 +#define CONF_R_NO_CLOSE_BRACE 102 +#define CONF_R_NO_CONF 105 +#define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE 106 +#define CONF_R_NO_SECTION 107 +#define CONF_R_NO_SUCH_FILE 114 +#define CONF_R_NO_VALUE 108 +#define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 +#define CONF_R_UNKNOWN_MODULE_NAME 113 +#define CONF_R_VARIABLE_HAS_NO_VALUE 104 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/conf_api.h b/src/3rdparty/win32_include/openssl/conf_api.h new file mode 100644 index 000000000..95f938622 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/conf_api.h @@ -0,0 +1,88 @@ +/* $OpenBSD: conf_api.h,v 1.4 2014/06/12 15:49:28 deraadt Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_CONF_API_H +#define HEADER_CONF_API_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Up until OpenSSL 0.9.5a, this was new_section */ +CONF_VALUE *_CONF_new_section(CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was get_section */ +CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ +STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, + const char *section); + +int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value); +char *_CONF_get_string(const CONF *conf, const char *section, + const char *name); +long _CONF_get_number(const CONF *conf, const char *section, const char *name); + +int _CONF_new_data(CONF *conf); +void _CONF_free_data(CONF *conf); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/crypto.h b/src/3rdparty/win32_include/openssl/crypto.h new file mode 100644 index 000000000..c1ee78fb2 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/crypto.h @@ -0,0 +1,540 @@ +/* $OpenBSD: crypto.h,v 1.40 2015/09/17 09:51:40 bcook Exp $ */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#include +#include +#include + +#ifndef HEADER_CRYPTO_H +#define HEADER_CRYPTO_H + +#include + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Backward compatibility to SSLeay */ +/* This is more to be used to check the correct DLL is being used + * in the MS world. */ +#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +#define SSLEAY_VERSION 0 +/* #define SSLEAY_OPTIONS 1 no longer supported */ +#define SSLEAY_CFLAGS 2 +#define SSLEAY_BUILT_ON 3 +#define SSLEAY_PLATFORM 4 +#define SSLEAY_DIR 5 + +/* A generic structure to pass assorted data in a expandable way */ +typedef struct openssl_item_st { + int code; + void *value; /* Not used for flag attributes */ + size_t value_size; /* Max size of value for output, length for input */ + size_t *value_length; /* Returned length of value for output */ +} OPENSSL_ITEM; + + +/* When changing the CRYPTO_LOCK_* list, be sure to maintain the text lock + * names in cryptlib.c + */ + +#define CRYPTO_LOCK_ERR 1 +#define CRYPTO_LOCK_EX_DATA 2 +#define CRYPTO_LOCK_X509 3 +#define CRYPTO_LOCK_X509_INFO 4 +#define CRYPTO_LOCK_X509_PKEY 5 +#define CRYPTO_LOCK_X509_CRL 6 +#define CRYPTO_LOCK_X509_REQ 7 +#define CRYPTO_LOCK_DSA 8 +#define CRYPTO_LOCK_RSA 9 +#define CRYPTO_LOCK_EVP_PKEY 10 +#define CRYPTO_LOCK_X509_STORE 11 +#define CRYPTO_LOCK_SSL_CTX 12 +#define CRYPTO_LOCK_SSL_CERT 13 +#define CRYPTO_LOCK_SSL_SESSION 14 +#define CRYPTO_LOCK_SSL_SESS_CERT 15 +#define CRYPTO_LOCK_SSL 16 +#define CRYPTO_LOCK_SSL_METHOD 17 +#define CRYPTO_LOCK_RAND 18 +#define CRYPTO_LOCK_RAND2 19 +#define CRYPTO_LOCK_MALLOC 20 +#define CRYPTO_LOCK_BIO 21 +#define CRYPTO_LOCK_GETHOSTBYNAME 22 +#define CRYPTO_LOCK_GETSERVBYNAME 23 +#define CRYPTO_LOCK_READDIR 24 +#define CRYPTO_LOCK_RSA_BLINDING 25 +#define CRYPTO_LOCK_DH 26 +#define CRYPTO_LOCK_MALLOC2 27 +#define CRYPTO_LOCK_DSO 28 +#define CRYPTO_LOCK_DYNLOCK 29 +#define CRYPTO_LOCK_ENGINE 30 +#define CRYPTO_LOCK_UI 31 +#define CRYPTO_LOCK_ECDSA 32 +#define CRYPTO_LOCK_EC 33 +#define CRYPTO_LOCK_ECDH 34 +#define CRYPTO_LOCK_BN 35 +#define CRYPTO_LOCK_EC_PRE_COMP 36 +#define CRYPTO_LOCK_STORE 37 +#define CRYPTO_LOCK_COMP 38 +#define CRYPTO_LOCK_FIPS 39 +#define CRYPTO_LOCK_FIPS2 40 +#define CRYPTO_NUM_LOCKS 41 + +#define CRYPTO_LOCK 1 +#define CRYPTO_UNLOCK 2 +#define CRYPTO_READ 4 +#define CRYPTO_WRITE 8 + +#ifndef OPENSSL_NO_LOCKING +#ifndef CRYPTO_w_lock +#define CRYPTO_w_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +#define CRYPTO_w_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) +#define CRYPTO_r_lock(type) \ + CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__) +#define CRYPTO_r_unlock(type) \ + CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__) +#define CRYPTO_add(addr,amount,type) \ + CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__) +#endif +#else +#define CRYPTO_w_lock(a) +#define CRYPTO_w_unlock(a) +#define CRYPTO_r_lock(a) +#define CRYPTO_r_unlock(a) +#define CRYPTO_add(a,b,c) ((*(a))+=(b)) +#endif + +/* Some applications as well as some parts of OpenSSL need to allocate + and deallocate locks in a dynamic fashion. The following typedef + makes this possible in a type-safe manner. */ +/* struct CRYPTO_dynlock_value has to be defined by the application. */ +typedef struct { + int references; + struct CRYPTO_dynlock_value *data; +} CRYPTO_dynlock; + + +/* The following can be used to detect memory leaks in the SSLeay library. + * It used, it turns on malloc checking */ + +#define CRYPTO_MEM_CHECK_OFF 0x0 /* an enume */ +#define CRYPTO_MEM_CHECK_ON 0x1 /* a bit */ +#define CRYPTO_MEM_CHECK_ENABLE 0x2 /* a bit */ +#define CRYPTO_MEM_CHECK_DISABLE 0x3 /* an enume */ + +/* The following are bit values to turn on or off options connected to the + * malloc checking functionality */ + +/* Adds time to the memory checking information */ +#define V_CRYPTO_MDEBUG_TIME 0x1 /* a bit */ +/* Adds thread number to the memory checking information */ +#define V_CRYPTO_MDEBUG_THREAD 0x2 /* a bit */ + +#define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD) + + +/* predec of the BIO type */ +typedef struct bio_st BIO_dummy; + +struct crypto_ex_data_st { + STACK_OF(void) *sk; +}; +DECLARE_STACK_OF(void) + +/* This stuff is basically class callback functions + * The current classes are SSL_CTX, SSL, SSL_SESSION, and a few more */ + +typedef struct crypto_ex_data_func_st { + long argl; /* Arbitary long */ + void *argp; /* Arbitary void * */ + CRYPTO_EX_new *new_func; + CRYPTO_EX_free *free_func; + CRYPTO_EX_dup *dup_func; +} CRYPTO_EX_DATA_FUNCS; + +DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) + +/* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA + * entry. + */ + +#define CRYPTO_EX_INDEX_BIO 0 +#define CRYPTO_EX_INDEX_SSL 1 +#define CRYPTO_EX_INDEX_SSL_CTX 2 +#define CRYPTO_EX_INDEX_SSL_SESSION 3 +#define CRYPTO_EX_INDEX_X509_STORE 4 +#define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +#define CRYPTO_EX_INDEX_RSA 6 +#define CRYPTO_EX_INDEX_DSA 7 +#define CRYPTO_EX_INDEX_DH 8 +#define CRYPTO_EX_INDEX_ENGINE 9 +#define CRYPTO_EX_INDEX_X509 10 +#define CRYPTO_EX_INDEX_UI 11 +#define CRYPTO_EX_INDEX_ECDSA 12 +#define CRYPTO_EX_INDEX_ECDH 13 +#define CRYPTO_EX_INDEX_COMP 14 +#define CRYPTO_EX_INDEX_STORE 15 + +/* Dynamically assigned indexes start from this value (don't use directly, use + * via CRYPTO_ex_data_new_class). */ +#define CRYPTO_EX_INDEX_USER 100 + +#define CRYPTO_malloc_init() (0) +#define CRYPTO_malloc_debug_init() (0) + +#if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD +# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */ +# define CRYPTO_MDEBUG +# endif +#endif + +int CRYPTO_mem_ctrl(int mode); +int CRYPTO_is_mem_check_on(void); + +/* for applications */ +#define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) +#define MemCheck_stop() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) + +#define OPENSSL_malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) +#define OPENSSL_strdup(str) CRYPTO_strdup((str),__FILE__,__LINE__) +#define OPENSSL_realloc(addr,num) \ + CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) +#define OPENSSL_realloc_clean(addr,old_num,num) \ + CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__) +#define OPENSSL_remalloc(addr,num) \ + CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__) +#define OPENSSL_freeFunc CRYPTO_free +#define OPENSSL_free(addr) CRYPTO_free(addr) + +#define OPENSSL_malloc_locked(num) \ + CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) +#define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr) + + +const char *SSLeay_version(int type); +unsigned long SSLeay(void); + +/* An opaque type representing an implementation of "ex_data" support */ +typedef struct st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL; +/* Return an opaque pointer to the current "ex_data" implementation */ +const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void); +/* Sets the "ex_data" implementation to be used (if it's not too late) */ +int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i); +/* Get a new "ex_data" class, and return the corresponding "class_index" */ +int CRYPTO_ex_data_new_class(void); +/* Within a given class, get/register a new index */ +int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a given + * class (invokes whatever per-class callbacks are applicable) */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + CRYPTO_EX_DATA *from); +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +/* Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular index + * (relative to the class type involved) */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); +/* This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. */ +void CRYPTO_cleanup_all_ex_data(void); + +int CRYPTO_get_new_lockid(char *name); + +int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */ +void CRYPTO_lock(int mode, int type, const char *file, int line); +void CRYPTO_set_locking_callback(void (*func)(int mode, int type, + const char *file, int line)); +void (*CRYPTO_get_locking_callback(void))(int mode, int type, + const char *file, int line); +void CRYPTO_set_add_lock_callback(int (*func)(int *num, int mount, int type, + const char *file, int line)); +int (*CRYPTO_get_add_lock_callback(void))(int *num, int mount, int type, + const char *file, int line); + +/* Don't use this structure directly. */ +typedef struct crypto_threadid_st { + void *ptr; + unsigned long val; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +void CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val); +void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr); +int CRYPTO_THREADID_set_callback(void (*threadid_func)(CRYPTO_THREADID *)); +void (*CRYPTO_THREADID_get_callback(void))(CRYPTO_THREADID *); +void CRYPTO_THREADID_current(CRYPTO_THREADID *id); +int CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b); +void CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src); +unsigned long CRYPTO_THREADID_hash(const CRYPTO_THREADID *id); +#ifndef OPENSSL_NO_DEPRECATED +void CRYPTO_set_id_callback(unsigned long (*func)(void)); +unsigned long (*CRYPTO_get_id_callback(void))(void); +unsigned long CRYPTO_thread_id(void); +#endif + +const char *CRYPTO_get_lock_name(int type); +int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, + int line); + +int CRYPTO_get_new_dynlockid(void); +void CRYPTO_destroy_dynlockid(int i); +struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); +void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function)(const char *file, int line)); +void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)); +void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)(struct CRYPTO_dynlock_value *l, const char *file, int line)); +struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))(const char *file, int line); +void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line); +void (*CRYPTO_get_dynlock_destroy_callback(void))(struct CRYPTO_dynlock_value *l, const char *file, int line); + +/* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- + * call the latter last if you need different functions */ +int CRYPTO_set_mem_functions(void *(*m)(size_t), void *(*r)(void *, size_t), void (*f)(void *)); +int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*free_func)(void *)); +int CRYPTO_set_mem_ex_functions(void *(*m)(size_t, const char *, int), + void *(*r)(void *, size_t, const char *, int), void (*f)(void *)); +int CRYPTO_set_locked_mem_ex_functions(void *(*m)(size_t, const char *, int), + void (*free_func)(void *)); +int CRYPTO_set_mem_debug_functions( + void (*m)(void *, int, const char *, int, int), + void (*r)(void *, void *, int, const char *, int, int), + void (*f)(void *, int), void (*so)(long), long (*go)(void)); +void CRYPTO_get_mem_functions(void *(**m)(size_t), void *(**r)(void *, size_t), + void (**f)(void *)); +void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *)); +void CRYPTO_get_mem_ex_functions(void *(**m)(size_t, const char *, int), + void *(**r)(void *, size_t, const char *, int), void (**f)(void *)); +void CRYPTO_get_locked_mem_ex_functions(void *(**m)(size_t, const char *, int), + void (**f)(void *)); +void CRYPTO_get_mem_debug_functions( + void (**m)(void *, int, const char *, int, int), + void (**r)(void *, void *, int, const char *, int, int), + void (**f)(void *, int), void (**so)(long), long (**go)(void)); + +#ifndef LIBRESSL_INTERNAL +void *CRYPTO_malloc_locked(int num, const char *file, int line); +void CRYPTO_free_locked(void *ptr); +void *CRYPTO_malloc(int num, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +void CRYPTO_free(void *ptr); +void *CRYPTO_realloc(void *addr, int num, const char *file, int line); +#endif + +void *CRYPTO_realloc_clean(void *addr, int old_num, int num, + const char *file, int line); +void *CRYPTO_remalloc(void *addr, int num, const char *file, int line); + +#ifndef LIBRESSL_INTERNAL +void OPENSSL_cleanse(void *ptr, size_t len); +#endif + +void CRYPTO_set_mem_debug_options(long bits); +long CRYPTO_get_mem_debug_options(void); + +#define CRYPTO_push_info(info) \ + CRYPTO_push_info_(info, __FILE__, __LINE__); +int CRYPTO_push_info_(const char *info, const char *file, int line); +int CRYPTO_pop_info(void); +int CRYPTO_remove_all_info(void); + + +/* Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro; + * used as default in CRYPTO_MDEBUG compilations): */ +/* The last argument has the following significance: + * + * 0: called before the actual memory allocation has taken place + * 1: called after the actual memory allocation has taken place + */ +void CRYPTO_dbg_malloc(void *addr, int num, const char *file, int line, int before_p) + __attribute__ ((deprecated)); +void CRYPTO_dbg_realloc(void *addr1, void *addr2, int num, const char *file, int line, int before_p) + __attribute__ ((deprecated)); +void CRYPTO_dbg_free(void *addr, int before_p) + __attribute__ ((deprecated)); +/* Tell the debugging code about options. By default, the following values + * apply: + * + * 0: Clear all options. + * V_CRYPTO_MDEBUG_TIME (1): Set the "Show Time" option. + * V_CRYPTO_MDEBUG_THREAD (2): Set the "Show Thread Number" option. + * V_CRYPTO_MDEBUG_ALL (3): 1 + 2 + */ +void CRYPTO_dbg_set_options(long bits) + __attribute__ ((deprecated)); +long CRYPTO_dbg_get_options(void) + __attribute__ ((deprecated)); + + +void CRYPTO_mem_leaks_fp(FILE *); +void CRYPTO_mem_leaks(struct bio_st *bio); +/* unsigned long order, char *file, int line, int num_bytes, char *addr */ +typedef void *CRYPTO_MEM_LEAK_CB(unsigned long, const char *, int, int, void *); +void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb); + +/* die if we have to */ +void OpenSSLDie(const char *file, int line, const char *assertion); +#define OPENSSL_assert(e) (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1)) + +uint64_t OPENSSL_cpu_caps(void); + +int OPENSSL_isservice(void); + +void OPENSSL_init(void); + +#ifndef LIBRESSL_INTERNAL +/* CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. It + * takes an amount of time dependent on |len|, but independent of the contents + * of |a| and |b|. Unlike memcmp, it cannot be used to put elements into a + * defined order as the return value when a != b is undefined, other than to be + * non-zero. */ +int CRYPTO_memcmp(const void *a, const void *b, size_t len); +#endif + +/* 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. + */ +void ERR_load_CRYPTO_strings(void); + +/* Error codes for the CRYPTO functions. */ + +/* Function codes. */ +#define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 100 +#define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID 103 +#define CRYPTO_F_CRYPTO_GET_NEW_LOCKID 101 +#define CRYPTO_F_CRYPTO_SET_EX_DATA 102 +#define CRYPTO_F_DEF_ADD_INDEX 104 +#define CRYPTO_F_DEF_GET_CLASS 105 +#define CRYPTO_F_FIPS_MODE_SET 109 +#define CRYPTO_F_INT_DUP_EX_DATA 106 +#define CRYPTO_F_INT_FREE_EX_DATA 107 +#define CRYPTO_F_INT_NEW_EX_DATA 108 + +/* Reason codes. */ +#define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED 101 +#define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/curve25519.h b/src/3rdparty/win32_include/openssl/curve25519.h new file mode 100644 index 000000000..5aaa8c086 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/curve25519.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2015, Google Inc. + * + * Permission to use, copy, modify, and/or 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. + */ + +#ifndef HEADER_CURVE25519_H +#define HEADER_CURVE25519_H + +#include + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/* + * Curve25519. + * + * Curve25519 is an elliptic curve. See https://tools.ietf.org/html/rfc7748. + */ + +/* + * X25519. + * + * X25519 is the Diffie-Hellman primitive built from curve25519. It is + * sometimes referred to as curve25519, but X25519 is a more precise name. + * See http://cr.yp.to/ecdh.html and https://tools.ietf.org/html/rfc7748. + */ + +#define X25519_KEY_LENGTH 32 + +/* + * X25519_keypair sets |out_public_value| and |out_private_key| to a freshly + * generated, public/private key pair. + */ +void X25519_keypair(uint8_t out_public_value[X25519_KEY_LENGTH], + uint8_t out_private_key[X25519_KEY_LENGTH]); + +/* + * X25519 writes a shared key to |out_shared_key| that is calculated from the + * given private key and the peer's public value. It returns one on success and + * zero on error. + * + * Don't use the shared key directly, rather use a KDF and also include the two + * public values as inputs. + */ +int X25519(uint8_t out_shared_key[X25519_KEY_LENGTH], + const uint8_t private_key[X25519_KEY_LENGTH], + const uint8_t peers_public_value[X25519_KEY_LENGTH]); + +#if defined(__cplusplus) +} /* extern C */ +#endif + +#endif /* HEADER_CURVE25519_H */ diff --git a/src/3rdparty/win32_include/openssl/des.h b/src/3rdparty/win32_include/openssl/des.h new file mode 100644 index 000000000..e1331d3fa --- /dev/null +++ b/src/3rdparty/win32_include/openssl/des.h @@ -0,0 +1,219 @@ +/* $OpenBSD: des.h,v 1.19 2015/02/07 13:19:15 doug Exp $ */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_NEW_DES_H +#define HEADER_NEW_DES_H + +#include + +#ifdef OPENSSL_NO_DES +#error DES is disabled. +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char DES_cblock[8]; +typedef /* const */ unsigned char const_DES_cblock[8]; +/* With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * + * and const_DES_cblock * are incompatible pointer types. */ + +typedef struct DES_ks + { + union + { + DES_cblock cblock; + /* make sure things are correct size on machines with + * 8 byte longs */ + DES_LONG deslong[2]; + } ks[16]; + } DES_key_schedule; + +#define DES_KEY_SZ (sizeof(DES_cblock)) +#define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) + +#define DES_ENCRYPT 1 +#define DES_DECRYPT 0 + +#define DES_CBC_MODE 0 +#define DES_PCBC_MODE 1 + +#define DES_ecb2_encrypt(i,o,k1,k2,e) \ + DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +#define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +#define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +#define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +extern int DES_check_key; /* defaults to false */ +extern int DES_rw_mode; /* defaults to DES_PCBC_MODE */ + +const char *DES_options(void); +void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks1,DES_key_schedule *ks2, + DES_key_schedule *ks3, int enc); +DES_LONG DES_cbc_cksum(const unsigned char *input,DES_cblock *output, + long length,DES_key_schedule *schedule, + const_DES_cblock *ivec); +/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ +void DES_cbc_encrypt(const unsigned char *input,unsigned char *output, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + int enc); +void DES_ncbc_encrypt(const unsigned char *input,unsigned char *output, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + int enc); +void DES_xcbc_encrypt(const unsigned char *input,unsigned char *output, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + const_DES_cblock *inw,const_DES_cblock *outw,int enc); +void DES_cfb_encrypt(const unsigned char *in,unsigned char *out,int numbits, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + int enc); +void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output, + DES_key_schedule *ks,int enc); + +/* This is the DES encryption function that gets called by just about + every other DES routine in the library. You should not use this + function except to implement 'modes' of DES. I say this because the + functions that call this routine do the conversion from 'char *' to + long, and this needs to be done to make sure 'non-aligned' memory + access do not occur. The characters are loaded 'little endian'. + Data is a pointer to 2 unsigned long's and ks is the + DES_key_schedule to use. enc, is non zero specifies encryption, + zero if decryption. */ +void DES_encrypt1(DES_LONG *data,DES_key_schedule *ks, int enc); + +/* This functions is the same as DES_encrypt1() except that the DES + initial permutation (IP) and final permutation (FP) have been left + out. As for DES_encrypt1(), you should not use this function. + It is used by the routines in the library that implement triple DES. + IP() DES_encrypt2() DES_encrypt2() DES_encrypt2() FP() is the same + as DES_encrypt1() DES_encrypt1() DES_encrypt1() except faster :-). */ +void DES_encrypt2(DES_LONG *data,DES_key_schedule *ks, int enc); + +void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3); +void DES_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output, + long length, + DES_key_schedule *ks1,DES_key_schedule *ks2, + DES_key_schedule *ks3,DES_cblock *ivec,int enc); +void DES_ede3_cbcm_encrypt(const unsigned char *in,unsigned char *out, + long length, + DES_key_schedule *ks1,DES_key_schedule *ks2, + DES_key_schedule *ks3, + DES_cblock *ivec1,DES_cblock *ivec2, + int enc); +void DES_ede3_cfb64_encrypt(const unsigned char *in,unsigned char *out, + long length,DES_key_schedule *ks1, + DES_key_schedule *ks2,DES_key_schedule *ks3, + DES_cblock *ivec,int *num,int enc); +void DES_ede3_cfb_encrypt(const unsigned char *in,unsigned char *out, + int numbits,long length,DES_key_schedule *ks1, + DES_key_schedule *ks2,DES_key_schedule *ks3, + DES_cblock *ivec,int enc); +void DES_ede3_ofb64_encrypt(const unsigned char *in,unsigned char *out, + long length,DES_key_schedule *ks1, + DES_key_schedule *ks2,DES_key_schedule *ks3, + DES_cblock *ivec,int *num); +int DES_enc_read(int fd,void *buf,int len,DES_key_schedule *sched, + DES_cblock *iv); +int DES_enc_write(int fd,const void *buf,int len,DES_key_schedule *sched, + DES_cblock *iv); +char *DES_fcrypt(const char *buf,const char *salt, char *ret); +char *DES_crypt(const char *buf,const char *salt); +void DES_ofb_encrypt(const unsigned char *in,unsigned char *out,int numbits, + long length,DES_key_schedule *schedule,DES_cblock *ivec); +void DES_pcbc_encrypt(const unsigned char *input,unsigned char *output, + long length,DES_key_schedule *schedule,DES_cblock *ivec, + int enc); +DES_LONG DES_quad_cksum(const unsigned char *input,DES_cblock output[], + long length,int out_count,DES_cblock *seed); +int DES_random_key(DES_cblock *ret); +void DES_set_odd_parity(DES_cblock *key); +int DES_check_key_parity(const_DES_cblock *key); +int DES_is_weak_key(const_DES_cblock *key); +/* DES_set_key (= set_key = DES_key_sched = key_sched) calls + * DES_set_key_checked if global variable DES_check_key is set, + * DES_set_key_unchecked otherwise. */ +int DES_set_key(const_DES_cblock *key,DES_key_schedule *schedule); +int DES_key_sched(const_DES_cblock *key,DES_key_schedule *schedule); +int DES_set_key_checked(const_DES_cblock *key,DES_key_schedule *schedule); +void DES_set_key_unchecked(const_DES_cblock *key,DES_key_schedule *schedule); +void DES_string_to_key(const char *str,DES_cblock *key); +void DES_string_to_2keys(const char *str,DES_cblock *key1,DES_cblock *key2); +void DES_cfb64_encrypt(const unsigned char *in,unsigned char *out,long length, + DES_key_schedule *schedule,DES_cblock *ivec,int *num, + int enc); +void DES_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length, + DES_key_schedule *schedule,DES_cblock *ivec,int *num); + +#define DES_fixup_key_parity DES_set_odd_parity + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/dh.h b/src/3rdparty/win32_include/openssl/dh.h new file mode 100644 index 000000000..920af3b92 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/dh.h @@ -0,0 +1,269 @@ +/* $OpenBSD: dh.h,v 1.18 2016/11/04 18:35:30 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_DH_H +#define HEADER_DH_H + +#include + +#ifdef OPENSSL_NO_DH +#error DH is disabled. +#endif + +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +#endif + +#define DH_FLAG_CACHE_MONT_P 0x01 + +/* If this flag is set the DH method is FIPS compliant and can be used + * in FIPS mode. This is set in the validated module method. If an + * application sets this flag in its own methods it is its reposibility + * to ensure the result is compliant. + */ + +#define DH_FLAG_FIPS_METHOD 0x0400 + +/* If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +#define DH_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dh_st DH; */ +/* typedef struct dh_method DH_METHOD; */ + +struct dh_method + { + const char *name; + /* Methods here */ + int (*generate_key)(DH *dh); + int (*compute_key)(unsigned char *key,const BIGNUM *pub_key,DH *dh); + int (*bn_mod_exp)(const DH *dh, BIGNUM *r, const BIGNUM *a, + const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); /* Can be null */ + + int (*init)(DH *dh); + int (*finish)(DH *dh); + int flags; + char *app_data; + /* If this is non-NULL, it will be used to generate parameters */ + int (*generate_params)(DH *dh, int prime_len, int generator, BN_GENCB *cb); + }; + +struct dh_st + { + /* This first argument is used to pick up errors when + * a DH is passed instead of a EVP_PKEY */ + int pad; + int version; + BIGNUM *p; + BIGNUM *g; + long length; /* optional */ + BIGNUM *pub_key; /* g^x */ + BIGNUM *priv_key; /* x */ + + int flags; + BN_MONT_CTX *method_mont_p; + /* Place holders if we want to do X9.42 DH */ + BIGNUM *q; + BIGNUM *j; + unsigned char *seed; + int seedlen; + BIGNUM *counter; + + int references; + CRYPTO_EX_DATA ex_data; + const DH_METHOD *meth; + ENGINE *engine; + }; + +#define DH_GENERATOR_2 2 +/* #define DH_GENERATOR_3 3 */ +#define DH_GENERATOR_5 5 + +/* DH_check error codes */ +#define DH_CHECK_P_NOT_PRIME 0x01 +#define DH_CHECK_P_NOT_SAFE_PRIME 0x02 +#define DH_UNABLE_TO_CHECK_GENERATOR 0x04 +#define DH_NOT_SUITABLE_GENERATOR 0x08 + +/* DH_check_pub_key error codes */ +#define DH_CHECK_PUBKEY_TOO_SMALL 0x01 +#define DH_CHECK_PUBKEY_TOO_LARGE 0x02 + +/* primes p where (p-1)/2 is prime too are called "safe"; we define + this for backward compatibility: */ +#define DH_CHECK_P_NOT_STRONG_PRIME DH_CHECK_P_NOT_SAFE_PRIME + +DH *d2i_DHparams_bio(BIO *bp, DH **a); +int i2d_DHparams_bio(BIO *bp, DH *a); +DH *d2i_DHparams_fp(FILE *fp, DH **a); +int i2d_DHparams_fp(FILE *fp, DH *a); + +DH *DHparams_dup(DH *); + +const DH_METHOD *DH_OpenSSL(void); + +void DH_set_default_method(const DH_METHOD *meth); +const DH_METHOD *DH_get_default_method(void); +int DH_set_method(DH *dh, const DH_METHOD *meth); +DH *DH_new_method(ENGINE *engine); + +DH * DH_new(void); +void DH_free(DH *dh); +int DH_up_ref(DH *dh); +int DH_size(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); + +/* Deprecated version */ +#ifndef OPENSSL_NO_DEPRECATED +DH * DH_generate_parameters(int prime_len,int generator, + void (*callback)(int,int,void *),void *cb_arg); +#endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DH_generate_parameters_ex(DH *dh, int prime_len,int generator, BN_GENCB *cb); + +int DH_check(const DH *dh,int *codes); +int DH_check_pub_key(const DH *dh,const BIGNUM *pub_key, int *codes); +int DH_generate_key(DH *dh); +int DH_compute_key(unsigned char *key,const BIGNUM *pub_key,DH *dh); +DH * d2i_DHparams(DH **a,const unsigned char **pp, long length); +int i2d_DHparams(const DH *a,unsigned char **pp); +int DHparams_print_fp(FILE *fp, const DH *x); +#ifndef OPENSSL_NO_BIO +int DHparams_print(BIO *bp, const DH *x); +#else +int DHparams_print(char *bp, const DH *x); +#endif + +#define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, len, NULL) + +#define EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, gen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, NULL) + +#define EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) +#define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 2) + + +/* 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. + */ +void ERR_load_DH_strings(void); + +/* Error codes for the DH functions. */ + +/* Function codes. */ +#define DH_F_COMPUTE_KEY 102 +#define DH_F_DHPARAMS_PRINT_FP 101 +#define DH_F_DH_BUILTIN_GENPARAMS 106 +#define DH_F_DH_COMPUTE_KEY 114 +#define DH_F_DH_GENERATE_KEY 115 +#define DH_F_DH_GENERATE_PARAMETERS_EX 116 +#define DH_F_DH_NEW_METHOD 105 +#define DH_F_DH_PARAM_DECODE 107 +#define DH_F_DH_PRIV_DECODE 110 +#define DH_F_DH_PRIV_ENCODE 111 +#define DH_F_DH_PUB_DECODE 108 +#define DH_F_DH_PUB_ENCODE 109 +#define DH_F_DO_DH_PRINT 100 +#define DH_F_GENERATE_KEY 103 +#define DH_F_GENERATE_PARAMETERS 104 +#define DH_F_PKEY_DH_DERIVE 112 +#define DH_F_PKEY_DH_KEYGEN 113 + +/* Reason codes. */ +#define DH_R_BAD_GENERATOR 101 +#define DH_R_BN_DECODE_ERROR 109 +#define DH_R_BN_ERROR 106 +#define DH_R_DECODE_ERROR 104 +#define DH_R_INVALID_PUBKEY 102 +#define DH_R_KEYS_NOT_SET 108 +#define DH_R_KEY_SIZE_TOO_SMALL 110 +#define DH_R_MODULUS_TOO_LARGE 103 +#define DH_R_NON_FIPS_METHOD 111 +#define DH_R_NO_PARAMETERS_SET 107 +#define DH_R_NO_PRIVATE_VALUE 100 +#define DH_R_PARAMETER_ENCODING_ERROR 105 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/dsa.h b/src/3rdparty/win32_include/openssl/dsa.h new file mode 100644 index 000000000..6ddd4c35d --- /dev/null +++ b/src/3rdparty/win32_include/openssl/dsa.h @@ -0,0 +1,320 @@ +/* $OpenBSD: dsa.h,v 1.22 2016/11/04 18:35:30 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* + * The DSS routines are based on patches supplied by + * Steven Schoch . He basically did the + * work and I have just tweaked them a little to fit into my + * stylistic vision for SSLeay :-) */ + +#ifndef HEADER_DSA_H +#define HEADER_DSA_H + +#include + +#ifdef OPENSSL_NO_DSA +#error DSA is disabled. +#endif + +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include + +#ifndef OPENSSL_NO_DEPRECATED +#include +#ifndef OPENSSL_NO_DH +# include +#endif +#endif + +#ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +#endif + +#define DSA_FLAG_CACHE_MONT_P 0x01 + +/* If this flag is set the DSA method is FIPS compliant and can be used + * in FIPS mode. This is set in the validated module method. If an + * application sets this flag in its own methods it is its reposibility + * to ensure the result is compliant. + */ + +#define DSA_FLAG_FIPS_METHOD 0x0400 + +/* If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +#define DSA_FLAG_NON_FIPS_ALLOW 0x0400 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dsa_st DSA; */ +/* typedef struct dsa_method DSA_METHOD; */ + +typedef struct DSA_SIG_st + { + BIGNUM *r; + BIGNUM *s; + } DSA_SIG; + +struct dsa_method + { + const char *name; + DSA_SIG * (*dsa_do_sign)(const unsigned char *dgst, int dlen, DSA *dsa); + int (*dsa_sign_setup)(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, + BIGNUM **rp); + int (*dsa_do_verify)(const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + int (*dsa_mod_exp)(DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1, + BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); + int (*bn_mod_exp)(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *m_ctx); /* Can be null */ + int (*init)(DSA *dsa); + int (*finish)(DSA *dsa); + int flags; + char *app_data; + /* If this is non-NULL, it is used to generate DSA parameters */ + int (*dsa_paramgen)(DSA *dsa, int bits, + const unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + BN_GENCB *cb); + /* If this is non-NULL, it is used to generate DSA keys */ + int (*dsa_keygen)(DSA *dsa); + }; + +struct dsa_st + { + /* This first variable is used to pick up errors where + * a DSA is passed instead of of a EVP_PKEY */ + int pad; + long version; + int write_params; + BIGNUM *p; + BIGNUM *q; /* == 20 */ + BIGNUM *g; + + BIGNUM *pub_key; /* y public key */ + BIGNUM *priv_key; /* x private key */ + + BIGNUM *kinv; /* Signing pre-calc */ + BIGNUM *r; /* Signing pre-calc */ + + int flags; + /* Normally used to cache montgomery values */ + BN_MONT_CTX *method_mont_p; + int references; + CRYPTO_EX_DATA ex_data; + const DSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + }; + +DSA *d2i_DSAparams_bio(BIO *bp, DSA **a); +int i2d_DSAparams_bio(BIO *bp, DSA *a); +DSA *d2i_DSAparams_fp(FILE *fp, DSA **a); +int i2d_DSAparams_fp(FILE *fp, DSA *a); + +DSA *DSAparams_dup(DSA *x); +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); + +DSA_SIG * DSA_do_sign(const unsigned char *dgst,int dlen,DSA *dsa); +int DSA_do_verify(const unsigned char *dgst,int dgst_len, + DSA_SIG *sig,DSA *dsa); + +const DSA_METHOD *DSA_OpenSSL(void); + +void DSA_set_default_method(const DSA_METHOD *); +const DSA_METHOD *DSA_get_default_method(void); +int DSA_set_method(DSA *dsa, const DSA_METHOD *); + +DSA * DSA_new(void); +DSA * DSA_new_method(ENGINE *engine); +void DSA_free(DSA *r); +/* "up" the DSA object's reference count */ +int DSA_up_ref(DSA *r); +int DSA_size(const DSA *); + /* next 4 return -1 on error */ +int DSA_sign_setup( DSA *dsa,BN_CTX *ctx_in,BIGNUM **kinvp,BIGNUM **rp); +int DSA_sign(int type,const unsigned char *dgst,int dlen, + unsigned char *sig, unsigned int *siglen, DSA *dsa); +int DSA_verify(int type,const unsigned char *dgst,int dgst_len, + const unsigned char *sigbuf, int siglen, DSA *dsa); +int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int DSA_set_ex_data(DSA *d, int idx, void *arg); +void *DSA_get_ex_data(DSA *d, int idx); + +DSA *d2i_DSAPublicKey(DSA **a, const unsigned char **pp, long length); +int i2d_DSAPublicKey(const DSA *a, unsigned char **pp); +extern const ASN1_ITEM DSAPublicKey_it; + +DSA *d2i_DSAPrivateKey(DSA **a, const unsigned char **pp, long length); +int i2d_DSAPrivateKey(const DSA *a, unsigned char **pp); +extern const ASN1_ITEM DSAPrivateKey_it; + +DSA *d2i_DSAparams(DSA **a, const unsigned char **pp, long length); +int i2d_DSAparams(const DSA *a,unsigned char **pp); +extern const ASN1_ITEM DSAparams_it; + +/* Deprecated version */ +#ifndef OPENSSL_NO_DEPRECATED +DSA * DSA_generate_parameters(int bits, + unsigned char *seed,int seed_len, + int *counter_ret, unsigned long *h_ret,void + (*callback)(int, int, void *),void *cb_arg); +#endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int DSA_generate_parameters_ex(DSA *dsa, int bits, + const unsigned char *seed,int seed_len, + int *counter_ret, unsigned long *h_ret, BN_GENCB *cb); + +int DSA_generate_key(DSA *a); + +#ifndef OPENSSL_NO_BIO +int DSAparams_print(BIO *bp, const DSA *x); +int DSA_print(BIO *bp, const DSA *x, int off); +#endif +int DSAparams_print_fp(FILE *fp, const DSA *x); +int DSA_print_fp(FILE *bp, const DSA *x, int off); + +#define DSS_prime_checks 50 +/* Primality test according to FIPS PUB 186[-1], Appendix 2.1: + * 50 rounds of Rabin-Miller */ +#define DSA_is_prime(n, callback, cb_arg) \ + BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) + +#ifndef OPENSSL_NO_DH +/* Convert DSA structure (key or just parameters) into DH structure + * (be careful to avoid small subgroup attacks when using this!) */ +DH *DSA_dup_DH(const DSA *r); +#endif + +#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) + +#define EVP_PKEY_CTRL_DSA_PARAMGEN_BITS (EVP_PKEY_ALG_CTRL + 1) +#define EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS (EVP_PKEY_ALG_CTRL + 2) +#define EVP_PKEY_CTRL_DSA_PARAMGEN_MD (EVP_PKEY_ALG_CTRL + 3) + +/* 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. + */ +void ERR_load_DSA_strings(void); + +/* Error codes for the DSA functions. */ + +/* Function codes. */ +#define DSA_F_D2I_DSA_SIG 110 +#define DSA_F_DO_DSA_PRINT 104 +#define DSA_F_DSAPARAMS_PRINT 100 +#define DSA_F_DSAPARAMS_PRINT_FP 101 +#define DSA_F_DSA_DO_SIGN 112 +#define DSA_F_DSA_DO_VERIFY 113 +#define DSA_F_DSA_GENERATE_KEY 124 +#define DSA_F_DSA_GENERATE_PARAMETERS_EX 123 +#define DSA_F_DSA_NEW_METHOD 103 +#define DSA_F_DSA_PARAM_DECODE 119 +#define DSA_F_DSA_PRINT_FP 105 +#define DSA_F_DSA_PRIV_DECODE 115 +#define DSA_F_DSA_PRIV_ENCODE 116 +#define DSA_F_DSA_PUB_DECODE 117 +#define DSA_F_DSA_PUB_ENCODE 118 +#define DSA_F_DSA_SIGN 106 +#define DSA_F_DSA_SIGN_SETUP 107 +#define DSA_F_DSA_SIG_NEW 109 +#define DSA_F_DSA_SIG_PRINT 125 +#define DSA_F_DSA_VERIFY 108 +#define DSA_F_I2D_DSA_SIG 111 +#define DSA_F_OLD_DSA_PRIV_DECODE 122 +#define DSA_F_PKEY_DSA_CTRL 120 +#define DSA_F_PKEY_DSA_KEYGEN 121 +#define DSA_F_SIG_CB 114 + +/* Reason codes. */ +#define DSA_R_BAD_Q_VALUE 102 +#define DSA_R_BN_DECODE_ERROR 108 +#define DSA_R_BN_ERROR 109 +#define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 +#define DSA_R_DECODE_ERROR 104 +#define DSA_R_INVALID_DIGEST_TYPE 106 +#define DSA_R_MISSING_PARAMETERS 101 +#define DSA_R_MODULUS_TOO_LARGE 103 +#define DSA_R_NEED_NEW_SETUP_VALUES 110 +#define DSA_R_NON_FIPS_DSA_METHOD 111 +#define DSA_R_NO_PARAMETERS_SET 107 +#define DSA_R_PARAMETER_ENCODING_ERROR 105 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/dso.h b/src/3rdparty/win32_include/openssl/dso.h new file mode 100644 index 000000000..6c982c9f9 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/dso.h @@ -0,0 +1,386 @@ +/* $OpenBSD: dso.h,v 1.12 2016/03/15 20:50:22 krw Exp $ */ +/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL + * project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DSO_H +#define HEADER_DSO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These values are used as commands to DSO_ctrl() */ +#define DSO_CTRL_GET_FLAGS 1 +#define DSO_CTRL_SET_FLAGS 2 +#define DSO_CTRL_OR_FLAGS 3 + +/* By default, DSO_load() will translate the provided filename into a form + * typical for the platform (more specifically the DSO_METHOD) using the + * dso_name_converter function of the method. Eg. win32 will transform "blah" + * into "blah.dll", and dlfcn will transform it into "libblah.so". The + * behaviour can be overridden by setting the name_converter callback in the DSO + * object (using DSO_set_name_converter()). This callback could even utilise + * the DSO_METHOD's converter too if it only wants to override behaviour for + * one or two possible DSO methods. However, the following flag can be set in a + * DSO to prevent *any* native name-translation at all - eg. if the caller has + * prompted the user for a path to a driver library so the filename should be + * interpreted as-is. */ +#define DSO_FLAG_NO_NAME_TRANSLATION 0x01 +/* An extra flag to give if only the extension should be added as + * translation. This is obviously only of importance on Unix and + * other operating systems where the translation also may prefix + * the name with something, like 'lib', and ignored everywhere else. + * This flag is also ignored if DSO_FLAG_NO_NAME_TRANSLATION is used + * at the same time. */ +#define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02 + +/* The following flag controls the translation of symbol names to upper + * case. This is currently only being implemented for OpenVMS. + */ +#define DSO_FLAG_UPCASE_SYMBOL 0x10 + +/* This flag loads the library with public symbols. + * Meaning: The exported symbols of this library are public + * to all libraries loaded after this library. + * At the moment only implemented in unix. + */ +#define DSO_FLAG_GLOBAL_SYMBOLS 0x20 + + +typedef void (*DSO_FUNC_TYPE)(void); + +typedef struct dso_st DSO; + +/* The function prototype used for method functions (or caller-provided + * callbacks) that transform filenames. They are passed a DSO structure pointer + * (or NULL if they are to be used independantly of a DSO object) and a + * filename to transform. They should either return NULL (if there is an error + * condition) or a newly allocated string containing the transformed form that + * the caller will need to free with free() when done. */ +typedef char* (*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); +/* The function prototype used for method functions (or caller-provided + * callbacks) that merge two file specifications. They are passed a + * DSO structure pointer (or NULL if they are to be used independantly of + * a DSO object) and two file specifications to merge. They should + * either return NULL (if there is an error condition) or a newly allocated + * string containing the result of merging that the caller will need + * to free with free() when done. + * Here, merging means that bits and pieces are taken from each of the + * file specifications and added together in whatever fashion that is + * sensible for the DSO method in question. The only rule that really + * applies is that if the two specification contain pieces of the same + * type, the copy from the first string takes priority. One could see + * it as the first specification is the one given by the user and the + * second being a bunch of defaults to add on if they're missing in the + * first. */ +typedef char* (*DSO_MERGER_FUNC)(DSO *, const char *, const char *); + +typedef struct dso_meth_st { + const char *name; + /* Loads a shared library, NB: new DSO_METHODs must ensure that a + * successful load populates the loaded_filename field, and likewise a + * successful unload frees and NULLs it out. */ + int (*dso_load)(DSO *dso); + /* Unloads a shared library */ + int (*dso_unload)(DSO *dso); + /* Binds a variable */ + void *(*dso_bind_var)(DSO *dso, const char *symname); + /* Binds a function - assumes a return type of DSO_FUNC_TYPE. + * This should be cast to the real function prototype by the + * caller. Platforms that don't have compatible representations + * for different prototypes (this is possible within ANSI C) + * are highly unlikely to have shared libraries at all, let + * alone a DSO_METHOD implemented for them. */ + DSO_FUNC_TYPE (*dso_bind_func)(DSO *dso, const char *symname); + + /* The generic (yuck) "ctrl()" function. NB: Negative return + * values (rather than zero) indicate errors. */ + long (*dso_ctrl)(DSO *dso, int cmd, long larg, void *parg); + /* The default DSO_METHOD-specific function for converting filenames to + * a canonical native form. */ + DSO_NAME_CONVERTER_FUNC dso_name_converter; + /* The default DSO_METHOD-specific function for converting filenames to + * a canonical native form. */ + DSO_MERGER_FUNC dso_merger; + + /* [De]Initialisation handlers. */ + int (*init)(DSO *dso); + int (*finish)(DSO *dso); + + /* Return pathname of the module containing location */ + int (*pathbyaddr)(void *addr, char *path, int sz); + /* Perform global symbol lookup, i.e. among *all* modules */ + void *(*globallookup)(const char *symname); +} DSO_METHOD; + +/**********************************************************************/ +/* The low-level handle type used to refer to a loaded shared library */ + +struct dso_st { + DSO_METHOD *meth; + /* Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS + * doesn't use anything but will need to cache the filename + * for use in the dso_bind handler. All in all, let each + * method control its own destiny. "Handles" and such go in + * a STACK. */ + STACK_OF(void) *meth_data; + int references; + int flags; + /* For use by applications etc ... use this for your bits'n'pieces, + * don't touch meth_data! */ + CRYPTO_EX_DATA ex_data; + /* If this callback function pointer is set to non-NULL, then it will + * be used in DSO_load() in place of meth->dso_name_converter. NB: This + * should normally set using DSO_set_name_converter(). */ + DSO_NAME_CONVERTER_FUNC name_converter; + /* If this callback function pointer is set to non-NULL, then it will + * be used in DSO_load() in place of meth->dso_merger. NB: This + * should normally set using DSO_set_merger(). */ + DSO_MERGER_FUNC merger; + /* This is populated with (a copy of) the platform-independant + * filename used for this DSO. */ + char *filename; + /* This is populated with (a copy of) the translated filename by which + * the DSO was actually loaded. It is NULL iff the DSO is not currently + * loaded. NB: This is here because the filename translation process + * may involve a callback being invoked more than once not only to + * convert to a platform-specific form, but also to try different + * filenames in the process of trying to perform a load. As such, this + * variable can be used to indicate (a) whether this DSO structure + * corresponds to a loaded library or not, and (b) the filename with + * which it was actually loaded. */ + char *loaded_filename; +}; + + +DSO * DSO_new(void); +DSO * DSO_new_method(DSO_METHOD *method); +int DSO_free(DSO *dso); +int DSO_flags(DSO *dso); +int DSO_up_ref(DSO *dso); +long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); + +/* This function sets the DSO's name_converter callback. If it is non-NULL, + * then it will be used instead of the associated DSO_METHOD's function. If + * oldcb is non-NULL then it is set to the function pointer value being + * replaced. Return value is non-zero for success. */ +int DSO_set_name_converter(DSO *dso, DSO_NAME_CONVERTER_FUNC cb, + DSO_NAME_CONVERTER_FUNC *oldcb); +/* These functions can be used to get/set the platform-independant filename + * used for a DSO. NB: set will fail if the DSO is already loaded. */ +const char *DSO_get_filename(DSO *dso); +int DSO_set_filename(DSO *dso, const char *filename); +/* This function will invoke the DSO's name_converter callback to translate a + * filename, or if the callback isn't set it will instead use the DSO_METHOD's + * converter. If "filename" is NULL, the "filename" in the DSO itself will be + * used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is + * simply duplicated. NB: This function is usually called from within a + * DSO_METHOD during the processing of a DSO_load() call, and is exposed so that + * caller-created DSO_METHODs can do the same thing. A non-NULL return value + * will need to be free()'d. */ +char *DSO_convert_filename(DSO *dso, const char *filename); +/* This function will invoke the DSO's merger callback to merge two file + * specifications, or if the callback isn't set it will instead use the + * DSO_METHOD's merger. A non-NULL return value will need to be + * free()'d. */ +char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2); +/* If the DSO is currently loaded, this returns the filename that it was loaded + * under, otherwise it returns NULL. So it is also useful as a test as to + * whether the DSO is currently loaded. NB: This will not necessarily return + * the same value as DSO_convert_filename(dso, dso->filename), because the + * DSO_METHOD's load function may have tried a variety of filenames (with + * and/or without the aid of the converters) before settling on the one it + * actually loaded. */ +const char *DSO_get_loaded_filename(DSO *dso); + +void DSO_set_default_method(DSO_METHOD *meth); +DSO_METHOD *DSO_get_default_method(void); +DSO_METHOD *DSO_get_method(DSO *dso); +DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth); + +/* The all-singing all-dancing load function, you normally pass NULL + * for the first and third parameters. Use DSO_up and DSO_free for + * subsequent reference count handling. Any flags passed in will be set + * in the constructed DSO after its init() function but before the + * load operation. If 'dso' is non-NULL, 'flags' is ignored. */ +DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags); + +/* This function binds to a variable inside a shared library. */ +void *DSO_bind_var(DSO *dso, const char *symname); + +/* This function binds to a function inside a shared library. */ +DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname); + +/* This method is the default, but will beg, borrow, or steal whatever + * method should be the default on any particular platform (including + * DSO_METH_null() if necessary). */ +DSO_METHOD *DSO_METHOD_openssl(void); + +/* This method is defined for all platforms - if a platform has no + * DSO support then this will be the only method! */ +DSO_METHOD *DSO_METHOD_null(void); + +/* If DSO_DLFCN is defined, the standard dlfcn.h-style functions + * (dlopen, dlclose, dlsym, etc) will be used and incorporated into + * this method. If not, this method will return NULL. */ +DSO_METHOD *DSO_METHOD_dlfcn(void); + +/* This function writes null-terminated pathname of DSO module + * containing 'addr' into 'sz' large caller-provided 'path' and + * returns the number of characters [including trailing zero] + * written to it. If 'sz' is 0 or negative, 'path' is ignored and + * required amount of charachers [including trailing zero] to + * accommodate pathname is returned. If 'addr' is NULL, then + * pathname of cryptolib itself is returned. Negative or zero + * return value denotes error. + */ +int DSO_pathbyaddr(void *addr, char *path, int sz); + +/* This function should be used with caution! It looks up symbols in + * *all* loaded modules and if module gets unloaded by somebody else + * attempt to dereference the pointer is doomed to have fatal + * consequences. Primary usage for this function is to probe *core* + * system functionality, e.g. check if getnameinfo(3) is available + * at run-time without bothering about OS-specific details such as + * libc.so.versioning or where does it actually reside: in libc + * itself or libsocket. */ +void *DSO_global_lookup(const char *name); + +/* 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. + */ +void ERR_load_DSO_strings(void); + +/* Error codes for the DSO functions. */ + +/* Function codes. */ +#define DSO_F_BEOS_BIND_FUNC 144 +#define DSO_F_BEOS_BIND_VAR 145 +#define DSO_F_BEOS_LOAD 146 +#define DSO_F_BEOS_NAME_CONVERTER 147 +#define DSO_F_BEOS_UNLOAD 148 +#define DSO_F_DLFCN_BIND_FUNC 100 +#define DSO_F_DLFCN_BIND_VAR 101 +#define DSO_F_DLFCN_LOAD 102 +#define DSO_F_DLFCN_MERGER 130 +#define DSO_F_DLFCN_NAME_CONVERTER 123 +#define DSO_F_DLFCN_UNLOAD 103 +#define DSO_F_DL_BIND_FUNC 104 +#define DSO_F_DL_BIND_VAR 105 +#define DSO_F_DL_LOAD 106 +#define DSO_F_DL_MERGER 131 +#define DSO_F_DL_NAME_CONVERTER 124 +#define DSO_F_DL_UNLOAD 107 +#define DSO_F_DSO_BIND_FUNC 108 +#define DSO_F_DSO_BIND_VAR 109 +#define DSO_F_DSO_CONVERT_FILENAME 126 +#define DSO_F_DSO_CTRL 110 +#define DSO_F_DSO_FREE 111 +#define DSO_F_DSO_GET_FILENAME 127 +#define DSO_F_DSO_GET_LOADED_FILENAME 128 +#define DSO_F_DSO_GLOBAL_LOOKUP 139 +#define DSO_F_DSO_LOAD 112 +#define DSO_F_DSO_MERGE 132 +#define DSO_F_DSO_NEW_METHOD 113 +#define DSO_F_DSO_PATHBYADDR 140 +#define DSO_F_DSO_SET_FILENAME 129 +#define DSO_F_DSO_SET_NAME_CONVERTER 122 +#define DSO_F_DSO_UP_REF 114 +#define DSO_F_GLOBAL_LOOKUP_FUNC 138 +#define DSO_F_PATHBYADDR 137 +#define DSO_F_VMS_BIND_SYM 115 +#define DSO_F_VMS_LOAD 116 +#define DSO_F_VMS_MERGER 133 +#define DSO_F_VMS_UNLOAD 117 +#define DSO_F_WIN32_BIND_FUNC 118 +#define DSO_F_WIN32_BIND_VAR 119 +#define DSO_F_WIN32_GLOBALLOOKUP 142 +#define DSO_F_WIN32_GLOBALLOOKUP_FUNC 143 +#define DSO_F_WIN32_JOINER 135 +#define DSO_F_WIN32_LOAD 120 +#define DSO_F_WIN32_MERGER 134 +#define DSO_F_WIN32_NAME_CONVERTER 125 +#define DSO_F_WIN32_PATHBYADDR 141 +#define DSO_F_WIN32_SPLITTER 136 +#define DSO_F_WIN32_UNLOAD 121 + +/* Reason codes. */ +#define DSO_R_CTRL_FAILED 100 +#define DSO_R_DSO_ALREADY_LOADED 110 +#define DSO_R_EMPTY_FILE_STRUCTURE 113 +#define DSO_R_FAILURE 114 +#define DSO_R_FILENAME_TOO_BIG 101 +#define DSO_R_FINISH_FAILED 102 +#define DSO_R_INCORRECT_FILE_SYNTAX 115 +#define DSO_R_LOAD_FAILED 103 +#define DSO_R_NAME_TRANSLATION_FAILED 109 +#define DSO_R_NO_FILENAME 111 +#define DSO_R_NO_FILE_SPECIFICATION 116 +#define DSO_R_NULL_HANDLE 104 +#define DSO_R_SET_FILENAME_FAILED 112 +#define DSO_R_STACK_ERROR 105 +#define DSO_R_SYM_FAILURE 106 +#define DSO_R_UNLOAD_FAILED 107 +#define DSO_R_UNSUPPORTED 108 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/dtls1.h b/src/3rdparty/win32_include/openssl/dtls1.h new file mode 100644 index 000000000..31ba06530 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/dtls1.h @@ -0,0 +1,190 @@ +/* $OpenBSD: dtls1.h,v 1.21 2017/01/22 07:16:39 beck Exp $ */ +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_DTLS1_H +#define HEADER_DTLS1_H + +#if defined(_WIN32) +#include +#else +#include +#endif + +#include +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define DTLS1_VERSION 0xFEFF + +/* lengths of messages */ +#define DTLS1_COOKIE_LENGTH 256 + +#define DTLS1_RT_HEADER_LENGTH 13 + +#define DTLS1_HM_HEADER_LENGTH 12 + +#define DTLS1_HM_BAD_FRAGMENT -2 +#define DTLS1_HM_FRAGMENT_RETRY -3 + +#define DTLS1_CCS_HEADER_LENGTH 1 + +#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE +#define DTLS1_AL_HEADER_LENGTH 7 +#else +#define DTLS1_AL_HEADER_LENGTH 2 +#endif + +#ifndef OPENSSL_NO_SSL_INTERN + + +typedef struct dtls1_bitmap_st { + unsigned long map; /* track 32 packets on 32-bit systems + and 64 - on 64-bit systems */ + unsigned char max_seq_num[8]; /* max record number seen so far, + 64-bit value in big-endian + encoding */ +} DTLS1_BITMAP; + +struct dtls1_retransmit_state { + EVP_CIPHER_CTX *enc_write_ctx; /* cryptographic state */ + EVP_MD_CTX *write_hash; /* used for mac generation */ + SSL_SESSION *session; + unsigned short epoch; +}; + +struct hm_header_st { + unsigned char type; + unsigned long msg_len; + unsigned short seq; + unsigned long frag_off; + unsigned long frag_len; + unsigned int is_ccs; + struct dtls1_retransmit_state saved_retransmit_state; +}; + +struct ccs_header_st { + unsigned char type; + unsigned short seq; +}; + +struct dtls1_timeout_st { + /* Number of read timeouts so far */ + unsigned int read_timeouts; + + /* Number of write timeouts so far */ + unsigned int write_timeouts; + + /* Number of alerts received so far */ + unsigned int num_alerts; +}; + +struct _pqueue; + +typedef struct record_pqueue_st { + unsigned short epoch; + struct _pqueue *q; +} record_pqueue; + +typedef struct hm_fragment_st { + struct hm_header_st msg_header; + unsigned char *fragment; + unsigned char *reassembly; +} hm_fragment; + +struct dtls1_state_internal_st; + +typedef struct dtls1_state_st { + /* Buffered (sent) handshake records */ + struct _pqueue *sent_messages; + + /* Indicates when the last handshake msg or heartbeat sent will timeout */ + struct timeval next_timeout; + + /* Timeout duration */ + unsigned short timeout_duration; + + struct dtls1_state_internal_st *internal; +} DTLS1_STATE; + +typedef struct dtls1_record_data_st { + unsigned char *packet; + unsigned int packet_length; + SSL3_BUFFER rbuf; + SSL3_RECORD rrec; +} DTLS1_RECORD_DATA; + +#endif + +/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ +#define DTLS1_TMO_READ_COUNT 2 +#define DTLS1_TMO_WRITE_COUNT 2 + +#define DTLS1_TMO_ALERT_COUNT 12 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ec.h b/src/3rdparty/win32_include/openssl/ec.h new file mode 100644 index 000000000..dc70cfa6a --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ec.h @@ -0,0 +1,1169 @@ +/* $OpenBSD: ec.h,v 1.12 2016/11/04 17:33:19 miod Exp $ */ +/* + * Originally written by Bodo Moeller for the OpenSSL project. + */ +/** + * \file crypto/ec/ec.h Include file for the OpenSSL EC functions + * \author Originally written by Bodo Moeller for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * The elliptic curve binary polynomial software is originally written by + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. + * + */ + +#ifndef HEADER_EC_H +#define HEADER_EC_H + +#include + +#ifdef OPENSSL_NO_EC +#error EC is disabled. +#endif + +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef __cplusplus +extern "C" { +#elif defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +#endif + + +#ifndef OPENSSL_ECC_MAX_FIELD_BITS +# define OPENSSL_ECC_MAX_FIELD_BITS 661 +#endif + +/** Enum for the point conversion form as defined in X9.62 (ECDSA) + * for the encoding of a elliptic curve point (x,y) */ +typedef enum { + /** the point is encoded as z||x, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_COMPRESSED = 2, + /** the point is encoded as z||x||y, where z is the octet 0x02 */ + POINT_CONVERSION_UNCOMPRESSED = 4, + /** the point is encoded as z||x||y, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_HYBRID = 6 +} point_conversion_form_t; + + +typedef struct ec_method_st EC_METHOD; + +typedef struct ec_group_st + /* + EC_METHOD *meth; + -- field definition + -- curve coefficients + -- optional generator with associated information (order, cofactor) + -- optional extra data (precomputed table for fast computation of multiples of generator) + -- ASN1 stuff + */ + EC_GROUP; + +typedef struct ec_point_st EC_POINT; + + +/********************************************************************/ +/* EC_METHODs for curves over GF(p) */ +/********************************************************************/ + +/** Returns the basic GFp ec methods which provides the basis for the + * optimized methods. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_simple_method(void); + +/** Returns GFp methods using montgomery multiplication. + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_mont_method(void); + +/** Returns GFp methods using optimized methods for NIST recommended curves + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nist_method(void); + +#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +/** Returns 64-bit optimized methods for nistp224 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp224_method(void); + +/** Returns 64-bit optimized methods for nistp256 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp256_method(void); + +/** Returns 64-bit optimized methods for nistp521 + * \return EC_METHOD object + */ +const EC_METHOD *EC_GFp_nistp521_method(void); +#endif + +#ifndef OPENSSL_NO_EC2M +/********************************************************************/ +/* EC_METHOD for curves over GF(2^m) */ +/********************************************************************/ + +/** Returns the basic GF2m ec method + * \return EC_METHOD object + */ +const EC_METHOD *EC_GF2m_simple_method(void); + +#endif + + +/********************************************************************/ +/* EC_GROUP functions */ +/********************************************************************/ + +/** Creates a new EC_GROUP object + * \param meth EC_METHOD to use + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_new(const EC_METHOD *meth); + +/** Frees a EC_GROUP object + * \param group EC_GROUP object to be freed. + */ +void EC_GROUP_free(EC_GROUP *group); + +/** Clears and frees a EC_GROUP object + * \param group EC_GROUP object to be cleared and freed. + */ +void EC_GROUP_clear_free(EC_GROUP *group); + +/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD. + * \param dst destination EC_GROUP object + * \param src source EC_GROUP object + * \return 1 on success and 0 if an error occurred. + */ +int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); + +/** Creates a new EC_GROUP object and copies the copies the content + * form src to the newly created EC_KEY object + * \param src source EC_GROUP object + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_dup(const EC_GROUP *src); + +/** Returns the EC_METHOD of the EC_GROUP object. + * \param group EC_GROUP object + * \return EC_METHOD used in this EC_GROUP object. + */ +const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); + +/** Returns the field type of the EC_METHOD. + * \param meth EC_METHOD object + * \return NID of the underlying field type OID. + */ +int EC_METHOD_get_field_type(const EC_METHOD *meth); + +/** Sets the generator and it's order/cofactor of a EC_GROUP object. + * \param group EC_GROUP object + * \param generator EC_POINT object with the generator. + * \param order the order of the group generated by the generator. + * \param cofactor the index of the sub-group generated by the generator + * in the group of all points on the elliptic curve. + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor); + +/** Returns the generator of a EC_GROUP object. + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). + */ +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); + +/** Gets the order of a EC_GROUP + * \param group EC_GROUP object + * \param order BIGNUM to which the order is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); + +/** Gets the cofactor of a EC_GROUP + * \param group EC_GROUP object + * \param cofactor BIGNUM to which the cofactor is copied + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx); + +/** Sets the name of a EC_GROUP object + * \param group EC_GROUP object + * \param nid NID of the curve name OID + */ +void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); + +/** Returns the curve name of a EC_GROUP object + * \param group EC_GROUP object + * \return NID of the curve name OID or 0 if not set. + */ +int EC_GROUP_get_curve_name(const EC_GROUP *group); + +void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); +int EC_GROUP_get_asn1_flag(const EC_GROUP *group); + +void EC_GROUP_set_point_conversion_form(EC_GROUP *group, point_conversion_form_t form); +point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); + +unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); +size_t EC_GROUP_get_seed_len(const EC_GROUP *); +size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); + +/** Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM with the prime number + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GFp defined by y^2 = x^3 + a*x + b + * \param group EC_GROUP object + * \param p BIGNUM for the prime number + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx); + +#ifndef OPENSSL_NO_EC2M +/** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameter of the ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b + * \param group EC_GROUP object + * \param p BIGNUM for the polynomial defining the underlying field + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx); +#endif +/** Returns the number of bits needed to represent a field element + * \param group EC_GROUP object + * \return number of bits needed to represent a field element + */ +int EC_GROUP_get_degree(const EC_GROUP *group); + +/** Checks whether the parameter in the EC_GROUP define a valid ec group + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if group is a valid ec group and 0 otherwise + */ +int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); + +/** Checks whether the discriminant of the elliptic curve is zero or not + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if the discriminant is not zero and 0 otherwise + */ +int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); + +/** Compares two EC_GROUP objects + * \param a first EC_GROUP object + * \param b second EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 0 if both groups are equal and 1 otherwise + */ +int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); + +/* EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() + * after choosing an appropriate EC_METHOD */ + +/** Creates a new EC_GROUP object with the specified parameters defined + * over GFp (defined by the equation y^2 = x^3 + a*x + b) + * \param p BIGNUM with the prime number + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +#ifndef OPENSSL_NO_EC2M +/** Creates a new EC_GROUP object with the specified parameters defined + * over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b) + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +#endif +/** Creates a EC_GROUP object with a curve specified by a NID + * \param nid NID of the OID of the curve name + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_by_curve_name(int nid); + + +/********************************************************************/ +/* handling of internal curves */ +/********************************************************************/ + +typedef struct { + int nid; + const char *comment; + } EC_builtin_curve; + +/* EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number + * of all available curves or zero if a error occurred. + * In case r ist not zero nitems EC_builtin_curve structures + * are filled with the data of the first nitems internal groups */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + +const char *EC_curve_nid2nist(int nid); +int EC_curve_nist2nid(const char *name); + +/********************************************************************/ +/* EC_POINT functions */ +/********************************************************************/ + +/** Creates a new EC_POINT object for the specified EC_GROUP + * \param group EC_GROUP the underlying EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_new(const EC_GROUP *group); + +/** Frees a EC_POINT object + * \param point EC_POINT object to be freed + */ +void EC_POINT_free(EC_POINT *point); + +/** Clears and frees a EC_POINT object + * \param point EC_POINT object to be cleared and freed + */ +void EC_POINT_clear_free(EC_POINT *point); + +/** Copies EC_POINT object + * \param dst destination EC_POINT object + * \param src source EC_POINT object + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); + +/** Creates a new EC_POINT object and copies the content of the supplied + * EC_POINT + * \param src source EC_POINT object + * \param group underlying the EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); + +/** Returns the EC_METHOD used in EC_POINT object + * \param point EC_POINT object + * \return the EC_METHOD used + */ +const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); + +/** Sets a point to infinity (neutral element) + * \param group underlying EC_GROUP object + * \param point EC_POINT to set to infinity + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); + +/** Sets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param z BIGNUM with the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx); + +/** Gets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param z BIGNUM for the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx); + +/** Sets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, int y_bit, BN_CTX *ctx); +#ifndef OPENSSL_NO_EC2M +/** Sets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx); + +/** Gets the affine coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, + const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT over GF2m + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, int y_bit, BN_CTX *ctx); +#endif +/** Encodes a EC_POINT object to a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param form point conversion form + * \param buf memory buffer for the result. If NULL the function returns + * required buffer size. + * \param len length of the memory buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, + point_conversion_form_t form, + unsigned char *buf, size_t len, BN_CTX *ctx); + +/** Decodes a EC_POINT from a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param buf memory buffer with the encoded ec point + * \param len length of the encoded ec point + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, + const unsigned char *buf, size_t len, BN_CTX *ctx); + +/* other interfaces to point2oct/oct2point: */ +BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BIGNUM *, BN_CTX *); +EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, + EC_POINT *, BN_CTX *); +char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BN_CTX *); +EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, + EC_POINT *, BN_CTX *); + + +/********************************************************************/ +/* functions for doing EC_POINT arithmetic */ +/********************************************************************/ + +/** Computes the sum of two EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = a + b) + * \param a EC_POINT object with the first summand + * \param b EC_POINT object with the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx); + +/** Computes the double of a EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = 2 * a) + * \param a EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx); + +/** Computes the inverse of a EC_POINT + * \param group underlying EC_GROUP object + * \param a EC_POINT object to be inverted (it's used for the result as well) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); + +/** Checks whether the point is the neutral element of the group + * \param group the underlying EC_GROUP object + * \param p EC_POINT object + * \return 1 if the point is the neutral element and 0 otherwise + */ +int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); + +/** Checks whether the point is on the curve + * \param group underlying EC_GROUP object + * \param point EC_POINT object to check + * \param ctx BN_CTX object (optional) + * \return 1 if point if on the curve and 0 otherwise + */ +int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx); + +/** Compares two EC_POINTs + * \param group underlying EC_GROUP object + * \param a first EC_POINT object + * \param b second EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 0 if both points are equal and a value != 0 otherwise + */ +int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx); + +int EC_POINT_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx); +int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], BN_CTX *ctx); + +/** Computes r = generator * n sum_{i=0}^num p[i] * m[i] + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param num number futher summands + * \param p array of size num of EC_POINT objects + * \param m array of size num of BIGNUM objects + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, size_t num, const EC_POINT *p[], const BIGNUM *m[], BN_CTX *ctx); + +/** Computes r = generator * n + q * m + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param q EC_POINT object with the first factor of the second summand + * \param m BIGNUM with the second factor of the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); + +/** Stores multiples of generator for faster point multiplication + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occured + */ +int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx); + +/** Reports whether a precomputation has been done + * \param group EC_GROUP object + * \return 1 if a pre-computation has been done and 0 otherwise + */ +int EC_GROUP_have_precompute_mult(const EC_GROUP *group); + + +/********************************************************************/ +/* ASN1 stuff */ +/********************************************************************/ + +/* EC_GROUP_get_basis_type() returns the NID of the basis type + * used to represent the field elements */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +#ifndef OPENSSL_NO_EC2M +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); +#endif + +#define OPENSSL_EC_NAMED_CURVE 0x001 + +typedef struct ecpk_parameters_st ECPKPARAMETERS; + +EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); +int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); + +#define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x) +#define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x) +#define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \ + (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x)) +#define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \ + (unsigned char *)(x)) + +#ifndef OPENSSL_NO_BIO +int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off); +#endif +int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off); + + +/********************************************************************/ +/* EC_KEY functions */ +/********************************************************************/ + +typedef struct ec_key_st EC_KEY; + +/* some values for the encoding_flag */ +#define EC_PKEY_NO_PARAMETERS 0x001 +#define EC_PKEY_NO_PUBKEY 0x002 + +/* some values for the flags field */ +#define EC_FLAG_NON_FIPS_ALLOW 0x1 +#define EC_FLAG_FIPS_CHECKED 0x2 + +/** Creates a new EC_KEY object. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new(void); + +int EC_KEY_get_flags(const EC_KEY *key); + +void EC_KEY_set_flags(EC_KEY *key, int flags); + +void EC_KEY_clear_flags(EC_KEY *key, int flags); + +/** Creates a new EC_KEY object using a named curve as underlying + * EC_GROUP object. + * \param nid NID of the named curve. + * \return EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_new_by_curve_name(int nid); + +/** Frees a EC_KEY object. + * \param key EC_KEY object to be freed. + */ +void EC_KEY_free(EC_KEY *key); + +/** Copies a EC_KEY object. + * \param dst destination EC_KEY object + * \param src src EC_KEY object + * \return dst or NULL if an error occurred. + */ +EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); + +/** Creates a new EC_KEY object and copies the content from src to it. + * \param src the source EC_KEY object + * \return newly created EC_KEY object or NULL if an error occurred. + */ +EC_KEY *EC_KEY_dup(const EC_KEY *src); + +/** Increases the internal reference count of a EC_KEY object. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_up_ref(EC_KEY *key); + +/** Returns the EC_GROUP object of a EC_KEY object + * \param key EC_KEY object + * \return the EC_GROUP object (possibly NULL). + */ +const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); + +/** Sets the EC_GROUP of a EC_KEY object. + * \param key EC_KEY object + * \param group EC_GROUP to use in the EC_KEY object (note: the EC_KEY + * object will use an own copy of the EC_GROUP). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); + +/** Returns the private key of a EC_KEY object. + * \param key EC_KEY object + * \return a BIGNUM with the private key (possibly NULL). + */ +const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); + +/** Sets the private key of a EC_KEY object. + * \param key EC_KEY object + * \param prv BIGNUM with the private key (note: the EC_KEY object + * will use an own copy of the BIGNUM). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); + +/** Returns the public key of a EC_KEY object. + * \param key the EC_KEY object + * \return a EC_POINT object with the public key (possibly NULL) + */ +const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); + +/** Sets the public key of a EC_KEY object. + * \param key EC_KEY object + * \param pub EC_POINT object with the public key (note: the EC_KEY object + * will use an own copy of the EC_POINT object). + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); + +unsigned EC_KEY_get_enc_flags(const EC_KEY *key); +void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); +point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); +void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform); +/* functions to set/get method specific data */ +void *EC_KEY_get_key_method_data(EC_KEY *key, + void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); +/** Sets the key method data of an EC_KEY object, if none has yet been set. + * \param key EC_KEY object + * \param data opaque data to install. + * \param dup_func a function that duplicates |data|. + * \param free_func a function that frees |data|. + * \param clear_free_func a function that wipes and frees |data|. + * \return the previously set data pointer, or NULL if |data| was inserted. + */ +void *EC_KEY_insert_key_method_data(EC_KEY *key, void *data, + void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *)); +/* wrapper functions for the underlying EC_GROUP object */ +void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); + +/** Creates a table of pre-computed multiples of the generator to + * accelerate further EC_KEY operations. + * \param key EC_KEY object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); + +/** Creates a new ec private (and optional a new public) key. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +int EC_KEY_generate_key(EC_KEY *key); + +/** Verifies that a private and/or public key is valid. + * \param key the EC_KEY object + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_check_key(const EC_KEY *key); + +/** Sets a public key from affine coordindates performing + * neccessary NIST PKV tests. + * \param key the EC_KEY object + * \param x public key x coordinate + * \param y public key y coordinate + * \return 1 on success and 0 otherwise. + */ +int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y); + + +/********************************************************************/ +/* de- and encoding functions for SEC1 ECPrivateKey */ +/********************************************************************/ + +/** Decodes a private key from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded private key + * \param len length of the DER encoded private key + * \return the decoded private key or NULL if an error occurred. + */ +EC_KEY *d2i_ECPrivateKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a private key object and stores the result in a buffer. + * \param key the EC_KEY object to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECPrivateKey(EC_KEY *key, unsigned char **out); + + +/********************************************************************/ +/* de- and encoding functions for EC parameters */ +/********************************************************************/ + +/** Decodes ec parameter from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded ec parameters + * \param len length of the DER encoded ec parameters + * \return a EC_KEY object with the decoded parameters or NULL if an error + * occurred. + */ +EC_KEY *d2i_ECParameters(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes ec parameter and stores the result in a buffer. + * \param key the EC_KEY object with ec paramters to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +int i2d_ECParameters(EC_KEY *key, unsigned char **out); + + +/********************************************************************/ +/* de- and encoding functions for EC public key */ +/* (octet string, not DER -- hence 'o2i' and 'i2o') */ +/********************************************************************/ + +/** Decodes a ec public key from a octet string. + * \param key a pointer to a EC_KEY object which should be used + * \param in memory buffer with the encoded public key + * \param len length of the encoded public key + * \return EC_KEY object with decoded public key or NULL if an error + * occurred. + */ +EC_KEY *o2i_ECPublicKey(EC_KEY **key, const unsigned char **in, long len); + +/** Encodes a ec public key in an octet string. + * \param key the EC_KEY object with the public key + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred + */ +int i2o_ECPublicKey(EC_KEY *key, unsigned char **out); + +#ifndef OPENSSL_NO_BIO +/** Prints out the ec parameters on human readable form. + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print(BIO *bp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); + +#endif +/** Prints out the ec parameters on human readable form. + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +int ECParameters_print_fp(FILE *fp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); + +EC_KEY *ECParameters_dup(EC_KEY *key); + +#ifndef __cplusplus +#if defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif +#endif + +#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_EC, EVP_PKEY_OP_PARAMGEN, \ + EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID, nid, NULL) + + +#define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) + +/* 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. + */ +void ERR_load_EC_strings(void); + +/* Error codes for the EC functions. */ + +/* Function codes. */ +#define EC_F_BN_TO_FELEM 224 +#define EC_F_COMPUTE_WNAF 143 +#define EC_F_D2I_ECPARAMETERS 144 +#define EC_F_D2I_ECPKPARAMETERS 145 +#define EC_F_D2I_ECPRIVATEKEY 146 +#define EC_F_DO_EC_KEY_PRINT 221 +#define EC_F_ECKEY_PARAM2TYPE 223 +#define EC_F_ECKEY_PARAM_DECODE 212 +#define EC_F_ECKEY_PRIV_DECODE 213 +#define EC_F_ECKEY_PRIV_ENCODE 214 +#define EC_F_ECKEY_PUB_DECODE 215 +#define EC_F_ECKEY_PUB_ENCODE 216 +#define EC_F_ECKEY_TYPE2PARAM 220 +#define EC_F_ECPARAMETERS_PRINT 147 +#define EC_F_ECPARAMETERS_PRINT_FP 148 +#define EC_F_ECPKPARAMETERS_PRINT 149 +#define EC_F_ECPKPARAMETERS_PRINT_FP 150 +#define EC_F_ECP_NIST_MOD_192 203 +#define EC_F_ECP_NIST_MOD_224 204 +#define EC_F_ECP_NIST_MOD_256 205 +#define EC_F_ECP_NIST_MOD_521 206 +#define EC_F_ECP_NISTZ256_GET_AFFINE 240 +#define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE 243 +#define EC_F_ECP_NISTZ256_POINTS_MUL 241 +#define EC_F_ECP_NISTZ256_PRE_COMP_NEW 244 +#define EC_F_ECP_NISTZ256_SET_WORDS 245 +#define EC_F_ECP_NISTZ256_WINDOWED_MUL 242 +#define EC_F_EC_ASN1_GROUP2CURVE 153 +#define EC_F_EC_ASN1_GROUP2FIELDID 154 +#define EC_F_EC_ASN1_GROUP2PARAMETERS 155 +#define EC_F_EC_ASN1_GROUP2PKPARAMETERS 156 +#define EC_F_EC_ASN1_PARAMETERS2GROUP 157 +#define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 +#define EC_F_EC_EX_DATA_SET_DATA 211 +#define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 208 +#define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +#define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 +#define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 +#define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 +#define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 +#define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 +#define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 +#define EC_F_EC_GFP_MONT_FIELD_DECODE 133 +#define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 +#define EC_F_EC_GFP_MONT_FIELD_MUL 131 +#define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 209 +#define EC_F_EC_GFP_MONT_FIELD_SQR 132 +#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189 +#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP 135 +#define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 225 +#define EC_F_EC_GFP_NISTP224_POINTS_MUL 228 +#define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 226 +#define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE 230 +#define EC_F_EC_GFP_NISTP256_POINTS_MUL 231 +#define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 232 +#define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE 233 +#define EC_F_EC_GFP_NISTP521_POINTS_MUL 234 +#define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 235 +#define EC_F_EC_GFP_NIST_FIELD_MUL 200 +#define EC_F_EC_GFP_NIST_FIELD_SQR 201 +#define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202 +#define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 +#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 +#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 100 +#define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR 101 +#define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 +#define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 +#define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 +#define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 +#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 +#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105 +#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 +#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128 +#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 +#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129 +#define EC_F_EC_GROUP_CHECK 170 +#define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 +#define EC_F_EC_GROUP_COPY 106 +#define EC_F_EC_GROUP_GET0_GENERATOR 139 +#define EC_F_EC_GROUP_GET_COFACTOR 140 +#define EC_F_EC_GROUP_GET_CURVE_GF2M 172 +#define EC_F_EC_GROUP_GET_CURVE_GFP 130 +#define EC_F_EC_GROUP_GET_DEGREE 173 +#define EC_F_EC_GROUP_GET_ORDER 141 +#define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 +#define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 +#define EC_F_EC_GROUP_NEW 108 +#define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 174 +#define EC_F_EC_GROUP_NEW_FROM_DATA 175 +#define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 +#define EC_F_EC_GROUP_SET_CURVE_GF2M 176 +#define EC_F_EC_GROUP_SET_CURVE_GFP 109 +#define EC_F_EC_GROUP_SET_EXTRA_DATA 110 +#define EC_F_EC_GROUP_SET_GENERATOR 111 +#define EC_F_EC_KEY_CHECK_KEY 177 +#define EC_F_EC_KEY_COPY 178 +#define EC_F_EC_KEY_GENERATE_KEY 179 +#define EC_F_EC_KEY_NEW 182 +#define EC_F_EC_KEY_PRINT 180 +#define EC_F_EC_KEY_PRINT_FP 181 +#define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 229 +#define EC_F_EC_POINTS_MAKE_AFFINE 136 +#define EC_F_EC_POINT_ADD 112 +#define EC_F_EC_POINT_CMP 113 +#define EC_F_EC_POINT_COPY 114 +#define EC_F_EC_POINT_DBL 115 +#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 +#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 +#define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 +#define EC_F_EC_POINT_INVERT 210 +#define EC_F_EC_POINT_IS_AT_INFINITY 118 +#define EC_F_EC_POINT_IS_ON_CURVE 119 +#define EC_F_EC_POINT_MAKE_AFFINE 120 +#define EC_F_EC_POINT_MUL 184 +#define EC_F_EC_POINT_NEW 121 +#define EC_F_EC_POINT_OCT2POINT 122 +#define EC_F_EC_POINT_POINT2OCT 123 +#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 +#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 +#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 +#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 +#define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 +#define EC_F_EC_POINT_SET_TO_INFINITY 127 +#define EC_F_EC_PRE_COMP_DUP 207 +#define EC_F_EC_PRE_COMP_NEW 196 +#define EC_F_EC_WNAF_MUL 187 +#define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 +#define EC_F_I2D_ECPARAMETERS 190 +#define EC_F_I2D_ECPKPARAMETERS 191 +#define EC_F_I2D_ECPRIVATEKEY 192 +#define EC_F_I2O_ECPUBLICKEY 151 +#define EC_F_NISTP224_PRE_COMP_NEW 227 +#define EC_F_NISTP256_PRE_COMP_NEW 236 +#define EC_F_NISTP521_PRE_COMP_NEW 237 +#define EC_F_O2I_ECPUBLICKEY 152 +#define EC_F_OLD_EC_PRIV_DECODE 222 +#define EC_F_PKEY_EC_CTRL 197 +#define EC_F_PKEY_EC_CTRL_STR 198 +#define EC_F_PKEY_EC_DERIVE 217 +#define EC_F_PKEY_EC_KEYGEN 199 +#define EC_F_PKEY_EC_PARAMGEN 219 +#define EC_F_PKEY_EC_SIGN 218 + +/* Reason codes. */ +#define EC_R_ASN1_ERROR 115 +#define EC_R_ASN1_UNKNOWN_FIELD 116 +#define EC_R_BIGNUM_OUT_OF_RANGE 144 +#define EC_R_BUFFER_TOO_SMALL 100 +#define EC_R_COORDINATES_OUT_OF_RANGE 146 +#define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 +#define EC_R_DECODE_ERROR 142 +#define EC_R_DISCRIMINANT_IS_ZERO 118 +#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +#define EC_R_FIELD_TOO_LARGE 143 +#define EC_R_GF2M_NOT_SUPPORTED 147 +#define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +#define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 +#define EC_R_INCOMPATIBLE_OBJECTS 101 +#define EC_R_INVALID_ARGUMENT 112 +#define EC_R_INVALID_COMPRESSED_POINT 110 +#define EC_R_INVALID_COMPRESSION_BIT 109 +#define EC_R_INVALID_CURVE 141 +#define EC_R_INVALID_DIGEST_TYPE 138 +#define EC_R_INVALID_ENCODING 102 +#define EC_R_INVALID_FIELD 103 +#define EC_R_INVALID_FORM 104 +#define EC_R_INVALID_GROUP_ORDER 122 +#define EC_R_INVALID_PENTANOMIAL_BASIS 132 +#define EC_R_INVALID_PRIVATE_KEY 123 +#define EC_R_INVALID_TRINOMIAL_BASIS 137 +#define EC_R_KEYS_NOT_SET 140 +#define EC_R_MISSING_PARAMETERS 124 +#define EC_R_MISSING_PRIVATE_KEY 125 +#define EC_R_NOT_A_NIST_PRIME 135 +#define EC_R_NOT_A_SUPPORTED_NIST_PRIME 136 +#define EC_R_NOT_IMPLEMENTED 126 +#define EC_R_NOT_INITIALIZED 111 +#define EC_R_NO_FIELD_MOD 133 +#define EC_R_NO_PARAMETERS_SET 139 +#define EC_R_PASSED_NULL_PARAMETER 134 +#define EC_R_PKPARAMETERS2GROUP_FAILURE 127 +#define EC_R_POINT_AT_INFINITY 106 +#define EC_R_POINT_IS_NOT_ON_CURVE 107 +#define EC_R_SLOT_FULL 108 +#define EC_R_UNDEFINED_GENERATOR 113 +#define EC_R_UNDEFINED_ORDER 128 +#define EC_R_UNKNOWN_GROUP 129 +#define EC_R_UNKNOWN_ORDER 114 +#define EC_R_UNSUPPORTED_FIELD 131 +#define EC_R_WRONG_CURVE_PARAMETERS 145 +#define EC_R_WRONG_ORDER 130 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ecdh.h b/src/3rdparty/win32_include/openssl/ecdh.h new file mode 100644 index 000000000..ccc1312fd --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ecdh.h @@ -0,0 +1,128 @@ +/* $OpenBSD: ecdh.h,v 1.5 2015/09/13 12:03:07 jsing Exp $ */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * The Elliptic Curve Public-Key Crypto Library (ECC Code) included + * herein is developed by SUN MICROSYSTEMS, INC., and is contributed + * to the OpenSSL project. + * + * The ECC Code is licensed pursuant to the OpenSSL open source + * license provided below. + * + * The ECDH software is originally written by Douglas Stebila of + * Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDH_H +#define HEADER_ECDH_H + +#include + +#ifdef OPENSSL_NO_ECDH +#error ECDH is disabled. +#endif + +#include +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +const ECDH_METHOD *ECDH_OpenSSL(void); + +void ECDH_set_default_method(const ECDH_METHOD *); +const ECDH_METHOD *ECDH_get_default_method(void); +int ECDH_set_method(EC_KEY *, const ECDH_METHOD *); + +int ECDH_size(const EC_KEY *ecdh); +int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, + EC_KEY *ecdh, + void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen)); + +int ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new +*new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int ECDH_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDH_get_ex_data(EC_KEY *d, int idx); + + +/* 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. + */ +void ERR_load_ECDH_strings(void); + +/* Error codes for the ECDH functions. */ + +/* Function codes. */ +#define ECDH_F_ECDH_CHECK 102 +#define ECDH_F_ECDH_COMPUTE_KEY 100 +#define ECDH_F_ECDH_DATA_NEW_METHOD 101 + +/* Reason codes. */ +#define ECDH_R_KDF_FAILED 102 +#define ECDH_R_KEY_TRUNCATION 104 +#define ECDH_R_NON_FIPS_METHOD 103 +#define ECDH_R_NO_PRIVATE_VALUE 100 +#define ECDH_R_POINT_ARITHMETIC_FAILURE 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ecdsa.h b/src/3rdparty/win32_include/openssl/ecdsa.h new file mode 100644 index 000000000..530ab265b --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ecdsa.h @@ -0,0 +1,286 @@ +/* $OpenBSD: ecdsa.h,v 1.4 2015/02/08 13:35:06 jsing Exp $ */ +/** + * \file crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions + * \author Written by Nils Larsch for the OpenSSL project + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_ECDSA_H +#define HEADER_ECDSA_H + +#include + +#ifdef OPENSSL_NO_ECDSA +#error ECDSA is disabled. +#endif + +#include +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ECDSA_SIG_st ECDSA_SIG; + +struct ecdsa_method { + const char *name; + ECDSA_SIG *(*ecdsa_do_sign)(const unsigned char *dgst, int dgst_len, + const BIGNUM *inv, const BIGNUM *rp, EC_KEY *eckey); + int (*ecdsa_sign_setup)(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, + BIGNUM **r); + int (*ecdsa_do_verify)(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY *eckey); +#if 0 + int (*init)(EC_KEY *eckey); + int (*finish)(EC_KEY *eckey); +#endif + int flags; + char *app_data; +}; + +/* If this flag is set the ECDSA method is FIPS compliant and can be used + * in FIPS mode. This is set in the validated module method. If an + * application sets this flag in its own methods it is its responsibility + * to ensure the result is compliant. + */ + +#define ECDSA_FLAG_FIPS_METHOD 0x1 + +struct ECDSA_SIG_st { + BIGNUM *r; + BIGNUM *s; +}; + +/** Allocates and initialize a ECDSA_SIG structure + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_SIG_new(void); + +/** frees a ECDSA_SIG structure + * \param sig pointer to the ECDSA_SIG structure + */ +void ECDSA_SIG_free(ECDSA_SIG *sig); + +/** DER encode content of ECDSA_SIG object (note: this function modifies *pp + * (*pp += length of the DER encoded signature)). + * \param sig pointer to the ECDSA_SIG object + * \param pp pointer to a unsigned char pointer for the output or NULL + * \return the length of the DER encoded ECDSA_SIG object or 0 + */ +int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp); + +/** Decodes a DER encoded ECDSA signature (note: this function changes *pp + * (*pp += len)). + * \param sig pointer to ECDSA_SIG pointer (may be NULL) + * \param pp memory buffer with the DER encoded signature + * \param len length of the buffer + * \return pointer to the decoded ECDSA_SIG structure (or NULL) + */ +ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len); + +/** 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 + * \param dgst_len length of the hash value + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst, int dgst_len, + EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen, + const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey); + +/** Verifies that the supplied signature is a valid ECDSA + * signature of the supplied hash value using the supplied public key. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param sig ECDSA_SIG structure + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_do_verify(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY* eckey); + +const ECDSA_METHOD *ECDSA_OpenSSL(void); + +/** Sets the default ECDSA method + * \param meth new default ECDSA_METHOD + */ +void ECDSA_set_default_method(const ECDSA_METHOD *meth); + +/** Returns the default ECDSA method + * \return pointer to ECDSA_METHOD structure containing the default method + */ +const ECDSA_METHOD *ECDSA_get_default_method(void); + +/** Sets method to be used for the ECDSA operations + * \param eckey EC_KEY object + * \param meth new method + * \return 1 on success and 0 otherwise + */ +int ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth); + +/** Returns the maximum length of the DER encoded signature + * \param eckey EC_KEY object + * \return numbers of bytes required for the DER encoded signature + */ +int ECDSA_size(const EC_KEY *eckey); + +/** Precompute parts of the signing operation + * \param eckey EC_KEY object containing a private EC key + * \param ctx BN_CTX object (optional) + * \param kinv BIGNUM pointer for the inverse of k + * \param rp BIGNUM pointer for x coordinate of k * generator + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, + BIGNUM **rp); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig memory for the DER encoded created signature + * \param siglen pointer to the length of the returned signature + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, EC_KEY *eckey); + + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig buffer to hold the DER encoded signature + * \param siglen pointer to the length of the returned signature + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optioanl), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen, + unsigned char *sig, unsigned int *siglen, const BIGNUM *kinv, + const BIGNUM *rp, EC_KEY *eckey); + +/** Verifies that the given signature is valid ECDSA signature + * of the supplied hash value using the specified public key. + * \param type this parameter is ignored + * \param dgst pointer to the hash value + * \param dgstlen length of the hash value + * \param sig pointer to the DER encoded signature + * \param siglen length of the DER encoded signature + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, + const unsigned char *sig, int siglen, EC_KEY *eckey); + +/* the standard ex_data functions */ +int ECDSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg); +void *ECDSA_get_ex_data(EC_KEY *d, int idx); + + +/* 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. + */ +void ERR_load_ECDSA_strings(void); + +/* Error codes for the ECDSA functions. */ + +/* Function codes. */ +#define ECDSA_F_ECDSA_CHECK 104 +#define ECDSA_F_ECDSA_DATA_NEW_METHOD 100 +#define ECDSA_F_ECDSA_DO_SIGN 101 +#define ECDSA_F_ECDSA_DO_VERIFY 102 +#define ECDSA_F_ECDSA_SIGN_SETUP 103 + +/* Reason codes. */ +#define ECDSA_R_BAD_SIGNATURE 100 +#define ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 101 +#define ECDSA_R_ERR_EC_LIB 102 +#define ECDSA_R_MISSING_PARAMETERS 103 +#define ECDSA_R_NEED_NEW_SETUP_VALUES 106 +#define ECDSA_R_NON_FIPS_METHOD 107 +#define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED 104 +#define ECDSA_R_SIGNATURE_MALLOC_FAILED 105 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/engine.h b/src/3rdparty/win32_include/openssl/engine.h new file mode 100644 index 000000000..30d1bde4a --- /dev/null +++ b/src/3rdparty/win32_include/openssl/engine.h @@ -0,0 +1,807 @@ +/* $OpenBSD: engine.h,v 1.31 2015/07/19 22:34:27 doug Exp $ */ +/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL + * project 2000. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_ENGINE_H +#define HEADER_ENGINE_H + +#include + +#ifdef OPENSSL_NO_ENGINE +#error ENGINE is disabled. +#endif + +#ifndef OPENSSL_NO_DEPRECATED +#include +#ifndef OPENSSL_NO_RSA +#include +#endif +#ifndef OPENSSL_NO_DSA +#include +#endif +#ifndef OPENSSL_NO_DH +#include +#endif +#ifndef OPENSSL_NO_ECDH +#include +#endif +#ifndef OPENSSL_NO_ECDSA +#include +#endif +#include +#include +#endif + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* These flags are used to control combinations of algorithm (methods) + * by bitwise "OR"ing. */ +#define ENGINE_METHOD_RSA (unsigned int)0x0001 +#define ENGINE_METHOD_DSA (unsigned int)0x0002 +#define ENGINE_METHOD_DH (unsigned int)0x0004 +#define ENGINE_METHOD_RAND (unsigned int)0x0008 +#define ENGINE_METHOD_ECDH (unsigned int)0x0010 +#define ENGINE_METHOD_ECDSA (unsigned int)0x0020 +#define ENGINE_METHOD_CIPHERS (unsigned int)0x0040 +#define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 +#define ENGINE_METHOD_STORE (unsigned int)0x0100 +#define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200 +#define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400 +/* Obvious all-or-nothing cases. */ +#define ENGINE_METHOD_ALL (unsigned int)0xFFFF +#define ENGINE_METHOD_NONE (unsigned int)0x0000 + +/* This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used + * internally to control registration of ENGINE implementations, and can be set + * by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to + * initialise registered ENGINEs if they are not already initialised. */ +#define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 + +/* ENGINE flags that can be set by ENGINE_set_flags(). */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ /* Not used */ + +/* This flag is for ENGINEs that wish to handle the various 'CMD'-related + * control commands on their own. Without this flag, ENGINE_ctrl() handles these + * control commands on behalf of the ENGINE using their "cmd_defns" data. */ +#define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 + +/* This flag is for ENGINEs who return new duplicate structures when found via + * "ENGINE_by_id()". When an ENGINE must store state (eg. if ENGINE_ctrl() + * commands are called in sequence as part of some stateful process like + * key-generation setup and execution), it can set this flag - then each attempt + * to obtain the ENGINE will result in it being copied into a new structure. + * Normally, ENGINEs don't declare this flag so ENGINE_by_id() just increments + * the existing ENGINE's structural reference count. */ +#define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 + +/* This flag if for an ENGINE that does not want its methods registered as + * part of ENGINE_register_all_complete() for example if the methods are + * not usable as default methods. + */ + +#define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008 + +/* ENGINEs can support their own command types, and these flags are used in + * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input each + * command expects. Currently only numeric and string input is supported. If a + * control command supports none of the _NUMERIC, _STRING, or _NO_INPUT options, + * then it is regarded as an "internal" control command - and not for use in + * config setting situations. As such, they're not available to the + * ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() access. Changes to + * this list of 'command types' should be reflected carefully in + * ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). */ + +/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ +#define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 +/* accepts string input (cast from 'void*' to 'const char *', 4th parameter to + * ENGINE_ctrl) */ +#define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 +/* Indicates that the control command takes *no* input. Ie. the control command + * is unparameterised. */ +#define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 +/* Indicates that the control command is internal. This control command won't + * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() + * function. */ +#define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 + +/* NB: These 3 control commands are deprecated and should not be used. ENGINEs + * relying on these commands should compile conditional support for + * compatibility (eg. if these symbols are defined) but should also migrate the + * same functionality to their own ENGINE-specific control functions that can be + * "discovered" by calling applications. The fact these control commands + * wouldn't be "executable" (ie. usable by text-based config) doesn't change the + * fact that application code can find and use them without requiring per-ENGINE + * hacking. */ + +/* These flags are used to tell the ctrl function what should be done. + * All command numbers are shared between all engines, even if some don't + * make sense to some engines. In such a case, they do nothing but return + * the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */ +#define ENGINE_CTRL_SET_LOGSTREAM 1 +#define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 +#define ENGINE_CTRL_HUP 3 /* Close and reinitialise any + handles/connections etc. */ +#define ENGINE_CTRL_SET_USER_INTERFACE 4 /* Alternative to callback */ +#define ENGINE_CTRL_SET_CALLBACK_DATA 5 /* User-specific data, used + when calling the password + callback and the user + interface */ +#define ENGINE_CTRL_LOAD_CONFIGURATION 6 /* Load a configuration, given + a string that represents a + file name or so */ +#define ENGINE_CTRL_LOAD_SECTION 7 /* Load data from a given + section in the already loaded + configuration */ + +/* These control commands allow an application to deal with an arbitrary engine + * in a dynamic way. Warn: Negative return values indicate errors FOR THESE + * COMMANDS because zero is used to indicate 'end-of-list'. Other commands, + * including ENGINE-specific command types, return zero for an error. + * + * An ENGINE can choose to implement these ctrl functions, and can internally + * manage things however it chooses - it does so by setting the + * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise the + * ENGINE_ctrl() code handles this on the ENGINE's behalf using the cmd_defns + * data (set using ENGINE_set_cmd_defns()). This means an ENGINE's ctrl() + * handler need only implement its own commands - the above "meta" commands will + * be taken care of. */ + +/* Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", then + * all the remaining control commands will return failure, so it is worth + * checking this first if the caller is trying to "discover" the engine's + * capabilities and doesn't want errors generated unnecessarily. */ +#define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 +/* Returns a positive command number for the first command supported by the + * engine. Returns zero if no ctrl commands are supported. */ +#define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 +/* The 'long' argument specifies a command implemented by the engine, and the + * return value is the next command supported, or zero if there are no more. */ +#define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 +/* The 'void*' argument is a command name (cast from 'const char *'), and the + * return value is the command that corresponds to it. */ +#define ENGINE_CTRL_GET_CMD_FROM_NAME 13 +/* The next two allow a command to be converted into its corresponding string + * form. In each case, the 'long' argument supplies the command. In the NAME_LEN + * case, the return value is the length of the command name (not counting a + * trailing EOL). In the NAME case, the 'void*' argument must be a string buffer + * large enough, and it will be populated with the name of the command (WITH a + * trailing EOL). */ +#define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 +#define ENGINE_CTRL_GET_NAME_FROM_CMD 15 +/* The next two are similar but give a "short description" of a command. */ +#define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 +#define ENGINE_CTRL_GET_DESC_FROM_CMD 17 +/* With this command, the return value is the OR'd combination of + * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given + * engine-specific ctrl command expects. */ +#define ENGINE_CTRL_GET_CMD_FLAGS 18 + +/* ENGINE implementations should start the numbering of their own control + * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). */ +#define ENGINE_CMD_BASE 200 + +/* If an ENGINE supports its own specific control commands and wishes the + * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on its + * behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN entries + * to ENGINE_set_cmd_defns(). It should also implement a ctrl() handler that + * supports the stated commands (ie. the "cmd_num" entries as described by the + * array). NB: The array must be ordered in increasing order of cmd_num. + * "null-terminated" means that the last ENGINE_CMD_DEFN element has cmd_num set + * to zero and/or cmd_name set to NULL. */ +typedef struct ENGINE_CMD_DEFN_st { + unsigned int cmd_num; /* The command number */ + const char *cmd_name; /* The command name itself */ + const char *cmd_desc; /* A short description of the command */ + unsigned int cmd_flags; /* The input the command expects */ +} ENGINE_CMD_DEFN; + +/* Generic function pointer */ +typedef int (*ENGINE_GEN_FUNC_PTR)(void); +/* Generic function pointer taking no arguments */ +typedef int (*ENGINE_GEN_INT_FUNC_PTR)(ENGINE *); +/* Specific control function pointer */ +typedef int (*ENGINE_CTRL_FUNC_PTR)(ENGINE *, int, long, void *, + void (*f)(void)); +/* Generic load_key function pointer */ +typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, + UI_METHOD *ui_method, void *callback_data); +typedef int (*ENGINE_SSL_CLIENT_CERT_PTR)(ENGINE *, SSL *ssl, + STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **pkey, + STACK_OF(X509) **pother, UI_METHOD *ui_method, void *callback_data); + +/* These callback types are for an ENGINE's handler for cipher and digest logic. + * These handlers have these prototypes; + * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); + * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); + * Looking at how to implement these handlers in the case of cipher support, if + * the framework wants the EVP_CIPHER for 'nid', it will call; + * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) + * If the framework wants a list of supported 'nid's, it will call; + * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) + */ +/* Returns to a pointer to the array of supported cipher 'nid's. If the second + * parameter is non-NULL it is set to the size of the returned array. */ +typedef int (*ENGINE_CIPHERS_PTR)(ENGINE *, const EVP_CIPHER **, + const int **, int); +typedef int (*ENGINE_DIGESTS_PTR)(ENGINE *, const EVP_MD **, const int **, int); +typedef int (*ENGINE_PKEY_METHS_PTR)(ENGINE *, EVP_PKEY_METHOD **, + const int **, int); +typedef int (*ENGINE_PKEY_ASN1_METHS_PTR)(ENGINE *, EVP_PKEY_ASN1_METHOD **, + const int **, int); + +/* STRUCTURE functions ... all of these functions deal with pointers to ENGINE + * structures where the pointers have a "structural reference". This means that + * their reference is to allowed access to the structure but it does not imply + * that the structure is functional. To simply increment or decrement the + * structural reference count, use ENGINE_by_id and ENGINE_free. NB: This is not + * required when iterating using ENGINE_get_next as it will automatically + * decrement the structural reference count of the "current" ENGINE and + * increment the structural reference count of the ENGINE it returns (unless it + * is NULL). */ + +/* Get the first/last "ENGINE" type available. */ +ENGINE *ENGINE_get_first(void); +ENGINE *ENGINE_get_last(void); +/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ +ENGINE *ENGINE_get_next(ENGINE *e); +ENGINE *ENGINE_get_prev(ENGINE *e); +/* Add another "ENGINE" type into the array. */ +int ENGINE_add(ENGINE *e); +/* Remove an existing "ENGINE" type from the array. */ +int ENGINE_remove(ENGINE *e); +/* Retrieve an engine from the list by its unique "id" value. */ +ENGINE *ENGINE_by_id(const char *id); +/* Add all the built-in engines. */ +void ENGINE_load_openssl(void); +void ENGINE_load_dynamic(void); +#ifndef OPENSSL_NO_STATIC_ENGINE +void ENGINE_load_padlock(void); +#endif +void ENGINE_load_builtin_engines(void); + +/* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation + * "registry" handling. */ +unsigned int ENGINE_get_table_flags(void); +void ENGINE_set_table_flags(unsigned int flags); + +/* Manage registration of ENGINEs per "table". For each type, there are 3 + * functions; + * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one) + * ENGINE_unregister_***(e) - unregister the implementation from 'e' + * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list + * Cleanup is automatically registered from each table when required, so + * ENGINE_cleanup() will reverse any "register" operations. */ + +int ENGINE_register_RSA(ENGINE *e); +void ENGINE_unregister_RSA(ENGINE *e); +void ENGINE_register_all_RSA(void); + +int ENGINE_register_DSA(ENGINE *e); +void ENGINE_unregister_DSA(ENGINE *e); +void ENGINE_register_all_DSA(void); + +int ENGINE_register_ECDH(ENGINE *e); +void ENGINE_unregister_ECDH(ENGINE *e); +void ENGINE_register_all_ECDH(void); + +int ENGINE_register_ECDSA(ENGINE *e); +void ENGINE_unregister_ECDSA(ENGINE *e); +void ENGINE_register_all_ECDSA(void); + +int ENGINE_register_DH(ENGINE *e); +void ENGINE_unregister_DH(ENGINE *e); +void ENGINE_register_all_DH(void); + +int ENGINE_register_RAND(ENGINE *e); +void ENGINE_unregister_RAND(ENGINE *e); +void ENGINE_register_all_RAND(void); + +int ENGINE_register_STORE(ENGINE *e); +void ENGINE_unregister_STORE(ENGINE *e); +void ENGINE_register_all_STORE(void); + +int ENGINE_register_ciphers(ENGINE *e); +void ENGINE_unregister_ciphers(ENGINE *e); +void ENGINE_register_all_ciphers(void); + +int ENGINE_register_digests(ENGINE *e); +void ENGINE_unregister_digests(ENGINE *e); +void ENGINE_register_all_digests(void); + +int ENGINE_register_pkey_meths(ENGINE *e); +void ENGINE_unregister_pkey_meths(ENGINE *e); +void ENGINE_register_all_pkey_meths(void); + +int ENGINE_register_pkey_asn1_meths(ENGINE *e); +void ENGINE_unregister_pkey_asn1_meths(ENGINE *e); +void ENGINE_register_all_pkey_asn1_meths(void); + +/* These functions register all support from the above categories. Note, use of + * these functions can result in static linkage of code your application may not + * need. If you only need a subset of functionality, consider using more + * selective initialisation. */ +int ENGINE_register_complete(ENGINE *e); +int ENGINE_register_all_complete(void); + +/* Send parametrised control commands to the engine. The possibilities to send + * down an integer, a pointer to data or a function pointer are provided. Any of + * the parameters may or may not be NULL, depending on the command number. In + * actuality, this function only requires a structural (rather than functional) + * reference to an engine, but many control commands may require the engine be + * functional. The caller should be aware of trying commands that require an + * operational ENGINE, and only use functional references in such situations. */ +int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void)); + +/* This function tests if an ENGINE-specific command is usable as a "setting". + * Eg. in an application's config file that gets processed through + * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to + * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). */ +int ENGINE_cmd_is_executable(ENGINE *e, int cmd); + +/* This function works like ENGINE_ctrl() with the exception of taking a + * command name instead of a command number, and can handle optional commands. + * See the comment on ENGINE_ctrl_cmd_string() for an explanation on how to + * use the cmd_name and cmd_optional. */ +int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, + long i, void *p, void (*f)(void), int cmd_optional); + +/* This function passes a command-name and argument to an ENGINE. The cmd_name + * is converted to a command number and the control command is called using + * 'arg' as an argument (unless the ENGINE doesn't support such a command, in + * which case no control command is called). The command is checked for input + * flags, and if necessary the argument will be converted to a numeric value. If + * cmd_optional is non-zero, then if the ENGINE doesn't support the given + * cmd_name the return value will be success anyway. This function is intended + * for applications to use so that users (or config files) can supply + * engine-specific config data to the ENGINE at run-time to control behaviour of + * specific engines. As such, it shouldn't be used for calling ENGINE_ctrl() + * functions that return data, deal with binary data, or that are otherwise + * supposed to be used directly through ENGINE_ctrl() in application code. Any + * "return" data from an ENGINE_ctrl() operation in this function will be lost - + * the return value is interpreted as failure if the return value is zero, + * success otherwise, and this function returns a boolean value as a result. In + * other words, vendors of 'ENGINE'-enabled devices should write ENGINE + * implementations with parameterisations that work in this scheme, so that + * compliant ENGINE-based applications can work consistently with the same + * configuration for the same ENGINE-enabled devices, across applications. */ +int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, + int cmd_optional); + +/* These functions are useful for manufacturing new ENGINE structures. They + * don't address reference counting at all - one uses them to populate an ENGINE + * structure with personalised implementations of things prior to using it + * directly or adding it to the builtin ENGINE list in OpenSSL. These are also + * here so that the ENGINE structure doesn't have to be exposed and break binary + * compatibility! */ +ENGINE *ENGINE_new(void); +int ENGINE_free(ENGINE *e); +int ENGINE_up_ref(ENGINE *e); +int ENGINE_set_id(ENGINE *e, const char *id); +int ENGINE_set_name(ENGINE *e, const char *name); +int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth); +int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth); +int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth); +int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth); +int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth); +int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth); +int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth); +int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f); +int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); +int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); +int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); +int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f); +int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); +int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, + ENGINE_SSL_CLIENT_CERT_PTR loadssl_f); +int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); +int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); +int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f); +int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f); +int ENGINE_set_flags(ENGINE *e, int flags); +int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns); +/* These functions allow control over any per-structure ENGINE data. */ +int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); +void *ENGINE_get_ex_data(const ENGINE *e, int idx); + +/* This function cleans up anything that needs it. Eg. the ENGINE_add() function + * automatically ensures the list cleanup function is registered to be called + * from ENGINE_cleanup(). Similarly, all ENGINE_register_*** functions ensure + * ENGINE_cleanup() will clean up after them. */ +void ENGINE_cleanup(void); + +/* These return values from within the ENGINE structure. These can be useful + * with functional references as well as structural references - it depends + * which you obtained. Using the result for functional purposes if you only + * obtained a structural reference may be problematic! */ +const char *ENGINE_get_id(const ENGINE *e); +const char *ENGINE_get_name(const ENGINE *e); +const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e); +const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e); +const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e); +const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e); +const DH_METHOD *ENGINE_get_DH(const ENGINE *e); +const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e); +const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e); +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); +ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); +ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); +ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e); +ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); +ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); +ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e); +ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e); +const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); +const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid); +const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid); +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e, + const char *str, int len); +const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe, + const char *str, int len); +const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e); +int ENGINE_get_flags(const ENGINE *e); + +/* FUNCTIONAL functions. These functions deal with ENGINE structures + * that have (or will) be initialised for use. Broadly speaking, the + * structural functions are useful for iterating the list of available + * engine types, creating new engine types, and other "list" operations. + * These functions actually deal with ENGINEs that are to be used. As + * such these functions can fail (if applicable) when particular + * engines are unavailable - eg. if a hardware accelerator is not + * attached or not functioning correctly. Each ENGINE has 2 reference + * counts; structural and functional. Every time a functional reference + * is obtained or released, a corresponding structural reference is + * automatically obtained or released too. */ + +/* Initialise a engine type for use (or up its reference count if it's + * already in use). This will fail if the engine is not currently + * operational and cannot initialise. */ +int ENGINE_init(ENGINE *e); +/* Free a functional reference to a engine type. This does not require + * a corresponding call to ENGINE_free as it also releases a structural + * reference. */ +int ENGINE_finish(ENGINE *e); + +/* The following functions handle keys that are stored in some secondary + * location, handled by the engine. The storage may be on a card or + * whatever. */ +EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, + STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **ppkey, + STACK_OF(X509) **pother, + UI_METHOD *ui_method, void *callback_data); + +/* This returns a pointer for the current ENGINE structure that + * is (by default) performing any RSA operations. The value returned + * is an incremented reference, so it should be free'd (ENGINE_finish) + * before it is discarded. */ +ENGINE *ENGINE_get_default_RSA(void); +/* Same for the other "methods" */ +ENGINE *ENGINE_get_default_DSA(void); +ENGINE *ENGINE_get_default_ECDH(void); +ENGINE *ENGINE_get_default_ECDSA(void); +ENGINE *ENGINE_get_default_DH(void); +ENGINE *ENGINE_get_default_RAND(void); +/* These functions can be used to get a functional reference to perform + * ciphering or digesting corresponding to "nid". */ +ENGINE *ENGINE_get_cipher_engine(int nid); +ENGINE *ENGINE_get_digest_engine(int nid); +ENGINE *ENGINE_get_pkey_meth_engine(int nid); +ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid); + +/* This sets a new default ENGINE structure for performing RSA + * operations. If the result is non-zero (success) then the ENGINE + * structure will have had its reference count up'd so the caller + * should still free their own reference 'e'. */ +int ENGINE_set_default_RSA(ENGINE *e); +int ENGINE_set_default_string(ENGINE *e, const char *def_list); +/* Same for the other "methods" */ +int ENGINE_set_default_DSA(ENGINE *e); +int ENGINE_set_default_ECDH(ENGINE *e); +int ENGINE_set_default_ECDSA(ENGINE *e); +int ENGINE_set_default_DH(ENGINE *e); +int ENGINE_set_default_RAND(ENGINE *e); +int ENGINE_set_default_ciphers(ENGINE *e); +int ENGINE_set_default_digests(ENGINE *e); +int ENGINE_set_default_pkey_meths(ENGINE *e); +int ENGINE_set_default_pkey_asn1_meths(ENGINE *e); + +/* The combination "set" - the flags are bitwise "OR"d from the + * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()" + * function, this function can result in unnecessary static linkage. If your + * application requires only specific functionality, consider using more + * selective functions. */ +int ENGINE_set_default(ENGINE *e, unsigned int flags); + +void ENGINE_add_conf_module(void); + +/* Deprecated functions ... */ +/* int ENGINE_clear_defaults(void); */ + +/**************************/ +/* DYNAMIC ENGINE SUPPORT */ +/**************************/ + +/* Binary/behaviour compatibility levels */ +#define OSSL_DYNAMIC_VERSION (unsigned long)0x00020000 +/* Binary versions older than this are too old for us (whether we're a loader or + * a loadee) */ +#define OSSL_DYNAMIC_OLDEST (unsigned long)0x00020000 + +/* When compiling an ENGINE entirely as an external shared library, loadable by + * the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' structure + * type provides the calling application's (or library's) error functionality + * and memory management function pointers to the loaded library. These should + * be used/set in the loaded library code so that the loading application's + * 'state' will be used/changed in all operations. The 'static_state' pointer + * allows the loaded library to know if it shares the same static data as the + * calling application (or library), and thus whether these callbacks need to be + * set or not. */ +typedef void *(*dyn_MEM_malloc_cb)(size_t); +typedef void *(*dyn_MEM_realloc_cb)(void *, size_t); +typedef void (*dyn_MEM_free_cb)(void *); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_cb malloc_cb; + dyn_MEM_realloc_cb realloc_cb; + dyn_MEM_free_cb free_cb; +} dynamic_MEM_fns; +/* FIXME: Perhaps the memory and locking code (crypto.h) should declare and use + * these types so we (and any other dependant code) can simplify a bit?? */ +typedef void (*dyn_lock_locking_cb)(int, int, const char *, int); +typedef int (*dyn_lock_add_lock_cb)(int*, int, int, const char *, int); +typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb)( + const char *, int); +typedef void (*dyn_dynlock_lock_cb)(int, struct CRYPTO_dynlock_value *, + const char *, int); +typedef void (*dyn_dynlock_destroy_cb)(struct CRYPTO_dynlock_value *, + const char *, int); +typedef struct st_dynamic_LOCK_fns { + dyn_lock_locking_cb lock_locking_cb; + dyn_lock_add_lock_cb lock_add_lock_cb; + dyn_dynlock_create_cb dynlock_create_cb; + dyn_dynlock_lock_cb dynlock_lock_cb; + dyn_dynlock_destroy_cb dynlock_destroy_cb; +} dynamic_LOCK_fns; +/* The top-level structure */ +typedef struct st_dynamic_fns { + void *static_state; + const ERR_FNS *err_fns; + const CRYPTO_EX_DATA_IMPL *ex_data_fns; + dynamic_MEM_fns mem_fns; + dynamic_LOCK_fns lock_fns; +} dynamic_fns; + +/* The version checking function should be of this prototype. NB: The + * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading code. + * If this function returns zero, it indicates a (potential) version + * incompatibility and the loaded library doesn't believe it can proceed. + * Otherwise, the returned value is the (latest) version supported by the + * loading library. The loader may still decide that the loaded code's version + * is unsatisfactory and could veto the load. The function is expected to + * be implemented with the symbol name "v_check", and a default implementation + * can be fully instantiated with IMPLEMENT_DYNAMIC_CHECK_FN(). */ +typedef unsigned long (*dynamic_v_check_fn)(unsigned long ossl_version); +#define IMPLEMENT_DYNAMIC_CHECK_FN() \ + extern unsigned long v_check(unsigned long v); \ + extern unsigned long v_check(unsigned long v) { \ + if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \ + return 0; } + +/* This function is passed the ENGINE structure to initialise with its own + * function and command settings. It should not adjust the structural or + * functional reference counts. If this function returns zero, (a) the load will + * be aborted, (b) the previous ENGINE state will be memcpy'd back onto the + * structure, and (c) the shared library will be unloaded. So implementations + * should do their own internal cleanup in failure circumstances otherwise they + * could leak. The 'id' parameter, if non-NULL, represents the ENGINE id that + * the loader is looking for. If this is NULL, the shared library can choose to + * return failure or to initialise a 'default' ENGINE. If non-NULL, the shared + * library must initialise only an ENGINE matching the passed 'id'. The function + * is expected to be implemented with the symbol name "bind_engine". A standard + * implementation can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where + * the parameter 'fn' is a callback function that populates the ENGINE structure + * and returns an int value (zero for failure). 'fn' should have prototype; + * [static] int fn(ENGINE *e, const char *id); */ +typedef int (*dynamic_bind_engine)(ENGINE *e, const char *id, + const dynamic_fns *fns); +#define IMPLEMENT_DYNAMIC_BIND_FN(fn) \ + extern \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \ + extern \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ + if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ + if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \ + fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \ + return 0; \ + CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \ + CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \ + CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \ + CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \ + CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \ + if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \ + return 0; \ + if(!ERR_set_implementation(fns->err_fns)) return 0; \ + skip_cbs: \ + if(!fn(e,id)) return 0; \ + return 1; } + +/* If the loading application (or library) and the loaded ENGINE library share + * the same static data (eg. they're both dynamically linked to the same + * libcrypto.so) we need a way to avoid trying to set system callbacks - this + * would fail, and for the same reason that it's unnecessary to try. If the + * loaded ENGINE has (or gets from through the loader) its own copy of the + * libcrypto static data, we will need to set the callbacks. The easiest way to + * detect this is to have a function that returns a pointer to some static data + * and let the loading application and loaded ENGINE compare their respective + * values. */ + void *ENGINE_get_static_state(void); + +/* 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. + */ +void ERR_load_ENGINE_strings(void); + +/* Error codes for the ENGINE functions. */ + +/* Function codes. */ +#define ENGINE_F_DYNAMIC_CTRL 180 +#define ENGINE_F_DYNAMIC_GET_DATA_CTX 181 +#define ENGINE_F_DYNAMIC_LOAD 182 +#define ENGINE_F_DYNAMIC_SET_DATA_CTX 183 +#define ENGINE_F_ENGINE_ADD 105 +#define ENGINE_F_ENGINE_BY_ID 106 +#define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170 +#define ENGINE_F_ENGINE_CTRL 142 +#define ENGINE_F_ENGINE_CTRL_CMD 178 +#define ENGINE_F_ENGINE_CTRL_CMD_STRING 171 +#define ENGINE_F_ENGINE_FINISH 107 +#define ENGINE_F_ENGINE_FREE_UTIL 108 +#define ENGINE_F_ENGINE_GET_CIPHER 185 +#define ENGINE_F_ENGINE_GET_DEFAULT_TYPE 177 +#define ENGINE_F_ENGINE_GET_DIGEST 186 +#define ENGINE_F_ENGINE_GET_NEXT 115 +#define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH 193 +#define ENGINE_F_ENGINE_GET_PKEY_METH 192 +#define ENGINE_F_ENGINE_GET_PREV 116 +#define ENGINE_F_ENGINE_INIT 119 +#define ENGINE_F_ENGINE_LIST_ADD 120 +#define ENGINE_F_ENGINE_LIST_REMOVE 121 +#define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 +#define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 +#define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 194 +#define ENGINE_F_ENGINE_NEW 122 +#define ENGINE_F_ENGINE_REMOVE 123 +#define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189 +#define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126 +#define ENGINE_F_ENGINE_SET_ID 129 +#define ENGINE_F_ENGINE_SET_NAME 130 +#define ENGINE_F_ENGINE_TABLE_REGISTER 184 +#define ENGINE_F_ENGINE_UNLOAD_KEY 152 +#define ENGINE_F_ENGINE_UNLOCKED_FINISH 191 +#define ENGINE_F_ENGINE_UP_REF 190 +#define ENGINE_F_INT_CTRL_HELPER 172 +#define ENGINE_F_INT_ENGINE_CONFIGURE 188 +#define ENGINE_F_INT_ENGINE_MODULE_INIT 187 +#define ENGINE_F_LOG_MESSAGE 141 + +/* Reason codes. */ +#define ENGINE_R_ALREADY_LOADED 100 +#define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133 +#define ENGINE_R_CMD_NOT_EXECUTABLE 134 +#define ENGINE_R_COMMAND_TAKES_INPUT 135 +#define ENGINE_R_COMMAND_TAKES_NO_INPUT 136 +#define ENGINE_R_CONFLICTING_ENGINE_ID 103 +#define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 +#define ENGINE_R_DH_NOT_IMPLEMENTED 139 +#define ENGINE_R_DSA_NOT_IMPLEMENTED 140 +#define ENGINE_R_DSO_FAILURE 104 +#define ENGINE_R_DSO_NOT_FOUND 132 +#define ENGINE_R_ENGINES_SECTION_ERROR 148 +#define ENGINE_R_ENGINE_CONFIGURATION_ERROR 102 +#define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 +#define ENGINE_R_ENGINE_SECTION_ERROR 149 +#define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 +#define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 +#define ENGINE_R_FINISH_FAILED 106 +#define ENGINE_R_GET_HANDLE_FAILED 107 +#define ENGINE_R_ID_OR_NAME_MISSING 108 +#define ENGINE_R_INIT_FAILED 109 +#define ENGINE_R_INTERNAL_LIST_ERROR 110 +#define ENGINE_R_INVALID_ARGUMENT 143 +#define ENGINE_R_INVALID_CMD_NAME 137 +#define ENGINE_R_INVALID_CMD_NUMBER 138 +#define ENGINE_R_INVALID_INIT_VALUE 151 +#define ENGINE_R_INVALID_STRING 150 +#define ENGINE_R_NOT_INITIALISED 117 +#define ENGINE_R_NOT_LOADED 112 +#define ENGINE_R_NO_CONTROL_FUNCTION 120 +#define ENGINE_R_NO_INDEX 144 +#define ENGINE_R_NO_LOAD_FUNCTION 125 +#define ENGINE_R_NO_REFERENCE 130 +#define ENGINE_R_NO_SUCH_ENGINE 116 +#define ENGINE_R_NO_UNLOAD_FUNCTION 126 +#define ENGINE_R_PROVIDE_PARAMETERS 113 +#define ENGINE_R_RSA_NOT_IMPLEMENTED 141 +#define ENGINE_R_UNIMPLEMENTED_CIPHER 146 +#define ENGINE_R_UNIMPLEMENTED_DIGEST 147 +#define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101 +#define ENGINE_R_VERSION_INCOMPATIBILITY 145 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/err.h b/src/3rdparty/win32_include/openssl/err.h new file mode 100644 index 000000000..22cdb2987 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/err.h @@ -0,0 +1,421 @@ +/* $OpenBSD: err.h,v 1.25 2017/02/20 23:21:19 beck Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_ERR_H +#define HEADER_ERR_H + +#include + +#include +#include + +#include +#ifndef OPENSSL_NO_BIO +#include +#endif +#ifndef OPENSSL_NO_LHASH +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_ERR +#define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e) +#else +#define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0) +#endif + +#include + +#define ERR_TXT_MALLOCED 0x01 +#define ERR_TXT_STRING 0x02 + +#define ERR_FLAG_MARK 0x01 + +#define ERR_NUM_ERRORS 16 +typedef struct err_state_st { + CRYPTO_THREADID tid; + int err_flags[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + const char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + int top, bottom; +} ERR_STATE; + +/* library */ +#define ERR_LIB_NONE 1 +#define ERR_LIB_SYS 2 +#define ERR_LIB_BN 3 +#define ERR_LIB_RSA 4 +#define ERR_LIB_DH 5 +#define ERR_LIB_EVP 6 +#define ERR_LIB_BUF 7 +#define ERR_LIB_OBJ 8 +#define ERR_LIB_PEM 9 +#define ERR_LIB_DSA 10 +#define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +#define ERR_LIB_ASN1 13 +#define ERR_LIB_CONF 14 +#define ERR_LIB_CRYPTO 15 +#define ERR_LIB_EC 16 +#define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +#define ERR_LIB_BIO 32 +#define ERR_LIB_PKCS7 33 +#define ERR_LIB_X509V3 34 +#define ERR_LIB_PKCS12 35 +#define ERR_LIB_RAND 36 +#define ERR_LIB_DSO 37 +#define ERR_LIB_ENGINE 38 +#define ERR_LIB_OCSP 39 +#define ERR_LIB_UI 40 +#define ERR_LIB_COMP 41 +#define ERR_LIB_ECDSA 42 +#define ERR_LIB_ECDH 43 +#define ERR_LIB_STORE 44 +#define ERR_LIB_FIPS 45 +#define ERR_LIB_CMS 46 +#define ERR_LIB_TS 47 +#define ERR_LIB_HMAC 48 +#define ERR_LIB_JPAKE 49 +#define ERR_LIB_GOST 50 + +#define ERR_LIB_USER 128 + +#ifndef LIBRESSL_INTERNAL +#define SYSerr(f,r) ERR_PUT_error(ERR_LIB_SYS,(f),(r),__FILE__,__LINE__) +#define BNerr(f,r) ERR_PUT_error(ERR_LIB_BN,(f),(r),__FILE__,__LINE__) +#define RSAerr(f,r) ERR_PUT_error(ERR_LIB_RSA,(f),(r),__FILE__,__LINE__) +#define DHerr(f,r) ERR_PUT_error(ERR_LIB_DH,(f),(r),__FILE__,__LINE__) +#define EVPerr(f,r) ERR_PUT_error(ERR_LIB_EVP,(f),(r),__FILE__,__LINE__) +#define BUFerr(f,r) ERR_PUT_error(ERR_LIB_BUF,(f),(r),__FILE__,__LINE__) +#define OBJerr(f,r) ERR_PUT_error(ERR_LIB_OBJ,(f),(r),__FILE__,__LINE__) +#define PEMerr(f,r) ERR_PUT_error(ERR_LIB_PEM,(f),(r),__FILE__,__LINE__) +#define DSAerr(f,r) ERR_PUT_error(ERR_LIB_DSA,(f),(r),__FILE__,__LINE__) +#define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),__FILE__,__LINE__) +#define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__) +#define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),__FILE__,__LINE__) +#define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),__FILE__,__LINE__) +#define ECerr(f,r) ERR_PUT_error(ERR_LIB_EC,(f),(r),__FILE__,__LINE__) +#define BIOerr(f,r) ERR_PUT_error(ERR_LIB_BIO,(f),(r),__FILE__,__LINE__) +#define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),__FILE__,__LINE__) +#define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),__FILE__,__LINE__) +#define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),__FILE__,__LINE__) +#define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),__FILE__,__LINE__) +#define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),__FILE__,__LINE__) +#define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),__FILE__,__LINE__) +#define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),__FILE__,__LINE__) +#define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),__FILE__,__LINE__) +#define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),__FILE__,__LINE__) +#define ECDSAerr(f,r) ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__) +#define ECDHerr(f,r) ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__) +#define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__) +#define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),__FILE__,__LINE__) +#define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__) +#define TSerr(f,r) ERR_PUT_error(ERR_LIB_TS,(f),(r),__FILE__,__LINE__) +#define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),__FILE__,__LINE__) +#define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__) +#define GOSTerr(f,r) ERR_PUT_error(ERR_LIB_GOST,(f),(r),__FILE__,__LINE__) +#define SSLerr(f,r) ERR_PUT_error(ERR_LIB_SSL,(f),(r),__FILE__,__LINE__) +#endif + +#ifdef LIBRESSL_INTERNAL +#define SYSerror(r) ERR_PUT_error(ERR_LIB_SYS,(0xfff),(r),__FILE__,__LINE__) +#define BNerror(r) ERR_PUT_error(ERR_LIB_BN,(0xfff),(r),__FILE__,__LINE__) +#define RSAerror(r) ERR_PUT_error(ERR_LIB_RSA,(0xfff),(r),__FILE__,__LINE__) +#define DHerror(r) ERR_PUT_error(ERR_LIB_DH,(0xfff),(r),__FILE__,__LINE__) +#define EVPerror(r) ERR_PUT_error(ERR_LIB_EVP,(0xfff),(r),__FILE__,__LINE__) +#define BUFerror(r) ERR_PUT_error(ERR_LIB_BUF,(0xfff),(r),__FILE__,__LINE__) +#define OBJerror(r) ERR_PUT_error(ERR_LIB_OBJ,(0xfff),(r),__FILE__,__LINE__) +#define PEMerror(r) ERR_PUT_error(ERR_LIB_PEM,(0xfff),(r),__FILE__,__LINE__) +#define DSAerror(r) ERR_PUT_error(ERR_LIB_DSA,(0xfff),(r),__FILE__,__LINE__) +#define X509error(r) ERR_PUT_error(ERR_LIB_X509,(0xfff),(r),__FILE__,__LINE__) +#define ASN1error(r) ERR_PUT_error(ERR_LIB_ASN1,(0xfff),(r),__FILE__,__LINE__) +#define CONFerror(r) ERR_PUT_error(ERR_LIB_CONF,(0xfff),(r),__FILE__,__LINE__) +#define CRYPTOerror(r) ERR_PUT_error(ERR_LIB_CRYPTO,(0xfff),(r),__FILE__,__LINE__) +#define ECerror(r) ERR_PUT_error(ERR_LIB_EC,(0xfff),(r),__FILE__,__LINE__) +#define BIOerror(r) ERR_PUT_error(ERR_LIB_BIO,(0xfff),(r),__FILE__,__LINE__) +#define PKCS7error(r) ERR_PUT_error(ERR_LIB_PKCS7,(0xfff),(r),__FILE__,__LINE__) +#define X509V3error(r) ERR_PUT_error(ERR_LIB_X509V3,(0xfff),(r),__FILE__,__LINE__) +#define PKCS12error(r) ERR_PUT_error(ERR_LIB_PKCS12,(0xfff),(r),__FILE__,__LINE__) +#define RANDerror(r) ERR_PUT_error(ERR_LIB_RAND,(0xfff),(r),__FILE__,__LINE__) +#define DSOerror(r) ERR_PUT_error(ERR_LIB_DSO,(0xfff),(r),__FILE__,__LINE__) +#define ENGINEerror(r) ERR_PUT_error(ERR_LIB_ENGINE,(0xfff),(r),__FILE__,__LINE__) +#define OCSPerror(r) ERR_PUT_error(ERR_LIB_OCSP,(0xfff),(r),__FILE__,__LINE__) +#define UIerror(r) ERR_PUT_error(ERR_LIB_UI,(0xfff),(r),__FILE__,__LINE__) +#define COMPerror(r) ERR_PUT_error(ERR_LIB_COMP,(0xfff),(r),__FILE__,__LINE__) +#define ECDSAerror(r) ERR_PUT_error(ERR_LIB_ECDSA,(0xfff),(r),__FILE__,__LINE__) +#define ECDHerror(r) ERR_PUT_error(ERR_LIB_ECDH,(0xfff),(r),__FILE__,__LINE__) +#define STOREerror(r) ERR_PUT_error(ERR_LIB_STORE,(0xfff),(r),__FILE__,__LINE__) +#define FIPSerror(r) ERR_PUT_error(ERR_LIB_FIPS,(0xfff),(r),__FILE__,__LINE__) +#define CMSerror(r) ERR_PUT_error(ERR_LIB_CMS,(0xfff),(r),__FILE__,__LINE__) +#define TSerror(r) ERR_PUT_error(ERR_LIB_TS,(0xfff),(r),__FILE__,__LINE__) +#define HMACerror(r) ERR_PUT_error(ERR_LIB_HMAC,(0xfff),(r),__FILE__,__LINE__) +#define JPAKEerror(r) ERR_PUT_error(ERR_LIB_JPAKE,(0xfff),(r),__FILE__,__LINE__) +#define GOSTerror(r) ERR_PUT_error(ERR_LIB_GOST,(0xfff),(r),__FILE__,__LINE__) +#endif + +#define ERR_PACK(l,f,r) (((((unsigned long)l)&0xffL)<<24L)| \ + ((((unsigned long)f)&0xfffL)<<12L)| \ + ((((unsigned long)r)&0xfffL))) +#define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL) +#define ERR_GET_FUNC(l) (int)((((unsigned long)l)>>12L)&0xfffL) +#define ERR_GET_REASON(l) (int)((l)&0xfffL) +#define ERR_FATAL_ERROR(l) (int)((l)&ERR_R_FATAL) + + +/* OS functions */ +#define SYS_F_FOPEN 1 +#define SYS_F_CONNECT 2 +#define SYS_F_GETSERVBYNAME 3 +#define SYS_F_SOCKET 4 +#define SYS_F_IOCTLSOCKET 5 +#define SYS_F_BIND 6 +#define SYS_F_LISTEN 7 +#define SYS_F_ACCEPT 8 +#define SYS_F_WSASTARTUP 9 /* Winsock stuff */ +#define SYS_F_OPENDIR 10 +#define SYS_F_FREAD 11 + + +/* reasons */ +#define ERR_R_SYS_LIB ERR_LIB_SYS /* 2 */ +#define ERR_R_BN_LIB ERR_LIB_BN /* 3 */ +#define ERR_R_RSA_LIB ERR_LIB_RSA /* 4 */ +#define ERR_R_DH_LIB ERR_LIB_DH /* 5 */ +#define ERR_R_EVP_LIB ERR_LIB_EVP /* 6 */ +#define ERR_R_BUF_LIB ERR_LIB_BUF /* 7 */ +#define ERR_R_OBJ_LIB ERR_LIB_OBJ /* 8 */ +#define ERR_R_PEM_LIB ERR_LIB_PEM /* 9 */ +#define ERR_R_DSA_LIB ERR_LIB_DSA /* 10 */ +#define ERR_R_X509_LIB ERR_LIB_X509 /* 11 */ +#define ERR_R_ASN1_LIB ERR_LIB_ASN1 /* 13 */ +#define ERR_R_CONF_LIB ERR_LIB_CONF /* 14 */ +#define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO /* 15 */ +#define ERR_R_EC_LIB ERR_LIB_EC /* 16 */ +#define ERR_R_SSL_LIB ERR_LIB_SSL /* 20 */ +#define ERR_R_BIO_LIB ERR_LIB_BIO /* 32 */ +#define ERR_R_PKCS7_LIB ERR_LIB_PKCS7 /* 33 */ +#define ERR_R_X509V3_LIB ERR_LIB_X509V3 /* 34 */ +#define ERR_R_PKCS12_LIB ERR_LIB_PKCS12 /* 35 */ +#define ERR_R_RAND_LIB ERR_LIB_RAND /* 36 */ +#define ERR_R_DSO_LIB ERR_LIB_DSO /* 37 */ +#define ERR_R_ENGINE_LIB ERR_LIB_ENGINE /* 38 */ +#define ERR_R_OCSP_LIB ERR_LIB_OCSP /* 39 */ +#define ERR_R_UI_LIB ERR_LIB_UI /* 40 */ +#define ERR_R_COMP_LIB ERR_LIB_COMP /* 41 */ +#define ERR_R_ECDSA_LIB ERR_LIB_ECDSA /* 42 */ +#define ERR_R_ECDH_LIB ERR_LIB_ECDH /* 43 */ +#define ERR_R_STORE_LIB ERR_LIB_STORE /* 44 */ +#define ERR_R_TS_LIB ERR_LIB_TS /* 45 */ + +#define ERR_R_NESTED_ASN1_ERROR 58 +#define ERR_R_BAD_ASN1_OBJECT_HEADER 59 +#define ERR_R_BAD_GET_ASN1_OBJECT_CALL 60 +#define ERR_R_EXPECTING_AN_ASN1_SEQUENCE 61 +#define ERR_R_ASN1_LENGTH_MISMATCH 62 +#define ERR_R_MISSING_ASN1_EOS 63 + +/* fatal error */ +#define ERR_R_FATAL 64 +#define ERR_R_MALLOC_FAILURE (1|ERR_R_FATAL) +#define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (2|ERR_R_FATAL) +#define ERR_R_PASSED_NULL_PARAMETER (3|ERR_R_FATAL) +#define ERR_R_INTERNAL_ERROR (4|ERR_R_FATAL) +#define ERR_R_DISABLED (5|ERR_R_FATAL) + +/* 99 is the maximum possible ERR_R_... code, higher values + * are reserved for the individual libraries */ + + +typedef struct ERR_string_data_st { + unsigned long error; + const char *string; +} ERR_STRING_DATA; + +void ERR_put_error(int lib, int func, int reason, const char *file, int line); +void ERR_set_error_data(char *data, int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_line(const char **file, int *line); +unsigned long ERR_get_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file, int *line); +unsigned long ERR_peek_error_line_data(const char **file, int *line, + const char **data, int *flags); +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file, int *line); +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); +void ERR_clear_error(void ); +char *ERR_error_string(unsigned long e, char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +const char *ERR_func_error_string(unsigned long e); +const char *ERR_reason_error_string(unsigned long e); +void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), + void *u); +void ERR_print_errors_fp(FILE *fp); +#ifndef OPENSSL_NO_BIO +void ERR_print_errors(BIO *bp); +#endif +void ERR_asprintf_error_data(char * format, ...); +#ifndef LIBRESSL_INTERNAL +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +#endif +void ERR_load_strings(int lib, ERR_STRING_DATA str[]); +void ERR_unload_strings(int lib, ERR_STRING_DATA str[]); +void ERR_load_ERR_strings(void); +void ERR_load_crypto_strings(void); +void ERR_free_strings(void); + +void ERR_remove_thread_state(const CRYPTO_THREADID *tid); +#ifndef OPENSSL_NO_DEPRECATED +void ERR_remove_state(unsigned long pid); /* if zero we look it up */ +#endif +ERR_STATE *ERR_get_state(void); + +#ifndef OPENSSL_NO_LHASH +LHASH_OF(ERR_STRING_DATA) *ERR_get_string_table(void); +LHASH_OF(ERR_STATE) *ERR_get_err_state_table(void); +void ERR_release_err_state_table(LHASH_OF(ERR_STATE) **hash); +#endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); + +/* Already defined in ossl_typ.h */ +/* typedef struct st_ERR_FNS ERR_FNS; */ +/* An application can use this function and provide the return value to loaded + * modules that should use the application's ERR state/functionality */ +const ERR_FNS *ERR_get_implementation(void); +/* A loaded module should call this function prior to any ERR operations using + * the application's "ERR_FNS". */ +int ERR_set_implementation(const ERR_FNS *fns); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/evp.h b/src/3rdparty/win32_include/openssl/evp.h new file mode 100644 index 000000000..68e104958 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/evp.h @@ -0,0 +1,1502 @@ +/* $OpenBSD: evp.h,v 1.52 2017/02/28 14:15:37 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_ENVELOPE_H +#define HEADER_ENVELOPE_H + +#include + +#include + +#ifndef OPENSSL_NO_BIO +#include +#endif + +/* +#define EVP_RC2_KEY_SIZE 16 +#define EVP_RC4_KEY_SIZE 16 +#define EVP_BLOWFISH_KEY_SIZE 16 +#define EVP_CAST5_KEY_SIZE 16 +#define EVP_RC5_32_12_16_KEY_SIZE 16 +*/ +#define EVP_MAX_MD_SIZE 64 /* longest known is SHA512 */ +#define EVP_MAX_KEY_LENGTH 64 +#define EVP_MAX_IV_LENGTH 16 +#define EVP_MAX_BLOCK_LENGTH 32 + +#define PKCS5_SALT_LEN 8 +/* Default PKCS#5 iteration count */ +#define PKCS5_DEFAULT_ITER 2048 + +#include + +#define EVP_PK_RSA 0x0001 +#define EVP_PK_DSA 0x0002 +#define EVP_PK_DH 0x0004 +#define EVP_PK_EC 0x0008 +#define EVP_PKT_SIGN 0x0010 +#define EVP_PKT_ENC 0x0020 +#define EVP_PKT_EXCH 0x0040 +#define EVP_PKS_RSA 0x0100 +#define EVP_PKS_DSA 0x0200 +#define EVP_PKS_EC 0x0400 +#define EVP_PKT_EXP 0x1000 /* <= 512 bit key */ + +#define EVP_PKEY_NONE NID_undef +#define EVP_PKEY_RSA NID_rsaEncryption +#define EVP_PKEY_RSA2 NID_rsa +#define EVP_PKEY_DSA NID_dsa +#define EVP_PKEY_DSA1 NID_dsa_2 +#define EVP_PKEY_DSA2 NID_dsaWithSHA +#define EVP_PKEY_DSA3 NID_dsaWithSHA1 +#define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 +#define EVP_PKEY_DH NID_dhKeyAgreement +#define EVP_PKEY_EC NID_X9_62_id_ecPublicKey +#define EVP_PKEY_GOSTR01 NID_id_GostR3410_2001 +#define EVP_PKEY_GOSTIMIT NID_id_Gost28147_89_MAC +#define EVP_PKEY_HMAC NID_hmac +#define EVP_PKEY_CMAC NID_cmac +#define EVP_PKEY_GOSTR12_256 NID_id_tc26_gost3410_2012_256 +#define EVP_PKEY_GOSTR12_512 NID_id_tc26_gost3410_2012_512 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Type needs to be a bit field + * Sub-type needs to be for variations on the method, as in, can it do + * arbitrary encryption.... */ +struct evp_pkey_st { + int type; + int save_type; + int references; + const EVP_PKEY_ASN1_METHOD *ameth; + ENGINE *engine; + union { + char *ptr; +#ifndef OPENSSL_NO_RSA + struct rsa_st *rsa; /* RSA */ +#endif +#ifndef OPENSSL_NO_DSA + struct dsa_st *dsa; /* DSA */ +#endif +#ifndef OPENSSL_NO_DH + struct dh_st *dh; /* DH */ +#endif +#ifndef OPENSSL_NO_EC + struct ec_key_st *ec; /* ECC */ +#endif +#ifndef OPENSSL_NO_GOST + struct gost_key_st *gost; /* GOST */ +#endif + } pkey; + int save_parameters; + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ +} /* EVP_PKEY */; + +#define EVP_PKEY_MO_SIGN 0x0001 +#define EVP_PKEY_MO_VERIFY 0x0002 +#define EVP_PKEY_MO_ENCRYPT 0x0004 +#define EVP_PKEY_MO_DECRYPT 0x0008 + +typedef int evp_sign_method(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigret, unsigned int *siglen, + void *key); +typedef int evp_verify_method(int type, const unsigned char *m, + unsigned int m_length, const unsigned char *sigbuf, unsigned int siglen, + void *key); + +#ifndef EVP_MD +struct env_md_st { + int type; + int pkey_type; + int md_size; + unsigned long flags; + int (*init)(EVP_MD_CTX *ctx); + int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count); + int (*final)(EVP_MD_CTX *ctx, unsigned char *md); + int (*copy)(EVP_MD_CTX *to, const EVP_MD_CTX *from); + int (*cleanup)(EVP_MD_CTX *ctx); + + evp_sign_method *sign; + evp_verify_method *verify; + int required_pkey_type[5]; /*EVP_PKEY_xxx */ + int block_size; + int ctx_size; /* how big does the ctx->md_data need to be */ + /* control function */ + int (*md_ctrl)(EVP_MD_CTX *ctx, int cmd, int p1, void *p2); +} /* EVP_MD */; + +#define EVP_MD_FLAG_ONESHOT 0x0001 /* digest can only handle a single + * block */ + +#define EVP_MD_FLAG_PKEY_DIGEST 0x0002 /* digest is a "clone" digest used + * which is a copy of an existing + * one for a specific public key type. + * EVP_dss1() etc */ + +/* Digest uses EVP_PKEY_METHOD for signing instead of MD specific signing */ + +#define EVP_MD_FLAG_PKEY_METHOD_SIGNATURE 0x0004 + +/* DigestAlgorithmIdentifier flags... */ + +#define EVP_MD_FLAG_DIGALGID_MASK 0x0018 + +/* NULL or absent parameter accepted. Use NULL */ + +#define EVP_MD_FLAG_DIGALGID_NULL 0x0000 + +/* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */ + +#define EVP_MD_FLAG_DIGALGID_ABSENT 0x0008 + +/* Custom handling via ctrl */ + +#define EVP_MD_FLAG_DIGALGID_CUSTOM 0x0018 + +#define EVP_MD_FLAG_FIPS 0x0400 /* Note if suitable for use in FIPS mode */ + +/* Digest ctrls */ + +#define EVP_MD_CTRL_DIGALGID 0x1 +#define EVP_MD_CTRL_MICALG 0x2 +#define EVP_MD_CTRL_SET_KEY 0x3 +#define EVP_MD_CTRL_GOST_SET_SBOX 0x4 + +/* Minimum Algorithm specific ctrl value */ + +#define EVP_MD_CTRL_ALG_CTRL 0x1000 + +#define EVP_PKEY_NULL_method NULL,NULL,{0,0,0,0} + +#ifndef OPENSSL_NO_DSA +#define EVP_PKEY_DSA_method (evp_sign_method *)DSA_sign, \ + (evp_verify_method *)DSA_verify, \ + {EVP_PKEY_DSA,EVP_PKEY_DSA2,EVP_PKEY_DSA3, \ + EVP_PKEY_DSA4,0} +#else +#define EVP_PKEY_DSA_method EVP_PKEY_NULL_method +#endif + +#ifndef OPENSSL_NO_ECDSA +#define EVP_PKEY_ECDSA_method (evp_sign_method *)ECDSA_sign, \ + (evp_verify_method *)ECDSA_verify, \ + {EVP_PKEY_EC,0,0,0} +#else +#define EVP_PKEY_ECDSA_method EVP_PKEY_NULL_method +#endif + +#ifndef OPENSSL_NO_RSA +#define EVP_PKEY_RSA_method (evp_sign_method *)RSA_sign, \ + (evp_verify_method *)RSA_verify, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +#define EVP_PKEY_RSA_ASN1_OCTET_STRING_method \ + (evp_sign_method *)RSA_sign_ASN1_OCTET_STRING, \ + (evp_verify_method *)RSA_verify_ASN1_OCTET_STRING, \ + {EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0} +#else +#define EVP_PKEY_RSA_method EVP_PKEY_NULL_method +#define EVP_PKEY_RSA_ASN1_OCTET_STRING_method EVP_PKEY_NULL_method +#endif + +#endif /* !EVP_MD */ + +struct env_md_ctx_st { + const EVP_MD *digest; + ENGINE *engine; /* functional reference if 'digest' is ENGINE-provided */ + unsigned long flags; + void *md_data; + /* Public key context for sign/verify */ + EVP_PKEY_CTX *pctx; + /* Update function: usually copied from EVP_MD */ + int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count); +} /* EVP_MD_CTX */; + +/* values for EVP_MD_CTX flags */ + +#define EVP_MD_CTX_FLAG_ONESHOT 0x0001 /* digest update will be called + * once only */ +#define EVP_MD_CTX_FLAG_CLEANED 0x0002 /* context has already been + * cleaned */ +#define EVP_MD_CTX_FLAG_REUSE 0x0004 /* Don't free up ctx->md_data + * in EVP_MD_CTX_cleanup */ +/* FIPS and pad options are ignored in 1.0.0, definitions are here + * so we don't accidentally reuse the values for other purposes. + */ + +#define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008 /* Allow use of non FIPS digest + * in FIPS mode */ + +/* The following PAD options are also currently ignored in 1.0.0, digest + * parameters are handled through EVP_DigestSign*() and EVP_DigestVerify*() + * instead. + */ +#define EVP_MD_CTX_FLAG_PAD_MASK 0xF0 /* RSA mode to use */ +#define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00 /* PKCS#1 v1.5 mode */ +#define EVP_MD_CTX_FLAG_PAD_X931 0x10 /* X9.31 mode */ +#define EVP_MD_CTX_FLAG_PAD_PSS 0x20 /* PSS mode */ + +#define EVP_MD_CTX_FLAG_NO_INIT 0x0100 /* Don't initialize md_data */ + +struct evp_cipher_st { + int nid; + int block_size; + int key_len; /* Default value for variable length ciphers */ + int iv_len; + unsigned long flags; /* Various flags */ + int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc); /* init key */ + int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, size_t inl);/* encrypt/decrypt data */ + int (*cleanup)(EVP_CIPHER_CTX *); /* cleanup ctx */ + int ctx_size; /* how big ctx->cipher_data needs to be */ + int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Populate a ASN1_TYPE with parameters */ + int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Get parameters from a ASN1_TYPE */ + int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */ + void *app_data; /* Application data */ +} /* EVP_CIPHER */; + +/* Values for cipher flags */ + +/* Modes for ciphers */ + +#define EVP_CIPH_STREAM_CIPHER 0x0 +#define EVP_CIPH_ECB_MODE 0x1 +#define EVP_CIPH_CBC_MODE 0x2 +#define EVP_CIPH_CFB_MODE 0x3 +#define EVP_CIPH_OFB_MODE 0x4 +#define EVP_CIPH_CTR_MODE 0x5 +#define EVP_CIPH_GCM_MODE 0x6 +#define EVP_CIPH_CCM_MODE 0x7 +#define EVP_CIPH_XTS_MODE 0x10001 +#define EVP_CIPH_MODE 0xF0007 +/* Set if variable length cipher */ +#define EVP_CIPH_VARIABLE_LENGTH 0x8 +/* Set if the iv handling should be done by the cipher itself */ +#define EVP_CIPH_CUSTOM_IV 0x10 +/* Set if the cipher's init() function should be called if key is NULL */ +#define EVP_CIPH_ALWAYS_CALL_INIT 0x20 +/* Call ctrl() to init cipher parameters */ +#define EVP_CIPH_CTRL_INIT 0x40 +/* Don't use standard key length function */ +#define EVP_CIPH_CUSTOM_KEY_LENGTH 0x80 +/* Don't use standard block padding */ +#define EVP_CIPH_NO_PADDING 0x100 +/* cipher handles random key generation */ +#define EVP_CIPH_RAND_KEY 0x200 +/* cipher has its own additional copying logic */ +#define EVP_CIPH_CUSTOM_COPY 0x400 +/* Allow use default ASN1 get/set iv */ +#define EVP_CIPH_FLAG_DEFAULT_ASN1 0x1000 +/* Buffer length in bits not bytes: CFB1 mode only */ +#define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 +/* Note if suitable for use in FIPS mode */ +#define EVP_CIPH_FLAG_FIPS 0x4000 +/* Allow non FIPS cipher in FIPS mode */ +#define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0x8000 +/* Cipher handles any and all padding logic as well + * as finalisation. + */ +#define EVP_CIPH_FLAG_CUSTOM_CIPHER 0x100000 +#define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 + +/* ctrl() values */ + +#define EVP_CTRL_INIT 0x0 +#define EVP_CTRL_SET_KEY_LENGTH 0x1 +#define EVP_CTRL_GET_RC2_KEY_BITS 0x2 +#define EVP_CTRL_SET_RC2_KEY_BITS 0x3 +#define EVP_CTRL_GET_RC5_ROUNDS 0x4 +#define EVP_CTRL_SET_RC5_ROUNDS 0x5 +#define EVP_CTRL_RAND_KEY 0x6 +#define EVP_CTRL_PBE_PRF_NID 0x7 +#define EVP_CTRL_COPY 0x8 +#define EVP_CTRL_GCM_SET_IVLEN 0x9 +#define EVP_CTRL_GCM_GET_TAG 0x10 +#define EVP_CTRL_GCM_SET_TAG 0x11 +#define EVP_CTRL_GCM_SET_IV_FIXED 0x12 +#define EVP_CTRL_GCM_IV_GEN 0x13 +#define EVP_CTRL_CCM_SET_IVLEN EVP_CTRL_GCM_SET_IVLEN +#define EVP_CTRL_CCM_GET_TAG EVP_CTRL_GCM_GET_TAG +#define EVP_CTRL_CCM_SET_TAG EVP_CTRL_GCM_SET_TAG +#define EVP_CTRL_CCM_SET_L 0x14 +#define EVP_CTRL_CCM_SET_MSGLEN 0x15 +/* AEAD cipher deduces payload length and returns number of bytes + * required to store MAC and eventual padding. Subsequent call to + * EVP_Cipher even appends/verifies MAC. + */ +#define EVP_CTRL_AEAD_TLS1_AAD 0x16 +/* Used by composite AEAD ciphers, no-op in GCM, CCM... */ +#define EVP_CTRL_AEAD_SET_MAC_KEY 0x17 +/* Set the GCM invocation field, decrypt only */ +#define EVP_CTRL_GCM_SET_IV_INV 0x18 +/* Set the S-BOX NID for GOST ciphers */ +#define EVP_CTRL_GOST_SET_SBOX 0x19 + +/* GCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +#define EVP_GCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +#define EVP_GCM_TLS_EXPLICIT_IV_LEN 8 +/* Length of tag for TLS */ +#define EVP_GCM_TLS_TAG_LEN 16 + +typedef struct evp_cipher_info_st { + const EVP_CIPHER *cipher; + unsigned char iv[EVP_MAX_IV_LENGTH]; +} EVP_CIPHER_INFO; + +struct evp_cipher_ctx_st { + const EVP_CIPHER *cipher; + ENGINE *engine; /* functional reference if 'cipher' is ENGINE-provided */ + int encrypt; /* encrypt or decrypt */ + int buf_len; /* number we have left */ + + unsigned char oiv[EVP_MAX_IV_LENGTH]; /* original iv */ + unsigned char iv[EVP_MAX_IV_LENGTH]; /* working iv */ + unsigned char buf[EVP_MAX_BLOCK_LENGTH];/* saved partial block */ + int num; /* used by cfb/ofb/ctr mode */ + + void *app_data; /* application stuff */ + int key_len; /* May change for variable length cipher */ + unsigned long flags; /* Various flags */ + void *cipher_data; /* per EVP data */ + int final_used; + int block_mask; + unsigned char final[EVP_MAX_BLOCK_LENGTH];/* possible final block */ +} /* EVP_CIPHER_CTX */; + +typedef struct evp_Encode_Ctx_st { + int num; /* number saved in a partial encode/decode */ + int length; /* The length is either the output line length + * (in input bytes) or the shortest input line + * length that is ok. Once decoding begins, + * the length is adjusted up each time a longer + * line is decoded */ + unsigned char enc_data[80]; /* data to encode */ + int line_num; /* number read on current line */ + int expect_nl; +} EVP_ENCODE_CTX; + +/* Password based encryption function */ +typedef int (EVP_PBE_KEYGEN)(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md, int en_de); + +#ifndef OPENSSL_NO_RSA +#define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\ + (char *)(rsa)) +#endif + +#ifndef OPENSSL_NO_DSA +#define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\ + (char *)(dsa)) +#endif + +#ifndef OPENSSL_NO_DH +#define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,\ + (char *)(dh)) +#endif + +#ifndef OPENSSL_NO_EC +#define EVP_PKEY_assign_EC_KEY(pkey,eckey) EVP_PKEY_assign((pkey),EVP_PKEY_EC,\ + (char *)(eckey)) +#endif + +#ifndef OPENSSL_NO_GOST +#define EVP_PKEY_assign_GOST(pkey,gostkey) EVP_PKEY_assign((pkey),EVP_PKEY_GOSTR01,\ + (char *)(gostkey)) +#endif + +/* Add some extra combinations */ +#define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a)) +#define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a)) +#define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) +#define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) + +int EVP_MD_type(const EVP_MD *md); +#define EVP_MD_nid(e) EVP_MD_type(e) +#define EVP_MD_name(e) OBJ_nid2sn(EVP_MD_nid(e)) +int EVP_MD_pkey_type(const EVP_MD *md); +int EVP_MD_size(const EVP_MD *md); +int EVP_MD_block_size(const EVP_MD *md); +unsigned long EVP_MD_flags(const EVP_MD *md); + +const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx); +#define EVP_MD_CTX_size(e) EVP_MD_size(EVP_MD_CTX_md(e)) +#define EVP_MD_CTX_block_size(e) EVP_MD_block_size(EVP_MD_CTX_md(e)) +#define EVP_MD_CTX_type(e) EVP_MD_type(EVP_MD_CTX_md(e)) + +int EVP_CIPHER_nid(const EVP_CIPHER *cipher); +#define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) +int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); +int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); +int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); +unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher); +#define EVP_CIPHER_mode(e) (EVP_CIPHER_flags(e) & EVP_CIPH_MODE) + +const EVP_CIPHER * EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in); +void * EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx); +void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data); +#define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) +unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx); +#define EVP_CIPHER_CTX_mode(e) (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE) + +#define EVP_ENCODE_LENGTH(l) (((l+2)/3*4)+(l/48+1)*2+80) +#define EVP_DECODE_LENGTH(l) ((l+3)/4*3+80) + +#define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +#define EVP_SignInit(a,b) EVP_DigestInit(a,b) +#define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +#define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +#define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) +#define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +#define EVP_OpenUpdate(a,b,c,d,e) EVP_DecryptUpdate(a,b,c,d,e) +#define EVP_SealUpdate(a,b,c,d,e) EVP_EncryptUpdate(a,b,c,d,e) +#define EVP_DigestSignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +#define EVP_DigestVerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) + +#define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,0,(char *)md) +#define BIO_get_md(b,mdp) BIO_ctrl(b,BIO_C_GET_MD,0,(char *)mdp) +#define BIO_get_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_GET_MD_CTX,0,(char *)mdcp) +#define BIO_set_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_SET_MD_CTX,0,(char *)mdcp) +#define BIO_get_cipher_status(b) BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL) +#define BIO_get_cipher_ctx(b,c_pp) BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,(char *)c_pp) + +int EVP_Cipher(EVP_CIPHER_CTX *c, unsigned char *out, const unsigned char *in, + unsigned int inl); + +#define EVP_add_cipher_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n)) +#define EVP_add_digest_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n)) +#define EVP_delete_cipher_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS); +#define EVP_delete_digest_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS); + +void EVP_MD_CTX_init(EVP_MD_CTX *ctx); +int EVP_MD_CTX_cleanup(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_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); +int EVP_Digest(const void *data, size_t count, unsigned char *md, + unsigned int *size, const EVP_MD *type, ENGINE *impl); + +int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in); +int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); +int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); + +int EVP_read_pw_string(char *buf, int length, const char *prompt, int verify); +int EVP_read_pw_string_min(char *buf, int minlen, int maxlen, + const char *prompt, int verify); +void EVP_set_pw_prompt(const char *prompt); +char *EVP_get_pw_prompt(void); + +int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, + const unsigned char *salt, const unsigned char *data, int datal, int count, + unsigned char *key, unsigned char *iv); + +void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); +void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); +int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags); + +int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, const unsigned char *iv); +int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); +#ifndef LIBRESSL_INTERNAL +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); +#endif + +int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, const unsigned char *iv); +int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +#ifndef LIBRESSL_INTERNAL +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +#endif + +int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv, int enc); +int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + ENGINE *impl, const unsigned char *key, const unsigned char *iv, int enc); +int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +#ifndef LIBRESSL_INTERNAL +int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); +#endif + +int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, + EVP_PKEY *pkey); + +int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, + unsigned int siglen, EVP_PKEY *pkey); + +int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen); + +int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, unsigned char *sig, size_t siglen); + +int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + const unsigned char *ek, int ekl, const unsigned char *iv, EVP_PKEY *priv); +int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + unsigned char **ek, int *ekl, unsigned char *iv, EVP_PKEY **pubk, + int npubk); +int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); +void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); +int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl); +int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); + +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_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); +int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key); + +#ifndef OPENSSL_NO_BIO +BIO_METHOD *BIO_f_md(void); +BIO_METHOD *BIO_f_base64(void); +BIO_METHOD *BIO_f_cipher(void); +void BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k, + const unsigned char *i, int enc); +#endif + +const EVP_MD *EVP_md_null(void); +#ifndef OPENSSL_NO_MD4 +const EVP_MD *EVP_md4(void); +#endif +#ifndef OPENSSL_NO_MD5 +const EVP_MD *EVP_md5(void); +const EVP_MD *EVP_md5_sha1(void); +#endif +#ifndef OPENSSL_NO_SHA +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_dss(void); +const EVP_MD *EVP_dss1(void); +const EVP_MD *EVP_ecdsa(void); +#endif +#ifndef OPENSSL_NO_SHA256 +const EVP_MD *EVP_sha224(void); +const EVP_MD *EVP_sha256(void); +#endif +#ifndef OPENSSL_NO_SHA512 +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); +#endif +#ifndef OPENSSL_NO_RIPEMD +const EVP_MD *EVP_ripemd160(void); +#endif +#ifndef OPENSSL_NO_WHIRLPOOL +const EVP_MD *EVP_whirlpool(void); +#endif +#ifndef OPENSSL_NO_GOST +const EVP_MD *EVP_gostr341194(void); +const EVP_MD *EVP_gost2814789imit(void); +const EVP_MD *EVP_streebog256(void); +const EVP_MD *EVP_streebog512(void); +#endif +const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ +#ifndef OPENSSL_NO_DES +const EVP_CIPHER *EVP_des_ecb(void); +const EVP_CIPHER *EVP_des_ede(void); +const EVP_CIPHER *EVP_des_ede3(void); +const EVP_CIPHER *EVP_des_ede_ecb(void); +const EVP_CIPHER *EVP_des_ede3_ecb(void); +const EVP_CIPHER *EVP_des_cfb64(void); +# define EVP_des_cfb EVP_des_cfb64 +const EVP_CIPHER *EVP_des_cfb1(void); +const EVP_CIPHER *EVP_des_cfb8(void); +const EVP_CIPHER *EVP_des_ede_cfb64(void); +# define EVP_des_ede_cfb EVP_des_ede_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb64(void); +# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb1(void); +const EVP_CIPHER *EVP_des_ede3_cfb8(void); +const EVP_CIPHER *EVP_des_ofb(void); +const EVP_CIPHER *EVP_des_ede_ofb(void); +const EVP_CIPHER *EVP_des_ede3_ofb(void); +const EVP_CIPHER *EVP_des_cbc(void); +const EVP_CIPHER *EVP_des_ede_cbc(void); +const EVP_CIPHER *EVP_des_ede3_cbc(void); +const EVP_CIPHER *EVP_desx_cbc(void); +#endif +#ifndef OPENSSL_NO_RC4 +const EVP_CIPHER *EVP_rc4(void); +const EVP_CIPHER *EVP_rc4_40(void); +#ifndef OPENSSL_NO_MD5 +const EVP_CIPHER *EVP_rc4_hmac_md5(void); +#endif +#endif +#ifndef OPENSSL_NO_IDEA +const EVP_CIPHER *EVP_idea_ecb(void); +const EVP_CIPHER *EVP_idea_cfb64(void); +# define EVP_idea_cfb EVP_idea_cfb64 +const EVP_CIPHER *EVP_idea_ofb(void); +const EVP_CIPHER *EVP_idea_cbc(void); +#endif +#ifndef OPENSSL_NO_RC2 +const EVP_CIPHER *EVP_rc2_ecb(void); +const EVP_CIPHER *EVP_rc2_cbc(void); +const EVP_CIPHER *EVP_rc2_40_cbc(void); +const EVP_CIPHER *EVP_rc2_64_cbc(void); +const EVP_CIPHER *EVP_rc2_cfb64(void); +# define EVP_rc2_cfb EVP_rc2_cfb64 +const EVP_CIPHER *EVP_rc2_ofb(void); +#endif +#ifndef OPENSSL_NO_BF +const EVP_CIPHER *EVP_bf_ecb(void); +const EVP_CIPHER *EVP_bf_cbc(void); +const EVP_CIPHER *EVP_bf_cfb64(void); +# define EVP_bf_cfb EVP_bf_cfb64 +const EVP_CIPHER *EVP_bf_ofb(void); +#endif +#ifndef OPENSSL_NO_CAST +const EVP_CIPHER *EVP_cast5_ecb(void); +const EVP_CIPHER *EVP_cast5_cbc(void); +const EVP_CIPHER *EVP_cast5_cfb64(void); +# define EVP_cast5_cfb EVP_cast5_cfb64 +const EVP_CIPHER *EVP_cast5_ofb(void); +#endif +#ifndef OPENSSL_NO_AES +const EVP_CIPHER *EVP_aes_128_ecb(void); +const EVP_CIPHER *EVP_aes_128_cbc(void); +const EVP_CIPHER *EVP_aes_128_cfb1(void); +const EVP_CIPHER *EVP_aes_128_cfb8(void); +const EVP_CIPHER *EVP_aes_128_cfb128(void); +# define EVP_aes_128_cfb EVP_aes_128_cfb128 +const EVP_CIPHER *EVP_aes_128_ofb(void); +const EVP_CIPHER *EVP_aes_128_ctr(void); +const EVP_CIPHER *EVP_aes_128_ccm(void); +const EVP_CIPHER *EVP_aes_128_gcm(void); +const EVP_CIPHER *EVP_aes_128_xts(void); +const EVP_CIPHER *EVP_aes_192_ecb(void); +const EVP_CIPHER *EVP_aes_192_cbc(void); +const EVP_CIPHER *EVP_aes_192_cfb1(void); +const EVP_CIPHER *EVP_aes_192_cfb8(void); +const EVP_CIPHER *EVP_aes_192_cfb128(void); +# define EVP_aes_192_cfb EVP_aes_192_cfb128 +const EVP_CIPHER *EVP_aes_192_ofb(void); +const EVP_CIPHER *EVP_aes_192_ctr(void); +const EVP_CIPHER *EVP_aes_192_ccm(void); +const EVP_CIPHER *EVP_aes_192_gcm(void); +const EVP_CIPHER *EVP_aes_256_ecb(void); +const EVP_CIPHER *EVP_aes_256_cbc(void); +const EVP_CIPHER *EVP_aes_256_cfb1(void); +const EVP_CIPHER *EVP_aes_256_cfb8(void); +const EVP_CIPHER *EVP_aes_256_cfb128(void); +# define EVP_aes_256_cfb EVP_aes_256_cfb128 +const EVP_CIPHER *EVP_aes_256_ofb(void); +const EVP_CIPHER *EVP_aes_256_ctr(void); +const EVP_CIPHER *EVP_aes_256_ccm(void); +const EVP_CIPHER *EVP_aes_256_gcm(void); +const EVP_CIPHER *EVP_aes_256_xts(void); +#if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA1) +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void); +#endif +#endif +#ifndef OPENSSL_NO_CAMELLIA +const EVP_CIPHER *EVP_camellia_128_ecb(void); +const EVP_CIPHER *EVP_camellia_128_cbc(void); +const EVP_CIPHER *EVP_camellia_128_cfb1(void); +const EVP_CIPHER *EVP_camellia_128_cfb8(void); +const EVP_CIPHER *EVP_camellia_128_cfb128(void); +# define EVP_camellia_128_cfb EVP_camellia_128_cfb128 +const EVP_CIPHER *EVP_camellia_128_ofb(void); +const EVP_CIPHER *EVP_camellia_192_ecb(void); +const EVP_CIPHER *EVP_camellia_192_cbc(void); +const EVP_CIPHER *EVP_camellia_192_cfb1(void); +const EVP_CIPHER *EVP_camellia_192_cfb8(void); +const EVP_CIPHER *EVP_camellia_192_cfb128(void); +# define EVP_camellia_192_cfb EVP_camellia_192_cfb128 +const EVP_CIPHER *EVP_camellia_192_ofb(void); +const EVP_CIPHER *EVP_camellia_256_ecb(void); +const EVP_CIPHER *EVP_camellia_256_cbc(void); +const EVP_CIPHER *EVP_camellia_256_cfb1(void); +const EVP_CIPHER *EVP_camellia_256_cfb8(void); +const EVP_CIPHER *EVP_camellia_256_cfb128(void); +# define EVP_camellia_256_cfb EVP_camellia_256_cfb128 +const EVP_CIPHER *EVP_camellia_256_ofb(void); +#endif + +#ifndef OPENSSL_NO_CHACHA +const EVP_CIPHER *EVP_chacha20(void); +#endif + +#ifndef OPENSSL_NO_GOST +const EVP_CIPHER *EVP_gost2814789_ecb(void); +const EVP_CIPHER *EVP_gost2814789_cfb64(void); +const EVP_CIPHER *EVP_gost2814789_cnt(void); +#endif + +void OPENSSL_add_all_algorithms_noconf(void); +void OPENSSL_add_all_algorithms_conf(void); + +#ifdef OPENSSL_LOAD_CONF +#define OpenSSL_add_all_algorithms() OPENSSL_add_all_algorithms_conf() +#else +#define OpenSSL_add_all_algorithms() OPENSSL_add_all_algorithms_noconf() +#endif + +void OpenSSL_add_all_ciphers(void); +void OpenSSL_add_all_digests(void); + +#define SSLeay_add_all_algorithms() OpenSSL_add_all_algorithms() +#define SSLeay_add_all_ciphers() OpenSSL_add_all_ciphers() +#define SSLeay_add_all_digests() OpenSSL_add_all_digests() + +int EVP_add_cipher(const EVP_CIPHER *cipher); +int EVP_add_digest(const EVP_MD *digest); + +const EVP_CIPHER *EVP_get_cipherbyname(const char *name); +const EVP_MD *EVP_get_digestbyname(const char *name); +void EVP_cleanup(void); + +void EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, const char *from, + const char *to, void *x), void *arg); +void EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, + const char *from, const char *to, void *x), void *arg); + +void EVP_MD_do_all(void (*fn)(const EVP_MD *ciph, const char *from, + const char *to, void *x), void *arg); +void EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *ciph, const char *from, + const char *to, void *x), void *arg); + +int EVP_PKEY_decrypt_old(unsigned char *dec_key, const unsigned char *enc_key, + int enc_key_len, EVP_PKEY *private_key); +int EVP_PKEY_encrypt_old(unsigned char *enc_key, const unsigned char *key, + int key_len, EVP_PKEY *pub_key); +int EVP_PKEY_type(int type); +int EVP_PKEY_id(const EVP_PKEY *pkey); +int EVP_PKEY_base_id(const EVP_PKEY *pkey); +int EVP_PKEY_bits(EVP_PKEY *pkey); +int EVP_PKEY_size(EVP_PKEY *pkey); +int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); +int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len); +int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); +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_get1_RSA(EVP_PKEY *pkey); +#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_get1_DSA(EVP_PKEY *pkey); +#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_get1_DH(EVP_PKEY *pkey); +#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_get1_EC_KEY(EVP_PKEY *pkey); +#endif +#ifndef OPENSSL_NO_GOST +struct gost_key_st; +#endif + +EVP_PKEY *EVP_PKEY_new(void); +void EVP_PKEY_free(EVP_PKEY *pkey); + +EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PublicKey(EVP_PKEY *a, unsigned char **pp); + +EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp); + +int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); +int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); +int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode); +int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b); + +int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, int indent, + ASN1_PCTX *pctx); +int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, int indent, + ASN1_PCTX *pctx); +int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, int indent, + ASN1_PCTX *pctx); + +int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid); + +int EVP_CIPHER_type(const EVP_CIPHER *ctx); + +/* calls methods */ +int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* These are used by EVP_CIPHER methods */ +int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* PKCS5 password based encryption */ +int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md, int en_de); +int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, int keylen, + unsigned char *out); +int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, const unsigned char *salt, + int saltlen, int iter, const EVP_MD *digest, int keylen, + unsigned char *out); +int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de); + +void PKCS5_PBE_add(void); + +int EVP_PBE_CipherInit (ASN1_OBJECT *pbe_obj, const char *pass, int passlen, + ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); + +/* PBE type */ + +/* Can appear as the outermost AlgorithmIdentifier */ +#define EVP_PBE_TYPE_OUTER 0x0 +/* Is an PRF type OID */ +#define EVP_PBE_TYPE_PRF 0x1 + +int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, int md_nid, + EVP_PBE_KEYGEN *keygen); +int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, + EVP_PBE_KEYGEN *keygen); +int EVP_PBE_find(int type, int pbe_nid, int *pcnid, int *pmnid, + EVP_PBE_KEYGEN **pkeygen); +void EVP_PBE_cleanup(void); + +#define ASN1_PKEY_ALIAS 0x1 +#define ASN1_PKEY_DYNAMIC 0x2 +#define ASN1_PKEY_SIGPARAM_NULL 0x4 + +#define ASN1_PKEY_CTRL_PKCS7_SIGN 0x1 +#define ASN1_PKEY_CTRL_PKCS7_ENCRYPT 0x2 +#define ASN1_PKEY_CTRL_DEFAULT_MD_NID 0x3 +#define ASN1_PKEY_CTRL_CMS_SIGN 0x5 +#define ASN1_PKEY_CTRL_CMS_ENVELOPE 0x7 + +int EVP_PKEY_asn1_get_count(void); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, + const char *str, int len); +int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth); +int EVP_PKEY_asn1_add_alias(int to, int from); +int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *pkey_base_id, int *ppkey_flags, + const char **pinfo, const char **ppem_str, + const EVP_PKEY_ASN1_METHOD *ameth); + +const EVP_PKEY_ASN1_METHOD* EVP_PKEY_get0_asn1(EVP_PKEY *pkey); +EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id, int flags, const char *pem_str, + const char *info); +void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, + const EVP_PKEY_ASN1_METHOD *src); +void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth); +void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, + int (*pub_decode)(EVP_PKEY *pk, X509_PUBKEY *pub), + int (*pub_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk), + int (*pub_cmp)(const EVP_PKEY *a, const EVP_PKEY *b), + int (*pub_print)(BIO *out, const EVP_PKEY *pkey, int indent, + ASN1_PCTX *pctx), + int (*pkey_size)(const EVP_PKEY *pk), + int (*pkey_bits)(const EVP_PKEY *pk)); +void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, + int (*priv_decode)(EVP_PKEY *pk, PKCS8_PRIV_KEY_INFO *p8inf), + int (*priv_encode)(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk), + int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent, + ASN1_PCTX *pctx)); +void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, + int (*param_decode)(EVP_PKEY *pkey, const unsigned char **pder, int derlen), + int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder), + int (*param_missing)(const EVP_PKEY *pk), + int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from), + int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b), + int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent, + ASN1_PCTX *pctx)); + +void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, + void (*pkey_free)(EVP_PKEY *pkey)); +void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_ctrl)(EVP_PKEY *pkey, int op, long arg1, void *arg2)); + +#define EVP_PKEY_OP_UNDEFINED 0 +#define EVP_PKEY_OP_PARAMGEN (1<<1) +#define EVP_PKEY_OP_KEYGEN (1<<2) +#define EVP_PKEY_OP_SIGN (1<<3) +#define EVP_PKEY_OP_VERIFY (1<<4) +#define EVP_PKEY_OP_VERIFYRECOVER (1<<5) +#define EVP_PKEY_OP_SIGNCTX (1<<6) +#define EVP_PKEY_OP_VERIFYCTX (1<<7) +#define EVP_PKEY_OP_ENCRYPT (1<<8) +#define EVP_PKEY_OP_DECRYPT (1<<9) +#define EVP_PKEY_OP_DERIVE (1<<10) + +#define EVP_PKEY_OP_TYPE_SIG \ + (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER \ + | EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX) + +#define EVP_PKEY_OP_TYPE_CRYPT \ + (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT) + +#define EVP_PKEY_OP_TYPE_NOGEN \ + (EVP_PKEY_OP_SIG | EVP_PKEY_OP_CRYPT | EVP_PKEY_OP_DERIVE) + +#define EVP_PKEY_OP_TYPE_GEN \ + (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN) + +#define EVP_PKEY_CTX_set_signature_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_MD, 0, (void *)md) + +#define EVP_PKEY_CTRL_MD 1 +#define EVP_PKEY_CTRL_PEER_KEY 2 + +#define EVP_PKEY_CTRL_PKCS7_ENCRYPT 3 +#define EVP_PKEY_CTRL_PKCS7_DECRYPT 4 + +#define EVP_PKEY_CTRL_PKCS7_SIGN 5 + +#define EVP_PKEY_CTRL_SET_MAC_KEY 6 + +#define EVP_PKEY_CTRL_DIGESTINIT 7 + +/* Used by GOST key encryption in TLS */ +#define EVP_PKEY_CTRL_SET_IV 8 + +#define EVP_PKEY_CTRL_CMS_ENCRYPT 9 +#define EVP_PKEY_CTRL_CMS_DECRYPT 10 +#define EVP_PKEY_CTRL_CMS_SIGN 11 + +#define EVP_PKEY_CTRL_CIPHER 12 + +#define EVP_PKEY_ALG_CTRL 0x1000 + + +#define EVP_PKEY_FLAG_AUTOARGLEN 2 +/* Method handles all operations: don't assume any digest related + * defaults. + */ +#define EVP_PKEY_FLAG_SIGCTX_CUSTOM 4 + +const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type); +EVP_PKEY_METHOD* EVP_PKEY_meth_new(int id, int flags); +void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, + const EVP_PKEY_METHOD *meth); +void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src); +void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth); +int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth); + +EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, int cmd, + int p1, void *p2); +int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, + const char *value); + +int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen); + +EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e, const unsigned char *key, + int keylen); + +void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx); +EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx); + +EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx); + +void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx, unsigned char *rout, + size_t *routlen, const unsigned char *sig, size_t siglen); +int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); +int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); + +int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer); +int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); + +typedef int EVP_PKEY_gen_cb(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); +int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); + +void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb); +EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx); + +void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, + int (*init)(EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth, + int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)); + +void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth, + void (*cleanup)(EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth, + int (*paramgen_init)(EVP_PKEY_CTX *ctx), + int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth, + int (*keygen_init)(EVP_PKEY_CTX *ctx), + int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)); + +void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth, + int (*sign_init)(EVP_PKEY_CTX *ctx), + int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen)); + +void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth, + int (*verify_init)(EVP_PKEY_CTX *ctx), + int (*verify)(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen)); + +void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth, + int (*verify_recover_init)(EVP_PKEY_CTX *ctx), + int (*verify_recover)(EVP_PKEY_CTX *ctx, unsigned char *sig, + size_t *siglen, const unsigned char *tbs, size_t tbslen)); + +void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth, + int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx), + int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth, + int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx), + int (*verifyctx)(EVP_PKEY_CTX *ctx, const unsigned char *sig, int siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth, + int (*encrypt_init)(EVP_PKEY_CTX *ctx), + int (*encryptfn)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen)); + +void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth, + int (*decrypt_init)(EVP_PKEY_CTX *ctx), + int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen)); + +void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth, + int (*derive_init)(EVP_PKEY_CTX *ctx), + int (*derive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)); + +void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, + int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2), + int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value)); + +/* Authenticated Encryption with Additional Data. + * + * AEAD couples confidentiality and integrity in a single primtive. AEAD + * algorithms take a key and then can seal and open individual messages. Each + * message has a unique, per-message nonce and, optionally, additional data + * which is authenticated but not included in the output. */ + +struct evp_aead_st; +typedef struct evp_aead_st EVP_AEAD; + +#ifndef OPENSSL_NO_AES +/* EVP_aes_128_gcm is AES-128 in Galois Counter Mode. */ +const EVP_AEAD *EVP_aead_aes_128_gcm(void); +/* EVP_aes_256_gcm is AES-256 in Galois Counter Mode. */ +const EVP_AEAD *EVP_aead_aes_256_gcm(void); +#endif + +#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) +/* EVP_aead_chacha20_poly1305 is ChaCha20 with a Poly1305 authenticator. */ +const EVP_AEAD *EVP_aead_chacha20_poly1305(void); +const EVP_AEAD *EVP_aead_chacha20_poly1305_old(void); +#endif + +/* EVP_AEAD_key_length returns the length of the keys used. */ +size_t EVP_AEAD_key_length(const EVP_AEAD *aead); + +/* EVP_AEAD_nonce_length returns the length of the per-message nonce. */ +size_t EVP_AEAD_nonce_length(const EVP_AEAD *aead); + +/* EVP_AEAD_max_overhead returns the maximum number of additional bytes added + * by the act of sealing data with the AEAD. */ +size_t EVP_AEAD_max_overhead(const EVP_AEAD *aead); + +/* EVP_AEAD_max_tag_len returns the maximum tag length when using this AEAD. + * This * is the largest value that can be passed as a tag length to + * EVP_AEAD_CTX_init. */ +size_t EVP_AEAD_max_tag_len(const EVP_AEAD *aead); + +/* An EVP_AEAD_CTX represents an AEAD algorithm configured with a specific key + * and message-independent IV. */ +typedef struct evp_aead_ctx_st { + const EVP_AEAD *aead; + /* aead_state is an opaque pointer to the AEAD specific state. */ + void *aead_state; +} EVP_AEAD_CTX; + +/* EVP_AEAD_MAX_TAG_LENGTH is the maximum tag length used by any AEAD + * defined in this header. */ +#define EVP_AEAD_MAX_TAG_LENGTH 16 + +/* EVP_AEAD_DEFAULT_TAG_LENGTH is a magic value that can be passed to + * EVP_AEAD_CTX_init to indicate that the default tag length for an AEAD + * should be used. */ +#define EVP_AEAD_DEFAULT_TAG_LENGTH 0 + +/* EVP_AEAD_init initializes the context for the given AEAD algorithm. + * The implementation argument may be NULL to choose the default implementation. + * Authentication tags may be truncated by passing a tag length. A tag length + * of zero indicates the default tag length should be used. */ +int EVP_AEAD_CTX_init(EVP_AEAD_CTX *ctx, const EVP_AEAD *aead, + const unsigned char *key, size_t key_len, size_t tag_len, ENGINE *impl); + +/* EVP_AEAD_CTX_cleanup frees any data allocated for this context. */ +void EVP_AEAD_CTX_cleanup(EVP_AEAD_CTX *ctx); + +/* EVP_AEAD_CTX_seal encrypts and authenticates the input and authenticates + * any additional data (AD), the result being written as output. One is + * returned on success, otherwise zero. + * + * This function may be called (with the same EVP_AEAD_CTX) concurrently with + * itself or EVP_AEAD_CTX_open. + * + * At most max_out_len bytes are written as output and, in order to ensure + * success, this value should be the length of the input plus the result of + * EVP_AEAD_overhead. On successful return, out_len is set to the actual + * number of bytes written. + * + * The length of the nonce is must be equal to the result of + * EVP_AEAD_nonce_length for this AEAD. + * + * EVP_AEAD_CTX_seal never results in a partial output. If max_out_len is + * insufficient, zero will be returned and out_len will be set to zero. + * + * If the input and output are aliased then out must be <= in. */ +int EVP_AEAD_CTX_seal(const EVP_AEAD_CTX *ctx, unsigned char *out, + size_t *out_len, size_t max_out_len, const unsigned char *nonce, + size_t nonce_len, const unsigned char *in, size_t in_len, + const unsigned char *ad, size_t ad_len); + +/* EVP_AEAD_CTX_open authenticates the input and additional data, decrypting + * the input and writing it as output. One is returned on success, otherwise + * zero. + * + * This function may be called (with the same EVP_AEAD_CTX) concurrently with + * itself or EVP_AEAD_CTX_seal. + * + * At most the number of input bytes are written as output. In order to ensure + * success, max_out_len should be at least the same as the input length. On + * successful return out_len is set to the actual number of bytes written. + * + * The length of nonce must be equal to the result of EVP_AEAD_nonce_length + * for this AEAD. + * + * EVP_AEAD_CTX_open never results in a partial output. If max_out_len is + * insufficient, zero will be returned and out_len will be set to zero. + * + * If the input and output are aliased then out must be <= in. */ +int EVP_AEAD_CTX_open(const EVP_AEAD_CTX *ctx, unsigned char *out, + size_t *out_len, size_t max_out_len, const unsigned char *nonce, + size_t nonce_len, const unsigned char *in, size_t in_len, + const unsigned char *ad, size_t ad_len); + +void EVP_add_alg_module(void); + +/* 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. + */ +void ERR_load_EVP_strings(void); + +/* Error codes for the EVP functions. */ + +/* Function codes. */ +#define EVP_F_AEAD_AES_GCM_INIT 187 +#define EVP_F_AEAD_AES_GCM_OPEN 188 +#define EVP_F_AEAD_AES_GCM_SEAL 189 +#define EVP_F_AEAD_CHACHA20_POLY1305_INIT 192 +#define EVP_F_AEAD_CHACHA20_POLY1305_OPEN 193 +#define EVP_F_AEAD_CHACHA20_POLY1305_SEAL 194 +#define EVP_F_AEAD_CTX_OPEN 185 +#define EVP_F_AEAD_CTX_SEAL 186 +#define EVP_F_AESNI_INIT_KEY 165 +#define EVP_F_AESNI_XTS_CIPHER 176 +#define EVP_F_AES_INIT_KEY 133 +#define EVP_F_AES_XTS 172 +#define EVP_F_AES_XTS_CIPHER 175 +#define EVP_F_ALG_MODULE_INIT 177 +#define EVP_F_CAMELLIA_INIT_KEY 159 +#define EVP_F_CMAC_INIT 173 +#define EVP_F_D2I_PKEY 100 +#define EVP_F_DO_SIGVER_INIT 161 +#define EVP_F_DSAPKEY2PKCS8 134 +#define EVP_F_DSA_PKEY2PKCS8 135 +#define EVP_F_ECDSA_PKEY2PKCS8 129 +#define EVP_F_ECKEY_PKEY2PKCS8 132 +#define EVP_F_EVP_AEAD_CTX_INIT 180 +#define EVP_F_EVP_AEAD_CTX_OPEN 190 +#define EVP_F_EVP_AEAD_CTX_SEAL 191 +#define EVP_F_EVP_BYTESTOKEY 200 +#define EVP_F_EVP_CIPHERINIT_EX 123 +#define EVP_F_EVP_CIPHER_CTX_COPY 163 +#define EVP_F_EVP_CIPHER_CTX_CTRL 124 +#define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 122 +#define EVP_F_EVP_CIPHER_GET_ASN1_IV 201 +#define EVP_F_EVP_CIPHER_SET_ASN1_IV 202 +#define EVP_F_EVP_DECRYPTFINAL_EX 101 +#define EVP_F_EVP_DECRYPTUPDATE 199 +#define EVP_F_EVP_DIGESTFINAL_EX 196 +#define EVP_F_EVP_DIGESTINIT_EX 128 +#define EVP_F_EVP_ENCRYPTFINAL_EX 127 +#define EVP_F_EVP_ENCRYPTUPDATE 198 +#define EVP_F_EVP_MD_CTX_COPY_EX 110 +#define EVP_F_EVP_MD_CTX_CTRL 195 +#define EVP_F_EVP_MD_SIZE 162 +#define EVP_F_EVP_OPENINIT 102 +#define EVP_F_EVP_PBE_ALG_ADD 115 +#define EVP_F_EVP_PBE_ALG_ADD_TYPE 160 +#define EVP_F_EVP_PBE_CIPHERINIT 116 +#define EVP_F_EVP_PKCS82PKEY 111 +#define EVP_F_EVP_PKCS82PKEY_BROKEN 136 +#define EVP_F_EVP_PKEY2PKCS8_BROKEN 113 +#define EVP_F_EVP_PKEY_COPY_PARAMETERS 103 +#define EVP_F_EVP_PKEY_CTX_CTRL 137 +#define EVP_F_EVP_PKEY_CTX_CTRL_STR 150 +#define EVP_F_EVP_PKEY_CTX_DUP 156 +#define EVP_F_EVP_PKEY_DECRYPT 104 +#define EVP_F_EVP_PKEY_DECRYPT_INIT 138 +#define EVP_F_EVP_PKEY_DECRYPT_OLD 151 +#define EVP_F_EVP_PKEY_DERIVE 153 +#define EVP_F_EVP_PKEY_DERIVE_INIT 154 +#define EVP_F_EVP_PKEY_DERIVE_SET_PEER 155 +#define EVP_F_EVP_PKEY_ENCRYPT 105 +#define EVP_F_EVP_PKEY_ENCRYPT_INIT 139 +#define EVP_F_EVP_PKEY_ENCRYPT_OLD 152 +#define EVP_F_EVP_PKEY_GET1_DH 119 +#define EVP_F_EVP_PKEY_GET1_DSA 120 +#define EVP_F_EVP_PKEY_GET1_ECDSA 130 +#define EVP_F_EVP_PKEY_GET1_EC_KEY 131 +#define EVP_F_EVP_PKEY_GET1_RSA 121 +#define EVP_F_EVP_PKEY_KEYGEN 146 +#define EVP_F_EVP_PKEY_KEYGEN_INIT 147 +#define EVP_F_EVP_PKEY_NEW 106 +#define EVP_F_EVP_PKEY_PARAMGEN 148 +#define EVP_F_EVP_PKEY_PARAMGEN_INIT 149 +#define EVP_F_EVP_PKEY_SIGN 140 +#define EVP_F_EVP_PKEY_SIGN_INIT 141 +#define EVP_F_EVP_PKEY_VERIFY 142 +#define EVP_F_EVP_PKEY_VERIFY_INIT 143 +#define EVP_F_EVP_PKEY_VERIFY_RECOVER 144 +#define EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT 145 +#define EVP_F_EVP_RIJNDAEL 126 +#define EVP_F_EVP_SIGNFINAL 107 +#define EVP_F_EVP_VERIFYFINAL 108 +#define EVP_F_FIPS_CIPHERINIT 166 +#define EVP_F_FIPS_CIPHER_CTX_COPY 170 +#define EVP_F_FIPS_CIPHER_CTX_CTRL 167 +#define EVP_F_FIPS_CIPHER_CTX_SET_KEY_LENGTH 171 +#define EVP_F_FIPS_DIGESTINIT 168 +#define EVP_F_FIPS_MD_CTX_COPY 169 +#define EVP_F_HMAC_INIT_EX 174 +#define EVP_F_INT_CTX_NEW 157 +#define EVP_F_PKCS5_PBE_KEYIVGEN 117 +#define EVP_F_PKCS5_V2_PBE_KEYIVGEN 118 +#define EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN 164 +#define EVP_F_PKCS8_SET_BROKEN 112 +#define EVP_F_PKEY_SET_TYPE 158 +#define EVP_F_RC2_GET_ASN1_TYPE_AND_IV 197 +#define EVP_F_RC2_MAGIC_TO_METH 109 +#define EVP_F_RC5_CTRL 125 + +/* Reason codes. */ +#define EVP_R_AES_IV_SETUP_FAILED 162 +#define EVP_R_AES_KEY_SETUP_FAILED 143 +#define EVP_R_ASN1_LIB 140 +#define EVP_R_BAD_BLOCK_LENGTH 136 +#define EVP_R_BAD_DECRYPT 100 +#define EVP_R_BAD_KEY_LENGTH 137 +#define EVP_R_BN_DECODE_ERROR 112 +#define EVP_R_BN_PUBKEY_ERROR 113 +#define EVP_R_BUFFER_TOO_SMALL 155 +#define EVP_R_CAMELLIA_KEY_SETUP_FAILED 157 +#define EVP_R_CIPHER_PARAMETER_ERROR 122 +#define EVP_R_COMMAND_NOT_SUPPORTED 147 +#define EVP_R_CTRL_NOT_IMPLEMENTED 132 +#define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED 133 +#define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 +#define EVP_R_DECODE_ERROR 114 +#define EVP_R_DIFFERENT_KEY_TYPES 101 +#define EVP_R_DIFFERENT_PARAMETERS 153 +#define EVP_R_DISABLED_FOR_FIPS 163 +#define EVP_R_ENCODE_ERROR 115 +#define EVP_R_ERROR_LOADING_SECTION 165 +#define EVP_R_ERROR_SETTING_FIPS_MODE 166 +#define EVP_R_EVP_PBE_CIPHERINIT_ERROR 119 +#define EVP_R_EXPECTING_AN_RSA_KEY 127 +#define EVP_R_EXPECTING_A_DH_KEY 128 +#define EVP_R_EXPECTING_A_DSA_KEY 129 +#define EVP_R_EXPECTING_A_ECDSA_KEY 141 +#define EVP_R_EXPECTING_A_EC_KEY 142 +#define EVP_R_FIPS_MODE_NOT_SUPPORTED 167 +#define EVP_R_INITIALIZATION_ERROR 134 +#define EVP_R_INPUT_NOT_INITIALIZED 111 +#define EVP_R_INVALID_DIGEST 152 +#define EVP_R_INVALID_FIPS_MODE 168 +#define EVP_R_INVALID_KEY_LENGTH 130 +#define EVP_R_INVALID_OPERATION 148 +#define EVP_R_IV_TOO_LARGE 102 +#define EVP_R_KEYGEN_FAILURE 120 +#define EVP_R_MESSAGE_DIGEST_IS_NULL 159 +#define EVP_R_METHOD_NOT_SUPPORTED 144 +#define EVP_R_MISSING_PARAMETERS 103 +#define EVP_R_NO_CIPHER_SET 131 +#define EVP_R_NO_DEFAULT_DIGEST 158 +#define EVP_R_NO_DIGEST_SET 139 +#define EVP_R_NO_DSA_PARAMETERS 116 +#define EVP_R_NO_KEY_SET 154 +#define EVP_R_NO_OPERATION_SET 149 +#define EVP_R_NO_SIGN_FUNCTION_CONFIGURED 104 +#define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED 105 +#define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 +#define EVP_R_OPERATON_NOT_INITIALIZED 151 +#define EVP_R_OUTPUT_ALIASES_INPUT 172 +#define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE 117 +#define EVP_R_PRIVATE_KEY_DECODE_ERROR 145 +#define EVP_R_PRIVATE_KEY_ENCODE_ERROR 146 +#define EVP_R_PUBLIC_KEY_NOT_RSA 106 +#define EVP_R_TAG_TOO_LARGE 171 +#define EVP_R_TOO_LARGE 164 +#define EVP_R_UNKNOWN_CIPHER 160 +#define EVP_R_UNKNOWN_DIGEST 161 +#define EVP_R_UNKNOWN_OPTION 169 +#define EVP_R_UNKNOWN_PBE_ALGORITHM 121 +#define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS 135 +#define EVP_R_UNSUPPORTED_ALGORITHM 156 +#define EVP_R_UNSUPPORTED_CIPHER 107 +#define EVP_R_UNSUPPORTED_KEYLENGTH 123 +#define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION 124 +#define EVP_R_UNSUPPORTED_KEY_SIZE 108 +#define EVP_R_UNSUPPORTED_PRF 125 +#define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 +#define EVP_R_UNSUPPORTED_SALT_TYPE 126 +#define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 +#define EVP_R_WRONG_PUBLIC_KEY_TYPE 110 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/gost.h b/src/3rdparty/win32_include/openssl/gost.h new file mode 100644 index 000000000..092f96fb6 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/gost.h @@ -0,0 +1,266 @@ +/* $OpenBSD: gost.h,v 1.3 2016/09/04 17:02:31 jsing Exp $ */ +/* + * Copyright (c) 2014 Dmitry Eremin-Solenikov + * Copyright (c) 2005-2006 Cryptocom LTD + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#ifndef HEADER_GOST_H +#define HEADER_GOST_H + +#include + +#ifdef OPENSSL_NO_GOST +#error GOST is disabled. +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct gost2814789_key_st { + unsigned int key[8]; + unsigned int k87[256],k65[256],k43[256],k21[256]; + unsigned int count; + unsigned key_meshing : 1; +} GOST2814789_KEY; + +int Gost2814789_set_sbox(GOST2814789_KEY *key, int nid); +int Gost2814789_set_key(GOST2814789_KEY *key, + const unsigned char *userKey, const int bits); +void Gost2814789_ecb_encrypt(const unsigned char *in, unsigned char *out, + GOST2814789_KEY *key, const int enc); +void Gost2814789_cfb64_encrypt(const unsigned char *in, unsigned char *out, + size_t length, GOST2814789_KEY *key, + unsigned char *ivec, int *num, const int enc); +void Gost2814789_cnt_encrypt(const unsigned char *in, unsigned char *out, + size_t length, GOST2814789_KEY *key, + unsigned char *ivec, unsigned char *cnt_buf, int *num); + +typedef struct { + ASN1_OCTET_STRING *iv; + ASN1_OBJECT *enc_param_set; +} GOST_CIPHER_PARAMS; + +GOST_CIPHER_PARAMS *GOST_CIPHER_PARAMS_new(void); +void GOST_CIPHER_PARAMS_free(GOST_CIPHER_PARAMS *a); +GOST_CIPHER_PARAMS *d2i_GOST_CIPHER_PARAMS(GOST_CIPHER_PARAMS **a, const unsigned char **in, long len); +int i2d_GOST_CIPHER_PARAMS(GOST_CIPHER_PARAMS *a, unsigned char **out); +extern const ASN1_ITEM GOST_CIPHER_PARAMS_it; + +#define GOST2814789IMIT_LENGTH 4 +#define GOST2814789IMIT_CBLOCK 8 +#define GOST2814789IMIT_LONG unsigned int + +typedef struct GOST2814789IMITstate_st { + GOST2814789IMIT_LONG Nl, Nh; + unsigned char data[GOST2814789IMIT_CBLOCK]; + unsigned int num; + + GOST2814789_KEY cipher; + unsigned char mac[GOST2814789IMIT_CBLOCK]; +} GOST2814789IMIT_CTX; + +/* Note, also removed second parameter and removed dctx->cipher setting */ +int GOST2814789IMIT_Init(GOST2814789IMIT_CTX *c, int nid); +int GOST2814789IMIT_Update(GOST2814789IMIT_CTX *c, const void *data, size_t len); +int GOST2814789IMIT_Final(unsigned char *md, GOST2814789IMIT_CTX *c); +void GOST2814789IMIT_Transform(GOST2814789IMIT_CTX *c, const unsigned char *data); +unsigned char *GOST2814789IMIT(const unsigned char *d, size_t n, + unsigned char *md, int nid, + const unsigned char *key, const unsigned char *iv); + +#define GOSTR341194_LONG unsigned int + +#define GOSTR341194_LENGTH 32 +#define GOSTR341194_CBLOCK 32 +#define GOSTR341194_LBLOCK (GOSTR341194_CBLOCK/4) + +typedef struct GOSTR341194state_st { + GOSTR341194_LONG Nl, Nh; + GOSTR341194_LONG data[GOSTR341194_LBLOCK]; + unsigned int num; + + GOST2814789_KEY cipher; + unsigned char H[GOSTR341194_CBLOCK]; + unsigned char S[GOSTR341194_CBLOCK]; +} GOSTR341194_CTX; + +/* Note, also removed second parameter and removed dctx->cipher setting */ +int GOSTR341194_Init(GOSTR341194_CTX *c, int nid); +int GOSTR341194_Update(GOSTR341194_CTX *c, const void *data, size_t len); +int GOSTR341194_Final(unsigned char *md, GOSTR341194_CTX *c); +void GOSTR341194_Transform(GOSTR341194_CTX *c, const unsigned char *data); +unsigned char *GOSTR341194(const unsigned char *d, size_t n,unsigned char *md, int nid); + +#if defined(_LP64) +#define STREEBOG_LONG64 unsigned long +#define U64(C) C##UL +#else +#define STREEBOG_LONG64 unsigned long long +#define U64(C) C##ULL +#endif + +#define STREEBOG_LBLOCK 8 +#define STREEBOG_CBLOCK 64 +#define STREEBOG256_LENGTH 32 +#define STREEBOG512_LENGTH 64 + +typedef struct STREEBOGstate_st { + STREEBOG_LONG64 data[STREEBOG_LBLOCK]; + unsigned int num; + unsigned int md_len; + STREEBOG_LONG64 h[STREEBOG_LBLOCK]; + STREEBOG_LONG64 N[STREEBOG_LBLOCK]; + STREEBOG_LONG64 Sigma[STREEBOG_LBLOCK]; +} STREEBOG_CTX; + +int STREEBOG256_Init(STREEBOG_CTX *c); +int STREEBOG256_Update(STREEBOG_CTX *c, const void *data, size_t len); +int STREEBOG256_Final(unsigned char *md, STREEBOG_CTX *c); +void STREEBOG256_Transform(STREEBOG_CTX *c, const unsigned char *data); +unsigned char *STREEBOG256(const unsigned char *d, size_t n,unsigned char *md); + +int STREEBOG512_Init(STREEBOG_CTX *c); +int STREEBOG512_Update(STREEBOG_CTX *c, const void *data, size_t len); +int STREEBOG512_Final(unsigned char *md, STREEBOG_CTX *c); +void STREEBOG512_Transform(STREEBOG_CTX *c, const unsigned char *data); +unsigned char *STREEBOG512(const unsigned char *d, size_t n,unsigned char *md); + +typedef struct gost_key_st GOST_KEY; +GOST_KEY *GOST_KEY_new(void); +void GOST_KEY_free(GOST_KEY * r); +int GOST_KEY_check_key(const GOST_KEY * eckey); +int GOST_KEY_set_public_key_affine_coordinates(GOST_KEY * key, BIGNUM * x, BIGNUM * y); +const EC_GROUP * GOST_KEY_get0_group(const GOST_KEY * key); +int GOST_KEY_set_group(GOST_KEY * key, const EC_GROUP * group); +int GOST_KEY_get_digest(const GOST_KEY * key); +int GOST_KEY_set_digest(GOST_KEY * key, int digest_nid); +const BIGNUM * GOST_KEY_get0_private_key(const GOST_KEY * key); +int GOST_KEY_set_private_key(GOST_KEY * key, const BIGNUM * priv_key); +const EC_POINT * GOST_KEY_get0_public_key(const GOST_KEY * key); +int GOST_KEY_set_public_key(GOST_KEY * key, const EC_POINT * pub_key); +size_t GOST_KEY_get_size(const GOST_KEY * r); + +/* Gost-specific pmeth control-function parameters */ +/* For GOST R34.10 parameters */ +#define EVP_PKEY_CTRL_GOST_PARAMSET (EVP_PKEY_ALG_CTRL+1) +#define EVP_PKEY_CTRL_GOST_SIG_FORMAT (EVP_PKEY_ALG_CTRL+2) +#define EVP_PKEY_CTRL_GOST_SET_DIGEST (EVP_PKEY_ALG_CTRL+3) +#define EVP_PKEY_CTRL_GOST_GET_DIGEST (EVP_PKEY_ALG_CTRL+4) + +#define GOST_SIG_FORMAT_SR_BE 0 +#define GOST_SIG_FORMAT_RS_LE 1 + +/* 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. + */ +void ERR_load_GOST_strings(void); + +/* Error codes for the GOST functions. */ + +/* Function codes. */ +#define GOST_F_DECODE_GOST01_ALGOR_PARAMS 104 +#define GOST_F_ENCODE_GOST01_ALGOR_PARAMS 105 +#define GOST_F_GOST2001_COMPUTE_PUBLIC 106 +#define GOST_F_GOST2001_DO_SIGN 107 +#define GOST_F_GOST2001_DO_VERIFY 108 +#define GOST_F_GOST2001_KEYGEN 109 +#define GOST_F_GOST89_GET_ASN1_PARAMETERS 102 +#define GOST_F_GOST89_SET_ASN1_PARAMETERS 103 +#define GOST_F_GOST_KEY_CHECK_KEY 124 +#define GOST_F_GOST_KEY_NEW 125 +#define GOST_F_GOST_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 126 +#define GOST_F_PARAM_COPY_GOST01 110 +#define GOST_F_PARAM_DECODE_GOST01 111 +#define GOST_F_PKEY_GOST01_CTRL 116 +#define GOST_F_PKEY_GOST01_DECRYPT 112 +#define GOST_F_PKEY_GOST01_DERIVE 113 +#define GOST_F_PKEY_GOST01_ENCRYPT 114 +#define GOST_F_PKEY_GOST01_PARAMGEN 115 +#define GOST_F_PKEY_GOST01_SIGN 123 +#define GOST_F_PKEY_GOST_MAC_CTRL 100 +#define GOST_F_PKEY_GOST_MAC_KEYGEN 101 +#define GOST_F_PRIV_DECODE_GOST01 117 +#define GOST_F_PUB_DECODE_GOST01 118 +#define GOST_F_PUB_ENCODE_GOST01 119 +#define GOST_F_PUB_PRINT_GOST01 120 +#define GOST_F_UNPACK_SIGNATURE_CP 121 +#define GOST_F_UNPACK_SIGNATURE_LE 122 + +/* Reason codes. */ +#define GOST_R_BAD_KEY_PARAMETERS_FORMAT 104 +#define GOST_R_BAD_PKEY_PARAMETERS_FORMAT 105 +#define GOST_R_CANNOT_PACK_EPHEMERAL_KEY 106 +#define GOST_R_CTRL_CALL_FAILED 107 +#define GOST_R_ERROR_COMPUTING_SHARED_KEY 108 +#define GOST_R_ERROR_PARSING_KEY_TRANSPORT_INFO 109 +#define GOST_R_INCOMPATIBLE_ALGORITHMS 110 +#define GOST_R_INCOMPATIBLE_PEER_KEY 111 +#define GOST_R_INVALID_DIGEST_TYPE 100 +#define GOST_R_INVALID_IV_LENGTH 103 +#define GOST_R_INVALID_MAC_KEY_LENGTH 101 +#define GOST_R_KEY_IS_NOT_INITIALIZED 112 +#define GOST_R_KEY_PARAMETERS_MISSING 113 +#define GOST_R_MAC_KEY_NOT_SET 102 +#define GOST_R_NO_PARAMETERS_SET 115 +#define GOST_R_NO_PEER_KEY 116 +#define GOST_R_NO_PRIVATE_PART_OF_NON_EPHEMERAL_KEYPAIR 117 +#define GOST_R_PUBLIC_KEY_UNDEFINED 118 +#define GOST_R_RANDOM_NUMBER_GENERATOR_FAILED 120 +#define GOST_R_SIGNATURE_MISMATCH 121 +#define GOST_R_SIGNATURE_PARTS_GREATER_THAN_Q 122 +#define GOST_R_UKM_NOT_SET 123 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/hmac.h b/src/3rdparty/win32_include/openssl/hmac.h new file mode 100644 index 000000000..f3418b3cb --- /dev/null +++ b/src/3rdparty/win32_include/openssl/hmac.h @@ -0,0 +1,108 @@ +/* $OpenBSD: hmac.h,v 1.12 2014/06/21 13:39:46 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +#ifndef HEADER_HMAC_H +#define HEADER_HMAC_H + +#include + +#ifdef OPENSSL_NO_HMAC +#error HMAC is disabled. +#endif + +#include + +#define HMAC_MAX_MD_CBLOCK 128 /* largest known is SHA512 */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct hmac_ctx_st { + const EVP_MD *md; + EVP_MD_CTX md_ctx; + EVP_MD_CTX i_ctx; + EVP_MD_CTX o_ctx; + unsigned int key_length; + unsigned char key[HMAC_MAX_MD_CBLOCK]; +} HMAC_CTX; + +#define HMAC_size(e) (EVP_MD_size((e)->md)) + + +void HMAC_CTX_init(HMAC_CTX *ctx); +void HMAC_CTX_cleanup(HMAC_CTX *ctx); + +#define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) /* deprecated */ + +int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md); /* deprecated */ +int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md, + ENGINE *impl); +int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len); +int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len); +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); +int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); + +void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/idea.h b/src/3rdparty/win32_include/openssl/idea.h new file mode 100644 index 000000000..f76bcaeba --- /dev/null +++ b/src/3rdparty/win32_include/openssl/idea.h @@ -0,0 +1,100 @@ +/* $OpenBSD: idea.h,v 1.10 2014/06/12 15:49:29 deraadt Exp $ */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_IDEA_H +#define HEADER_IDEA_H + +#include /* IDEA_INT, OPENSSL_NO_IDEA */ + +#ifdef OPENSSL_NO_IDEA +#error IDEA is disabled. +#endif + +#define IDEA_ENCRYPT 1 +#define IDEA_DECRYPT 0 + +#define IDEA_BLOCK 8 +#define IDEA_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct idea_key_st + { + IDEA_INT data[9][6]; + } IDEA_KEY_SCHEDULE; + +const char *idea_options(void); +void idea_ecb_encrypt(const unsigned char *in, unsigned char *out, + IDEA_KEY_SCHEDULE *ks); +void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks); +void idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk); +void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv,int enc); +void idea_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, + int *num,int enc); +void idea_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, int *num); +void idea_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/lhash.h b/src/3rdparty/win32_include/openssl/lhash.h new file mode 100644 index 000000000..9c6365739 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/lhash.h @@ -0,0 +1,235 @@ +/* $OpenBSD: lhash.h,v 1.12 2014/06/12 15:49:29 deraadt Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* Header for dynamic hash table routines + * Author - Eric Young + */ + +#ifndef HEADER_LHASH_H +#define HEADER_LHASH_H + +#include + +#include + +#ifndef OPENSSL_NO_BIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st { + void *data; + struct lhash_node_st *next; +#ifndef OPENSSL_NO_HASH_COMP + unsigned long hash; +#endif +} LHASH_NODE; + +typedef int (*LHASH_COMP_FN_TYPE)(const void *, const void *); +typedef unsigned long (*LHASH_HASH_FN_TYPE)(const void *); +typedef void (*LHASH_DOALL_FN_TYPE)(void *); +typedef void (*LHASH_DOALL_ARG_FN_TYPE)(void *, void *); + +/* Macros for declaring and implementing type-safe wrappers for LHASH callbacks. + * This way, callbacks can be provided to LHASH structures without function + * pointer casting and the macro-defined callbacks provide per-variable casting + * before deferring to the underlying type-specific callbacks. NB: It is + * possible to place a "static" in front of both the DECLARE and IMPLEMENT + * macros if the functions are strictly internal. */ + +/* First: "hash" functions */ +#define DECLARE_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *); +#define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *arg) { \ + const o_type *a = arg; \ + return name##_hash(a); } +#define LHASH_HASH_FN(name) name##_LHASH_HASH + +/* Second: "compare" functions */ +#define DECLARE_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *, const void *); +#define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ + const o_type *a = arg1; \ + const o_type *b = arg2; \ + return name##_cmp(a,b); } +#define LHASH_COMP_FN(name) name##_LHASH_COMP + +/* Third: "doall" functions */ +#define DECLARE_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *); +#define IMPLEMENT_LHASH_DOALL_FN(name, o_type) \ + void name##_LHASH_DOALL(void *arg) { \ + o_type *a = arg; \ + name##_doall(a); } +#define LHASH_DOALL_FN(name) name##_LHASH_DOALL + +/* Fourth: "doall_arg" functions */ +#define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *, void *); +#define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ + o_type *a = arg1; \ + a_type *b = arg2; \ + name##_doall_arg(a, b); } +#define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG + +typedef struct lhash_st { + LHASH_NODE **b; + LHASH_COMP_FN_TYPE comp; + LHASH_HASH_FN_TYPE hash; + unsigned int num_nodes; + unsigned int num_alloc_nodes; + unsigned int p; + unsigned int pmax; + unsigned long up_load; /* load times 256 */ + unsigned long down_load; /* load times 256 */ + unsigned long num_items; + + unsigned long num_expands; + unsigned long num_expand_reallocs; + unsigned long num_contracts; + unsigned long num_contract_reallocs; + unsigned long num_hash_calls; + unsigned long num_comp_calls; + unsigned long num_insert; + unsigned long num_replace; + unsigned long num_delete; + unsigned long num_no_delete; + unsigned long num_retrieve; + unsigned long num_retrieve_miss; + unsigned long num_hash_comps; + + int error; +} _LHASH; /* Do not use _LHASH directly, use LHASH_OF + * and friends */ + +#define LH_LOAD_MULT 256 + +/* Indicates a malloc() error in the last call, this is only bad + * in lh_insert(). */ +#define lh_error(lh) ((lh)->error) + +_LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); +void lh_free(_LHASH *lh); +void *lh_insert(_LHASH *lh, void *data); +void *lh_delete(_LHASH *lh, const void *data); +void *lh_retrieve(_LHASH *lh, const void *data); +void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func); +void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); +unsigned long lh_strhash(const char *c); +unsigned long lh_num_items(const _LHASH *lh); + +void lh_stats(const _LHASH *lh, FILE *out); +void lh_node_stats(const _LHASH *lh, FILE *out); +void lh_node_usage_stats(const _LHASH *lh, FILE *out); + +#ifndef OPENSSL_NO_BIO +void lh_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_stats_bio(const _LHASH *lh, BIO *out); +void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); +#endif + +/* Type checking... */ + +#define LHASH_OF(type) struct lhash_st_##type + +#define DECLARE_LHASH_OF(type) LHASH_OF(type) { int dummy; } + +#define CHECKED_LHASH_OF(type,lh) \ + ((_LHASH *)CHECKED_PTR_OF(LHASH_OF(type),lh)) + +/* Define wrapper functions. */ +#define LHM_lh_new(type, name) \ + ((LHASH_OF(type) *)lh_new(LHASH_HASH_FN(name), LHASH_COMP_FN(name))) +#define LHM_lh_error(type, lh) \ + lh_error(CHECKED_LHASH_OF(type,lh)) +#define LHM_lh_insert(type, lh, inst) \ + ((type *)lh_insert(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +#define LHM_lh_retrieve(type, lh, inst) \ + ((type *)lh_retrieve(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +#define LHM_lh_delete(type, lh, inst) \ + ((type *)lh_delete(CHECKED_LHASH_OF(type, lh), \ + CHECKED_PTR_OF(type, inst))) +#define LHM_lh_doall(type, lh,fn) lh_doall(CHECKED_LHASH_OF(type, lh), fn) +#define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \ + lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg)) +#define LHM_lh_num_items(type, lh) lh_num_items(CHECKED_LHASH_OF(type, lh)) +#define LHM_lh_down_load(type, lh) (CHECKED_LHASH_OF(type, lh)->down_load) +#define LHM_lh_node_stats_bio(type, lh, out) \ + lh_node_stats_bio(CHECKED_LHASH_OF(type, lh), out) +#define LHM_lh_node_usage_stats_bio(type, lh, out) \ + lh_node_usage_stats_bio(CHECKED_LHASH_OF(type, lh), out) +#define LHM_lh_stats_bio(type, lh, out) \ + lh_stats_bio(CHECKED_LHASH_OF(type, lh), out) +#define LHM_lh_free(type, lh) lh_free(CHECKED_LHASH_OF(type, lh)) + +DECLARE_LHASH_OF(OPENSSL_STRING); +DECLARE_LHASH_OF(OPENSSL_CSTRING); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/md4.h b/src/3rdparty/win32_include/openssl/md4.h new file mode 100644 index 000000000..04aacc980 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/md4.h @@ -0,0 +1,103 @@ +/* $OpenBSD: md4.h,v 1.16 2015/09/14 01:45:03 doug Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include + +#ifndef HEADER_MD4_H +#define HEADER_MD4_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_MD4 +#error MD4 is disabled. +#endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD4_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#define MD4_LONG unsigned int + +#define MD4_CBLOCK 64 +#define MD4_LBLOCK (MD4_CBLOCK/4) +#define MD4_DIGEST_LENGTH 16 + +typedef struct MD4state_st + { + MD4_LONG A,B,C,D; + MD4_LONG Nl,Nh; + MD4_LONG data[MD4_LBLOCK]; + unsigned int num; + } MD4_CTX; + +int MD4_Init(MD4_CTX *c); +int MD4_Update(MD4_CTX *c, const void *data, size_t len); +int MD4_Final(unsigned char *md, MD4_CTX *c); +unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md); +void MD4_Transform(MD4_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/md5.h b/src/3rdparty/win32_include/openssl/md5.h new file mode 100644 index 000000000..e2c511c7c --- /dev/null +++ b/src/3rdparty/win32_include/openssl/md5.h @@ -0,0 +1,108 @@ +/* $OpenBSD: md5.h,v 1.20 2014/10/20 13:06:54 bcook Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include + +#ifndef HEADER_MD5_H +#define HEADER_MD5_H +#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__OpenBSD__) +#define __bounded__(x, y, z) +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_MD5 +#error MD5 is disabled. +#endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD5_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#define MD5_LONG unsigned int + +#define MD5_CBLOCK 64 +#define MD5_LBLOCK (MD5_CBLOCK/4) +#define MD5_DIGEST_LENGTH 16 + +typedef struct MD5state_st + { + MD5_LONG A,B,C,D; + MD5_LONG Nl,Nh; + MD5_LONG data[MD5_LBLOCK]; + unsigned int num; + } MD5_CTX; + +int MD5_Init(MD5_CTX *c); +int MD5_Update(MD5_CTX *c, const void *data, size_t len) + __attribute__ ((__bounded__(__buffer__,2,3))); +int MD5_Final(unsigned char *md, MD5_CTX *c); +unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md) + __attribute__ ((__bounded__(__buffer__,1,2))); +void MD5_Transform(MD5_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/modes.h b/src/3rdparty/win32_include/openssl/modes.h new file mode 100644 index 000000000..a532cb3f4 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/modes.h @@ -0,0 +1,136 @@ +/* $OpenBSD: modes.h,v 1.2 2014/06/12 15:49:30 deraadt Exp $ */ +/* ==================================================================== + * Copyright (c) 2008 The OpenSSL Project. All rights reserved. + * + * Rights for redistribution and usage in source and binary + * forms are granted according to the OpenSSL license. + */ + +#include + +typedef void (*block128_f)(const unsigned char in[16], + unsigned char out[16], + const void *key); + +typedef void (*cbc128_f)(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int enc); + +typedef void (*ctr128_f)(const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16]); + +typedef void (*ccm128_f)(const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16],unsigned char cmac[16]); + +void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); + +void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], unsigned char ecount_buf[16], + unsigned int *num, block128_f block); + +void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], unsigned char ecount_buf[16], + unsigned int *num, ctr128_f ctr); + +void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + block128_f block); + +void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out, + size_t bits, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); + +size_t CRYPTO_cts128_encrypt_block(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +size_t CRYPTO_cts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_cts128_decrypt_block(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +size_t CRYPTO_cts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +size_t CRYPTO_nistcts128_encrypt_block(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +size_t CRYPTO_nistcts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +size_t CRYPTO_nistcts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +typedef struct gcm128_context GCM128_CONTEXT; + +GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block); +void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx,void *key,block128_f block); +void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv, + size_t len); +int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx,const unsigned char *tag, + size_t len); +void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx); + +typedef struct ccm128_context CCM128_CONTEXT; + +void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx, + unsigned int M, unsigned int L, void *key,block128_f block); +int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx, + const unsigned char *nonce, size_t nlen, size_t mlen); +void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx, + const unsigned char *aad, size_t alen); +int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx, + const unsigned char *inp, unsigned char *out, size_t len); +int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx, + const unsigned char *inp, unsigned char *out, size_t len); +int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx, + const unsigned char *inp, unsigned char *out, size_t len, + ccm128_f stream); +int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx, + const unsigned char *inp, unsigned char *out, size_t len, + ccm128_f stream); +size_t CRYPTO_ccm128_tag(CCM128_CONTEXT *ctx, unsigned char *tag, size_t len); + +typedef struct xts128_context XTS128_CONTEXT; + +int CRYPTO_xts128_encrypt(const XTS128_CONTEXT *ctx, const unsigned char iv[16], + const unsigned char *inp, unsigned char *out, size_t len, int enc); diff --git a/src/3rdparty/win32_include/openssl/obj_mac.h b/src/3rdparty/win32_include/openssl/obj_mac.h new file mode 100644 index 000000000..e11e2832a --- /dev/null +++ b/src/3rdparty/win32_include/openssl/obj_mac.h @@ -0,0 +1,4180 @@ +/* crypto/objects/obj_mac.h */ + +/* THIS FILE IS GENERATED FROM objects.txt by objects.pl via the + * following command: + * perl objects.pl objects.txt obj_mac.num obj_mac.h + */ + +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_itu_t "ITU-T" +#define LN_itu_t "itu-t" +#define NID_itu_t 645 +#define OBJ_itu_t 0L + +#define NID_ccitt 404 +#define OBJ_ccitt OBJ_itu_t + +#define SN_iso "ISO" +#define LN_iso "iso" +#define NID_iso 181 +#define OBJ_iso 1L + +#define SN_joint_iso_itu_t "JOINT-ISO-ITU-T" +#define LN_joint_iso_itu_t "joint-iso-itu-t" +#define NID_joint_iso_itu_t 646 +#define OBJ_joint_iso_itu_t 2L + +#define NID_joint_iso_ccitt 393 +#define OBJ_joint_iso_ccitt OBJ_joint_iso_itu_t + +#define SN_member_body "member-body" +#define LN_member_body "ISO Member Body" +#define NID_member_body 182 +#define OBJ_member_body OBJ_iso,2L + +#define SN_identified_organization "identified-organization" +#define NID_identified_organization 676 +#define OBJ_identified_organization OBJ_iso,3L + +#define SN_hmac_md5 "HMAC-MD5" +#define LN_hmac_md5 "hmac-md5" +#define NID_hmac_md5 780 +#define OBJ_hmac_md5 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,1L + +#define SN_hmac_sha1 "HMAC-SHA1" +#define LN_hmac_sha1 "hmac-sha1" +#define NID_hmac_sha1 781 +#define OBJ_hmac_sha1 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,2L + +#define SN_certicom_arc "certicom-arc" +#define NID_certicom_arc 677 +#define OBJ_certicom_arc OBJ_identified_organization,132L + +#define SN_international_organizations "international-organizations" +#define LN_international_organizations "International Organizations" +#define NID_international_organizations 647 +#define OBJ_international_organizations OBJ_joint_iso_itu_t,23L + +#define SN_wap "wap" +#define NID_wap 678 +#define OBJ_wap OBJ_international_organizations,43L + +#define SN_wap_wsg "wap-wsg" +#define NID_wap_wsg 679 +#define OBJ_wap_wsg OBJ_wap,1L + +#define SN_selected_attribute_types "selected-attribute-types" +#define LN_selected_attribute_types "Selected Attribute Types" +#define NID_selected_attribute_types 394 +#define OBJ_selected_attribute_types OBJ_joint_iso_itu_t,5L,1L,5L + +#define SN_clearance "clearance" +#define NID_clearance 395 +#define OBJ_clearance OBJ_selected_attribute_types,55L + +#define SN_ISO_US "ISO-US" +#define LN_ISO_US "ISO US Member Body" +#define NID_ISO_US 183 +#define OBJ_ISO_US OBJ_member_body,840L + +#define SN_X9_57 "X9-57" +#define LN_X9_57 "X9.57" +#define NID_X9_57 184 +#define OBJ_X9_57 OBJ_ISO_US,10040L + +#define SN_X9cm "X9cm" +#define LN_X9cm "X9.57 CM ?" +#define NID_X9cm 185 +#define OBJ_X9cm OBJ_X9_57,4L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa OBJ_X9cm,1L + +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 OBJ_X9cm,3L + +#define SN_ansi_X9_62 "ansi-X9-62" +#define LN_ansi_X9_62 "ANSI X9.62" +#define NID_ansi_X9_62 405 +#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L + +#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L + +#define SN_X9_62_prime_field "prime-field" +#define NID_X9_62_prime_field 406 +#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L + +#define SN_X9_62_characteristic_two_field "characteristic-two-field" +#define NID_X9_62_characteristic_two_field 407 +#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L + +#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" +#define NID_X9_62_id_characteristic_two_basis 680 +#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L + +#define SN_X9_62_onBasis "onBasis" +#define NID_X9_62_onBasis 681 +#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L + +#define SN_X9_62_tpBasis "tpBasis" +#define NID_X9_62_tpBasis 682 +#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L + +#define SN_X9_62_ppBasis "ppBasis" +#define NID_X9_62_ppBasis 683 +#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L + +#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L + +#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" +#define NID_X9_62_id_ecPublicKey 408 +#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L + +#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L + +#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L + +#define SN_X9_62_c2pnb163v1 "c2pnb163v1" +#define NID_X9_62_c2pnb163v1 684 +#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L + +#define SN_X9_62_c2pnb163v2 "c2pnb163v2" +#define NID_X9_62_c2pnb163v2 685 +#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L + +#define SN_X9_62_c2pnb163v3 "c2pnb163v3" +#define NID_X9_62_c2pnb163v3 686 +#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L + +#define SN_X9_62_c2pnb176v1 "c2pnb176v1" +#define NID_X9_62_c2pnb176v1 687 +#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L + +#define SN_X9_62_c2tnb191v1 "c2tnb191v1" +#define NID_X9_62_c2tnb191v1 688 +#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L + +#define SN_X9_62_c2tnb191v2 "c2tnb191v2" +#define NID_X9_62_c2tnb191v2 689 +#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L + +#define SN_X9_62_c2tnb191v3 "c2tnb191v3" +#define NID_X9_62_c2tnb191v3 690 +#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L + +#define SN_X9_62_c2onb191v4 "c2onb191v4" +#define NID_X9_62_c2onb191v4 691 +#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L + +#define SN_X9_62_c2onb191v5 "c2onb191v5" +#define NID_X9_62_c2onb191v5 692 +#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L + +#define SN_X9_62_c2pnb208w1 "c2pnb208w1" +#define NID_X9_62_c2pnb208w1 693 +#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L + +#define SN_X9_62_c2tnb239v1 "c2tnb239v1" +#define NID_X9_62_c2tnb239v1 694 +#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L + +#define SN_X9_62_c2tnb239v2 "c2tnb239v2" +#define NID_X9_62_c2tnb239v2 695 +#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L + +#define SN_X9_62_c2tnb239v3 "c2tnb239v3" +#define NID_X9_62_c2tnb239v3 696 +#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L + +#define SN_X9_62_c2onb239v4 "c2onb239v4" +#define NID_X9_62_c2onb239v4 697 +#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L + +#define SN_X9_62_c2onb239v5 "c2onb239v5" +#define NID_X9_62_c2onb239v5 698 +#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L + +#define SN_X9_62_c2pnb272w1 "c2pnb272w1" +#define NID_X9_62_c2pnb272w1 699 +#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L + +#define SN_X9_62_c2pnb304w1 "c2pnb304w1" +#define NID_X9_62_c2pnb304w1 700 +#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L + +#define SN_X9_62_c2tnb359v1 "c2tnb359v1" +#define NID_X9_62_c2tnb359v1 701 +#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L + +#define SN_X9_62_c2pnb368w1 "c2pnb368w1" +#define NID_X9_62_c2pnb368w1 702 +#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L + +#define SN_X9_62_c2tnb431r1 "c2tnb431r1" +#define NID_X9_62_c2tnb431r1 703 +#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L + +#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L + +#define SN_X9_62_prime192v1 "prime192v1" +#define NID_X9_62_prime192v1 409 +#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L + +#define SN_X9_62_prime192v2 "prime192v2" +#define NID_X9_62_prime192v2 410 +#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L + +#define SN_X9_62_prime192v3 "prime192v3" +#define NID_X9_62_prime192v3 411 +#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L + +#define SN_X9_62_prime239v1 "prime239v1" +#define NID_X9_62_prime239v1 412 +#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L + +#define SN_X9_62_prime239v2 "prime239v2" +#define NID_X9_62_prime239v2 413 +#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L + +#define SN_X9_62_prime239v3 "prime239v3" +#define NID_X9_62_prime239v3 414 +#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L + +#define SN_X9_62_prime256v1 "prime256v1" +#define NID_X9_62_prime256v1 415 +#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L + +#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L + +#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" +#define NID_ecdsa_with_SHA1 416 +#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L + +#define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" +#define NID_ecdsa_with_Recommended 791 +#define OBJ_ecdsa_with_Recommended OBJ_X9_62_id_ecSigType,2L + +#define SN_ecdsa_with_Specified "ecdsa-with-Specified" +#define NID_ecdsa_with_Specified 792 +#define OBJ_ecdsa_with_Specified OBJ_X9_62_id_ecSigType,3L + +#define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" +#define NID_ecdsa_with_SHA224 793 +#define OBJ_ecdsa_with_SHA224 OBJ_ecdsa_with_Specified,1L + +#define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" +#define NID_ecdsa_with_SHA256 794 +#define OBJ_ecdsa_with_SHA256 OBJ_ecdsa_with_Specified,2L + +#define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" +#define NID_ecdsa_with_SHA384 795 +#define OBJ_ecdsa_with_SHA384 OBJ_ecdsa_with_Specified,3L + +#define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" +#define NID_ecdsa_with_SHA512 796 +#define OBJ_ecdsa_with_SHA512 OBJ_ecdsa_with_Specified,4L + +#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L + +#define SN_secp112r1 "secp112r1" +#define NID_secp112r1 704 +#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L + +#define SN_secp112r2 "secp112r2" +#define NID_secp112r2 705 +#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L + +#define SN_secp128r1 "secp128r1" +#define NID_secp128r1 706 +#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L + +#define SN_secp128r2 "secp128r2" +#define NID_secp128r2 707 +#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L + +#define SN_secp160k1 "secp160k1" +#define NID_secp160k1 708 +#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L + +#define SN_secp160r1 "secp160r1" +#define NID_secp160r1 709 +#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L + +#define SN_secp160r2 "secp160r2" +#define NID_secp160r2 710 +#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L + +#define SN_secp192k1 "secp192k1" +#define NID_secp192k1 711 +#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L + +#define SN_secp224k1 "secp224k1" +#define NID_secp224k1 712 +#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L + +#define SN_secp224r1 "secp224r1" +#define NID_secp224r1 713 +#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L + +#define SN_secp256k1 "secp256k1" +#define NID_secp256k1 714 +#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L + +#define SN_secp384r1 "secp384r1" +#define NID_secp384r1 715 +#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L + +#define SN_secp521r1 "secp521r1" +#define NID_secp521r1 716 +#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L + +#define SN_sect113r1 "sect113r1" +#define NID_sect113r1 717 +#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L + +#define SN_sect113r2 "sect113r2" +#define NID_sect113r2 718 +#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L + +#define SN_sect131r1 "sect131r1" +#define NID_sect131r1 719 +#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L + +#define SN_sect131r2 "sect131r2" +#define NID_sect131r2 720 +#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L + +#define SN_sect163k1 "sect163k1" +#define NID_sect163k1 721 +#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L + +#define SN_sect163r1 "sect163r1" +#define NID_sect163r1 722 +#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L + +#define SN_sect163r2 "sect163r2" +#define NID_sect163r2 723 +#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L + +#define SN_sect193r1 "sect193r1" +#define NID_sect193r1 724 +#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L + +#define SN_sect193r2 "sect193r2" +#define NID_sect193r2 725 +#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L + +#define SN_sect233k1 "sect233k1" +#define NID_sect233k1 726 +#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L + +#define SN_sect233r1 "sect233r1" +#define NID_sect233r1 727 +#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L + +#define SN_sect239k1 "sect239k1" +#define NID_sect239k1 728 +#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L + +#define SN_sect283k1 "sect283k1" +#define NID_sect283k1 729 +#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L + +#define SN_sect283r1 "sect283r1" +#define NID_sect283r1 730 +#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L + +#define SN_sect409k1 "sect409k1" +#define NID_sect409k1 731 +#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L + +#define SN_sect409r1 "sect409r1" +#define NID_sect409r1 732 +#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L + +#define SN_sect571k1 "sect571k1" +#define NID_sect571k1 733 +#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L + +#define SN_sect571r1 "sect571r1" +#define NID_sect571r1 734 +#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L + +#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L + +#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" +#define NID_wap_wsg_idm_ecid_wtls1 735 +#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L + +#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" +#define NID_wap_wsg_idm_ecid_wtls3 736 +#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L + +#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" +#define NID_wap_wsg_idm_ecid_wtls4 737 +#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L + +#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" +#define NID_wap_wsg_idm_ecid_wtls5 738 +#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L + +#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" +#define NID_wap_wsg_idm_ecid_wtls6 739 +#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L + +#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" +#define NID_wap_wsg_idm_ecid_wtls7 740 +#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L + +#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" +#define NID_wap_wsg_idm_ecid_wtls8 741 +#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L + +#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" +#define NID_wap_wsg_idm_ecid_wtls9 742 +#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L + +#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" +#define NID_wap_wsg_idm_ecid_wtls10 743 +#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L + +#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" +#define NID_wap_wsg_idm_ecid_wtls11 744 +#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L + +#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" +#define NID_wap_wsg_idm_ecid_wtls12 745 +#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L + +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L + +#define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" +#define LN_id_PasswordBasedMAC "password based MAC" +#define NID_id_PasswordBasedMAC 782 +#define OBJ_id_PasswordBasedMAC OBJ_ISO_US,113533L,7L,66L,13L + +#define SN_id_DHBasedMac "id-DHBasedMac" +#define LN_id_DHBasedMac "Diffie-Hellman based MAC" +#define NID_id_DHBasedMac 783 +#define OBJ_id_DHBasedMac OBJ_ISO_US,113533L,7L,66L,30L + +#define SN_rsadsi "rsadsi" +#define LN_rsadsi "RSA Data Security, Inc." +#define NID_rsadsi 1 +#define OBJ_rsadsi OBJ_ISO_US,113549L + +#define SN_pkcs "pkcs" +#define LN_pkcs "RSA Data Security, Inc. PKCS" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_pkcs1 "pkcs1" +#define NID_pkcs1 186 +#define OBJ_pkcs1 OBJ_pkcs,1L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs1,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L + +#define SN_md4WithRSAEncryption "RSA-MD4" +#define LN_md4WithRSAEncryption "md4WithRSAEncryption" +#define NID_md4WithRSAEncryption 396 +#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L + +#define SN_rsaesOaep "RSAES-OAEP" +#define LN_rsaesOaep "rsaesOaep" +#define NID_rsaesOaep 919 +#define OBJ_rsaesOaep OBJ_pkcs1,7L + +#define SN_mgf1 "MGF1" +#define LN_mgf1 "mgf1" +#define NID_mgf1 911 +#define OBJ_mgf1 OBJ_pkcs1,8L + +#define SN_rsassaPss "RSASSA-PSS" +#define LN_rsassaPss "rsassaPss" +#define NID_rsassaPss 912 +#define OBJ_rsassaPss OBJ_pkcs1,10L + +#define SN_sha256WithRSAEncryption "RSA-SHA256" +#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" +#define NID_sha256WithRSAEncryption 668 +#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L + +#define SN_sha384WithRSAEncryption "RSA-SHA384" +#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" +#define NID_sha384WithRSAEncryption 669 +#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L + +#define SN_sha512WithRSAEncryption "RSA-SHA512" +#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" +#define NID_sha512WithRSAEncryption 670 +#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L + +#define SN_sha224WithRSAEncryption "RSA-SHA224" +#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" +#define NID_sha224WithRSAEncryption 671 +#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L + +#define SN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_pkcs5 "pkcs5" +#define NID_pkcs5 187 +#define OBJ_pkcs5 OBJ_pkcs,5L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs5,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs5,3L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs5,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs5,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs5,10L + +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs5,11L + +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs5,12L + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs5,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs5,14L + +#define SN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define SN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_ext_req "extReq" +#define LN_ext_req "Extension Request" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_SMIME "SMIME" +#define LN_SMIME "S/MIME" +#define NID_SMIME 188 +#define OBJ_SMIME OBJ_pkcs9,16L + +#define SN_id_smime_mod "id-smime-mod" +#define NID_id_smime_mod 189 +#define OBJ_id_smime_mod OBJ_SMIME,0L + +#define SN_id_smime_ct "id-smime-ct" +#define NID_id_smime_ct 190 +#define OBJ_id_smime_ct OBJ_SMIME,1L + +#define SN_id_smime_aa "id-smime-aa" +#define NID_id_smime_aa 191 +#define OBJ_id_smime_aa OBJ_SMIME,2L + +#define SN_id_smime_alg "id-smime-alg" +#define NID_id_smime_alg 192 +#define OBJ_id_smime_alg OBJ_SMIME,3L + +#define SN_id_smime_cd "id-smime-cd" +#define NID_id_smime_cd 193 +#define OBJ_id_smime_cd OBJ_SMIME,4L + +#define SN_id_smime_spq "id-smime-spq" +#define NID_id_smime_spq 194 +#define OBJ_id_smime_spq OBJ_SMIME,5L + +#define SN_id_smime_cti "id-smime-cti" +#define NID_id_smime_cti 195 +#define OBJ_id_smime_cti OBJ_SMIME,6L + +#define SN_id_smime_mod_cms "id-smime-mod-cms" +#define NID_id_smime_mod_cms 196 +#define OBJ_id_smime_mod_cms OBJ_id_smime_mod,1L + +#define SN_id_smime_mod_ess "id-smime-mod-ess" +#define NID_id_smime_mod_ess 197 +#define OBJ_id_smime_mod_ess OBJ_id_smime_mod,2L + +#define SN_id_smime_mod_oid "id-smime-mod-oid" +#define NID_id_smime_mod_oid 198 +#define OBJ_id_smime_mod_oid OBJ_id_smime_mod,3L + +#define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" +#define NID_id_smime_mod_msg_v3 199 +#define OBJ_id_smime_mod_msg_v3 OBJ_id_smime_mod,4L + +#define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" +#define NID_id_smime_mod_ets_eSignature_88 200 +#define OBJ_id_smime_mod_ets_eSignature_88 OBJ_id_smime_mod,5L + +#define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" +#define NID_id_smime_mod_ets_eSignature_97 201 +#define OBJ_id_smime_mod_ets_eSignature_97 OBJ_id_smime_mod,6L + +#define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" +#define NID_id_smime_mod_ets_eSigPolicy_88 202 +#define OBJ_id_smime_mod_ets_eSigPolicy_88 OBJ_id_smime_mod,7L + +#define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" +#define NID_id_smime_mod_ets_eSigPolicy_97 203 +#define OBJ_id_smime_mod_ets_eSigPolicy_97 OBJ_id_smime_mod,8L + +#define SN_id_smime_ct_receipt "id-smime-ct-receipt" +#define NID_id_smime_ct_receipt 204 +#define OBJ_id_smime_ct_receipt OBJ_id_smime_ct,1L + +#define SN_id_smime_ct_authData "id-smime-ct-authData" +#define NID_id_smime_ct_authData 205 +#define OBJ_id_smime_ct_authData OBJ_id_smime_ct,2L + +#define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" +#define NID_id_smime_ct_publishCert 206 +#define OBJ_id_smime_ct_publishCert OBJ_id_smime_ct,3L + +#define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" +#define NID_id_smime_ct_TSTInfo 207 +#define OBJ_id_smime_ct_TSTInfo OBJ_id_smime_ct,4L + +#define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" +#define NID_id_smime_ct_TDTInfo 208 +#define OBJ_id_smime_ct_TDTInfo OBJ_id_smime_ct,5L + +#define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" +#define NID_id_smime_ct_contentInfo 209 +#define OBJ_id_smime_ct_contentInfo OBJ_id_smime_ct,6L + +#define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" +#define NID_id_smime_ct_DVCSRequestData 210 +#define OBJ_id_smime_ct_DVCSRequestData OBJ_id_smime_ct,7L + +#define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" +#define NID_id_smime_ct_DVCSResponseData 211 +#define OBJ_id_smime_ct_DVCSResponseData OBJ_id_smime_ct,8L + +#define SN_id_smime_ct_compressedData "id-smime-ct-compressedData" +#define NID_id_smime_ct_compressedData 786 +#define OBJ_id_smime_ct_compressedData OBJ_id_smime_ct,9L + +#define SN_id_ct_asciiTextWithCRLF "id-ct-asciiTextWithCRLF" +#define NID_id_ct_asciiTextWithCRLF 787 +#define OBJ_id_ct_asciiTextWithCRLF OBJ_id_smime_ct,27L + +#define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" +#define NID_id_smime_aa_receiptRequest 212 +#define OBJ_id_smime_aa_receiptRequest OBJ_id_smime_aa,1L + +#define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" +#define NID_id_smime_aa_securityLabel 213 +#define OBJ_id_smime_aa_securityLabel OBJ_id_smime_aa,2L + +#define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" +#define NID_id_smime_aa_mlExpandHistory 214 +#define OBJ_id_smime_aa_mlExpandHistory OBJ_id_smime_aa,3L + +#define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" +#define NID_id_smime_aa_contentHint 215 +#define OBJ_id_smime_aa_contentHint OBJ_id_smime_aa,4L + +#define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" +#define NID_id_smime_aa_msgSigDigest 216 +#define OBJ_id_smime_aa_msgSigDigest OBJ_id_smime_aa,5L + +#define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" +#define NID_id_smime_aa_encapContentType 217 +#define OBJ_id_smime_aa_encapContentType OBJ_id_smime_aa,6L + +#define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" +#define NID_id_smime_aa_contentIdentifier 218 +#define OBJ_id_smime_aa_contentIdentifier OBJ_id_smime_aa,7L + +#define SN_id_smime_aa_macValue "id-smime-aa-macValue" +#define NID_id_smime_aa_macValue 219 +#define OBJ_id_smime_aa_macValue OBJ_id_smime_aa,8L + +#define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" +#define NID_id_smime_aa_equivalentLabels 220 +#define OBJ_id_smime_aa_equivalentLabels OBJ_id_smime_aa,9L + +#define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" +#define NID_id_smime_aa_contentReference 221 +#define OBJ_id_smime_aa_contentReference OBJ_id_smime_aa,10L + +#define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" +#define NID_id_smime_aa_encrypKeyPref 222 +#define OBJ_id_smime_aa_encrypKeyPref OBJ_id_smime_aa,11L + +#define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" +#define NID_id_smime_aa_signingCertificate 223 +#define OBJ_id_smime_aa_signingCertificate OBJ_id_smime_aa,12L + +#define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" +#define NID_id_smime_aa_smimeEncryptCerts 224 +#define OBJ_id_smime_aa_smimeEncryptCerts OBJ_id_smime_aa,13L + +#define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" +#define NID_id_smime_aa_timeStampToken 225 +#define OBJ_id_smime_aa_timeStampToken OBJ_id_smime_aa,14L + +#define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" +#define NID_id_smime_aa_ets_sigPolicyId 226 +#define OBJ_id_smime_aa_ets_sigPolicyId OBJ_id_smime_aa,15L + +#define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" +#define NID_id_smime_aa_ets_commitmentType 227 +#define OBJ_id_smime_aa_ets_commitmentType OBJ_id_smime_aa,16L + +#define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" +#define NID_id_smime_aa_ets_signerLocation 228 +#define OBJ_id_smime_aa_ets_signerLocation OBJ_id_smime_aa,17L + +#define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" +#define NID_id_smime_aa_ets_signerAttr 229 +#define OBJ_id_smime_aa_ets_signerAttr OBJ_id_smime_aa,18L + +#define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" +#define NID_id_smime_aa_ets_otherSigCert 230 +#define OBJ_id_smime_aa_ets_otherSigCert OBJ_id_smime_aa,19L + +#define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" +#define NID_id_smime_aa_ets_contentTimestamp 231 +#define OBJ_id_smime_aa_ets_contentTimestamp OBJ_id_smime_aa,20L + +#define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" +#define NID_id_smime_aa_ets_CertificateRefs 232 +#define OBJ_id_smime_aa_ets_CertificateRefs OBJ_id_smime_aa,21L + +#define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" +#define NID_id_smime_aa_ets_RevocationRefs 233 +#define OBJ_id_smime_aa_ets_RevocationRefs OBJ_id_smime_aa,22L + +#define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" +#define NID_id_smime_aa_ets_certValues 234 +#define OBJ_id_smime_aa_ets_certValues OBJ_id_smime_aa,23L + +#define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" +#define NID_id_smime_aa_ets_revocationValues 235 +#define OBJ_id_smime_aa_ets_revocationValues OBJ_id_smime_aa,24L + +#define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" +#define NID_id_smime_aa_ets_escTimeStamp 236 +#define OBJ_id_smime_aa_ets_escTimeStamp OBJ_id_smime_aa,25L + +#define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" +#define NID_id_smime_aa_ets_certCRLTimestamp 237 +#define OBJ_id_smime_aa_ets_certCRLTimestamp OBJ_id_smime_aa,26L + +#define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" +#define NID_id_smime_aa_ets_archiveTimeStamp 238 +#define OBJ_id_smime_aa_ets_archiveTimeStamp OBJ_id_smime_aa,27L + +#define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" +#define NID_id_smime_aa_signatureType 239 +#define OBJ_id_smime_aa_signatureType OBJ_id_smime_aa,28L + +#define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" +#define NID_id_smime_aa_dvcs_dvc 240 +#define OBJ_id_smime_aa_dvcs_dvc OBJ_id_smime_aa,29L + +#define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" +#define NID_id_smime_alg_ESDHwith3DES 241 +#define OBJ_id_smime_alg_ESDHwith3DES OBJ_id_smime_alg,1L + +#define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" +#define NID_id_smime_alg_ESDHwithRC2 242 +#define OBJ_id_smime_alg_ESDHwithRC2 OBJ_id_smime_alg,2L + +#define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" +#define NID_id_smime_alg_3DESwrap 243 +#define OBJ_id_smime_alg_3DESwrap OBJ_id_smime_alg,3L + +#define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" +#define NID_id_smime_alg_RC2wrap 244 +#define OBJ_id_smime_alg_RC2wrap OBJ_id_smime_alg,4L + +#define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" +#define NID_id_smime_alg_ESDH 245 +#define OBJ_id_smime_alg_ESDH OBJ_id_smime_alg,5L + +#define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" +#define NID_id_smime_alg_CMS3DESwrap 246 +#define OBJ_id_smime_alg_CMS3DESwrap OBJ_id_smime_alg,6L + +#define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" +#define NID_id_smime_alg_CMSRC2wrap 247 +#define OBJ_id_smime_alg_CMSRC2wrap OBJ_id_smime_alg,7L + +#define SN_id_alg_PWRI_KEK "id-alg-PWRI-KEK" +#define NID_id_alg_PWRI_KEK 893 +#define OBJ_id_alg_PWRI_KEK OBJ_id_smime_alg,9L + +#define SN_id_smime_cd_ldap "id-smime-cd-ldap" +#define NID_id_smime_cd_ldap 248 +#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L + +#define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" +#define NID_id_smime_spq_ets_sqt_uri 249 +#define OBJ_id_smime_spq_ets_sqt_uri OBJ_id_smime_spq,1L + +#define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" +#define NID_id_smime_spq_ets_sqt_unotice 250 +#define OBJ_id_smime_spq_ets_sqt_unotice OBJ_id_smime_spq,2L + +#define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" +#define NID_id_smime_cti_ets_proofOfOrigin 251 +#define OBJ_id_smime_cti_ets_proofOfOrigin OBJ_id_smime_cti,1L + +#define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" +#define NID_id_smime_cti_ets_proofOfReceipt 252 +#define OBJ_id_smime_cti_ets_proofOfReceipt OBJ_id_smime_cti,2L + +#define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" +#define NID_id_smime_cti_ets_proofOfDelivery 253 +#define OBJ_id_smime_cti_ets_proofOfDelivery OBJ_id_smime_cti,3L + +#define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" +#define NID_id_smime_cti_ets_proofOfSender 254 +#define OBJ_id_smime_cti_ets_proofOfSender OBJ_id_smime_cti,4L + +#define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" +#define NID_id_smime_cti_ets_proofOfApproval 255 +#define OBJ_id_smime_cti_ets_proofOfApproval OBJ_id_smime_cti,5L + +#define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" +#define NID_id_smime_cti_ets_proofOfCreation 256 +#define OBJ_id_smime_cti_ets_proofOfCreation OBJ_id_smime_cti,6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9,20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9,21L + +#define SN_ms_csp_name "CSPName" +#define LN_ms_csp_name "Microsoft CSP Name" +#define NID_ms_csp_name 417 +#define OBJ_ms_csp_name 1L,3L,6L,1L,4L,1L,311L,17L,1L + +#define SN_LocalKeySet "LocalKeySet" +#define LN_LocalKeySet "Microsoft Local Key set" +#define NID_LocalKeySet 856 +#define OBJ_LocalKeySet 1L,3L,6L,1L,4L,1L,311L,17L,2L + +#define OBJ_certTypes OBJ_pkcs9,22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes,1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes,2L + +#define OBJ_crlTypes OBJ_pkcs9,23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes,1L + +#define OBJ_pkcs12 OBJ_pkcs,12L + +#define OBJ_pkcs12_pbeids OBJ_pkcs12,1L + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids,1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids,2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids,3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids,4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids,5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids,6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12,10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1,1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds,1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds,2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds,3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds,4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds,5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds,6L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md4 "MD4" +#define LN_md4 "md4" +#define NID_md4 257 +#define OBJ_md4 OBJ_rsadsi,2L,4L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" +#define NID_md5_sha1 114 + +#define LN_hmacWithMD5 "hmacWithMD5" +#define NID_hmacWithMD5 797 +#define OBJ_hmacWithMD5 OBJ_rsadsi,2L,6L + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +#define LN_hmacWithSHA224 "hmacWithSHA224" +#define NID_hmacWithSHA224 798 +#define OBJ_hmacWithSHA224 OBJ_rsadsi,2L,8L + +#define LN_hmacWithSHA256 "hmacWithSHA256" +#define NID_hmacWithSHA256 799 +#define OBJ_hmacWithSHA256 OBJ_rsadsi,2L,9L + +#define LN_hmacWithSHA384 "hmacWithSHA384" +#define NID_hmacWithSHA384 800 +#define OBJ_hmacWithSHA384 OBJ_rsadsi,2L,10L + +#define LN_hmacWithSHA512 "hmacWithSHA512" +#define NID_hmacWithSHA512 801 +#define OBJ_hmacWithSHA512 OBJ_rsadsi,2L,11L + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#define LN_rc5_ofb64 "rc5-ofb" +#define NID_rc5_ofb64 123 + +#define SN_ms_ext_req "msExtReq" +#define LN_ms_ext_req "Microsoft Extension Request" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +#define SN_ms_smartcard_login "msSmartcardLogin" +#define LN_ms_smartcard_login "Microsoft Smartcardlogin" +#define NID_ms_smartcard_login 648 +#define OBJ_ms_smartcard_login 1L,3L,6L,1L,4L,1L,311L,20L,2L,2L + +#define SN_ms_upn "msUPN" +#define LN_ms_upn "Microsoft Universal Principal Name" +#define NID_ms_upn 649 +#define OBJ_ms_upn 1L,3L,6L,1L,4L,1L,311L,20L,2L,3L + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_pkix_mod "id-pkix-mod" +#define NID_id_pkix_mod 258 +#define OBJ_id_pkix_mod OBJ_id_pkix,0L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_qt "id-qt" +#define NID_id_qt 259 +#define OBJ_id_qt OBJ_id_pkix,2L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +#define SN_id_it "id-it" +#define NID_id_it 260 +#define OBJ_id_it OBJ_id_pkix,4L + +#define SN_id_pkip "id-pkip" +#define NID_id_pkip 261 +#define OBJ_id_pkip OBJ_id_pkix,5L + +#define SN_id_alg "id-alg" +#define NID_id_alg 262 +#define OBJ_id_alg OBJ_id_pkix,6L + +#define SN_id_cmc "id-cmc" +#define NID_id_cmc 263 +#define OBJ_id_cmc OBJ_id_pkix,7L + +#define SN_id_on "id-on" +#define NID_id_on 264 +#define OBJ_id_on OBJ_id_pkix,8L + +#define SN_id_pda "id-pda" +#define NID_id_pda 265 +#define OBJ_id_pda OBJ_id_pkix,9L + +#define SN_id_aca "id-aca" +#define NID_id_aca 266 +#define OBJ_id_aca OBJ_id_pkix,10L + +#define SN_id_qcs "id-qcs" +#define NID_id_qcs 267 +#define OBJ_id_qcs OBJ_id_pkix,11L + +#define SN_id_cct "id-cct" +#define NID_id_cct 268 +#define OBJ_id_cct OBJ_id_pkix,12L + +#define SN_id_ppl "id-ppl" +#define NID_id_ppl 662 +#define OBJ_id_ppl OBJ_id_pkix,21L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" +#define NID_id_pkix1_explicit_88 269 +#define OBJ_id_pkix1_explicit_88 OBJ_id_pkix_mod,1L + +#define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" +#define NID_id_pkix1_implicit_88 270 +#define OBJ_id_pkix1_implicit_88 OBJ_id_pkix_mod,2L + +#define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" +#define NID_id_pkix1_explicit_93 271 +#define OBJ_id_pkix1_explicit_93 OBJ_id_pkix_mod,3L + +#define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" +#define NID_id_pkix1_implicit_93 272 +#define OBJ_id_pkix1_implicit_93 OBJ_id_pkix_mod,4L + +#define SN_id_mod_crmf "id-mod-crmf" +#define NID_id_mod_crmf 273 +#define OBJ_id_mod_crmf OBJ_id_pkix_mod,5L + +#define SN_id_mod_cmc "id-mod-cmc" +#define NID_id_mod_cmc 274 +#define OBJ_id_mod_cmc OBJ_id_pkix_mod,6L + +#define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" +#define NID_id_mod_kea_profile_88 275 +#define OBJ_id_mod_kea_profile_88 OBJ_id_pkix_mod,7L + +#define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" +#define NID_id_mod_kea_profile_93 276 +#define OBJ_id_mod_kea_profile_93 OBJ_id_pkix_mod,8L + +#define SN_id_mod_cmp "id-mod-cmp" +#define NID_id_mod_cmp 277 +#define OBJ_id_mod_cmp OBJ_id_pkix_mod,9L + +#define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" +#define NID_id_mod_qualified_cert_88 278 +#define OBJ_id_mod_qualified_cert_88 OBJ_id_pkix_mod,10L + +#define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" +#define NID_id_mod_qualified_cert_93 279 +#define OBJ_id_mod_qualified_cert_93 OBJ_id_pkix_mod,11L + +#define SN_id_mod_attribute_cert "id-mod-attribute-cert" +#define NID_id_mod_attribute_cert 280 +#define OBJ_id_mod_attribute_cert OBJ_id_pkix_mod,12L + +#define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" +#define NID_id_mod_timestamp_protocol 281 +#define OBJ_id_mod_timestamp_protocol OBJ_id_pkix_mod,13L + +#define SN_id_mod_ocsp "id-mod-ocsp" +#define NID_id_mod_ocsp 282 +#define OBJ_id_mod_ocsp OBJ_id_pkix_mod,14L + +#define SN_id_mod_dvcs "id-mod-dvcs" +#define NID_id_mod_dvcs 283 +#define OBJ_id_mod_dvcs OBJ_id_pkix_mod,15L + +#define SN_id_mod_cmp2000 "id-mod-cmp2000" +#define NID_id_mod_cmp2000 284 +#define OBJ_id_mod_cmp2000 OBJ_id_pkix_mod,16L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_biometricInfo "biometricInfo" +#define LN_biometricInfo "Biometric Info" +#define NID_biometricInfo 285 +#define OBJ_biometricInfo OBJ_id_pe,2L + +#define SN_qcStatements "qcStatements" +#define NID_qcStatements 286 +#define OBJ_qcStatements OBJ_id_pe,3L + +#define SN_ac_auditEntity "ac-auditEntity" +#define NID_ac_auditEntity 287 +#define OBJ_ac_auditEntity OBJ_id_pe,4L + +#define SN_ac_targeting "ac-targeting" +#define NID_ac_targeting 288 +#define OBJ_ac_targeting OBJ_id_pe,5L + +#define SN_aaControls "aaControls" +#define NID_aaControls 289 +#define OBJ_aaControls OBJ_id_pe,6L + +#define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" +#define NID_sbgp_ipAddrBlock 290 +#define OBJ_sbgp_ipAddrBlock OBJ_id_pe,7L + +#define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" +#define NID_sbgp_autonomousSysNum 291 +#define OBJ_sbgp_autonomousSysNum OBJ_id_pe,8L + +#define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" +#define NID_sbgp_routerIdentifier 292 +#define OBJ_sbgp_routerIdentifier OBJ_id_pe,9L + +#define SN_ac_proxying "ac-proxying" +#define NID_ac_proxying 397 +#define OBJ_ac_proxying OBJ_id_pe,10L + +#define SN_sinfo_access "subjectInfoAccess" +#define LN_sinfo_access "Subject Information Access" +#define NID_sinfo_access 398 +#define OBJ_sinfo_access OBJ_id_pe,11L + +#define SN_proxyCertInfo "proxyCertInfo" +#define LN_proxyCertInfo "Proxy Certificate Information" +#define NID_proxyCertInfo 663 +#define OBJ_proxyCertInfo OBJ_id_pe,14L + +#define SN_id_qt_cps "id-qt-cps" +#define LN_id_qt_cps "Policy Qualifier CPS" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_qt,1L + +#define SN_id_qt_unotice "id-qt-unotice" +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_qt,2L + +#define SN_textNotice "textNotice" +#define NID_textNotice 293 +#define OBJ_textNotice OBJ_id_qt,3L + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_ipsecEndSystem "ipsecEndSystem" +#define LN_ipsecEndSystem "IPSec End System" +#define NID_ipsecEndSystem 294 +#define OBJ_ipsecEndSystem OBJ_id_kp,5L + +#define SN_ipsecTunnel "ipsecTunnel" +#define LN_ipsecTunnel "IPSec Tunnel" +#define NID_ipsecTunnel 295 +#define OBJ_ipsecTunnel OBJ_id_kp,6L + +#define SN_ipsecUser "ipsecUser" +#define LN_ipsecUser "IPSec User" +#define NID_ipsecUser 296 +#define OBJ_ipsecUser OBJ_id_kp,7L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L + +#define SN_dvcs "DVCS" +#define LN_dvcs "dvcs" +#define NID_dvcs 297 +#define OBJ_dvcs OBJ_id_kp,10L + +#define SN_id_it_caProtEncCert "id-it-caProtEncCert" +#define NID_id_it_caProtEncCert 298 +#define OBJ_id_it_caProtEncCert OBJ_id_it,1L + +#define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" +#define NID_id_it_signKeyPairTypes 299 +#define OBJ_id_it_signKeyPairTypes OBJ_id_it,2L + +#define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" +#define NID_id_it_encKeyPairTypes 300 +#define OBJ_id_it_encKeyPairTypes OBJ_id_it,3L + +#define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" +#define NID_id_it_preferredSymmAlg 301 +#define OBJ_id_it_preferredSymmAlg OBJ_id_it,4L + +#define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" +#define NID_id_it_caKeyUpdateInfo 302 +#define OBJ_id_it_caKeyUpdateInfo OBJ_id_it,5L + +#define SN_id_it_currentCRL "id-it-currentCRL" +#define NID_id_it_currentCRL 303 +#define OBJ_id_it_currentCRL OBJ_id_it,6L + +#define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" +#define NID_id_it_unsupportedOIDs 304 +#define OBJ_id_it_unsupportedOIDs OBJ_id_it,7L + +#define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" +#define NID_id_it_subscriptionRequest 305 +#define OBJ_id_it_subscriptionRequest OBJ_id_it,8L + +#define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" +#define NID_id_it_subscriptionResponse 306 +#define OBJ_id_it_subscriptionResponse OBJ_id_it,9L + +#define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" +#define NID_id_it_keyPairParamReq 307 +#define OBJ_id_it_keyPairParamReq OBJ_id_it,10L + +#define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" +#define NID_id_it_keyPairParamRep 308 +#define OBJ_id_it_keyPairParamRep OBJ_id_it,11L + +#define SN_id_it_revPassphrase "id-it-revPassphrase" +#define NID_id_it_revPassphrase 309 +#define OBJ_id_it_revPassphrase OBJ_id_it,12L + +#define SN_id_it_implicitConfirm "id-it-implicitConfirm" +#define NID_id_it_implicitConfirm 310 +#define OBJ_id_it_implicitConfirm OBJ_id_it,13L + +#define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" +#define NID_id_it_confirmWaitTime 311 +#define OBJ_id_it_confirmWaitTime OBJ_id_it,14L + +#define SN_id_it_origPKIMessage "id-it-origPKIMessage" +#define NID_id_it_origPKIMessage 312 +#define OBJ_id_it_origPKIMessage OBJ_id_it,15L + +#define SN_id_it_suppLangTags "id-it-suppLangTags" +#define NID_id_it_suppLangTags 784 +#define OBJ_id_it_suppLangTags OBJ_id_it,16L + +#define SN_id_regCtrl "id-regCtrl" +#define NID_id_regCtrl 313 +#define OBJ_id_regCtrl OBJ_id_pkip,1L + +#define SN_id_regInfo "id-regInfo" +#define NID_id_regInfo 314 +#define OBJ_id_regInfo OBJ_id_pkip,2L + +#define SN_id_regCtrl_regToken "id-regCtrl-regToken" +#define NID_id_regCtrl_regToken 315 +#define OBJ_id_regCtrl_regToken OBJ_id_regCtrl,1L + +#define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" +#define NID_id_regCtrl_authenticator 316 +#define OBJ_id_regCtrl_authenticator OBJ_id_regCtrl,2L + +#define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" +#define NID_id_regCtrl_pkiPublicationInfo 317 +#define OBJ_id_regCtrl_pkiPublicationInfo OBJ_id_regCtrl,3L + +#define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" +#define NID_id_regCtrl_pkiArchiveOptions 318 +#define OBJ_id_regCtrl_pkiArchiveOptions OBJ_id_regCtrl,4L + +#define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" +#define NID_id_regCtrl_oldCertID 319 +#define OBJ_id_regCtrl_oldCertID OBJ_id_regCtrl,5L + +#define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" +#define NID_id_regCtrl_protocolEncrKey 320 +#define OBJ_id_regCtrl_protocolEncrKey OBJ_id_regCtrl,6L + +#define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" +#define NID_id_regInfo_utf8Pairs 321 +#define OBJ_id_regInfo_utf8Pairs OBJ_id_regInfo,1L + +#define SN_id_regInfo_certReq "id-regInfo-certReq" +#define NID_id_regInfo_certReq 322 +#define OBJ_id_regInfo_certReq OBJ_id_regInfo,2L + +#define SN_id_alg_des40 "id-alg-des40" +#define NID_id_alg_des40 323 +#define OBJ_id_alg_des40 OBJ_id_alg,1L + +#define SN_id_alg_noSignature "id-alg-noSignature" +#define NID_id_alg_noSignature 324 +#define OBJ_id_alg_noSignature OBJ_id_alg,2L + +#define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" +#define NID_id_alg_dh_sig_hmac_sha1 325 +#define OBJ_id_alg_dh_sig_hmac_sha1 OBJ_id_alg,3L + +#define SN_id_alg_dh_pop "id-alg-dh-pop" +#define NID_id_alg_dh_pop 326 +#define OBJ_id_alg_dh_pop OBJ_id_alg,4L + +#define SN_id_cmc_statusInfo "id-cmc-statusInfo" +#define NID_id_cmc_statusInfo 327 +#define OBJ_id_cmc_statusInfo OBJ_id_cmc,1L + +#define SN_id_cmc_identification "id-cmc-identification" +#define NID_id_cmc_identification 328 +#define OBJ_id_cmc_identification OBJ_id_cmc,2L + +#define SN_id_cmc_identityProof "id-cmc-identityProof" +#define NID_id_cmc_identityProof 329 +#define OBJ_id_cmc_identityProof OBJ_id_cmc,3L + +#define SN_id_cmc_dataReturn "id-cmc-dataReturn" +#define NID_id_cmc_dataReturn 330 +#define OBJ_id_cmc_dataReturn OBJ_id_cmc,4L + +#define SN_id_cmc_transactionId "id-cmc-transactionId" +#define NID_id_cmc_transactionId 331 +#define OBJ_id_cmc_transactionId OBJ_id_cmc,5L + +#define SN_id_cmc_senderNonce "id-cmc-senderNonce" +#define NID_id_cmc_senderNonce 332 +#define OBJ_id_cmc_senderNonce OBJ_id_cmc,6L + +#define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" +#define NID_id_cmc_recipientNonce 333 +#define OBJ_id_cmc_recipientNonce OBJ_id_cmc,7L + +#define SN_id_cmc_addExtensions "id-cmc-addExtensions" +#define NID_id_cmc_addExtensions 334 +#define OBJ_id_cmc_addExtensions OBJ_id_cmc,8L + +#define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" +#define NID_id_cmc_encryptedPOP 335 +#define OBJ_id_cmc_encryptedPOP OBJ_id_cmc,9L + +#define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" +#define NID_id_cmc_decryptedPOP 336 +#define OBJ_id_cmc_decryptedPOP OBJ_id_cmc,10L + +#define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" +#define NID_id_cmc_lraPOPWitness 337 +#define OBJ_id_cmc_lraPOPWitness OBJ_id_cmc,11L + +#define SN_id_cmc_getCert "id-cmc-getCert" +#define NID_id_cmc_getCert 338 +#define OBJ_id_cmc_getCert OBJ_id_cmc,15L + +#define SN_id_cmc_getCRL "id-cmc-getCRL" +#define NID_id_cmc_getCRL 339 +#define OBJ_id_cmc_getCRL OBJ_id_cmc,16L + +#define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" +#define NID_id_cmc_revokeRequest 340 +#define OBJ_id_cmc_revokeRequest OBJ_id_cmc,17L + +#define SN_id_cmc_regInfo "id-cmc-regInfo" +#define NID_id_cmc_regInfo 341 +#define OBJ_id_cmc_regInfo OBJ_id_cmc,18L + +#define SN_id_cmc_responseInfo "id-cmc-responseInfo" +#define NID_id_cmc_responseInfo 342 +#define OBJ_id_cmc_responseInfo OBJ_id_cmc,19L + +#define SN_id_cmc_queryPending "id-cmc-queryPending" +#define NID_id_cmc_queryPending 343 +#define OBJ_id_cmc_queryPending OBJ_id_cmc,21L + +#define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" +#define NID_id_cmc_popLinkRandom 344 +#define OBJ_id_cmc_popLinkRandom OBJ_id_cmc,22L + +#define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" +#define NID_id_cmc_popLinkWitness 345 +#define OBJ_id_cmc_popLinkWitness OBJ_id_cmc,23L + +#define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" +#define NID_id_cmc_confirmCertAcceptance 346 +#define OBJ_id_cmc_confirmCertAcceptance OBJ_id_cmc,24L + +#define SN_id_on_personalData "id-on-personalData" +#define NID_id_on_personalData 347 +#define OBJ_id_on_personalData OBJ_id_on,1L + +#define SN_id_on_permanentIdentifier "id-on-permanentIdentifier" +#define LN_id_on_permanentIdentifier "Permanent Identifier" +#define NID_id_on_permanentIdentifier 858 +#define OBJ_id_on_permanentIdentifier OBJ_id_on,3L + +#define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" +#define NID_id_pda_dateOfBirth 348 +#define OBJ_id_pda_dateOfBirth OBJ_id_pda,1L + +#define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" +#define NID_id_pda_placeOfBirth 349 +#define OBJ_id_pda_placeOfBirth OBJ_id_pda,2L + +#define SN_id_pda_gender "id-pda-gender" +#define NID_id_pda_gender 351 +#define OBJ_id_pda_gender OBJ_id_pda,3L + +#define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" +#define NID_id_pda_countryOfCitizenship 352 +#define OBJ_id_pda_countryOfCitizenship OBJ_id_pda,4L + +#define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" +#define NID_id_pda_countryOfResidence 353 +#define OBJ_id_pda_countryOfResidence OBJ_id_pda,5L + +#define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" +#define NID_id_aca_authenticationInfo 354 +#define OBJ_id_aca_authenticationInfo OBJ_id_aca,1L + +#define SN_id_aca_accessIdentity "id-aca-accessIdentity" +#define NID_id_aca_accessIdentity 355 +#define OBJ_id_aca_accessIdentity OBJ_id_aca,2L + +#define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" +#define NID_id_aca_chargingIdentity 356 +#define OBJ_id_aca_chargingIdentity OBJ_id_aca,3L + +#define SN_id_aca_group "id-aca-group" +#define NID_id_aca_group 357 +#define OBJ_id_aca_group OBJ_id_aca,4L + +#define SN_id_aca_role "id-aca-role" +#define NID_id_aca_role 358 +#define OBJ_id_aca_role OBJ_id_aca,5L + +#define SN_id_aca_encAttrs "id-aca-encAttrs" +#define NID_id_aca_encAttrs 399 +#define OBJ_id_aca_encAttrs OBJ_id_aca,6L + +#define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" +#define NID_id_qcs_pkixQCSyntax_v1 359 +#define OBJ_id_qcs_pkixQCSyntax_v1 OBJ_id_qcs,1L + +#define SN_id_cct_crs "id-cct-crs" +#define NID_id_cct_crs 360 +#define OBJ_id_cct_crs OBJ_id_cct,1L + +#define SN_id_cct_PKIData "id-cct-PKIData" +#define NID_id_cct_PKIData 361 +#define OBJ_id_cct_PKIData OBJ_id_cct,2L + +#define SN_id_cct_PKIResponse "id-cct-PKIResponse" +#define NID_id_cct_PKIResponse 362 +#define OBJ_id_cct_PKIResponse OBJ_id_cct,3L + +#define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" +#define LN_id_ppl_anyLanguage "Any language" +#define NID_id_ppl_anyLanguage 664 +#define OBJ_id_ppl_anyLanguage OBJ_id_ppl,0L + +#define SN_id_ppl_inheritAll "id-ppl-inheritAll" +#define LN_id_ppl_inheritAll "Inherit all" +#define NID_id_ppl_inheritAll 665 +#define OBJ_id_ppl_inheritAll OBJ_id_ppl,1L + +#define SN_Independent "id-ppl-independent" +#define LN_Independent "Independent" +#define NID_Independent 667 +#define OBJ_Independent OBJ_id_ppl,2L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_ad_timeStamping "ad_timestamping" +#define LN_ad_timeStamping "AD Time Stamping" +#define NID_ad_timeStamping 363 +#define OBJ_ad_timeStamping OBJ_id_ad,3L + +#define SN_ad_dvcs "AD_DVCS" +#define LN_ad_dvcs "ad dvcs" +#define NID_ad_dvcs 364 +#define OBJ_ad_dvcs OBJ_id_ad,4L + +#define SN_caRepository "caRepository" +#define LN_caRepository "CA Repository" +#define NID_caRepository 785 +#define OBJ_caRepository OBJ_id_ad,5L + +#define OBJ_id_pkix_OCSP OBJ_ad_OCSP + +#define SN_id_pkix_OCSP_basic "basicOCSPResponse" +#define LN_id_pkix_OCSP_basic "Basic OCSP Response" +#define NID_id_pkix_OCSP_basic 365 +#define OBJ_id_pkix_OCSP_basic OBJ_id_pkix_OCSP,1L + +#define SN_id_pkix_OCSP_Nonce "Nonce" +#define LN_id_pkix_OCSP_Nonce "OCSP Nonce" +#define NID_id_pkix_OCSP_Nonce 366 +#define OBJ_id_pkix_OCSP_Nonce OBJ_id_pkix_OCSP,2L + +#define SN_id_pkix_OCSP_CrlID "CrlID" +#define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" +#define NID_id_pkix_OCSP_CrlID 367 +#define OBJ_id_pkix_OCSP_CrlID OBJ_id_pkix_OCSP,3L + +#define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" +#define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" +#define NID_id_pkix_OCSP_acceptableResponses 368 +#define OBJ_id_pkix_OCSP_acceptableResponses OBJ_id_pkix_OCSP,4L + +#define SN_id_pkix_OCSP_noCheck "noCheck" +#define LN_id_pkix_OCSP_noCheck "OCSP No Check" +#define NID_id_pkix_OCSP_noCheck 369 +#define OBJ_id_pkix_OCSP_noCheck OBJ_id_pkix_OCSP,5L + +#define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" +#define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" +#define NID_id_pkix_OCSP_archiveCutoff 370 +#define OBJ_id_pkix_OCSP_archiveCutoff OBJ_id_pkix_OCSP,6L + +#define SN_id_pkix_OCSP_serviceLocator "serviceLocator" +#define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" +#define NID_id_pkix_OCSP_serviceLocator 371 +#define OBJ_id_pkix_OCSP_serviceLocator OBJ_id_pkix_OCSP,7L + +#define SN_id_pkix_OCSP_extendedStatus "extendedStatus" +#define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" +#define NID_id_pkix_OCSP_extendedStatus 372 +#define OBJ_id_pkix_OCSP_extendedStatus OBJ_id_pkix_OCSP,8L + +#define SN_id_pkix_OCSP_valid "valid" +#define NID_id_pkix_OCSP_valid 373 +#define OBJ_id_pkix_OCSP_valid OBJ_id_pkix_OCSP,9L + +#define SN_id_pkix_OCSP_path "path" +#define NID_id_pkix_OCSP_path 374 +#define OBJ_id_pkix_OCSP_path OBJ_id_pkix_OCSP,10L + +#define SN_id_pkix_OCSP_trustRoot "trustRoot" +#define LN_id_pkix_OCSP_trustRoot "Trust Root" +#define NID_id_pkix_OCSP_trustRoot 375 +#define OBJ_id_pkix_OCSP_trustRoot OBJ_id_pkix_OCSP,11L + +#define SN_algorithm "algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 376 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_rsaSignature "rsaSignature" +#define NID_rsaSignature 377 +#define OBJ_rsaSignature OBJ_algorithm,11L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_ecb "DES-EDE" +#define LN_des_ede_ecb "des-ede" +#define NID_des_ede_ecb 32 +#define OBJ_des_ede_ecb OBJ_algorithm,17L + +#define SN_des_ede3_ecb "DES-EDE3" +#define LN_des_ede3_ecb "des-ede3" +#define NID_des_ede3_ecb 33 + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +#define NID_dsaWithSHA1_2 70 +#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +#define SN_X500 "X500" +#define LN_X500 "directory services (X.500)" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define SN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_surname "SN" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define SN_streetAddress "street" +#define LN_streetAddress "streetAddress" +#define NID_streetAddress 660 +#define OBJ_streetAddress OBJ_X509,9L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define SN_title "title" +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +#define LN_searchGuide "searchGuide" +#define NID_searchGuide 859 +#define OBJ_searchGuide OBJ_X509,14L + +#define LN_businessCategory "businessCategory" +#define NID_businessCategory 860 +#define OBJ_businessCategory OBJ_X509,15L + +#define LN_postalAddress "postalAddress" +#define NID_postalAddress 861 +#define OBJ_postalAddress OBJ_X509,16L + +#define LN_postalCode "postalCode" +#define NID_postalCode 661 +#define OBJ_postalCode OBJ_X509,17L + +#define LN_postOfficeBox "postOfficeBox" +#define NID_postOfficeBox 862 +#define OBJ_postOfficeBox OBJ_X509,18L + +#define LN_physicalDeliveryOfficeName "physicalDeliveryOfficeName" +#define NID_physicalDeliveryOfficeName 863 +#define OBJ_physicalDeliveryOfficeName OBJ_X509,19L + +#define LN_telephoneNumber "telephoneNumber" +#define NID_telephoneNumber 864 +#define OBJ_telephoneNumber OBJ_X509,20L + +#define LN_telexNumber "telexNumber" +#define NID_telexNumber 865 +#define OBJ_telexNumber OBJ_X509,21L + +#define LN_teletexTerminalIdentifier "teletexTerminalIdentifier" +#define NID_teletexTerminalIdentifier 866 +#define OBJ_teletexTerminalIdentifier OBJ_X509,22L + +#define LN_facsimileTelephoneNumber "facsimileTelephoneNumber" +#define NID_facsimileTelephoneNumber 867 +#define OBJ_facsimileTelephoneNumber OBJ_X509,23L + +#define LN_x121Address "x121Address" +#define NID_x121Address 868 +#define OBJ_x121Address OBJ_X509,24L + +#define LN_internationaliSDNNumber "internationaliSDNNumber" +#define NID_internationaliSDNNumber 869 +#define OBJ_internationaliSDNNumber OBJ_X509,25L + +#define LN_registeredAddress "registeredAddress" +#define NID_registeredAddress 870 +#define OBJ_registeredAddress OBJ_X509,26L + +#define LN_destinationIndicator "destinationIndicator" +#define NID_destinationIndicator 871 +#define OBJ_destinationIndicator OBJ_X509,27L + +#define LN_preferredDeliveryMethod "preferredDeliveryMethod" +#define NID_preferredDeliveryMethod 872 +#define OBJ_preferredDeliveryMethod OBJ_X509,28L + +#define LN_presentationAddress "presentationAddress" +#define NID_presentationAddress 873 +#define OBJ_presentationAddress OBJ_X509,29L + +#define LN_supportedApplicationContext "supportedApplicationContext" +#define NID_supportedApplicationContext 874 +#define OBJ_supportedApplicationContext OBJ_X509,30L + +#define SN_member "member" +#define NID_member 875 +#define OBJ_member OBJ_X509,31L + +#define SN_owner "owner" +#define NID_owner 876 +#define OBJ_owner OBJ_X509,32L + +#define LN_roleOccupant "roleOccupant" +#define NID_roleOccupant 877 +#define OBJ_roleOccupant OBJ_X509,33L + +#define SN_seeAlso "seeAlso" +#define NID_seeAlso 878 +#define OBJ_seeAlso OBJ_X509,34L + +#define LN_userPassword "userPassword" +#define NID_userPassword 879 +#define OBJ_userPassword OBJ_X509,35L + +#define LN_userCertificate "userCertificate" +#define NID_userCertificate 880 +#define OBJ_userCertificate OBJ_X509,36L + +#define LN_cACertificate "cACertificate" +#define NID_cACertificate 881 +#define OBJ_cACertificate OBJ_X509,37L + +#define LN_authorityRevocationList "authorityRevocationList" +#define NID_authorityRevocationList 882 +#define OBJ_authorityRevocationList OBJ_X509,38L + +#define LN_certificateRevocationList "certificateRevocationList" +#define NID_certificateRevocationList 883 +#define OBJ_certificateRevocationList OBJ_X509,39L + +#define LN_crossCertificatePair "crossCertificatePair" +#define NID_crossCertificatePair 884 +#define OBJ_crossCertificatePair OBJ_X509,40L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_givenName "GN" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define SN_initials "initials" +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define LN_generationQualifier "generationQualifier" +#define NID_generationQualifier 509 +#define OBJ_generationQualifier OBJ_X509,44L + +#define LN_x500UniqueIdentifier "x500UniqueIdentifier" +#define NID_x500UniqueIdentifier 503 +#define OBJ_x500UniqueIdentifier OBJ_X509,45L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define LN_enhancedSearchGuide "enhancedSearchGuide" +#define NID_enhancedSearchGuide 885 +#define OBJ_enhancedSearchGuide OBJ_X509,47L + +#define LN_protocolInformation "protocolInformation" +#define NID_protocolInformation 886 +#define OBJ_protocolInformation OBJ_X509,48L + +#define LN_distinguishedName "distinguishedName" +#define NID_distinguishedName 887 +#define OBJ_distinguishedName OBJ_X509,49L + +#define LN_uniqueMember "uniqueMember" +#define NID_uniqueMember 888 +#define OBJ_uniqueMember OBJ_X509,50L + +#define LN_houseIdentifier "houseIdentifier" +#define NID_houseIdentifier 889 +#define OBJ_houseIdentifier OBJ_X509,51L + +#define LN_supportedAlgorithms "supportedAlgorithms" +#define NID_supportedAlgorithms 890 +#define OBJ_supportedAlgorithms OBJ_X509,52L + +#define LN_deltaRevocationList "deltaRevocationList" +#define NID_deltaRevocationList 891 +#define OBJ_deltaRevocationList OBJ_X509,53L + +#define SN_dmdName "dmdName" +#define NID_dmdName 892 +#define OBJ_dmdName OBJ_X509,54L + +#define LN_pseudonym "pseudonym" +#define NID_pseudonym 510 +#define OBJ_pseudonym OBJ_X509,65L + +#define SN_role "role" +#define LN_role "role" +#define NID_role 400 +#define OBJ_role OBJ_X509,72L + +#define SN_X500algorithms "X500algorithms" +#define LN_X500algorithms "directory services - algorithms" +#define NID_X500algorithms 378 +#define OBJ_X500algorithms OBJ_X500,8L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500algorithms,1L,1L + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2WithRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA OBJ_X500algorithms,3L,100L + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 OBJ_X500algorithms,3L,101L + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce OBJ_X500,29L + +#define SN_subject_directory_attributes "subjectDirectoryAttributes" +#define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" +#define NID_subject_directory_attributes 769 +#define OBJ_subject_directory_attributes OBJ_id_ce,9L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "X509v3 CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_issuing_distribution_point "issuingDistributionPoint" +#define LN_issuing_distribution_point "X509v3 Issuing Distribution Point" +#define NID_issuing_distribution_point 770 +#define OBJ_issuing_distribution_point OBJ_id_ce,28L + +#define SN_certificate_issuer "certificateIssuer" +#define LN_certificate_issuer "X509v3 Certificate Issuer" +#define NID_certificate_issuer 771 +#define OBJ_certificate_issuer OBJ_id_ce,29L + +#define SN_name_constraints "nameConstraints" +#define LN_name_constraints "X509v3 Name Constraints" +#define NID_name_constraints 666 +#define OBJ_name_constraints OBJ_id_ce,30L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_any_policy "anyPolicy" +#define LN_any_policy "X509v3 Any Policy" +#define NID_any_policy 746 +#define OBJ_any_policy OBJ_certificate_policies,0L + +#define SN_policy_mappings "policyMappings" +#define LN_policy_mappings "X509v3 Policy Mappings" +#define NID_policy_mappings 747 +#define OBJ_policy_mappings OBJ_id_ce,33L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_policy_constraints "policyConstraints" +#define LN_policy_constraints "X509v3 Policy Constraints" +#define NID_policy_constraints 401 +#define OBJ_policy_constraints OBJ_id_ce,36L + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37L + +#define SN_freshest_crl "freshestCRL" +#define LN_freshest_crl "X509v3 Freshest CRL" +#define NID_freshest_crl 857 +#define OBJ_freshest_crl OBJ_id_ce,46L + +#define SN_inhibit_any_policy "inhibitAnyPolicy" +#define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" +#define NID_inhibit_any_policy 748 +#define OBJ_inhibit_any_policy OBJ_id_ce,54L + +#define SN_target_information "targetInformation" +#define LN_target_information "X509v3 AC Targeting" +#define NID_target_information 402 +#define OBJ_target_information OBJ_id_ce,55L + +#define SN_no_rev_avail "noRevAvail" +#define LN_no_rev_avail "X509v3 No Revocation Available" +#define NID_no_rev_avail 403 +#define OBJ_no_rev_avail OBJ_id_ce,56L + +#define SN_anyExtendedKeyUsage "anyExtendedKeyUsage" +#define LN_anyExtendedKeyUsage "Any Extended Key Usage" +#define NID_anyExtendedKeyUsage 910 +#define OBJ_anyExtendedKeyUsage OBJ_ext_key_usage,0L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_org "ORG" +#define LN_org "org" +#define NID_org 379 +#define OBJ_org OBJ_iso,3L + +#define SN_dod "DOD" +#define LN_dod "dod" +#define NID_dod 380 +#define OBJ_dod OBJ_org,6L + +#define SN_iana "IANA" +#define LN_iana "iana" +#define NID_iana 381 +#define OBJ_iana OBJ_dod,1L + +#define OBJ_internet OBJ_iana + +#define SN_Directory "directory" +#define LN_Directory "Directory" +#define NID_Directory 382 +#define OBJ_Directory OBJ_internet,1L + +#define SN_Management "mgmt" +#define LN_Management "Management" +#define NID_Management 383 +#define OBJ_Management OBJ_internet,2L + +#define SN_Experimental "experimental" +#define LN_Experimental "Experimental" +#define NID_Experimental 384 +#define OBJ_Experimental OBJ_internet,3L + +#define SN_Private "private" +#define LN_Private "Private" +#define NID_Private 385 +#define OBJ_Private OBJ_internet,4L + +#define SN_Security "security" +#define LN_Security "Security" +#define NID_Security 386 +#define OBJ_Security OBJ_internet,5L + +#define SN_SNMPv2 "snmpv2" +#define LN_SNMPv2 "SNMPv2" +#define NID_SNMPv2 387 +#define OBJ_SNMPv2 OBJ_internet,6L + +#define LN_Mail "Mail" +#define NID_Mail 388 +#define OBJ_Mail OBJ_internet,7L + +#define SN_Enterprises "enterprises" +#define LN_Enterprises "Enterprises" +#define NID_Enterprises 389 +#define OBJ_Enterprises OBJ_Private,1L + +#define SN_dcObject "dcobject" +#define LN_dcObject "dcObject" +#define NID_dcObject 390 +#define OBJ_dcObject OBJ_Enterprises,1466L,344L + +#define SN_mime_mhs "mime-mhs" +#define LN_mime_mhs "MIME MHS" +#define NID_mime_mhs 504 +#define OBJ_mime_mhs OBJ_Mail,1L + +#define SN_mime_mhs_headings "mime-mhs-headings" +#define LN_mime_mhs_headings "mime-mhs-headings" +#define NID_mime_mhs_headings 505 +#define OBJ_mime_mhs_headings OBJ_mime_mhs,1L + +#define SN_mime_mhs_bodies "mime-mhs-bodies" +#define LN_mime_mhs_bodies "mime-mhs-bodies" +#define NID_mime_mhs_bodies 506 +#define OBJ_mime_mhs_bodies OBJ_mime_mhs,2L + +#define SN_id_hex_partial_message "id-hex-partial-message" +#define LN_id_hex_partial_message "id-hex-partial-message" +#define NID_id_hex_partial_message 507 +#define OBJ_id_hex_partial_message OBJ_mime_mhs_headings,1L + +#define SN_id_hex_multipart_message "id-hex-multipart-message" +#define LN_id_hex_multipart_message "id-hex-multipart-message" +#define NID_id_hex_multipart_message 508 +#define OBJ_id_hex_multipart_message OBJ_mime_mhs_headings,2L + +#define SN_rle_compression "RLE" +#define LN_rle_compression "run length compression" +#define NID_rle_compression 124 +#define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +#define SN_zlib_compression "ZLIB" +#define LN_zlib_compression "zlib compression" +#define NID_zlib_compression 125 +#define OBJ_zlib_compression OBJ_id_smime_alg,8L + +#define OBJ_csor 2L,16L,840L,1L,101L,3L + +#define OBJ_nistAlgorithms OBJ_csor,4L + +#define OBJ_aes OBJ_nistAlgorithms,1L + +#define SN_aes_128_ecb "AES-128-ECB" +#define LN_aes_128_ecb "aes-128-ecb" +#define NID_aes_128_ecb 418 +#define OBJ_aes_128_ecb OBJ_aes,1L + +#define SN_aes_128_cbc "AES-128-CBC" +#define LN_aes_128_cbc "aes-128-cbc" +#define NID_aes_128_cbc 419 +#define OBJ_aes_128_cbc OBJ_aes,2L + +#define SN_aes_128_ofb128 "AES-128-OFB" +#define LN_aes_128_ofb128 "aes-128-ofb" +#define NID_aes_128_ofb128 420 +#define OBJ_aes_128_ofb128 OBJ_aes,3L + +#define SN_aes_128_cfb128 "AES-128-CFB" +#define LN_aes_128_cfb128 "aes-128-cfb" +#define NID_aes_128_cfb128 421 +#define OBJ_aes_128_cfb128 OBJ_aes,4L + +#define SN_id_aes128_wrap "id-aes128-wrap" +#define NID_id_aes128_wrap 788 +#define OBJ_id_aes128_wrap OBJ_aes,5L + +#define SN_aes_128_gcm "id-aes128-GCM" +#define LN_aes_128_gcm "aes-128-gcm" +#define NID_aes_128_gcm 895 +#define OBJ_aes_128_gcm OBJ_aes,6L + +#define SN_aes_128_ccm "id-aes128-CCM" +#define LN_aes_128_ccm "aes-128-ccm" +#define NID_aes_128_ccm 896 +#define OBJ_aes_128_ccm OBJ_aes,7L + +#define SN_id_aes128_wrap_pad "id-aes128-wrap-pad" +#define NID_id_aes128_wrap_pad 897 +#define OBJ_id_aes128_wrap_pad OBJ_aes,8L + +#define SN_aes_192_ecb "AES-192-ECB" +#define LN_aes_192_ecb "aes-192-ecb" +#define NID_aes_192_ecb 422 +#define OBJ_aes_192_ecb OBJ_aes,21L + +#define SN_aes_192_cbc "AES-192-CBC" +#define LN_aes_192_cbc "aes-192-cbc" +#define NID_aes_192_cbc 423 +#define OBJ_aes_192_cbc OBJ_aes,22L + +#define SN_aes_192_ofb128 "AES-192-OFB" +#define LN_aes_192_ofb128 "aes-192-ofb" +#define NID_aes_192_ofb128 424 +#define OBJ_aes_192_ofb128 OBJ_aes,23L + +#define SN_aes_192_cfb128 "AES-192-CFB" +#define LN_aes_192_cfb128 "aes-192-cfb" +#define NID_aes_192_cfb128 425 +#define OBJ_aes_192_cfb128 OBJ_aes,24L + +#define SN_id_aes192_wrap "id-aes192-wrap" +#define NID_id_aes192_wrap 789 +#define OBJ_id_aes192_wrap OBJ_aes,25L + +#define SN_aes_192_gcm "id-aes192-GCM" +#define LN_aes_192_gcm "aes-192-gcm" +#define NID_aes_192_gcm 898 +#define OBJ_aes_192_gcm OBJ_aes,26L + +#define SN_aes_192_ccm "id-aes192-CCM" +#define LN_aes_192_ccm "aes-192-ccm" +#define NID_aes_192_ccm 899 +#define OBJ_aes_192_ccm OBJ_aes,27L + +#define SN_id_aes192_wrap_pad "id-aes192-wrap-pad" +#define NID_id_aes192_wrap_pad 900 +#define OBJ_id_aes192_wrap_pad OBJ_aes,28L + +#define SN_aes_256_ecb "AES-256-ECB" +#define LN_aes_256_ecb "aes-256-ecb" +#define NID_aes_256_ecb 426 +#define OBJ_aes_256_ecb OBJ_aes,41L + +#define SN_aes_256_cbc "AES-256-CBC" +#define LN_aes_256_cbc "aes-256-cbc" +#define NID_aes_256_cbc 427 +#define OBJ_aes_256_cbc OBJ_aes,42L + +#define SN_aes_256_ofb128 "AES-256-OFB" +#define LN_aes_256_ofb128 "aes-256-ofb" +#define NID_aes_256_ofb128 428 +#define OBJ_aes_256_ofb128 OBJ_aes,43L + +#define SN_aes_256_cfb128 "AES-256-CFB" +#define LN_aes_256_cfb128 "aes-256-cfb" +#define NID_aes_256_cfb128 429 +#define OBJ_aes_256_cfb128 OBJ_aes,44L + +#define SN_id_aes256_wrap "id-aes256-wrap" +#define NID_id_aes256_wrap 790 +#define OBJ_id_aes256_wrap OBJ_aes,45L + +#define SN_aes_256_gcm "id-aes256-GCM" +#define LN_aes_256_gcm "aes-256-gcm" +#define NID_aes_256_gcm 901 +#define OBJ_aes_256_gcm OBJ_aes,46L + +#define SN_aes_256_ccm "id-aes256-CCM" +#define LN_aes_256_ccm "aes-256-ccm" +#define NID_aes_256_ccm 902 +#define OBJ_aes_256_ccm OBJ_aes,47L + +#define SN_id_aes256_wrap_pad "id-aes256-wrap-pad" +#define NID_id_aes256_wrap_pad 903 +#define OBJ_id_aes256_wrap_pad OBJ_aes,48L + +#define SN_aes_128_cfb1 "AES-128-CFB1" +#define LN_aes_128_cfb1 "aes-128-cfb1" +#define NID_aes_128_cfb1 650 + +#define SN_aes_192_cfb1 "AES-192-CFB1" +#define LN_aes_192_cfb1 "aes-192-cfb1" +#define NID_aes_192_cfb1 651 + +#define SN_aes_256_cfb1 "AES-256-CFB1" +#define LN_aes_256_cfb1 "aes-256-cfb1" +#define NID_aes_256_cfb1 652 + +#define SN_aes_128_cfb8 "AES-128-CFB8" +#define LN_aes_128_cfb8 "aes-128-cfb8" +#define NID_aes_128_cfb8 653 + +#define SN_aes_192_cfb8 "AES-192-CFB8" +#define LN_aes_192_cfb8 "aes-192-cfb8" +#define NID_aes_192_cfb8 654 + +#define SN_aes_256_cfb8 "AES-256-CFB8" +#define LN_aes_256_cfb8 "aes-256-cfb8" +#define NID_aes_256_cfb8 655 + +#define SN_aes_128_ctr "AES-128-CTR" +#define LN_aes_128_ctr "aes-128-ctr" +#define NID_aes_128_ctr 904 + +#define SN_aes_192_ctr "AES-192-CTR" +#define LN_aes_192_ctr "aes-192-ctr" +#define NID_aes_192_ctr 905 + +#define SN_aes_256_ctr "AES-256-CTR" +#define LN_aes_256_ctr "aes-256-ctr" +#define NID_aes_256_ctr 906 + +#define SN_aes_128_xts "AES-128-XTS" +#define LN_aes_128_xts "aes-128-xts" +#define NID_aes_128_xts 913 + +#define SN_aes_256_xts "AES-256-XTS" +#define LN_aes_256_xts "aes-256-xts" +#define NID_aes_256_xts 914 + +#define SN_des_cfb1 "DES-CFB1" +#define LN_des_cfb1 "des-cfb1" +#define NID_des_cfb1 656 + +#define SN_des_cfb8 "DES-CFB8" +#define LN_des_cfb8 "des-cfb8" +#define NID_des_cfb8 657 + +#define SN_des_ede3_cfb1 "DES-EDE3-CFB1" +#define LN_des_ede3_cfb1 "des-ede3-cfb1" +#define NID_des_ede3_cfb1 658 + +#define SN_des_ede3_cfb8 "DES-EDE3-CFB8" +#define LN_des_ede3_cfb8 "des-ede3-cfb8" +#define NID_des_ede3_cfb8 659 + +#define OBJ_nist_hashalgs OBJ_nistAlgorithms,2L + +#define SN_sha256 "SHA256" +#define LN_sha256 "sha256" +#define NID_sha256 672 +#define OBJ_sha256 OBJ_nist_hashalgs,1L + +#define SN_sha384 "SHA384" +#define LN_sha384 "sha384" +#define NID_sha384 673 +#define OBJ_sha384 OBJ_nist_hashalgs,2L + +#define SN_sha512 "SHA512" +#define LN_sha512 "sha512" +#define NID_sha512 674 +#define OBJ_sha512 OBJ_nist_hashalgs,3L + +#define SN_sha224 "SHA224" +#define LN_sha224 "sha224" +#define NID_sha224 675 +#define OBJ_sha224 OBJ_nist_hashalgs,4L + +#define OBJ_dsa_with_sha2 OBJ_nistAlgorithms,3L + +#define SN_dsa_with_SHA224 "dsa_with_SHA224" +#define NID_dsa_with_SHA224 802 +#define OBJ_dsa_with_SHA224 OBJ_dsa_with_sha2,1L + +#define SN_dsa_with_SHA256 "dsa_with_SHA256" +#define NID_dsa_with_SHA256 803 +#define OBJ_dsa_with_SHA256 OBJ_dsa_with_sha2,2L + +#define SN_hold_instruction_code "holdInstructionCode" +#define LN_hold_instruction_code "Hold Instruction Code" +#define NID_hold_instruction_code 430 +#define OBJ_hold_instruction_code OBJ_id_ce,23L + +#define OBJ_holdInstruction OBJ_X9_57,2L + +#define SN_hold_instruction_none "holdInstructionNone" +#define LN_hold_instruction_none "Hold Instruction None" +#define NID_hold_instruction_none 431 +#define OBJ_hold_instruction_none OBJ_holdInstruction,1L + +#define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" +#define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" +#define NID_hold_instruction_call_issuer 432 +#define OBJ_hold_instruction_call_issuer OBJ_holdInstruction,2L + +#define SN_hold_instruction_reject "holdInstructionReject" +#define LN_hold_instruction_reject "Hold Instruction Reject" +#define NID_hold_instruction_reject 433 +#define OBJ_hold_instruction_reject OBJ_holdInstruction,3L + +#define SN_data "data" +#define NID_data 434 +#define OBJ_data OBJ_itu_t,9L + +#define SN_pss "pss" +#define NID_pss 435 +#define OBJ_pss OBJ_data,2342L + +#define SN_ucl "ucl" +#define NID_ucl 436 +#define OBJ_ucl OBJ_pss,19200300L + +#define SN_pilot "pilot" +#define NID_pilot 437 +#define OBJ_pilot OBJ_ucl,100L + +#define LN_pilotAttributeType "pilotAttributeType" +#define NID_pilotAttributeType 438 +#define OBJ_pilotAttributeType OBJ_pilot,1L + +#define LN_pilotAttributeSyntax "pilotAttributeSyntax" +#define NID_pilotAttributeSyntax 439 +#define OBJ_pilotAttributeSyntax OBJ_pilot,3L + +#define LN_pilotObjectClass "pilotObjectClass" +#define NID_pilotObjectClass 440 +#define OBJ_pilotObjectClass OBJ_pilot,4L + +#define LN_pilotGroups "pilotGroups" +#define NID_pilotGroups 441 +#define OBJ_pilotGroups OBJ_pilot,10L + +#define LN_iA5StringSyntax "iA5StringSyntax" +#define NID_iA5StringSyntax 442 +#define OBJ_iA5StringSyntax OBJ_pilotAttributeSyntax,4L + +#define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" +#define NID_caseIgnoreIA5StringSyntax 443 +#define OBJ_caseIgnoreIA5StringSyntax OBJ_pilotAttributeSyntax,5L + +#define LN_pilotObject "pilotObject" +#define NID_pilotObject 444 +#define OBJ_pilotObject OBJ_pilotObjectClass,3L + +#define LN_pilotPerson "pilotPerson" +#define NID_pilotPerson 445 +#define OBJ_pilotPerson OBJ_pilotObjectClass,4L + +#define SN_account "account" +#define NID_account 446 +#define OBJ_account OBJ_pilotObjectClass,5L + +#define SN_document "document" +#define NID_document 447 +#define OBJ_document OBJ_pilotObjectClass,6L + +#define SN_room "room" +#define NID_room 448 +#define OBJ_room OBJ_pilotObjectClass,7L + +#define LN_documentSeries "documentSeries" +#define NID_documentSeries 449 +#define OBJ_documentSeries OBJ_pilotObjectClass,9L + +#define SN_Domain "domain" +#define LN_Domain "Domain" +#define NID_Domain 392 +#define OBJ_Domain OBJ_pilotObjectClass,13L + +#define LN_rFC822localPart "rFC822localPart" +#define NID_rFC822localPart 450 +#define OBJ_rFC822localPart OBJ_pilotObjectClass,14L + +#define LN_dNSDomain "dNSDomain" +#define NID_dNSDomain 451 +#define OBJ_dNSDomain OBJ_pilotObjectClass,15L + +#define LN_domainRelatedObject "domainRelatedObject" +#define NID_domainRelatedObject 452 +#define OBJ_domainRelatedObject OBJ_pilotObjectClass,17L + +#define LN_friendlyCountry "friendlyCountry" +#define NID_friendlyCountry 453 +#define OBJ_friendlyCountry OBJ_pilotObjectClass,18L + +#define LN_simpleSecurityObject "simpleSecurityObject" +#define NID_simpleSecurityObject 454 +#define OBJ_simpleSecurityObject OBJ_pilotObjectClass,19L + +#define LN_pilotOrganization "pilotOrganization" +#define NID_pilotOrganization 455 +#define OBJ_pilotOrganization OBJ_pilotObjectClass,20L + +#define LN_pilotDSA "pilotDSA" +#define NID_pilotDSA 456 +#define OBJ_pilotDSA OBJ_pilotObjectClass,21L + +#define LN_qualityLabelledData "qualityLabelledData" +#define NID_qualityLabelledData 457 +#define OBJ_qualityLabelledData OBJ_pilotObjectClass,22L + +#define SN_userId "UID" +#define LN_userId "userId" +#define NID_userId 458 +#define OBJ_userId OBJ_pilotAttributeType,1L + +#define LN_textEncodedORAddress "textEncodedORAddress" +#define NID_textEncodedORAddress 459 +#define OBJ_textEncodedORAddress OBJ_pilotAttributeType,2L + +#define SN_rfc822Mailbox "mail" +#define LN_rfc822Mailbox "rfc822Mailbox" +#define NID_rfc822Mailbox 460 +#define OBJ_rfc822Mailbox OBJ_pilotAttributeType,3L + +#define SN_info "info" +#define NID_info 461 +#define OBJ_info OBJ_pilotAttributeType,4L + +#define LN_favouriteDrink "favouriteDrink" +#define NID_favouriteDrink 462 +#define OBJ_favouriteDrink OBJ_pilotAttributeType,5L + +#define LN_roomNumber "roomNumber" +#define NID_roomNumber 463 +#define OBJ_roomNumber OBJ_pilotAttributeType,6L + +#define SN_photo "photo" +#define NID_photo 464 +#define OBJ_photo OBJ_pilotAttributeType,7L + +#define LN_userClass "userClass" +#define NID_userClass 465 +#define OBJ_userClass OBJ_pilotAttributeType,8L + +#define SN_host "host" +#define NID_host 466 +#define OBJ_host OBJ_pilotAttributeType,9L + +#define SN_manager "manager" +#define NID_manager 467 +#define OBJ_manager OBJ_pilotAttributeType,10L + +#define LN_documentIdentifier "documentIdentifier" +#define NID_documentIdentifier 468 +#define OBJ_documentIdentifier OBJ_pilotAttributeType,11L + +#define LN_documentTitle "documentTitle" +#define NID_documentTitle 469 +#define OBJ_documentTitle OBJ_pilotAttributeType,12L + +#define LN_documentVersion "documentVersion" +#define NID_documentVersion 470 +#define OBJ_documentVersion OBJ_pilotAttributeType,13L + +#define LN_documentAuthor "documentAuthor" +#define NID_documentAuthor 471 +#define OBJ_documentAuthor OBJ_pilotAttributeType,14L + +#define LN_documentLocation "documentLocation" +#define NID_documentLocation 472 +#define OBJ_documentLocation OBJ_pilotAttributeType,15L + +#define LN_homeTelephoneNumber "homeTelephoneNumber" +#define NID_homeTelephoneNumber 473 +#define OBJ_homeTelephoneNumber OBJ_pilotAttributeType,20L + +#define SN_secretary "secretary" +#define NID_secretary 474 +#define OBJ_secretary OBJ_pilotAttributeType,21L + +#define LN_otherMailbox "otherMailbox" +#define NID_otherMailbox 475 +#define OBJ_otherMailbox OBJ_pilotAttributeType,22L + +#define LN_lastModifiedTime "lastModifiedTime" +#define NID_lastModifiedTime 476 +#define OBJ_lastModifiedTime OBJ_pilotAttributeType,23L + +#define LN_lastModifiedBy "lastModifiedBy" +#define NID_lastModifiedBy 477 +#define OBJ_lastModifiedBy OBJ_pilotAttributeType,24L + +#define SN_domainComponent "DC" +#define LN_domainComponent "domainComponent" +#define NID_domainComponent 391 +#define OBJ_domainComponent OBJ_pilotAttributeType,25L + +#define LN_aRecord "aRecord" +#define NID_aRecord 478 +#define OBJ_aRecord OBJ_pilotAttributeType,26L + +#define LN_pilotAttributeType27 "pilotAttributeType27" +#define NID_pilotAttributeType27 479 +#define OBJ_pilotAttributeType27 OBJ_pilotAttributeType,27L + +#define LN_mXRecord "mXRecord" +#define NID_mXRecord 480 +#define OBJ_mXRecord OBJ_pilotAttributeType,28L + +#define LN_nSRecord "nSRecord" +#define NID_nSRecord 481 +#define OBJ_nSRecord OBJ_pilotAttributeType,29L + +#define LN_sOARecord "sOARecord" +#define NID_sOARecord 482 +#define OBJ_sOARecord OBJ_pilotAttributeType,30L + +#define LN_cNAMERecord "cNAMERecord" +#define NID_cNAMERecord 483 +#define OBJ_cNAMERecord OBJ_pilotAttributeType,31L + +#define LN_associatedDomain "associatedDomain" +#define NID_associatedDomain 484 +#define OBJ_associatedDomain OBJ_pilotAttributeType,37L + +#define LN_associatedName "associatedName" +#define NID_associatedName 485 +#define OBJ_associatedName OBJ_pilotAttributeType,38L + +#define LN_homePostalAddress "homePostalAddress" +#define NID_homePostalAddress 486 +#define OBJ_homePostalAddress OBJ_pilotAttributeType,39L + +#define LN_personalTitle "personalTitle" +#define NID_personalTitle 487 +#define OBJ_personalTitle OBJ_pilotAttributeType,40L + +#define LN_mobileTelephoneNumber "mobileTelephoneNumber" +#define NID_mobileTelephoneNumber 488 +#define OBJ_mobileTelephoneNumber OBJ_pilotAttributeType,41L + +#define LN_pagerTelephoneNumber "pagerTelephoneNumber" +#define NID_pagerTelephoneNumber 489 +#define OBJ_pagerTelephoneNumber OBJ_pilotAttributeType,42L + +#define LN_friendlyCountryName "friendlyCountryName" +#define NID_friendlyCountryName 490 +#define OBJ_friendlyCountryName OBJ_pilotAttributeType,43L + +#define LN_organizationalStatus "organizationalStatus" +#define NID_organizationalStatus 491 +#define OBJ_organizationalStatus OBJ_pilotAttributeType,45L + +#define LN_janetMailbox "janetMailbox" +#define NID_janetMailbox 492 +#define OBJ_janetMailbox OBJ_pilotAttributeType,46L + +#define LN_mailPreferenceOption "mailPreferenceOption" +#define NID_mailPreferenceOption 493 +#define OBJ_mailPreferenceOption OBJ_pilotAttributeType,47L + +#define LN_buildingName "buildingName" +#define NID_buildingName 494 +#define OBJ_buildingName OBJ_pilotAttributeType,48L + +#define LN_dSAQuality "dSAQuality" +#define NID_dSAQuality 495 +#define OBJ_dSAQuality OBJ_pilotAttributeType,49L + +#define LN_singleLevelQuality "singleLevelQuality" +#define NID_singleLevelQuality 496 +#define OBJ_singleLevelQuality OBJ_pilotAttributeType,50L + +#define LN_subtreeMinimumQuality "subtreeMinimumQuality" +#define NID_subtreeMinimumQuality 497 +#define OBJ_subtreeMinimumQuality OBJ_pilotAttributeType,51L + +#define LN_subtreeMaximumQuality "subtreeMaximumQuality" +#define NID_subtreeMaximumQuality 498 +#define OBJ_subtreeMaximumQuality OBJ_pilotAttributeType,52L + +#define LN_personalSignature "personalSignature" +#define NID_personalSignature 499 +#define OBJ_personalSignature OBJ_pilotAttributeType,53L + +#define LN_dITRedirect "dITRedirect" +#define NID_dITRedirect 500 +#define OBJ_dITRedirect OBJ_pilotAttributeType,54L + +#define SN_audio "audio" +#define NID_audio 501 +#define OBJ_audio OBJ_pilotAttributeType,55L + +#define LN_documentPublisher "documentPublisher" +#define NID_documentPublisher 502 +#define OBJ_documentPublisher OBJ_pilotAttributeType,56L + +#define SN_id_set "id-set" +#define LN_id_set "Secure Electronic Transactions" +#define NID_id_set 512 +#define OBJ_id_set OBJ_international_organizations,42L + +#define SN_set_ctype "set-ctype" +#define LN_set_ctype "content types" +#define NID_set_ctype 513 +#define OBJ_set_ctype OBJ_id_set,0L + +#define SN_set_msgExt "set-msgExt" +#define LN_set_msgExt "message extensions" +#define NID_set_msgExt 514 +#define OBJ_set_msgExt OBJ_id_set,1L + +#define SN_set_attr "set-attr" +#define NID_set_attr 515 +#define OBJ_set_attr OBJ_id_set,3L + +#define SN_set_policy "set-policy" +#define NID_set_policy 516 +#define OBJ_set_policy OBJ_id_set,5L + +#define SN_set_certExt "set-certExt" +#define LN_set_certExt "certificate extensions" +#define NID_set_certExt 517 +#define OBJ_set_certExt OBJ_id_set,7L + +#define SN_set_brand "set-brand" +#define NID_set_brand 518 +#define OBJ_set_brand OBJ_id_set,8L + +#define SN_setct_PANData "setct-PANData" +#define NID_setct_PANData 519 +#define OBJ_setct_PANData OBJ_set_ctype,0L + +#define SN_setct_PANToken "setct-PANToken" +#define NID_setct_PANToken 520 +#define OBJ_setct_PANToken OBJ_set_ctype,1L + +#define SN_setct_PANOnly "setct-PANOnly" +#define NID_setct_PANOnly 521 +#define OBJ_setct_PANOnly OBJ_set_ctype,2L + +#define SN_setct_OIData "setct-OIData" +#define NID_setct_OIData 522 +#define OBJ_setct_OIData OBJ_set_ctype,3L + +#define SN_setct_PI "setct-PI" +#define NID_setct_PI 523 +#define OBJ_setct_PI OBJ_set_ctype,4L + +#define SN_setct_PIData "setct-PIData" +#define NID_setct_PIData 524 +#define OBJ_setct_PIData OBJ_set_ctype,5L + +#define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" +#define NID_setct_PIDataUnsigned 525 +#define OBJ_setct_PIDataUnsigned OBJ_set_ctype,6L + +#define SN_setct_HODInput "setct-HODInput" +#define NID_setct_HODInput 526 +#define OBJ_setct_HODInput OBJ_set_ctype,7L + +#define SN_setct_AuthResBaggage "setct-AuthResBaggage" +#define NID_setct_AuthResBaggage 527 +#define OBJ_setct_AuthResBaggage OBJ_set_ctype,8L + +#define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" +#define NID_setct_AuthRevReqBaggage 528 +#define OBJ_setct_AuthRevReqBaggage OBJ_set_ctype,9L + +#define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" +#define NID_setct_AuthRevResBaggage 529 +#define OBJ_setct_AuthRevResBaggage OBJ_set_ctype,10L + +#define SN_setct_CapTokenSeq "setct-CapTokenSeq" +#define NID_setct_CapTokenSeq 530 +#define OBJ_setct_CapTokenSeq OBJ_set_ctype,11L + +#define SN_setct_PInitResData "setct-PInitResData" +#define NID_setct_PInitResData 531 +#define OBJ_setct_PInitResData OBJ_set_ctype,12L + +#define SN_setct_PI_TBS "setct-PI-TBS" +#define NID_setct_PI_TBS 532 +#define OBJ_setct_PI_TBS OBJ_set_ctype,13L + +#define SN_setct_PResData "setct-PResData" +#define NID_setct_PResData 533 +#define OBJ_setct_PResData OBJ_set_ctype,14L + +#define SN_setct_AuthReqTBS "setct-AuthReqTBS" +#define NID_setct_AuthReqTBS 534 +#define OBJ_setct_AuthReqTBS OBJ_set_ctype,16L + +#define SN_setct_AuthResTBS "setct-AuthResTBS" +#define NID_setct_AuthResTBS 535 +#define OBJ_setct_AuthResTBS OBJ_set_ctype,17L + +#define SN_setct_AuthResTBSX "setct-AuthResTBSX" +#define NID_setct_AuthResTBSX 536 +#define OBJ_setct_AuthResTBSX OBJ_set_ctype,18L + +#define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" +#define NID_setct_AuthTokenTBS 537 +#define OBJ_setct_AuthTokenTBS OBJ_set_ctype,19L + +#define SN_setct_CapTokenData "setct-CapTokenData" +#define NID_setct_CapTokenData 538 +#define OBJ_setct_CapTokenData OBJ_set_ctype,20L + +#define SN_setct_CapTokenTBS "setct-CapTokenTBS" +#define NID_setct_CapTokenTBS 539 +#define OBJ_setct_CapTokenTBS OBJ_set_ctype,21L + +#define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" +#define NID_setct_AcqCardCodeMsg 540 +#define OBJ_setct_AcqCardCodeMsg OBJ_set_ctype,22L + +#define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" +#define NID_setct_AuthRevReqTBS 541 +#define OBJ_setct_AuthRevReqTBS OBJ_set_ctype,23L + +#define SN_setct_AuthRevResData "setct-AuthRevResData" +#define NID_setct_AuthRevResData 542 +#define OBJ_setct_AuthRevResData OBJ_set_ctype,24L + +#define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" +#define NID_setct_AuthRevResTBS 543 +#define OBJ_setct_AuthRevResTBS OBJ_set_ctype,25L + +#define SN_setct_CapReqTBS "setct-CapReqTBS" +#define NID_setct_CapReqTBS 544 +#define OBJ_setct_CapReqTBS OBJ_set_ctype,26L + +#define SN_setct_CapReqTBSX "setct-CapReqTBSX" +#define NID_setct_CapReqTBSX 545 +#define OBJ_setct_CapReqTBSX OBJ_set_ctype,27L + +#define SN_setct_CapResData "setct-CapResData" +#define NID_setct_CapResData 546 +#define OBJ_setct_CapResData OBJ_set_ctype,28L + +#define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" +#define NID_setct_CapRevReqTBS 547 +#define OBJ_setct_CapRevReqTBS OBJ_set_ctype,29L + +#define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" +#define NID_setct_CapRevReqTBSX 548 +#define OBJ_setct_CapRevReqTBSX OBJ_set_ctype,30L + +#define SN_setct_CapRevResData "setct-CapRevResData" +#define NID_setct_CapRevResData 549 +#define OBJ_setct_CapRevResData OBJ_set_ctype,31L + +#define SN_setct_CredReqTBS "setct-CredReqTBS" +#define NID_setct_CredReqTBS 550 +#define OBJ_setct_CredReqTBS OBJ_set_ctype,32L + +#define SN_setct_CredReqTBSX "setct-CredReqTBSX" +#define NID_setct_CredReqTBSX 551 +#define OBJ_setct_CredReqTBSX OBJ_set_ctype,33L + +#define SN_setct_CredResData "setct-CredResData" +#define NID_setct_CredResData 552 +#define OBJ_setct_CredResData OBJ_set_ctype,34L + +#define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" +#define NID_setct_CredRevReqTBS 553 +#define OBJ_setct_CredRevReqTBS OBJ_set_ctype,35L + +#define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" +#define NID_setct_CredRevReqTBSX 554 +#define OBJ_setct_CredRevReqTBSX OBJ_set_ctype,36L + +#define SN_setct_CredRevResData "setct-CredRevResData" +#define NID_setct_CredRevResData 555 +#define OBJ_setct_CredRevResData OBJ_set_ctype,37L + +#define SN_setct_PCertReqData "setct-PCertReqData" +#define NID_setct_PCertReqData 556 +#define OBJ_setct_PCertReqData OBJ_set_ctype,38L + +#define SN_setct_PCertResTBS "setct-PCertResTBS" +#define NID_setct_PCertResTBS 557 +#define OBJ_setct_PCertResTBS OBJ_set_ctype,39L + +#define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" +#define NID_setct_BatchAdminReqData 558 +#define OBJ_setct_BatchAdminReqData OBJ_set_ctype,40L + +#define SN_setct_BatchAdminResData "setct-BatchAdminResData" +#define NID_setct_BatchAdminResData 559 +#define OBJ_setct_BatchAdminResData OBJ_set_ctype,41L + +#define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" +#define NID_setct_CardCInitResTBS 560 +#define OBJ_setct_CardCInitResTBS OBJ_set_ctype,42L + +#define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" +#define NID_setct_MeAqCInitResTBS 561 +#define OBJ_setct_MeAqCInitResTBS OBJ_set_ctype,43L + +#define SN_setct_RegFormResTBS "setct-RegFormResTBS" +#define NID_setct_RegFormResTBS 562 +#define OBJ_setct_RegFormResTBS OBJ_set_ctype,44L + +#define SN_setct_CertReqData "setct-CertReqData" +#define NID_setct_CertReqData 563 +#define OBJ_setct_CertReqData OBJ_set_ctype,45L + +#define SN_setct_CertReqTBS "setct-CertReqTBS" +#define NID_setct_CertReqTBS 564 +#define OBJ_setct_CertReqTBS OBJ_set_ctype,46L + +#define SN_setct_CertResData "setct-CertResData" +#define NID_setct_CertResData 565 +#define OBJ_setct_CertResData OBJ_set_ctype,47L + +#define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" +#define NID_setct_CertInqReqTBS 566 +#define OBJ_setct_CertInqReqTBS OBJ_set_ctype,48L + +#define SN_setct_ErrorTBS "setct-ErrorTBS" +#define NID_setct_ErrorTBS 567 +#define OBJ_setct_ErrorTBS OBJ_set_ctype,49L + +#define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" +#define NID_setct_PIDualSignedTBE 568 +#define OBJ_setct_PIDualSignedTBE OBJ_set_ctype,50L + +#define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" +#define NID_setct_PIUnsignedTBE 569 +#define OBJ_setct_PIUnsignedTBE OBJ_set_ctype,51L + +#define SN_setct_AuthReqTBE "setct-AuthReqTBE" +#define NID_setct_AuthReqTBE 570 +#define OBJ_setct_AuthReqTBE OBJ_set_ctype,52L + +#define SN_setct_AuthResTBE "setct-AuthResTBE" +#define NID_setct_AuthResTBE 571 +#define OBJ_setct_AuthResTBE OBJ_set_ctype,53L + +#define SN_setct_AuthResTBEX "setct-AuthResTBEX" +#define NID_setct_AuthResTBEX 572 +#define OBJ_setct_AuthResTBEX OBJ_set_ctype,54L + +#define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" +#define NID_setct_AuthTokenTBE 573 +#define OBJ_setct_AuthTokenTBE OBJ_set_ctype,55L + +#define SN_setct_CapTokenTBE "setct-CapTokenTBE" +#define NID_setct_CapTokenTBE 574 +#define OBJ_setct_CapTokenTBE OBJ_set_ctype,56L + +#define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" +#define NID_setct_CapTokenTBEX 575 +#define OBJ_setct_CapTokenTBEX OBJ_set_ctype,57L + +#define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" +#define NID_setct_AcqCardCodeMsgTBE 576 +#define OBJ_setct_AcqCardCodeMsgTBE OBJ_set_ctype,58L + +#define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" +#define NID_setct_AuthRevReqTBE 577 +#define OBJ_setct_AuthRevReqTBE OBJ_set_ctype,59L + +#define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" +#define NID_setct_AuthRevResTBE 578 +#define OBJ_setct_AuthRevResTBE OBJ_set_ctype,60L + +#define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" +#define NID_setct_AuthRevResTBEB 579 +#define OBJ_setct_AuthRevResTBEB OBJ_set_ctype,61L + +#define SN_setct_CapReqTBE "setct-CapReqTBE" +#define NID_setct_CapReqTBE 580 +#define OBJ_setct_CapReqTBE OBJ_set_ctype,62L + +#define SN_setct_CapReqTBEX "setct-CapReqTBEX" +#define NID_setct_CapReqTBEX 581 +#define OBJ_setct_CapReqTBEX OBJ_set_ctype,63L + +#define SN_setct_CapResTBE "setct-CapResTBE" +#define NID_setct_CapResTBE 582 +#define OBJ_setct_CapResTBE OBJ_set_ctype,64L + +#define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" +#define NID_setct_CapRevReqTBE 583 +#define OBJ_setct_CapRevReqTBE OBJ_set_ctype,65L + +#define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" +#define NID_setct_CapRevReqTBEX 584 +#define OBJ_setct_CapRevReqTBEX OBJ_set_ctype,66L + +#define SN_setct_CapRevResTBE "setct-CapRevResTBE" +#define NID_setct_CapRevResTBE 585 +#define OBJ_setct_CapRevResTBE OBJ_set_ctype,67L + +#define SN_setct_CredReqTBE "setct-CredReqTBE" +#define NID_setct_CredReqTBE 586 +#define OBJ_setct_CredReqTBE OBJ_set_ctype,68L + +#define SN_setct_CredReqTBEX "setct-CredReqTBEX" +#define NID_setct_CredReqTBEX 587 +#define OBJ_setct_CredReqTBEX OBJ_set_ctype,69L + +#define SN_setct_CredResTBE "setct-CredResTBE" +#define NID_setct_CredResTBE 588 +#define OBJ_setct_CredResTBE OBJ_set_ctype,70L + +#define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" +#define NID_setct_CredRevReqTBE 589 +#define OBJ_setct_CredRevReqTBE OBJ_set_ctype,71L + +#define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" +#define NID_setct_CredRevReqTBEX 590 +#define OBJ_setct_CredRevReqTBEX OBJ_set_ctype,72L + +#define SN_setct_CredRevResTBE "setct-CredRevResTBE" +#define NID_setct_CredRevResTBE 591 +#define OBJ_setct_CredRevResTBE OBJ_set_ctype,73L + +#define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" +#define NID_setct_BatchAdminReqTBE 592 +#define OBJ_setct_BatchAdminReqTBE OBJ_set_ctype,74L + +#define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" +#define NID_setct_BatchAdminResTBE 593 +#define OBJ_setct_BatchAdminResTBE OBJ_set_ctype,75L + +#define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" +#define NID_setct_RegFormReqTBE 594 +#define OBJ_setct_RegFormReqTBE OBJ_set_ctype,76L + +#define SN_setct_CertReqTBE "setct-CertReqTBE" +#define NID_setct_CertReqTBE 595 +#define OBJ_setct_CertReqTBE OBJ_set_ctype,77L + +#define SN_setct_CertReqTBEX "setct-CertReqTBEX" +#define NID_setct_CertReqTBEX 596 +#define OBJ_setct_CertReqTBEX OBJ_set_ctype,78L + +#define SN_setct_CertResTBE "setct-CertResTBE" +#define NID_setct_CertResTBE 597 +#define OBJ_setct_CertResTBE OBJ_set_ctype,79L + +#define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" +#define NID_setct_CRLNotificationTBS 598 +#define OBJ_setct_CRLNotificationTBS OBJ_set_ctype,80L + +#define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" +#define NID_setct_CRLNotificationResTBS 599 +#define OBJ_setct_CRLNotificationResTBS OBJ_set_ctype,81L + +#define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" +#define NID_setct_BCIDistributionTBS 600 +#define OBJ_setct_BCIDistributionTBS OBJ_set_ctype,82L + +#define SN_setext_genCrypt "setext-genCrypt" +#define LN_setext_genCrypt "generic cryptogram" +#define NID_setext_genCrypt 601 +#define OBJ_setext_genCrypt OBJ_set_msgExt,1L + +#define SN_setext_miAuth "setext-miAuth" +#define LN_setext_miAuth "merchant initiated auth" +#define NID_setext_miAuth 602 +#define OBJ_setext_miAuth OBJ_set_msgExt,3L + +#define SN_setext_pinSecure "setext-pinSecure" +#define NID_setext_pinSecure 603 +#define OBJ_setext_pinSecure OBJ_set_msgExt,4L + +#define SN_setext_pinAny "setext-pinAny" +#define NID_setext_pinAny 604 +#define OBJ_setext_pinAny OBJ_set_msgExt,5L + +#define SN_setext_track2 "setext-track2" +#define NID_setext_track2 605 +#define OBJ_setext_track2 OBJ_set_msgExt,7L + +#define SN_setext_cv "setext-cv" +#define LN_setext_cv "additional verification" +#define NID_setext_cv 606 +#define OBJ_setext_cv OBJ_set_msgExt,8L + +#define SN_set_policy_root "set-policy-root" +#define NID_set_policy_root 607 +#define OBJ_set_policy_root OBJ_set_policy,0L + +#define SN_setCext_hashedRoot "setCext-hashedRoot" +#define NID_setCext_hashedRoot 608 +#define OBJ_setCext_hashedRoot OBJ_set_certExt,0L + +#define SN_setCext_certType "setCext-certType" +#define NID_setCext_certType 609 +#define OBJ_setCext_certType OBJ_set_certExt,1L + +#define SN_setCext_merchData "setCext-merchData" +#define NID_setCext_merchData 610 +#define OBJ_setCext_merchData OBJ_set_certExt,2L + +#define SN_setCext_cCertRequired "setCext-cCertRequired" +#define NID_setCext_cCertRequired 611 +#define OBJ_setCext_cCertRequired OBJ_set_certExt,3L + +#define SN_setCext_tunneling "setCext-tunneling" +#define NID_setCext_tunneling 612 +#define OBJ_setCext_tunneling OBJ_set_certExt,4L + +#define SN_setCext_setExt "setCext-setExt" +#define NID_setCext_setExt 613 +#define OBJ_setCext_setExt OBJ_set_certExt,5L + +#define SN_setCext_setQualf "setCext-setQualf" +#define NID_setCext_setQualf 614 +#define OBJ_setCext_setQualf OBJ_set_certExt,6L + +#define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" +#define NID_setCext_PGWYcapabilities 615 +#define OBJ_setCext_PGWYcapabilities OBJ_set_certExt,7L + +#define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" +#define NID_setCext_TokenIdentifier 616 +#define OBJ_setCext_TokenIdentifier OBJ_set_certExt,8L + +#define SN_setCext_Track2Data "setCext-Track2Data" +#define NID_setCext_Track2Data 617 +#define OBJ_setCext_Track2Data OBJ_set_certExt,9L + +#define SN_setCext_TokenType "setCext-TokenType" +#define NID_setCext_TokenType 618 +#define OBJ_setCext_TokenType OBJ_set_certExt,10L + +#define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" +#define NID_setCext_IssuerCapabilities 619 +#define OBJ_setCext_IssuerCapabilities OBJ_set_certExt,11L + +#define SN_setAttr_Cert "setAttr-Cert" +#define NID_setAttr_Cert 620 +#define OBJ_setAttr_Cert OBJ_set_attr,0L + +#define SN_setAttr_PGWYcap "setAttr-PGWYcap" +#define LN_setAttr_PGWYcap "payment gateway capabilities" +#define NID_setAttr_PGWYcap 621 +#define OBJ_setAttr_PGWYcap OBJ_set_attr,1L + +#define SN_setAttr_TokenType "setAttr-TokenType" +#define NID_setAttr_TokenType 622 +#define OBJ_setAttr_TokenType OBJ_set_attr,2L + +#define SN_setAttr_IssCap "setAttr-IssCap" +#define LN_setAttr_IssCap "issuer capabilities" +#define NID_setAttr_IssCap 623 +#define OBJ_setAttr_IssCap OBJ_set_attr,3L + +#define SN_set_rootKeyThumb "set-rootKeyThumb" +#define NID_set_rootKeyThumb 624 +#define OBJ_set_rootKeyThumb OBJ_setAttr_Cert,0L + +#define SN_set_addPolicy "set-addPolicy" +#define NID_set_addPolicy 625 +#define OBJ_set_addPolicy OBJ_setAttr_Cert,1L + +#define SN_setAttr_Token_EMV "setAttr-Token-EMV" +#define NID_setAttr_Token_EMV 626 +#define OBJ_setAttr_Token_EMV OBJ_setAttr_TokenType,1L + +#define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" +#define NID_setAttr_Token_B0Prime 627 +#define OBJ_setAttr_Token_B0Prime OBJ_setAttr_TokenType,2L + +#define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" +#define NID_setAttr_IssCap_CVM 628 +#define OBJ_setAttr_IssCap_CVM OBJ_setAttr_IssCap,3L + +#define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" +#define NID_setAttr_IssCap_T2 629 +#define OBJ_setAttr_IssCap_T2 OBJ_setAttr_IssCap,4L + +#define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" +#define NID_setAttr_IssCap_Sig 630 +#define OBJ_setAttr_IssCap_Sig OBJ_setAttr_IssCap,5L + +#define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" +#define LN_setAttr_GenCryptgrm "generate cryptogram" +#define NID_setAttr_GenCryptgrm 631 +#define OBJ_setAttr_GenCryptgrm OBJ_setAttr_IssCap_CVM,1L + +#define SN_setAttr_T2Enc "setAttr-T2Enc" +#define LN_setAttr_T2Enc "encrypted track 2" +#define NID_setAttr_T2Enc 632 +#define OBJ_setAttr_T2Enc OBJ_setAttr_IssCap_T2,1L + +#define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" +#define LN_setAttr_T2cleartxt "cleartext track 2" +#define NID_setAttr_T2cleartxt 633 +#define OBJ_setAttr_T2cleartxt OBJ_setAttr_IssCap_T2,2L + +#define SN_setAttr_TokICCsig "setAttr-TokICCsig" +#define LN_setAttr_TokICCsig "ICC or token signature" +#define NID_setAttr_TokICCsig 634 +#define OBJ_setAttr_TokICCsig OBJ_setAttr_IssCap_Sig,1L + +#define SN_setAttr_SecDevSig "setAttr-SecDevSig" +#define LN_setAttr_SecDevSig "secure device signature" +#define NID_setAttr_SecDevSig 635 +#define OBJ_setAttr_SecDevSig OBJ_setAttr_IssCap_Sig,2L + +#define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" +#define NID_set_brand_IATA_ATA 636 +#define OBJ_set_brand_IATA_ATA OBJ_set_brand,1L + +#define SN_set_brand_Diners "set-brand-Diners" +#define NID_set_brand_Diners 637 +#define OBJ_set_brand_Diners OBJ_set_brand,30L + +#define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" +#define NID_set_brand_AmericanExpress 638 +#define OBJ_set_brand_AmericanExpress OBJ_set_brand,34L + +#define SN_set_brand_JCB "set-brand-JCB" +#define NID_set_brand_JCB 639 +#define OBJ_set_brand_JCB OBJ_set_brand,35L + +#define SN_set_brand_Visa "set-brand-Visa" +#define NID_set_brand_Visa 640 +#define OBJ_set_brand_Visa OBJ_set_brand,4L + +#define SN_set_brand_MasterCard "set-brand-MasterCard" +#define NID_set_brand_MasterCard 641 +#define OBJ_set_brand_MasterCard OBJ_set_brand,5L + +#define SN_set_brand_Novus "set-brand-Novus" +#define NID_set_brand_Novus 642 +#define OBJ_set_brand_Novus OBJ_set_brand,6011L + +#define SN_des_cdmf "DES-CDMF" +#define LN_des_cdmf "des-cdmf" +#define NID_des_cdmf 643 +#define OBJ_des_cdmf OBJ_rsadsi,3L,10L + +#define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" +#define NID_rsaOAEPEncryptionSET 644 +#define OBJ_rsaOAEPEncryptionSET OBJ_rsadsi,1L,1L,6L + +#define SN_ipsec3 "Oakley-EC2N-3" +#define LN_ipsec3 "ipsec3" +#define NID_ipsec3 749 + +#define SN_ipsec4 "Oakley-EC2N-4" +#define LN_ipsec4 "ipsec4" +#define NID_ipsec4 750 + +#define SN_whirlpool "whirlpool" +#define NID_whirlpool 804 +#define OBJ_whirlpool OBJ_iso,0L,10118L,3L,0L,55L + +#define SN_cryptopro "cryptopro" +#define NID_cryptopro 805 +#define OBJ_cryptopro OBJ_member_body,643L,2L,2L + +#define SN_cryptocom "cryptocom" +#define NID_cryptocom 806 +#define OBJ_cryptocom OBJ_member_body,643L,2L,9L + +#define SN_id_GostR3411_94_with_GostR3410_2001 "id-GostR3411-94-with-GostR3410-2001" +#define LN_id_GostR3411_94_with_GostR3410_2001 "GOST R 34.11-94 with GOST R 34.10-2001" +#define NID_id_GostR3411_94_with_GostR3410_2001 807 +#define OBJ_id_GostR3411_94_with_GostR3410_2001 OBJ_cryptopro,3L + +#define SN_id_GostR3411_94_with_GostR3410_94 "id-GostR3411-94-with-GostR3410-94" +#define LN_id_GostR3411_94_with_GostR3410_94 "GOST R 34.11-94 with GOST R 34.10-94" +#define NID_id_GostR3411_94_with_GostR3410_94 808 +#define OBJ_id_GostR3411_94_with_GostR3410_94 OBJ_cryptopro,4L + +#define SN_id_GostR3411_94 "md_gost94" +#define LN_id_GostR3411_94 "GOST R 34.11-94" +#define NID_id_GostR3411_94 809 +#define OBJ_id_GostR3411_94 OBJ_cryptopro,9L + +#define SN_id_HMACGostR3411_94 "id-HMACGostR3411-94" +#define LN_id_HMACGostR3411_94 "HMAC GOST 34.11-94" +#define NID_id_HMACGostR3411_94 810 +#define OBJ_id_HMACGostR3411_94 OBJ_cryptopro,10L + +#define SN_id_GostR3410_2001 "gost2001" +#define LN_id_GostR3410_2001 "GOST R 34.10-2001" +#define NID_id_GostR3410_2001 811 +#define OBJ_id_GostR3410_2001 OBJ_cryptopro,19L + +#define SN_id_GostR3410_94 "gost94" +#define LN_id_GostR3410_94 "GOST R 34.10-94" +#define NID_id_GostR3410_94 812 +#define OBJ_id_GostR3410_94 OBJ_cryptopro,20L + +#define SN_id_Gost28147_89 "gost89" +#define LN_id_Gost28147_89 "GOST 28147-89" +#define NID_id_Gost28147_89 813 +#define OBJ_id_Gost28147_89 OBJ_cryptopro,21L + +#define SN_gost89_cnt "gost89-cnt" +#define NID_gost89_cnt 814 + +#define SN_id_Gost28147_89_MAC "gost-mac" +#define LN_id_Gost28147_89_MAC "GOST 28147-89 MAC" +#define NID_id_Gost28147_89_MAC 815 +#define OBJ_id_Gost28147_89_MAC OBJ_cryptopro,22L + +#define SN_id_GostR3411_94_prf "prf-gostr3411-94" +#define LN_id_GostR3411_94_prf "GOST R 34.11-94 PRF" +#define NID_id_GostR3411_94_prf 816 +#define OBJ_id_GostR3411_94_prf OBJ_cryptopro,23L + +#define SN_id_GostR3410_2001DH "id-GostR3410-2001DH" +#define LN_id_GostR3410_2001DH "GOST R 34.10-2001 DH" +#define NID_id_GostR3410_2001DH 817 +#define OBJ_id_GostR3410_2001DH OBJ_cryptopro,98L + +#define SN_id_GostR3410_94DH "id-GostR3410-94DH" +#define LN_id_GostR3410_94DH "GOST R 34.10-94 DH" +#define NID_id_GostR3410_94DH 818 +#define OBJ_id_GostR3410_94DH OBJ_cryptopro,99L + +#define SN_id_Gost28147_89_CryptoPro_KeyMeshing "id-Gost28147-89-CryptoPro-KeyMeshing" +#define NID_id_Gost28147_89_CryptoPro_KeyMeshing 819 +#define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing OBJ_cryptopro,14L,1L + +#define SN_id_Gost28147_89_None_KeyMeshing "id-Gost28147-89-None-KeyMeshing" +#define NID_id_Gost28147_89_None_KeyMeshing 820 +#define OBJ_id_Gost28147_89_None_KeyMeshing OBJ_cryptopro,14L,0L + +#define SN_id_GostR3411_94_TestParamSet "id-GostR3411-94-TestParamSet" +#define NID_id_GostR3411_94_TestParamSet 821 +#define OBJ_id_GostR3411_94_TestParamSet OBJ_cryptopro,30L,0L + +#define SN_id_GostR3411_94_CryptoProParamSet "id-GostR3411-94-CryptoProParamSet" +#define NID_id_GostR3411_94_CryptoProParamSet 822 +#define OBJ_id_GostR3411_94_CryptoProParamSet OBJ_cryptopro,30L,1L + +#define SN_id_Gost28147_89_TestParamSet "id-Gost28147-89-TestParamSet" +#define NID_id_Gost28147_89_TestParamSet 823 +#define OBJ_id_Gost28147_89_TestParamSet OBJ_cryptopro,31L,0L + +#define SN_id_Gost28147_89_CryptoPro_A_ParamSet "id-Gost28147-89-CryptoPro-A-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_A_ParamSet 824 +#define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet OBJ_cryptopro,31L,1L + +#define SN_id_Gost28147_89_CryptoPro_B_ParamSet "id-Gost28147-89-CryptoPro-B-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_B_ParamSet 825 +#define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet OBJ_cryptopro,31L,2L + +#define SN_id_Gost28147_89_CryptoPro_C_ParamSet "id-Gost28147-89-CryptoPro-C-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_C_ParamSet 826 +#define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet OBJ_cryptopro,31L,3L + +#define SN_id_Gost28147_89_CryptoPro_D_ParamSet "id-Gost28147-89-CryptoPro-D-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_D_ParamSet 827 +#define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet OBJ_cryptopro,31L,4L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet OBJ_cryptopro,31L,5L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet OBJ_cryptopro,31L,6L + +#define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet "id-Gost28147-89-CryptoPro-RIC-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 +#define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet OBJ_cryptopro,31L,7L + +#define SN_id_GostR3410_94_TestParamSet "id-GostR3410-94-TestParamSet" +#define NID_id_GostR3410_94_TestParamSet 831 +#define OBJ_id_GostR3410_94_TestParamSet OBJ_cryptopro,32L,0L + +#define SN_id_GostR3410_94_CryptoPro_A_ParamSet "id-GostR3410-94-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_A_ParamSet 832 +#define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet OBJ_cryptopro,32L,2L + +#define SN_id_GostR3410_94_CryptoPro_B_ParamSet "id-GostR3410-94-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_B_ParamSet 833 +#define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet OBJ_cryptopro,32L,3L + +#define SN_id_GostR3410_94_CryptoPro_C_ParamSet "id-GostR3410-94-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_C_ParamSet 834 +#define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet OBJ_cryptopro,32L,4L + +#define SN_id_GostR3410_94_CryptoPro_D_ParamSet "id-GostR3410-94-CryptoPro-D-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_D_ParamSet 835 +#define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet OBJ_cryptopro,32L,5L + +#define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet "id-GostR3410-94-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet 836 +#define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet OBJ_cryptopro,33L,1L + +#define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet "id-GostR3410-94-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet 837 +#define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet OBJ_cryptopro,33L,2L + +#define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet "id-GostR3410-94-CryptoPro-XchC-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet 838 +#define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet OBJ_cryptopro,33L,3L + +#define SN_id_GostR3410_2001_TestParamSet "id-GostR3410-2001-TestParamSet" +#define NID_id_GostR3410_2001_TestParamSet 839 +#define OBJ_id_GostR3410_2001_TestParamSet OBJ_cryptopro,35L,0L + +#define SN_id_GostR3410_2001_CryptoPro_A_ParamSet "id-GostR3410-2001-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_A_ParamSet 840 +#define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet OBJ_cryptopro,35L,1L + +#define SN_id_GostR3410_2001_CryptoPro_B_ParamSet "id-GostR3410-2001-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_B_ParamSet 841 +#define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet OBJ_cryptopro,35L,2L + +#define SN_id_GostR3410_2001_CryptoPro_C_ParamSet "id-GostR3410-2001-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_C_ParamSet 842 +#define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet OBJ_cryptopro,35L,3L + +#define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet "id-GostR3410-2001-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 +#define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet OBJ_cryptopro,36L,0L + +#define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet "id-GostR3410-2001-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 +#define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet OBJ_cryptopro,36L,1L + +#define SN_id_GostR3410_94_a "id-GostR3410-94-a" +#define NID_id_GostR3410_94_a 845 +#define OBJ_id_GostR3410_94_a OBJ_id_GostR3410_94,1L + +#define SN_id_GostR3410_94_aBis "id-GostR3410-94-aBis" +#define NID_id_GostR3410_94_aBis 846 +#define OBJ_id_GostR3410_94_aBis OBJ_id_GostR3410_94,2L + +#define SN_id_GostR3410_94_b "id-GostR3410-94-b" +#define NID_id_GostR3410_94_b 847 +#define OBJ_id_GostR3410_94_b OBJ_id_GostR3410_94,3L + +#define SN_id_GostR3410_94_bBis "id-GostR3410-94-bBis" +#define NID_id_GostR3410_94_bBis 848 +#define OBJ_id_GostR3410_94_bBis OBJ_id_GostR3410_94,4L + +#define SN_id_Gost28147_89_cc "id-Gost28147-89-cc" +#define LN_id_Gost28147_89_cc "GOST 28147-89 Cryptocom ParamSet" +#define NID_id_Gost28147_89_cc 849 +#define OBJ_id_Gost28147_89_cc OBJ_cryptocom,1L,6L,1L + +#define SN_id_GostR3410_94_cc "gost94cc" +#define LN_id_GostR3410_94_cc "GOST 34.10-94 Cryptocom" +#define NID_id_GostR3410_94_cc 850 +#define OBJ_id_GostR3410_94_cc OBJ_cryptocom,1L,5L,3L + +#define SN_id_GostR3410_2001_cc "gost2001cc" +#define LN_id_GostR3410_2001_cc "GOST 34.10-2001 Cryptocom" +#define NID_id_GostR3410_2001_cc 851 +#define OBJ_id_GostR3410_2001_cc OBJ_cryptocom,1L,5L,4L + +#define SN_id_GostR3411_94_with_GostR3410_94_cc "id-GostR3411-94-with-GostR3410-94-cc" +#define LN_id_GostR3411_94_with_GostR3410_94_cc "GOST R 34.11-94 with GOST R 34.10-94 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_94_cc 852 +#define OBJ_id_GostR3411_94_with_GostR3410_94_cc OBJ_cryptocom,1L,3L,3L + +#define SN_id_GostR3411_94_with_GostR3410_2001_cc "id-GostR3411-94-with-GostR3410-2001-cc" +#define LN_id_GostR3411_94_with_GostR3410_2001_cc "GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_2001_cc 853 +#define OBJ_id_GostR3411_94_with_GostR3410_2001_cc OBJ_cryptocom,1L,3L,4L + +#define SN_id_GostR3410_2001_ParamSet_cc "id-GostR3410-2001-ParamSet-cc" +#define LN_id_GostR3410_2001_ParamSet_cc "GOST R 3410-2001 Parameter Set Cryptocom" +#define NID_id_GostR3410_2001_ParamSet_cc 854 +#define OBJ_id_GostR3410_2001_ParamSet_cc OBJ_cryptocom,1L,8L,1L + +#define SN_camellia_128_cbc "CAMELLIA-128-CBC" +#define LN_camellia_128_cbc "camellia-128-cbc" +#define NID_camellia_128_cbc 751 +#define OBJ_camellia_128_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,2L + +#define SN_camellia_192_cbc "CAMELLIA-192-CBC" +#define LN_camellia_192_cbc "camellia-192-cbc" +#define NID_camellia_192_cbc 752 +#define OBJ_camellia_192_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,3L + +#define SN_camellia_256_cbc "CAMELLIA-256-CBC" +#define LN_camellia_256_cbc "camellia-256-cbc" +#define NID_camellia_256_cbc 753 +#define OBJ_camellia_256_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,4L + +#define SN_id_camellia128_wrap "id-camellia128-wrap" +#define NID_id_camellia128_wrap 907 +#define OBJ_id_camellia128_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,2L + +#define SN_id_camellia192_wrap "id-camellia192-wrap" +#define NID_id_camellia192_wrap 908 +#define OBJ_id_camellia192_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,3L + +#define SN_id_camellia256_wrap "id-camellia256-wrap" +#define NID_id_camellia256_wrap 909 +#define OBJ_id_camellia256_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,4L + +#define OBJ_ntt_ds 0L,3L,4401L,5L + +#define OBJ_camellia OBJ_ntt_ds,3L,1L,9L + +#define SN_camellia_128_ecb "CAMELLIA-128-ECB" +#define LN_camellia_128_ecb "camellia-128-ecb" +#define NID_camellia_128_ecb 754 +#define OBJ_camellia_128_ecb OBJ_camellia,1L + +#define SN_camellia_128_ofb128 "CAMELLIA-128-OFB" +#define LN_camellia_128_ofb128 "camellia-128-ofb" +#define NID_camellia_128_ofb128 766 +#define OBJ_camellia_128_ofb128 OBJ_camellia,3L + +#define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" +#define LN_camellia_128_cfb128 "camellia-128-cfb" +#define NID_camellia_128_cfb128 757 +#define OBJ_camellia_128_cfb128 OBJ_camellia,4L + +#define SN_camellia_192_ecb "CAMELLIA-192-ECB" +#define LN_camellia_192_ecb "camellia-192-ecb" +#define NID_camellia_192_ecb 755 +#define OBJ_camellia_192_ecb OBJ_camellia,21L + +#define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" +#define LN_camellia_192_ofb128 "camellia-192-ofb" +#define NID_camellia_192_ofb128 767 +#define OBJ_camellia_192_ofb128 OBJ_camellia,23L + +#define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" +#define LN_camellia_192_cfb128 "camellia-192-cfb" +#define NID_camellia_192_cfb128 758 +#define OBJ_camellia_192_cfb128 OBJ_camellia,24L + +#define SN_camellia_256_ecb "CAMELLIA-256-ECB" +#define LN_camellia_256_ecb "camellia-256-ecb" +#define NID_camellia_256_ecb 756 +#define OBJ_camellia_256_ecb OBJ_camellia,41L + +#define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" +#define LN_camellia_256_ofb128 "camellia-256-ofb" +#define NID_camellia_256_ofb128 768 +#define OBJ_camellia_256_ofb128 OBJ_camellia,43L + +#define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" +#define LN_camellia_256_cfb128 "camellia-256-cfb" +#define NID_camellia_256_cfb128 759 +#define OBJ_camellia_256_cfb128 OBJ_camellia,44L + +#define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" +#define LN_camellia_128_cfb1 "camellia-128-cfb1" +#define NID_camellia_128_cfb1 760 + +#define SN_camellia_192_cfb1 "CAMELLIA-192-CFB1" +#define LN_camellia_192_cfb1 "camellia-192-cfb1" +#define NID_camellia_192_cfb1 761 + +#define SN_camellia_256_cfb1 "CAMELLIA-256-CFB1" +#define LN_camellia_256_cfb1 "camellia-256-cfb1" +#define NID_camellia_256_cfb1 762 + +#define SN_camellia_128_cfb8 "CAMELLIA-128-CFB8" +#define LN_camellia_128_cfb8 "camellia-128-cfb8" +#define NID_camellia_128_cfb8 763 + +#define SN_camellia_192_cfb8 "CAMELLIA-192-CFB8" +#define LN_camellia_192_cfb8 "camellia-192-cfb8" +#define NID_camellia_192_cfb8 764 + +#define SN_camellia_256_cfb8 "CAMELLIA-256-CFB8" +#define LN_camellia_256_cfb8 "camellia-256-cfb8" +#define NID_camellia_256_cfb8 765 + +#define SN_kisa "KISA" +#define LN_kisa "kisa" +#define NID_kisa 773 +#define OBJ_kisa OBJ_member_body,410L,200004L + +#define SN_seed_ecb "SEED-ECB" +#define LN_seed_ecb "seed-ecb" +#define NID_seed_ecb 776 +#define OBJ_seed_ecb OBJ_kisa,1L,3L + +#define SN_seed_cbc "SEED-CBC" +#define LN_seed_cbc "seed-cbc" +#define NID_seed_cbc 777 +#define OBJ_seed_cbc OBJ_kisa,1L,4L + +#define SN_seed_cfb128 "SEED-CFB" +#define LN_seed_cfb128 "seed-cfb" +#define NID_seed_cfb128 779 +#define OBJ_seed_cfb128 OBJ_kisa,1L,5L + +#define SN_seed_ofb128 "SEED-OFB" +#define LN_seed_ofb128 "seed-ofb" +#define NID_seed_ofb128 778 +#define OBJ_seed_ofb128 OBJ_kisa,1L,6L + +#define SN_hmac "HMAC" +#define LN_hmac "hmac" +#define NID_hmac 855 + +#define SN_cmac "CMAC" +#define LN_cmac "cmac" +#define NID_cmac 894 + +#define SN_rc4_hmac_md5 "RC4-HMAC-MD5" +#define LN_rc4_hmac_md5 "rc4-hmac-md5" +#define NID_rc4_hmac_md5 915 + +#define SN_aes_128_cbc_hmac_sha1 "AES-128-CBC-HMAC-SHA1" +#define LN_aes_128_cbc_hmac_sha1 "aes-128-cbc-hmac-sha1" +#define NID_aes_128_cbc_hmac_sha1 916 + +#define SN_aes_192_cbc_hmac_sha1 "AES-192-CBC-HMAC-SHA1" +#define LN_aes_192_cbc_hmac_sha1 "aes-192-cbc-hmac-sha1" +#define NID_aes_192_cbc_hmac_sha1 917 + +#define SN_aes_256_cbc_hmac_sha1 "AES-256-CBC-HMAC-SHA1" +#define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" +#define NID_aes_256_cbc_hmac_sha1 918 + +#define SN_teletrust "teletrust" +#define NID_teletrust 920 +#define OBJ_teletrust OBJ_identified_organization,36L + +#define SN_brainpool "brainpool" +#define NID_brainpool 921 +#define OBJ_brainpool OBJ_teletrust,3L,3L,2L,8L,1L + +#define SN_brainpoolP160r1 "brainpoolP160r1" +#define NID_brainpoolP160r1 922 +#define OBJ_brainpoolP160r1 OBJ_brainpool,1L,1L + +#define SN_brainpoolP160t1 "brainpoolP160t1" +#define NID_brainpoolP160t1 923 +#define OBJ_brainpoolP160t1 OBJ_brainpool,1L,2L + +#define SN_brainpoolP192r1 "brainpoolP192r1" +#define NID_brainpoolP192r1 924 +#define OBJ_brainpoolP192r1 OBJ_brainpool,1L,3L + +#define SN_brainpoolP192t1 "brainpoolP192t1" +#define NID_brainpoolP192t1 925 +#define OBJ_brainpoolP192t1 OBJ_brainpool,1L,4L + +#define SN_brainpoolP224r1 "brainpoolP224r1" +#define NID_brainpoolP224r1 926 +#define OBJ_brainpoolP224r1 OBJ_brainpool,1L,5L + +#define SN_brainpoolP224t1 "brainpoolP224t1" +#define NID_brainpoolP224t1 927 +#define OBJ_brainpoolP224t1 OBJ_brainpool,1L,6L + +#define SN_brainpoolP256r1 "brainpoolP256r1" +#define NID_brainpoolP256r1 928 +#define OBJ_brainpoolP256r1 OBJ_brainpool,1L,7L + +#define SN_brainpoolP256t1 "brainpoolP256t1" +#define NID_brainpoolP256t1 929 +#define OBJ_brainpoolP256t1 OBJ_brainpool,1L,8L + +#define SN_brainpoolP320r1 "brainpoolP320r1" +#define NID_brainpoolP320r1 930 +#define OBJ_brainpoolP320r1 OBJ_brainpool,1L,9L + +#define SN_brainpoolP320t1 "brainpoolP320t1" +#define NID_brainpoolP320t1 931 +#define OBJ_brainpoolP320t1 OBJ_brainpool,1L,10L + +#define SN_brainpoolP384r1 "brainpoolP384r1" +#define NID_brainpoolP384r1 932 +#define OBJ_brainpoolP384r1 OBJ_brainpool,1L,11L + +#define SN_brainpoolP384t1 "brainpoolP384t1" +#define NID_brainpoolP384t1 933 +#define OBJ_brainpoolP384t1 OBJ_brainpool,1L,12L + +#define SN_brainpoolP512r1 "brainpoolP512r1" +#define NID_brainpoolP512r1 934 +#define OBJ_brainpoolP512r1 OBJ_brainpool,1L,13L + +#define SN_brainpoolP512t1 "brainpoolP512t1" +#define NID_brainpoolP512t1 935 +#define OBJ_brainpoolP512t1 OBJ_brainpool,1L,14L + +#define SN_FRP256v1 "FRP256v1" +#define NID_FRP256v1 936 +#define OBJ_FRP256v1 1L,2L,250L,1L,223L,101L,256L,1L + +#define SN_chacha20 "ChaCha" +#define LN_chacha20 "chacha" +#define NID_chacha20 937 + +#define SN_gost89_ecb "gost89-ecb" +#define NID_gost89_ecb 938 + +#define SN_gost89_cbc "gost89-cbc" +#define NID_gost89_cbc 939 + +#define SN_tc26 "tc26" +#define NID_tc26 940 +#define OBJ_tc26 OBJ_member_body,643L,7L,1L + +#define SN_id_tc26_gost3411_2012_256 "streebog256" +#define LN_id_tc26_gost3411_2012_256 "GOST R 34.11-2012 (256 bit)" +#define NID_id_tc26_gost3411_2012_256 941 +#define OBJ_id_tc26_gost3411_2012_256 OBJ_tc26,1L,2L,2L + +#define SN_id_tc26_gost3411_2012_512 "streebog512" +#define LN_id_tc26_gost3411_2012_512 "GOST R 34-11-2012 (512 bit)" +#define NID_id_tc26_gost3411_2012_512 942 +#define OBJ_id_tc26_gost3411_2012_512 OBJ_tc26,1L,2L,3L + +#define SN_id_tc26_gost_3410_2012_512_paramSetA "id-tc26-gost-3410-2012-512-paramSetA" +#define NID_id_tc26_gost_3410_2012_512_paramSetA 943 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetA OBJ_tc26,2L,1L,2L,1L + +#define SN_id_tc26_gost_3410_2012_512_paramSetB "id-tc26-gost-3410-2012-512-paramSetB" +#define NID_id_tc26_gost_3410_2012_512_paramSetB 944 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetB OBJ_tc26,2L,1L,2L,2L + +#define SN_id_tc26_gost_28147_param_Z "id-tc26-gost-28147-param-Z" +#define NID_id_tc26_gost_28147_param_Z 945 +#define OBJ_id_tc26_gost_28147_param_Z OBJ_tc26,2L,5L,1L,1L + +#define SN_id_tc26_gost3410_2012_256 "id-tc26-gost3410-2012-256" +#define LN_id_tc26_gost3410_2012_256 "GOST R 34.10-2012 (256 bit)" +#define NID_id_tc26_gost3410_2012_256 946 +#define OBJ_id_tc26_gost3410_2012_256 OBJ_tc26,1L,1L,1L + +#define SN_id_tc26_gost3410_2012_512 "id-tc26-gost3410-2012-512" +#define LN_id_tc26_gost3410_2012_512 "GOST R 34.10-2012 (512 bit)" +#define NID_id_tc26_gost3410_2012_512 947 +#define OBJ_id_tc26_gost3410_2012_512 OBJ_tc26,1L,1L,2L + +#define SN_id_tc26_signwithdigest_gost3410_2012_256 "id-tc26-signwithdigest-gost3410-2012-256" +#define LN_id_tc26_signwithdigest_gost3410_2012_256 "GOST R 34.11-2012 with GOST R 34.10-2012 (256 bit)" +#define NID_id_tc26_signwithdigest_gost3410_2012_256 948 +#define OBJ_id_tc26_signwithdigest_gost3410_2012_256 OBJ_tc26,1L,3L,2L + +#define SN_id_tc26_signwithdigest_gost3410_2012_512 "id-tc26-signwithdigest-gost3410-2012-512" +#define LN_id_tc26_signwithdigest_gost3410_2012_512 "GOST R 34.11-2012 with GOST R 34.10-2012 (512 bit)" +#define NID_id_tc26_signwithdigest_gost3410_2012_512 949 +#define OBJ_id_tc26_signwithdigest_gost3410_2012_512 OBJ_tc26,1L,3L,3L + +#define SN_X25519 "X25519" +#define NID_X25519 950 +#define OBJ_X25519 1L,3L,101L,110L + +#define SN_X448 "X448" +#define NID_X448 951 +#define OBJ_X448 1L,3L,101L,111L + +#define SN_Ed25519 "Ed25519" +#define NID_Ed25519 952 +#define OBJ_Ed25519 1L,3L,101L,112L + +#define SN_Ed448 "Ed448" +#define NID_Ed448 953 +#define OBJ_Ed448 1L,3L,101L,113L + +#define SN_Ed25519ph "Ed25519ph" +#define NID_Ed25519ph 954 +#define OBJ_Ed25519ph 1L,3L,101L,114L + +#define SN_Ed448ph "Ed448ph" +#define NID_Ed448ph 955 +#define OBJ_Ed448ph 1L,3L,101L,115L + diff --git a/src/3rdparty/win32_include/openssl/objects.h b/src/3rdparty/win32_include/openssl/objects.h new file mode 100644 index 000000000..c40991b5e --- /dev/null +++ b/src/3rdparty/win32_include/openssl/objects.h @@ -0,0 +1,1140 @@ +/* $OpenBSD: objects.h,v 1.12 2017/01/21 04:53:22 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_OBJECTS_H +#define HEADER_OBJECTS_H + +#define USE_OBJ_MAC + +#ifdef USE_OBJ_MAC +#include +#else +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_Algorithm "Algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 38 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define LN_rsadsi "rsadsi" +#define NID_rsadsi 1 +#define OBJ_rsadsi 1L,2L,840L,113549L + +#define LN_pkcs "pkcs" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs,1L,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs,1L,2L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs,1L,4L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs,5L,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs,5L,3L + +#define LN_X500 "X500" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define LN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +/* Postal Address? PA */ + +/* should be "ST" (rfc1327) but MS uses 'S' */ +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500,8L,1L,1L + +#define LN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define LN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +/* IV + num */ +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +/* IV */ +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ede "DES-EDE" +#define LN_des_ede "des-ede" +#define NID_des_ede 32 +/* ?? */ +#define OBJ_des_ede OBJ_algorithm,17L + +#define SN_des_ede3 "DES-EDE3" +#define LN_des_ede3 "des-ede3" +#define NID_des_ede3 33 + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define LN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define SN_pkcs9_emailAddress "Email" +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +/* I'm not sure about the object ID */ +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L +/* 28 Jun 1996 - eay */ +/* #define OBJ_sha1 1L,3L,14L,2L,26L,05L <- wrong */ + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs,1L,5L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +/* proposed by microsoft to RSA */ +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs,5L,11L + +/* proposed by microsoft to RSA as pbeWithSHA1AndRC4: it is now + * defined explicitly in PKCS#5 v2.0 as id-PBKDF2 which is something + * completely different. + */ +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs,5L,12L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +#define NID_dsaWithSHA1_2 70 +/* Got this one from 'sdn706r20.pdf' which is actually an NSA document :-) */ +#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce 2L,5L,29L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 2L,5L,8L,3L,101L +/* An alternative? 1L,3L,14L,3L,2L,19L */ + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2withRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA 2L,5L,8L,3L,100L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_givenName "G" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define SN_surname "S" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define SN_initials "I" +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define SN_uniqueIdentifier "UID" +#define LN_uniqueIdentifier "uniqueIdentifier" +#define NID_uniqueIdentifier 102 +#define OBJ_uniqueIdentifier OBJ_X509,45L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_serialNumber "SN" +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_title "T" +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define SN_description "D" +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +/* CAST5 is CAST-128, I'm just sticking with the documentation */ +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc 1L,2L,840L,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC 1L,2L,840L,113533L,7L,66L,12L + +/* This is one sun will soon be using :-( + * id-dsa-with-sha1 ID ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3 } + */ +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 1L,2L,840L,10040L,4L,3L + +#define NID_md5_sha1 114 +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa 1L,2L,840L,10040L,4L,1L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +/* The name should actually be rsaSignatureWithripemd160, but I'm going + * to continue using the convention I'm using with the other ciphers */ +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +/* Taken from rfc2040 + * RC5_CBC_Parameters ::= SEQUENCE { + * version INTEGER (v1_0(16)), + * rounds INTEGER (8..127), + * blockSizeInBits INTEGER (64, 128), + * iv OCTET STRING OPTIONAL + * } + */ +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#define LN_rc5_ofb64 "rc5-ofb" +#define NID_rc5_ofb64 123 + +#define SN_rle_compression "RLE" +#define LN_rle_compression "run length compression" +#define NID_rle_compression 124 +#define OBJ_rle_compression 1L,1L,1L,1L,666L,1L + +#define SN_zlib_compression "ZLIB" +#define LN_zlib_compression "zlib compression" +#define NID_zlib_compression 125 +#define OBJ_zlib_compression 1L,1L,1L,1L,666L,2L + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +/* PKIX extended key usage OIDs */ + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +/* Additional extended key usage OIDs: Microsoft */ + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +/* Additional usage: Netscape */ + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +/* PKCS12 and related OBJECT IDENTIFIERS */ + +#define OBJ_pkcs12 OBJ_pkcs,12L +#define OBJ_pkcs12_pbeids OBJ_pkcs12, 1 + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids, 1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids, 2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids, 4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids, 5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids, 6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12, 10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1, 1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds, 1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds, 2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds, 3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds, 4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds, 5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds, 6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9, 20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9, 21L + +#define OBJ_certTypes OBJ_pkcs9, 22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes, 1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes, 2L + +#define OBJ_crlTypes OBJ_pkcs9, 23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes, 1L + +/* PKCS#5 v2 OIDs */ + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs,5L,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs,5L,14L + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +/* Policy Qualifier Ids */ + +#define LN_id_qt_cps "Policy Qualifier CPS" +#define SN_id_qt_cps "id-qt-cps" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_pkix,2L,1L + +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define SN_id_qt_unotice "id-qt-unotice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_pkix,2L,2L + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs,5L,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs,5L,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs,5L,10L + +/* Extension request OIDs */ + +#define LN_ms_ext_req "Microsoft Extension Request" +#define SN_ms_ext_req "msExtReq" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define LN_ext_req "Extension Request" +#define SN_ext_req "extReq" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L +#endif /* USE_OBJ_MAC */ + +#include +#include + +#define OBJ_NAME_TYPE_UNDEF 0x00 +#define OBJ_NAME_TYPE_MD_METH 0x01 +#define OBJ_NAME_TYPE_CIPHER_METH 0x02 +#define OBJ_NAME_TYPE_PKEY_METH 0x03 +#define OBJ_NAME_TYPE_COMP_METH 0x04 +#define OBJ_NAME_TYPE_NUM 0x05 + +#define OBJ_NAME_ALIAS 0x8000 + +#define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 +#define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct obj_name_st { + int type; + int alias; + const char *name; + const char *data; +} OBJ_NAME; + +#define OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c) + + +int OBJ_NAME_init(void); +int OBJ_NAME_new_index(unsigned long (*hash_func)(const char *), + int (*cmp_func)(const char *, const char *), + void (*free_func)(const char *, int, const char *)); +const char *OBJ_NAME_get(const char *name, int type); +int OBJ_NAME_add(const char *name, int type, const char *data); +int OBJ_NAME_remove(const char *name, int type); +void OBJ_NAME_cleanup(int type); /* -1 for everything */ +void OBJ_NAME_do_all(int type, void (*fn)(const OBJ_NAME *, void *arg), + void *arg); +void OBJ_NAME_do_all_sorted(int type, void (*fn)(const OBJ_NAME *, void *arg), + void *arg); + +ASN1_OBJECT * OBJ_dup(const ASN1_OBJECT *o); +ASN1_OBJECT * OBJ_nid2obj(int n); +const char * OBJ_nid2ln(int n); +const char * OBJ_nid2sn(int n); +int OBJ_obj2nid(const ASN1_OBJECT *o); +ASN1_OBJECT * OBJ_txt2obj(const char *s, int no_name); +int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name); +int OBJ_txt2nid(const char *s); +int OBJ_ln2nid(const char *s); +int OBJ_sn2nid(const char *s); +int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b); +const void * OBJ_bsearch_(const void *key, const void *base, int num, + int size, int (*cmp)(const void *, const void *)); +const void * OBJ_bsearch_ex_(const void *key, const void *base, int num, + int size, int (*cmp)(const void *, const void *), + int flags); + +#ifndef LIBRESSL_INTERNAL + +#define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *, const void *); \ + static int nm##_cmp(type1 const *, type2 const *); \ + scope type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +#define DECLARE_OBJ_BSEARCH_CMP_FN(type1, type2, cmp) \ + _DECLARE_OBJ_BSEARCH_CMP_FN(static, type1, type2, cmp) +#define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +/* + * Unsolved problem: if a type is actually a pointer type, like + * nid_triple is, then its impossible to get a const where you need + * it. Consider: + * + * typedef int nid_triple[3]; + * const void *a_; + * const nid_triple const *a = a_; + * + * The assignement discards a const because what you really want is: + * + * const int const * const *a = a_; + * + * But if you do that, you lose the fact that a is an array of 3 ints, + * which breaks comparison functions. + * + * Thus we end up having to cast, sadly, or unpack the + * declarations. Or, as I finally did in this case, delcare nid_triple + * to be a struct, which it should have been in the first place. + * + * Ben, August 2008. + * + * Also, strictly speaking not all types need be const, but handling + * the non-constness means a lot of complication, and in practice + * comparison routines do always not touch their arguments. + */ + +#define IMPLEMENT_OBJ_BSEARCH_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + static type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +#define IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +#define OBJ_bsearch(type1,key,type2,base,num,cmp) \ + ((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN))) + +#define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \ + ((type2 *)OBJ_bsearch_ex_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN)),flags) + +#endif /* !LIBRESSL_INTERNAL */ + +int OBJ_new_nid(int num); +int OBJ_add_object(const ASN1_OBJECT *obj); +int OBJ_create(const char *oid, const char *sn, const char *ln); +void OBJ_cleanup(void ); +int OBJ_create_objects(BIO *in); + +int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid); +int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid); +int OBJ_add_sigid(int signid, int dig_id, int pkey_id); +void OBJ_sigid_free(void); + +extern int obj_cleanup_defer; +void check_defer(int nid); + +/* 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. + */ +void ERR_load_OBJ_strings(void); + +/* Error codes for the OBJ functions. */ + +/* Function codes. */ +#define OBJ_F_OBJ_ADD_OBJECT 105 +#define OBJ_F_OBJ_CREATE 100 +#define OBJ_F_OBJ_DUP 101 +#define OBJ_F_OBJ_NAME_NEW_INDEX 106 +#define OBJ_F_OBJ_NID2LN 102 +#define OBJ_F_OBJ_NID2OBJ 103 +#define OBJ_F_OBJ_NID2SN 104 + +/* Reason codes. */ +#define OBJ_R_MALLOC_FAILURE 100 +#define OBJ_R_UNKNOWN_NID 101 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ocsp.h b/src/3rdparty/win32_include/openssl/ocsp.h new file mode 100644 index 000000000..e3fa6f5a3 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ocsp.h @@ -0,0 +1,669 @@ +/* $OpenBSD: ocsp.h,v 1.11 2016/12/30 16:19:04 jsing Exp $ */ +/* Written by Tom Titchener for the OpenSSL + * project. */ + +/* History: + This file was transfered to Richard Levitte from CertCo by Kathy + Weinhold in mid-spring 2000 to be included in OpenSSL or released + as a patch kit. */ + +/* ==================================================================== + * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OCSP_H +#define HEADER_OCSP_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Various flags and values */ + +#define OCSP_DEFAULT_NONCE_LENGTH 16 + +#define OCSP_NOCERTS 0x1 +#define OCSP_NOINTERN 0x2 +#define OCSP_NOSIGS 0x4 +#define OCSP_NOCHAIN 0x8 +#define OCSP_NOVERIFY 0x10 +#define OCSP_NOEXPLICIT 0x20 +#define OCSP_NOCASIGN 0x40 +#define OCSP_NODELEGATED 0x80 +#define OCSP_NOCHECKS 0x100 +#define OCSP_TRUSTOTHER 0x200 +#define OCSP_RESPID_KEY 0x400 +#define OCSP_NOTIME 0x800 + +/* CertID ::= SEQUENCE { + * hashAlgorithm AlgorithmIdentifier, + * issuerNameHash OCTET STRING, -- Hash of Issuer's DN + * issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields) + * serialNumber CertificateSerialNumber } + */ +typedef struct ocsp_cert_id_st { + X509_ALGOR *hashAlgorithm; + ASN1_OCTET_STRING *issuerNameHash; + ASN1_OCTET_STRING *issuerKeyHash; + ASN1_INTEGER *serialNumber; +} OCSP_CERTID; + +DECLARE_STACK_OF(OCSP_CERTID) + +/* Request ::= SEQUENCE { + * reqCert CertID, + * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_one_request_st { + OCSP_CERTID *reqCert; + STACK_OF(X509_EXTENSION) *singleRequestExtensions; +} OCSP_ONEREQ; + +DECLARE_STACK_OF(OCSP_ONEREQ) + + +/* TBSRequest ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * requestorName [1] EXPLICIT GeneralName OPTIONAL, + * requestList SEQUENCE OF Request, + * requestExtensions [2] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_req_info_st { + ASN1_INTEGER *version; + GENERAL_NAME *requestorName; + STACK_OF(OCSP_ONEREQ) *requestList; + STACK_OF(X509_EXTENSION) *requestExtensions; +} OCSP_REQINFO; + +/* Signature ::= SEQUENCE { + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ +typedef struct ocsp_signature_st { + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_SIGNATURE; + +/* OCSPRequest ::= SEQUENCE { + * tbsRequest TBSRequest, + * optionalSignature [0] EXPLICIT Signature OPTIONAL } + */ +typedef struct ocsp_request_st { + OCSP_REQINFO *tbsRequest; + OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */ +} OCSP_REQUEST; + +/* OCSPResponseStatus ::= ENUMERATED { + * successful (0), --Response has valid confirmations + * malformedRequest (1), --Illegal confirmation request + * internalError (2), --Internal error in issuer + * tryLater (3), --Try again later + * --(4) is not used + * sigRequired (5), --Must sign the request + * unauthorized (6) --Request unauthorized + * } + */ +#define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +#define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +#define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +#define OCSP_RESPONSE_STATUS_TRYLATER 3 +#define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +#define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +/* ResponseBytes ::= SEQUENCE { + * responseType OBJECT IDENTIFIER, + * response OCTET STRING } + */ +typedef struct ocsp_resp_bytes_st { + ASN1_OBJECT *responseType; + ASN1_OCTET_STRING *response; +} OCSP_RESPBYTES; + +/* OCSPResponse ::= SEQUENCE { + * responseStatus OCSPResponseStatus, + * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL } + */ +struct ocsp_response_st { + ASN1_ENUMERATED *responseStatus; + OCSP_RESPBYTES *responseBytes; +}; + +/* ResponderID ::= CHOICE { + * byName [1] Name, + * byKey [2] KeyHash } + */ +#define V_OCSP_RESPID_NAME 0 +#define V_OCSP_RESPID_KEY 1 +struct ocsp_responder_id_st { + int type; + union { + X509_NAME* byName; + ASN1_OCTET_STRING *byKey; + } value; +}; + +DECLARE_STACK_OF(OCSP_RESPID) +OCSP_RESPID *OCSP_RESPID_new(void); +void OCSP_RESPID_free(OCSP_RESPID *a); +OCSP_RESPID *d2i_OCSP_RESPID(OCSP_RESPID **a, const unsigned char **in, long len); +int i2d_OCSP_RESPID(OCSP_RESPID *a, unsigned char **out); +extern const ASN1_ITEM OCSP_RESPID_it; + +/* KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key + * --(excluding the tag and length fields) + */ + +/* RevokedInfo ::= SEQUENCE { + * revocationTime GeneralizedTime, + * revocationReason [0] EXPLICIT CRLReason OPTIONAL } + */ +typedef struct ocsp_revoked_info_st { + ASN1_GENERALIZEDTIME *revocationTime; + ASN1_ENUMERATED *revocationReason; +} OCSP_REVOKEDINFO; + +/* CertStatus ::= CHOICE { + * good [0] IMPLICIT NULL, + * revoked [1] IMPLICIT RevokedInfo, + * unknown [2] IMPLICIT UnknownInfo } + */ +#define V_OCSP_CERTSTATUS_GOOD 0 +#define V_OCSP_CERTSTATUS_REVOKED 1 +#define V_OCSP_CERTSTATUS_UNKNOWN 2 +typedef struct ocsp_cert_status_st { + int type; + union { + ASN1_NULL *good; + OCSP_REVOKEDINFO *revoked; + ASN1_NULL *unknown; + } value; +} OCSP_CERTSTATUS; + +/* SingleResponse ::= SEQUENCE { + * certID CertID, + * certStatus CertStatus, + * thisUpdate GeneralizedTime, + * nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL, + * singleExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_single_response_st { + OCSP_CERTID *certId; + OCSP_CERTSTATUS *certStatus; + ASN1_GENERALIZEDTIME *thisUpdate; + ASN1_GENERALIZEDTIME *nextUpdate; + STACK_OF(X509_EXTENSION) *singleExtensions; +} OCSP_SINGLERESP; + +DECLARE_STACK_OF(OCSP_SINGLERESP) + +/* ResponseData ::= SEQUENCE { + * version [0] EXPLICIT Version DEFAULT v1, + * responderID ResponderID, + * producedAt GeneralizedTime, + * responses SEQUENCE OF SingleResponse, + * responseExtensions [1] EXPLICIT Extensions OPTIONAL } + */ +typedef struct ocsp_response_data_st { + ASN1_INTEGER *version; + OCSP_RESPID *responderId; + ASN1_GENERALIZEDTIME *producedAt; + STACK_OF(OCSP_SINGLERESP) *responses; + STACK_OF(X509_EXTENSION) *responseExtensions; +} OCSP_RESPDATA; + +/* BasicOCSPResponse ::= SEQUENCE { + * tbsResponseData ResponseData, + * signatureAlgorithm AlgorithmIdentifier, + * signature BIT STRING, + * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } + */ + /* Note 1: + The value for "signature" is specified in the OCSP rfc2560 as follows: + "The value for the signature SHALL be computed on the hash of the DER + encoding ResponseData." This means that you must hash the DER-encoded + tbsResponseData, and then run it through a crypto-signing function, which + will (at least w/RSA) do a hash-'n'-private-encrypt operation. This seems + a bit odd, but that's the spec. Also note that the data structures do not + leave anywhere to independently specify the algorithm used for the initial + hash. So, we look at the signature-specification algorithm, and try to do + something intelligent. -- Kathy Weinhold, CertCo */ + /* Note 2: + It seems that the mentioned passage from RFC 2560 (section 4.2.1) is open + for interpretation. I've done tests against another responder, and found + that it doesn't do the double hashing that the RFC seems to say one + should. Therefore, all relevant functions take a flag saying which + variant should be used. -- Richard Levitte, OpenSSL team and CeloCom */ +typedef struct ocsp_basic_response_st { + OCSP_RESPDATA *tbsResponseData; + X509_ALGOR *signatureAlgorithm; + ASN1_BIT_STRING *signature; + STACK_OF(X509) *certs; +} OCSP_BASICRESP; + +/* + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * removeFromCRL (8) } + */ +#define OCSP_REVOKED_STATUS_NOSTATUS -1 +#define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +#define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +#define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +#define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +#define OCSP_REVOKED_STATUS_SUPERSEDED 4 +#define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +#define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +#define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 + +/* CrlID ::= SEQUENCE { + * crlUrl [0] EXPLICIT IA5String OPTIONAL, + * crlNum [1] EXPLICIT INTEGER OPTIONAL, + * crlTime [2] EXPLICIT GeneralizedTime OPTIONAL } + */ +typedef struct ocsp_crl_id_st { + ASN1_IA5STRING *crlUrl; + ASN1_INTEGER *crlNum; + ASN1_GENERALIZEDTIME *crlTime; +} OCSP_CRLID; + +/* ServiceLocator ::= SEQUENCE { + * issuer Name, + * locator AuthorityInfoAccessSyntax OPTIONAL } + */ +typedef struct ocsp_service_locator_st { + X509_NAME* issuer; + STACK_OF(ACCESS_DESCRIPTION) *locator; +} OCSP_SERVICELOC; + +#define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +#define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +#define PEM_read_bio_OCSP_REQUEST(bp,x,cb) \ + (OCSP_REQUEST *)PEM_ASN1_read_bio((char *(*)())d2i_OCSP_REQUEST, \ + PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL) + +#define PEM_read_bio_OCSP_RESPONSE(bp,x,cb) \ + (OCSP_RESPONSE *)PEM_ASN1_read_bio((char *(*)())d2i_OCSP_RESPONSE, \ + PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL) + +#define PEM_write_bio_OCSP_REQUEST(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +#define PEM_write_bio_OCSP_RESPONSE(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ + bp,(char *)o, NULL,NULL,0,NULL,NULL) + +#define OCSP_REQUEST_sign(o,pkey,md) \ + ASN1_item_sign(&OCSP_REQINFO_it, \ + o->optionalSignature->signatureAlgorithm,NULL, \ + o->optionalSignature->signature,o->tbsRequest,pkey,md) + +#define OCSP_BASICRESP_sign(o,pkey,md,d) \ + ASN1_item_sign(&OCSP_RESPDATA_it,o->signatureAlgorithm,NULL, \ + o->signature,o->tbsResponseData,pkey,md) + +#define OCSP_REQUEST_verify(a,r) \ + ASN1_item_verify(&OCSP_REQINFO_it, \ + a->optionalSignature->signatureAlgorithm, \ + a->optionalSignature->signature,a->tbsRequest,r) + +#define OCSP_BASICRESP_verify(a,r,d) \ + ASN1_item_verify(&OCSP_RESPDATA_it, \ + a->signatureAlgorithm,a->signature,a->tbsResponseData,r) + +#define ASN1_BIT_STRING_digest(data,type,md,len) \ + ASN1_item_digest(&ASN1_BIT_STRING_it,type,data,md,len) + +#define OCSP_CERTSTATUS_dup(cs) \ + ASN1_item_dup(&OCSP_CERTSTATUS_it, cs) + +OCSP_CERTID *OCSP_CERTID_dup(OCSP_CERTID *id); + +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req); +OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req, + int maxline); +int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx); +void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx); +int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX *rctx, OCSP_REQUEST *req); +int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX *rctx, const char *name, + const char *value); + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, X509_NAME *issuerName, + ASN1_BIT_STRING* issuerKey, ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, X509 *signer, EVP_PKEY *key, + const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, + int *pssl); + +int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b); +int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, ASN1_INTEGER **pserial, + OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, OCSP_CERTID *cid, + int status, int reason, ASN1_TIME *revtime, ASN1_TIME *thisupd, + ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, X509 *signer, EVP_PKEY *key, + const EVP_MD *dgst, STACK_OF(X509) *certs, unsigned long flags); + +X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char* tim); + +X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, + int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, + int *idx); +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); + +OCSP_SINGLERESP *OCSP_SINGLERESP_new(void); +void OCSP_SINGLERESP_free(OCSP_SINGLERESP *a); +OCSP_SINGLERESP *d2i_OCSP_SINGLERESP(OCSP_SINGLERESP **a, const unsigned char **in, long len); +int i2d_OCSP_SINGLERESP(OCSP_SINGLERESP *a, unsigned char **out); +extern const ASN1_ITEM OCSP_SINGLERESP_it; +OCSP_CERTSTATUS *OCSP_CERTSTATUS_new(void); +void OCSP_CERTSTATUS_free(OCSP_CERTSTATUS *a); +OCSP_CERTSTATUS *d2i_OCSP_CERTSTATUS(OCSP_CERTSTATUS **a, const unsigned char **in, long len); +int i2d_OCSP_CERTSTATUS(OCSP_CERTSTATUS *a, unsigned char **out); +extern const ASN1_ITEM OCSP_CERTSTATUS_it; +OCSP_REVOKEDINFO *OCSP_REVOKEDINFO_new(void); +void OCSP_REVOKEDINFO_free(OCSP_REVOKEDINFO *a); +OCSP_REVOKEDINFO *d2i_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO **a, const unsigned char **in, long len); +int i2d_OCSP_REVOKEDINFO(OCSP_REVOKEDINFO *a, unsigned char **out); +extern const ASN1_ITEM OCSP_REVOKEDINFO_it; +OCSP_BASICRESP *OCSP_BASICRESP_new(void); +void OCSP_BASICRESP_free(OCSP_BASICRESP *a); +OCSP_BASICRESP *d2i_OCSP_BASICRESP(OCSP_BASICRESP **a, const unsigned char **in, long len); +int i2d_OCSP_BASICRESP(OCSP_BASICRESP *a, unsigned char **out); +extern const ASN1_ITEM OCSP_BASICRESP_it; +OCSP_RESPDATA *OCSP_RESPDATA_new(void); +void OCSP_RESPDATA_free(OCSP_RESPDATA *a); +OCSP_RESPDATA *d2i_OCSP_RESPDATA(OCSP_RESPDATA **a, const unsigned char **in, long len); +int i2d_OCSP_RESPDATA(OCSP_RESPDATA *a, unsigned char **out); +extern const ASN1_ITEM OCSP_RESPDATA_it; +OCSP_RESPID *OCSP_RESPID_new(void); +void OCSP_RESPID_free(OCSP_RESPID *a); +OCSP_RESPID *d2i_OCSP_RESPID(OCSP_RESPID **a, const unsigned char **in, long len); +int i2d_OCSP_RESPID(OCSP_RESPID *a, unsigned char **out); +extern const ASN1_ITEM OCSP_RESPID_it; +OCSP_RESPONSE *OCSP_RESPONSE_new(void); +void OCSP_RESPONSE_free(OCSP_RESPONSE *a); +OCSP_RESPONSE *d2i_OCSP_RESPONSE(OCSP_RESPONSE **a, const unsigned char **in, long len); +int i2d_OCSP_RESPONSE(OCSP_RESPONSE *a, unsigned char **out); +OCSP_RESPONSE *d2i_OCSP_RESPONSE_bio(BIO *bp, OCSP_RESPONSE **a); +int i2d_OCSP_RESPONSE_bio(BIO *bp, OCSP_RESPONSE *a); +extern const ASN1_ITEM OCSP_RESPONSE_it; +OCSP_RESPBYTES *OCSP_RESPBYTES_new(void); +void OCSP_RESPBYTES_free(OCSP_RESPBYTES *a); +OCSP_RESPBYTES *d2i_OCSP_RESPBYTES(OCSP_RESPBYTES **a, const unsigned char **in, long len); +int i2d_OCSP_RESPBYTES(OCSP_RESPBYTES *a, unsigned char **out); +extern const ASN1_ITEM OCSP_RESPBYTES_it; +OCSP_ONEREQ *OCSP_ONEREQ_new(void); +void OCSP_ONEREQ_free(OCSP_ONEREQ *a); +OCSP_ONEREQ *d2i_OCSP_ONEREQ(OCSP_ONEREQ **a, const unsigned char **in, long len); +int i2d_OCSP_ONEREQ(OCSP_ONEREQ *a, unsigned char **out); +extern const ASN1_ITEM OCSP_ONEREQ_it; +OCSP_CERTID *OCSP_CERTID_new(void); +void OCSP_CERTID_free(OCSP_CERTID *a); +OCSP_CERTID *d2i_OCSP_CERTID(OCSP_CERTID **a, const unsigned char **in, long len); +int i2d_OCSP_CERTID(OCSP_CERTID *a, unsigned char **out); +extern const ASN1_ITEM OCSP_CERTID_it; +OCSP_REQUEST *OCSP_REQUEST_new(void); +void OCSP_REQUEST_free(OCSP_REQUEST *a); +OCSP_REQUEST *d2i_OCSP_REQUEST(OCSP_REQUEST **a, const unsigned char **in, long len); +int i2d_OCSP_REQUEST(OCSP_REQUEST *a, unsigned char **out); +OCSP_REQUEST *d2i_OCSP_REQUEST_bio(BIO *bp, OCSP_REQUEST **a); +int i2d_OCSP_REQUEST_bio(BIO *bp, OCSP_REQUEST *a); +extern const ASN1_ITEM OCSP_REQUEST_it; +OCSP_SIGNATURE *OCSP_SIGNATURE_new(void); +void OCSP_SIGNATURE_free(OCSP_SIGNATURE *a); +OCSP_SIGNATURE *d2i_OCSP_SIGNATURE(OCSP_SIGNATURE **a, const unsigned char **in, long len); +int i2d_OCSP_SIGNATURE(OCSP_SIGNATURE *a, unsigned char **out); +extern const ASN1_ITEM OCSP_SIGNATURE_it; +OCSP_REQINFO *OCSP_REQINFO_new(void); +void OCSP_REQINFO_free(OCSP_REQINFO *a); +OCSP_REQINFO *d2i_OCSP_REQINFO(OCSP_REQINFO **a, const unsigned char **in, long len); +int i2d_OCSP_REQINFO(OCSP_REQINFO *a, unsigned char **out); +extern const ASN1_ITEM OCSP_REQINFO_it; +OCSP_CRLID *OCSP_CRLID_new(void); +void OCSP_CRLID_free(OCSP_CRLID *a); +OCSP_CRLID *d2i_OCSP_CRLID(OCSP_CRLID **a, const unsigned char **in, long len); +int i2d_OCSP_CRLID(OCSP_CRLID *a, unsigned char **out); +extern const ASN1_ITEM OCSP_CRLID_it; +OCSP_SERVICELOC *OCSP_SERVICELOC_new(void); +void OCSP_SERVICELOC_free(OCSP_SERVICELOC *a); +OCSP_SERVICELOC *d2i_OCSP_SERVICELOC(OCSP_SERVICELOC **a, const unsigned char **in, long len); +int i2d_OCSP_SERVICELOC(OCSP_SERVICELOC *a, unsigned char **out); +extern const ASN1_ITEM OCSP_SERVICELOC_it; + +const char *OCSP_response_status_str(long s); +const char *OCSP_cert_status_str(long s); +const char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + +/* 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. + */ +void ERR_load_OCSP_strings(void); + +/* Error codes for the OCSP functions. */ + +/* Function codes. */ +#define OCSP_F_ASN1_STRING_ENCODE 100 +#define OCSP_F_D2I_OCSP_NONCE 102 +#define OCSP_F_OCSP_BASIC_ADD1_STATUS 103 +#define OCSP_F_OCSP_BASIC_SIGN 104 +#define OCSP_F_OCSP_BASIC_VERIFY 105 +#define OCSP_F_OCSP_CERT_ID_NEW 101 +#define OCSP_F_OCSP_CHECK_DELEGATED 106 +#define OCSP_F_OCSP_CHECK_IDS 107 +#define OCSP_F_OCSP_CHECK_ISSUER 108 +#define OCSP_F_OCSP_CHECK_VALIDITY 115 +#define OCSP_F_OCSP_MATCH_ISSUERID 109 +#define OCSP_F_OCSP_PARSE_URL 114 +#define OCSP_F_OCSP_REQUEST_SIGN 110 +#define OCSP_F_OCSP_REQUEST_VERIFY 116 +#define OCSP_F_OCSP_RESPONSE_GET1_BASIC 111 +#define OCSP_F_OCSP_SENDREQ_BIO 112 +#define OCSP_F_OCSP_SENDREQ_NBIO 117 +#define OCSP_F_PARSE_HTTP_LINE1 118 +#define OCSP_F_REQUEST_VERIFY 113 + +/* Reason codes. */ +#define OCSP_R_BAD_DATA 100 +#define OCSP_R_CERTIFICATE_VERIFY_ERROR 101 +#define OCSP_R_DIGEST_ERR 102 +#define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD 122 +#define OCSP_R_ERROR_IN_THISUPDATE_FIELD 123 +#define OCSP_R_ERROR_PARSING_URL 121 +#define OCSP_R_MISSING_OCSPSIGNING_USAGE 103 +#define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE 124 +#define OCSP_R_NOT_BASIC_RESPONSE 104 +#define OCSP_R_NO_CERTIFICATES_IN_CHAIN 105 +#define OCSP_R_NO_CONTENT 106 +#define OCSP_R_NO_PUBLIC_KEY 107 +#define OCSP_R_NO_RESPONSE_DATA 108 +#define OCSP_R_NO_REVOKED_TIME 109 +#define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 110 +#define OCSP_R_REQUEST_NOT_SIGNED 128 +#define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA 111 +#define OCSP_R_ROOT_CA_NOT_TRUSTED 112 +#define OCSP_R_SERVER_READ_ERROR 113 +#define OCSP_R_SERVER_RESPONSE_ERROR 114 +#define OCSP_R_SERVER_RESPONSE_PARSE_ERROR 115 +#define OCSP_R_SERVER_WRITE_ERROR 116 +#define OCSP_R_SIGNATURE_FAILURE 117 +#define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND 118 +#define OCSP_R_STATUS_EXPIRED 125 +#define OCSP_R_STATUS_NOT_YET_VALID 126 +#define OCSP_R_STATUS_TOO_OLD 127 +#define OCSP_R_UNKNOWN_MESSAGE_DIGEST 119 +#define OCSP_R_UNKNOWN_NID 120 +#define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE 129 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/opensslconf.h b/src/3rdparty/win32_include/openssl/opensslconf.h new file mode 100644 index 000000000..bb7176898 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/opensslconf.h @@ -0,0 +1,153 @@ +#include +/* crypto/opensslconf.h.in */ + +#if defined(_MSC_VER) && !defined(__attribute__) +#define __attribute__(a) +#endif + +#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#define OPENSSLDIR "/etc/ssl" +#endif + +#undef OPENSSL_UNISTD +#define OPENSSL_UNISTD + +#undef OPENSSL_EXPORT_VAR_AS_FUNCTION + +#if defined(HEADER_IDEA_H) && !defined(IDEA_INT) +#define IDEA_INT unsigned int +#endif + +#if defined(HEADER_MD2_H) && !defined(MD2_INT) +#define MD2_INT unsigned int +#endif + +#if defined(HEADER_RC2_H) && !defined(RC2_INT) +/* I need to put in a mod for the alpha - eay */ +#define RC2_INT unsigned int +#endif + +#if defined(HEADER_RC4_H) +#if !defined(RC4_INT) +/* using int types make the structure larger but make the code faster + * on most boxes I have tested - up to %20 faster. */ +/* + * I don't know what does "most" mean, but declaring "int" is a must on: + * - Intel P6 because partial register stalls are very expensive; + * - elder Alpha because it lacks byte load/store instructions; + */ +#define RC4_INT unsigned int +#endif +#if !defined(RC4_CHUNK) +/* + * This enables code handling data aligned at natural CPU word + * boundary. See crypto/rc4/rc4_enc.c for further details. + */ +#define RC4_CHUNK unsigned long +#endif +#endif + +#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG) +/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a + * %20 speed up (longs are 8 bytes, int's are 4). */ +#ifndef DES_LONG +#define DES_LONG unsigned int +#endif +#endif + +#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) +#define CONFIG_HEADER_BN_H +#undef BN_LLONG + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +#define SIXTY_FOUR_BIT_LONG +#undef SIXTY_FOUR_BIT +#undef THIRTY_TWO_BIT +#endif + +#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H) +#define CONFIG_HEADER_RC4_LOCL_H +/* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +#undef RC4_INDEX +#endif + +#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +#define CONFIG_HEADER_BF_LOCL_H +#undef BF_PTR +#endif /* HEADER_BF_LOCL_H */ + +#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H) +#define CONFIG_HEADER_DES_LOCL_H +#ifndef DES_DEFAULT_OPTIONS +/* the following is tweaked from a config script, that is why it is a + * protected undef/define */ +#ifndef DES_PTR +#undef DES_PTR +#endif + +/* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ +#ifndef DES_RISC1 +#undef DES_RISC1 +#endif + +#ifndef DES_RISC2 +#undef DES_RISC2 +#endif + +#if defined(DES_RISC1) && defined(DES_RISC2) +YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! +#endif + +/* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ +#ifndef DES_UNROLL +#define DES_UNROLL +#endif + +/* These default values were supplied by + * Peter Gutman + * They are only used if nothing else has been defined */ +#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL) +/* Special defines which change the way the code is built depending on the + CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find + even newer MIPS CPU's, but at the moment one size fits all for + optimization options. Older Sparc's work better with only UNROLL, but + there's no way to tell at compile time what it is you're running on */ + +#if defined( sun ) /* Newer Sparc's */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#elif defined( __ultrix ) /* Older MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined( __osf1__ ) /* Alpha */ +# define DES_PTR +# define DES_RISC2 +#elif defined ( _AIX ) /* RS6000 */ + /* Unknown */ +#elif defined( __hpux ) /* HP-PA */ + /* Unknown */ +#elif defined( __aux ) /* 68K */ + /* Unknown */ +#elif defined( __dgux ) /* 88K (but P6 in latest boxes) */ +# define DES_UNROLL +#elif defined( __sgi ) /* Newer MIPS */ +# define DES_PTR +# define DES_RISC2 +# define DES_UNROLL +#elif defined(i386) || defined(__i386__) /* x86 boxes, should be gcc */ +# define DES_PTR +# define DES_RISC1 +# define DES_UNROLL +#endif /* Systems-specific speed defines */ +#endif + +#endif /* DES_DEFAULT_OPTIONS */ +#endif /* HEADER_DES_LOCL_H */ diff --git a/src/3rdparty/win32_include/openssl/opensslfeatures.h b/src/3rdparty/win32_include/openssl/opensslfeatures.h new file mode 100644 index 000000000..ba4dbba95 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/opensslfeatures.h @@ -0,0 +1,26 @@ +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_CMS +# define OPENSSL_NO_COMP +# define OPENSSL_NO_EGD +# define OPENSSL_NO_GMP +# define OPENSSL_NO_JPAKE +# define OPENSSL_NO_KRB5 +# define OPENSSL_NO_MD2 +# define OPENSSL_NO_MDC2 +# define OPENSSL_NO_PSK +# define OPENSSL_NO_RC5 +# define OPENSSL_NO_RFC3779 +# define OPENSSL_NO_RSAX +# define OPENSSL_NO_SCTP +# define OPENSSL_NO_SEED +# define OPENSSL_NO_SHA0 +# define OPENSSL_NO_SRP +# define OPENSSL_NO_SSL2 +# define OPENSSL_NO_SSL3 +# define OPENSSL_NO_SSL3_METHOD +# define OPENSSL_NO_STORE +# define OPENSSL_NO_BUF_FREELISTS +# define OPENSSL_NO_HEARTBEATS +# define OPENSSL_NO_DYNAMIC_ENGINE + +# define OPENSSL_THREADS diff --git a/src/3rdparty/win32_include/openssl/opensslv.h b/src/3rdparty/win32_include/openssl/opensslv.h new file mode 100644 index 000000000..2792c7d6a --- /dev/null +++ b/src/3rdparty/win32_include/openssl/opensslv.h @@ -0,0 +1,17 @@ +/* $OpenBSD: opensslv.h,v 1.39 2017/02/14 03:50:25 bcook Exp $ */ +#ifndef HEADER_OPENSSLV_H +#define HEADER_OPENSSLV_H + +/* These will change with each release of LibreSSL-portable */ +#define LIBRESSL_VERSION_NUMBER 0x2050200fL +#define LIBRESSL_VERSION_TEXT "LibreSSL 2.5.2" + +/* These will never change */ +#define OPENSSL_VERSION_NUMBER 0x20000000L +#define OPENSSL_VERSION_TEXT LIBRESSL_VERSION_TEXT +#define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT + +#define SHLIB_VERSION_HISTORY "" +#define SHLIB_VERSION_NUMBER "1.0.0" + +#endif /* HEADER_OPENSSLV_H */ diff --git a/src/3rdparty/win32_include/openssl/ossl_typ.h b/src/3rdparty/win32_include/openssl/ossl_typ.h new file mode 100644 index 000000000..b1a9e0e37 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ossl_typ.h @@ -0,0 +1,190 @@ +/* $OpenBSD: ossl_typ.h,v 1.13 2015/09/30 04:10:07 doug Exp $ */ +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_OPENSSL_TYPES_H +#define HEADER_OPENSSL_TYPES_H + +#include + +typedef struct asn1_string_st ASN1_INTEGER; +typedef struct asn1_string_st ASN1_ENUMERATED; +typedef struct asn1_string_st ASN1_BIT_STRING; +typedef struct asn1_string_st ASN1_OCTET_STRING; +typedef struct asn1_string_st ASN1_PRINTABLESTRING; +typedef struct asn1_string_st ASN1_T61STRING; +typedef struct asn1_string_st ASN1_IA5STRING; +typedef struct asn1_string_st ASN1_GENERALSTRING; +typedef struct asn1_string_st ASN1_UNIVERSALSTRING; +typedef struct asn1_string_st ASN1_BMPSTRING; +typedef struct asn1_string_st ASN1_UTCTIME; +typedef struct asn1_string_st ASN1_TIME; +typedef struct asn1_string_st ASN1_GENERALIZEDTIME; +typedef struct asn1_string_st ASN1_VISIBLESTRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef struct asn1_string_st ASN1_STRING; +typedef int ASN1_BOOLEAN; +typedef int ASN1_NULL; + +typedef struct ASN1_ITEM_st ASN1_ITEM; +typedef struct asn1_pctx_st ASN1_PCTX; + +#if defined(_WIN32) && defined(__WINCRYPT_H__) +#ifndef LIBRESSL_INTERNAL +#ifdef _MSC_VER +#pragma message("Warning, overriding WinCrypt defines") +#else +#warning overriding WinCrypt defines +#endif +#endif +#undef X509_NAME +#undef X509_CERT_PAIR +#undef X509_EXTENSIONS +#undef OCSP_REQUEST +#undef OCSP_RESPONSE +#undef PKCS7_ISSUER_AND_SERIAL +#endif + +#ifdef BIGNUM +#undef BIGNUM +#endif +typedef struct bignum_st BIGNUM; +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; + +typedef struct buf_mem_st BUF_MEM; + +typedef struct evp_cipher_st EVP_CIPHER; +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; +typedef struct env_md_st EVP_MD; +typedef struct env_md_ctx_st EVP_MD_CTX; +typedef struct evp_pkey_st EVP_PKEY; + +typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; + +typedef struct evp_pkey_method_st EVP_PKEY_METHOD; +typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; + +typedef struct dh_st DH; +typedef struct dh_method DH_METHOD; + +typedef struct dsa_st DSA; +typedef struct dsa_method DSA_METHOD; + +typedef struct rsa_st RSA; +typedef struct rsa_meth_st RSA_METHOD; + +typedef struct rand_meth_st RAND_METHOD; + +typedef struct ecdh_method ECDH_METHOD; +typedef struct ecdsa_method ECDSA_METHOD; + +typedef struct x509_st X509; +typedef struct X509_algor_st X509_ALGOR; +typedef struct X509_crl_st X509_CRL; +typedef struct x509_crl_method_st X509_CRL_METHOD; +typedef struct x509_revoked_st X509_REVOKED; +typedef struct X509_name_st X509_NAME; +typedef struct X509_pubkey_st X509_PUBKEY; +typedef struct x509_store_st X509_STORE; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO; + +typedef struct v3_ext_ctx X509V3_CTX; +typedef struct conf_st CONF; + +typedef struct store_st STORE; +typedef struct store_method_st STORE_METHOD; + +typedef struct ui_st UI; +typedef struct ui_method_st UI_METHOD; + +typedef struct st_ERR_FNS ERR_FNS; + +typedef struct engine_st ENGINE; +typedef struct ssl_st SSL; +typedef struct ssl_ctx_st SSL_CTX; + +typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; +typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; +typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; +typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; + +typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID; +typedef struct DIST_POINT_st DIST_POINT; +typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT; +typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS; + +/* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */ +#define DECLARE_PKCS12_STACK_OF(type) /* Nothing */ +#define IMPLEMENT_PKCS12_STACK_OF(type) /* Nothing */ + +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; +/* Callback types for crypto.h */ +typedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, + void *from_d, int idx, long argl, void *argp); + +typedef struct ocsp_req_ctx_st OCSP_REQ_CTX; +typedef struct ocsp_response_st OCSP_RESPONSE; +typedef struct ocsp_responder_id_st OCSP_RESPID; + +#endif /* def HEADER_OPENSSL_TYPES_H */ diff --git a/src/3rdparty/win32_include/openssl/pem.h b/src/3rdparty/win32_include/openssl/pem.h new file mode 100644 index 000000000..d1916a183 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/pem.h @@ -0,0 +1,618 @@ +/* $OpenBSD: pem.h,v 1.17 2016/09/04 16:22:54 jsing Exp $ */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PEM_H +#define HEADER_PEM_H + +#include + +#ifndef OPENSSL_NO_BIO +#include +#endif +#ifndef OPENSSL_NO_STACK +#include +#endif +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define PEM_BUFSIZE 1024 + +#define PEM_OBJ_UNDEF 0 +#define PEM_OBJ_X509 1 +#define PEM_OBJ_X509_REQ 2 +#define PEM_OBJ_CRL 3 +#define PEM_OBJ_SSL_SESSION 4 +#define PEM_OBJ_PRIV_KEY 10 +#define PEM_OBJ_PRIV_RSA 11 +#define PEM_OBJ_PRIV_DSA 12 +#define PEM_OBJ_PRIV_DH 13 +#define PEM_OBJ_PUB_RSA 14 +#define PEM_OBJ_PUB_DSA 15 +#define PEM_OBJ_PUB_DH 16 +#define PEM_OBJ_DHPARAMS 17 +#define PEM_OBJ_DSAPARAMS 18 +#define PEM_OBJ_PRIV_RSA_PUBLIC 19 +#define PEM_OBJ_PRIV_ECDSA 20 +#define PEM_OBJ_PUB_ECDSA 21 +#define PEM_OBJ_ECPARAMETERS 22 + +#define PEM_ERROR 30 +#define PEM_DEK_DES_CBC 40 +#define PEM_DEK_IDEA_CBC 45 +#define PEM_DEK_DES_EDE 50 +#define PEM_DEK_DES_ECB 60 +#define PEM_DEK_RSA 70 +#define PEM_DEK_RSA_MD2 80 +#define PEM_DEK_RSA_MD5 90 + +#define PEM_MD_MD2 NID_md2 +#define PEM_MD_MD5 NID_md5 +#define PEM_MD_SHA NID_sha +#define PEM_MD_MD2_RSA NID_md2WithRSAEncryption +#define PEM_MD_MD5_RSA NID_md5WithRSAEncryption +#define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption + +#define PEM_STRING_X509_OLD "X509 CERTIFICATE" +#define PEM_STRING_X509 "CERTIFICATE" +#define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" +#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" +#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" +#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" +#define PEM_STRING_X509_CRL "X509 CRL" +#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" +#define PEM_STRING_PUBLIC "PUBLIC KEY" +#define PEM_STRING_RSA "RSA PRIVATE KEY" +#define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" +#define PEM_STRING_DSA "DSA PRIVATE KEY" +#define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" +#define PEM_STRING_PKCS7 "PKCS7" +#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" +#define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" +#define PEM_STRING_PKCS8INF "PRIVATE KEY" +#define PEM_STRING_DHPARAMS "DH PARAMETERS" +#define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" +#define PEM_STRING_DSAPARAMS "DSA PARAMETERS" +#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" +#define PEM_STRING_ECPARAMETERS "EC PARAMETERS" +#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" +#define PEM_STRING_PARAMETERS "PARAMETERS" +#define PEM_STRING_CMS "CMS" + + /* Note that this structure is initialised by PEM_SealInit and cleaned up + by PEM_SealFinal (at least for now) */ +typedef struct PEM_Encode_Seal_st { + EVP_ENCODE_CTX encode; + EVP_MD_CTX md; + EVP_CIPHER_CTX cipher; +} PEM_ENCODE_SEAL_CTX; + +/* enc_type is one off */ +#define PEM_TYPE_ENCRYPTED 10 +#define PEM_TYPE_MIC_ONLY 20 +#define PEM_TYPE_MIC_CLEAR 30 +#define PEM_TYPE_CLEAR 40 + +typedef struct pem_recip_st { + char *name; + X509_NAME *dn; + + int cipher; + int key_enc; + /* char iv[8]; unused and wrong size */ +} PEM_USER; + +typedef struct pem_ctx_st { + int type; /* what type of object */ + + struct { + int version; + int mode; + } proc_type; + + char *domain; + + struct { + int cipher; + /* unused, and wrong size + unsigned char iv[8]; */ + } DEK_info; + + PEM_USER *originator; + + int num_recipient; + PEM_USER **recipient; + + /* XXX(ben): don#t think this is used! + STACK *x509_chain; / * certificate chain */ + EVP_MD *md; /* signature type */ + + int md_enc; /* is the md encrypted or not? */ + int md_len; /* length of md_data */ + char *md_data; /* message digest, could be pkey encrypted */ + + EVP_CIPHER *dec; /* date encryption cipher */ + int key_len; /* key length */ + unsigned char *key; /* key */ + /* unused, and wrong size + unsigned char iv[8]; */ + + int data_enc; /* is the data encrypted */ + int data_len; + unsigned char *data; +} PEM_CTX; + +#ifndef LIBRESSL_INTERNAL +/* These macros make the PEM_read/PEM_write functions easier to maintain and + * write. Now they are all implemented with either: + * IMPLEMENT_PEM_rw(...) or IMPLEMENT_PEM_rw_cb(...) + */ + +#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ +type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str,fp,(void **)x,cb,u); \ +} + +#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \ +} + +#define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, const type *x) \ +{ \ +return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + +#define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ +int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ + } + + +#define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ +type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ +{ \ +return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str,bp,(void **)x,cb,u); \ +} + +#define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \ +} + +#define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, const type *x) \ +{ \ +return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,NULL,NULL,0,NULL,NULL); \ +} + +#define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \ + } + +#define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ +int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,enc,kstr,klen,cb,u); \ + } + +#define IMPLEMENT_PEM_write(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp(name, type, str, asn1) + +#define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) + +#define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) + +#define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) + +#define IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_read_fp(name, type, str, asn1) + +#define IMPLEMENT_PEM_rw(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write(name, type, str, asn1) + +#define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_const(name, type, str, asn1) + +#define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb(name, type, str, asn1) + +#endif + +/* These are the same except they are for the declarations */ + + +#define DECLARE_PEM_read_fp(name, type) \ + type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); + +#define DECLARE_PEM_write_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x); + +#define DECLARE_PEM_write_fp_const(name, type) \ + int PEM_write_##name(FILE *fp, const type *x); + +#define DECLARE_PEM_write_cb_fp(name, type) \ + int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + + +#ifndef OPENSSL_NO_BIO +#define DECLARE_PEM_read_bio(name, type) \ + type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); + +#define DECLARE_PEM_write_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x); + +#define DECLARE_PEM_write_bio_const(name, type) \ + int PEM_write_bio_##name(BIO *bp, const type *x); + +#define DECLARE_PEM_write_cb_bio(name, type) \ + int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u); + +#else + +#define DECLARE_PEM_read_bio(name, type) /**/ +#define DECLARE_PEM_write_bio(name, type) /**/ +#define DECLARE_PEM_write_bio_const(name, type) /**/ +#define DECLARE_PEM_write_cb_bio(name, type) /**/ + +#endif + +#define DECLARE_PEM_write(name, type) \ + DECLARE_PEM_write_bio(name, type) \ + DECLARE_PEM_write_fp(name, type) + +#define DECLARE_PEM_write_const(name, type) \ + DECLARE_PEM_write_bio_const(name, type) \ + DECLARE_PEM_write_fp_const(name, type) + +#define DECLARE_PEM_write_cb(name, type) \ + DECLARE_PEM_write_cb_bio(name, type) \ + DECLARE_PEM_write_cb_fp(name, type) + +#define DECLARE_PEM_read(name, type) \ + DECLARE_PEM_read_bio(name, type) \ + DECLARE_PEM_read_fp(name, type) + +#define DECLARE_PEM_rw(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write(name, type) + +#define DECLARE_PEM_rw_const(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_const(name, type) + +#define DECLARE_PEM_rw_cb(name, type) \ + DECLARE_PEM_read(name, type) \ + DECLARE_PEM_write_cb(name, type) + +typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata); + +int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); +int PEM_do_header (EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, + pem_password_cb *callback, void *u); + +#ifndef OPENSSL_NO_BIO +int PEM_read_bio(BIO *bp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write_bio(BIO *bp, const char *name, char *hdr, unsigned char *data, + long len); +int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, void *u); +void * PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, + void **x, pem_password_cb *cb, void *u); +int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, + const EVP_CIPHER *enc, unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +STACK_OF(X509_INFO) * PEM_X509_INFO_read_bio(BIO *bp, + STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u); +int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, + unsigned char *kstr, int klen, pem_password_cb *cd, void *u); +#endif + +int PEM_read(FILE *fp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write(FILE *fp, char *name, char *hdr, unsigned char *data, + long len); +void * PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, + void *x, const EVP_CIPHER *enc, unsigned char *kstr, + int klen, pem_password_cb *callback, void *u); +STACK_OF(X509_INFO) * PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); + +int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, + EVP_MD *md_type, unsigned char **ek, int *ekl, + unsigned char *iv, EVP_PKEY **pubk, int npubk); +void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, + unsigned char *in, int inl); +int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig, int *sigl, + unsigned char *out, int *outl, EVP_PKEY *priv); + +void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); +void PEM_SignUpdate(EVP_MD_CTX *ctx, unsigned char *d, unsigned int cnt); +int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + unsigned int *siglen, EVP_PKEY *pkey); + +int PEM_def_callback(char *buf, int num, int w, void *key); +void PEM_proc_type(char *buf, int type); +void PEM_dek_info(char *buf, const char *type, int len, char *str); + + +DECLARE_PEM_rw(X509, X509) + +DECLARE_PEM_rw(X509_AUX, X509) + +DECLARE_PEM_rw(X509_CERT_PAIR, X509_CERT_PAIR) + +DECLARE_PEM_rw(X509_REQ, X509_REQ) +DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) + +DECLARE_PEM_rw(X509_CRL, X509_CRL) + +DECLARE_PEM_rw(PKCS7, PKCS7) + +DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) + +DECLARE_PEM_rw(PKCS8, X509_SIG) + +DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) + +#ifndef OPENSSL_NO_RSA + +DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) + +DECLARE_PEM_rw_const(RSAPublicKey, RSA) +DECLARE_PEM_rw(RSA_PUBKEY, RSA) + +#endif + +#ifndef OPENSSL_NO_DSA + +DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) + +DECLARE_PEM_rw(DSA_PUBKEY, DSA) + +DECLARE_PEM_rw_const(DSAparams, DSA) + +#endif + +#ifndef OPENSSL_NO_EC +DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) +DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) +DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) +#endif + +#ifndef OPENSSL_NO_DH + +DECLARE_PEM_rw_const(DHparams, DH) + +#endif + +DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) + +DECLARE_PEM_rw(PUBKEY, EVP_PKEY) + +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, + char *, int, pem_password_cb *, void *); +int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, + char *kstr, int klen, + pem_password_cb *cb, void *u); + +EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, + char *kstr, int klen, pem_password_cb *cd, void *u); + +EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); +int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); + + +EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PrivateKey_bio(BIO *in); +EVP_PKEY *b2i_PublicKey_bio(BIO *in); +int i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk); +int i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk); +#ifndef OPENSSL_NO_RC4 +EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); +int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, pem_password_cb *cb, + void *u); +#endif + + +/* 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. + */ +void ERR_load_PEM_strings(void); + +/* Error codes for the PEM functions. */ + +/* Function codes. */ +#define PEM_F_B2I_DSS 127 +#define PEM_F_B2I_PVK_BIO 128 +#define PEM_F_B2I_RSA 129 +#define PEM_F_CHECK_BITLEN_DSA 130 +#define PEM_F_CHECK_BITLEN_RSA 131 +#define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 +#define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 +#define PEM_F_DO_B2I 132 +#define PEM_F_DO_B2I_BIO 133 +#define PEM_F_DO_BLOB_HEADER 134 +#define PEM_F_DO_PK8PKEY 126 +#define PEM_F_DO_PK8PKEY_FP 125 +#define PEM_F_DO_PVK_BODY 135 +#define PEM_F_DO_PVK_HEADER 136 +#define PEM_F_I2B_PVK 137 +#define PEM_F_I2B_PVK_BIO 138 +#define PEM_F_LOAD_IV 101 +#define PEM_F_PEM_ASN1_READ 102 +#define PEM_F_PEM_ASN1_READ_BIO 103 +#define PEM_F_PEM_ASN1_WRITE 104 +#define PEM_F_PEM_ASN1_WRITE_BIO 105 +#define PEM_F_PEM_DEF_CALLBACK 100 +#define PEM_F_PEM_DO_HEADER 106 +#define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 +#define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 +#define PEM_F_PEM_PK8PKEY 119 +#define PEM_F_PEM_READ 108 +#define PEM_F_PEM_READ_BIO 109 +#define PEM_F_PEM_READ_BIO_PARAMETERS 140 +#define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 +#define PEM_F_PEM_READ_PRIVATEKEY 124 +#define PEM_F_PEM_SEALFINAL 110 +#define PEM_F_PEM_SEALINIT 111 +#define PEM_F_PEM_SIGNFINAL 112 +#define PEM_F_PEM_WRITE 113 +#define PEM_F_PEM_WRITE_BIO 114 +#define PEM_F_PEM_WRITE_PRIVATEKEY 139 +#define PEM_F_PEM_X509_INFO_READ 115 +#define PEM_F_PEM_X509_INFO_READ_BIO 116 +#define PEM_F_PEM_X509_INFO_WRITE_BIO 117 + +/* Reason codes. */ +#define PEM_R_BAD_BASE64_DECODE 100 +#define PEM_R_BAD_DECRYPT 101 +#define PEM_R_BAD_END_LINE 102 +#define PEM_R_BAD_IV_CHARS 103 +#define PEM_R_BAD_MAGIC_NUMBER 116 +#define PEM_R_BAD_PASSWORD_READ 104 +#define PEM_R_BAD_VERSION_NUMBER 117 +#define PEM_R_BIO_WRITE_FAILURE 118 +#define PEM_R_CIPHER_IS_NULL 127 +#define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 +#define PEM_R_EXPECTING_PRIVATE_KEY_BLOB 119 +#define PEM_R_EXPECTING_PUBLIC_KEY_BLOB 120 +#define PEM_R_INCONSISTENT_HEADER 121 +#define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 +#define PEM_R_KEYBLOB_TOO_SHORT 123 +#define PEM_R_NOT_DEK_INFO 105 +#define PEM_R_NOT_ENCRYPTED 106 +#define PEM_R_NOT_PROC_TYPE 107 +#define PEM_R_NO_START_LINE 108 +#define PEM_R_PROBLEMS_GETTING_PASSWORD 109 +#define PEM_R_PUBLIC_KEY_NO_RSA 110 +#define PEM_R_PVK_DATA_TOO_SHORT 124 +#define PEM_R_PVK_TOO_SHORT 125 +#define PEM_R_READ_KEY 111 +#define PEM_R_SHORT_HEADER 112 +#define PEM_R_UNSUPPORTED_CIPHER 113 +#define PEM_R_UNSUPPORTED_ENCRYPTION 114 +#define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/pem2.h b/src/3rdparty/win32_include/openssl/pem2.h new file mode 100644 index 000000000..19525b4a4 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/pem2.h @@ -0,0 +1,71 @@ +/* $OpenBSD: pem2.h,v 1.5 2014/06/12 15:49:30 deraadt Exp $ */ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* + * This header only exists to break a circular dependency between pem and err + * Ben 30 Jan 1999. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HEADER_PEM_H +void ERR_load_PEM_strings(void); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/src/3rdparty/win32_include/openssl/pkcs12.h b/src/3rdparty/win32_include/openssl/pkcs12.h new file mode 100644 index 000000000..e30f9ac79 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/pkcs12.h @@ -0,0 +1,350 @@ +/* $OpenBSD: pkcs12.h,v 1.17 2016/12/30 15:08:58 jsing Exp $ */ +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project 1999. + */ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PKCS12_H +#define HEADER_PKCS12_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define PKCS12_KEY_ID 1 +#define PKCS12_IV_ID 2 +#define PKCS12_MAC_ID 3 + +/* Default iteration count */ +#ifndef PKCS12_DEFAULT_ITER +#define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +#endif + +#define PKCS12_MAC_KEY_LENGTH 20 + +#define PKCS12_SALT_LEN 8 + +/* Uncomment out next line for unicode password and names, otherwise ASCII */ + +/*#define PBE_UNICODE*/ + +#ifdef PBE_UNICODE +#define PKCS12_key_gen PKCS12_key_gen_uni +#define PKCS12_add_friendlyname PKCS12_add_friendlyname_uni +#else +#define PKCS12_key_gen PKCS12_key_gen_asc +#define PKCS12_add_friendlyname PKCS12_add_friendlyname_asc +#endif + +/* MS key usage constants */ + +#define KEY_EX 0x10 +#define KEY_SIG 0x80 + +typedef struct { + X509_SIG *dinfo; + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; /* defaults to 1 */ +} PKCS12_MAC_DATA; + +typedef struct { + ASN1_INTEGER *version; + PKCS12_MAC_DATA *mac; + PKCS7 *authsafes; +} PKCS12; + +typedef struct { + ASN1_OBJECT *type; + union { + struct pkcs12_bag_st *bag; /* secret, crl and certbag */ + struct pkcs8_priv_key_info_st *keybag; /* keybag */ + X509_SIG *shkeybag; /* shrouded key bag */ + STACK_OF(PKCS12_SAFEBAG) *safes; + ASN1_TYPE *other; + } value; + STACK_OF(X509_ATTRIBUTE) *attrib; +} PKCS12_SAFEBAG; + +DECLARE_STACK_OF(PKCS12_SAFEBAG) +DECLARE_PKCS12_STACK_OF(PKCS12_SAFEBAG) + +typedef struct pkcs12_bag_st { + ASN1_OBJECT *type; + union { + ASN1_OCTET_STRING *x509cert; + ASN1_OCTET_STRING *x509crl; + ASN1_OCTET_STRING *octet; + ASN1_IA5STRING *sdsicert; + ASN1_TYPE *other; /* Secret or other bag */ + } value; +} PKCS12_BAGS; + +#define PKCS12_ERROR 0 +#define PKCS12_OK 1 + +#ifndef LIBRESSL_INTERNAL + +/* Compatibility macros */ + +#define M_PKCS12_x5092certbag PKCS12_x5092certbag +#define M_PKCS12_x509crl2certbag PKCS12_x509crl2certbag + +#define M_PKCS12_certbag2x509 PKCS12_certbag2x509 +#define M_PKCS12_certbag2x509crl PKCS12_certbag2x509crl + +#define M_PKCS12_unpack_p7data PKCS12_unpack_p7data +#define M_PKCS12_pack_authsafes PKCS12_pack_authsafes +#define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes +#define M_PKCS12_unpack_p7encdata PKCS12_unpack_p7encdata + +#define M_PKCS12_decrypt_skey PKCS12_decrypt_skey +#define M_PKCS8_decrypt PKCS8_decrypt + +#define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type) +#define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type) +#define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type + +#endif /* !LIBRESSL_INTERNAL */ + +#define PKCS12_get_attr(bag, attr_nid) \ + PKCS12_get_attr_gen(bag->attrib, attr_nid) + +#define PKCS8_get_attr(p8, attr_nid) \ + PKCS12_get_attr_gen(p8->attributes, attr_nid) + +#define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0) + + +PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509); +PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl); +X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *p8, const char *pass, int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, const char *pass, + int passlen); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass, + int passlen, unsigned char *salt, int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, STACK_OF(PKCS12_SAFEBAG) *bags); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, + int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, + int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, const unsigned char *name, + int namelen); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +unsigned char *PKCS12_pbe_crypt(X509_ALGOR *algor, const char *pass, + int passlen, unsigned char *in, int inlen, unsigned char **data, + int *datalen, int en_de); +void * PKCS12_item_decrypt_d2i(X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, ASN1_OCTET_STRING *oct, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, + const ASN1_ITEM *it, const char *pass, int passlen, void *obj, int zbuf); +PKCS12 *PKCS12_init(int mode); +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, unsigned char *out, + const EVP_MD *md_type); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, unsigned char *out, + const EVP_MD *md_type); +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md_type, + int en_de); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2asc(unsigned char *uni, int unilen); + +PKCS12 *PKCS12_new(void); +void PKCS12_free(PKCS12 *a); +PKCS12 *d2i_PKCS12(PKCS12 **a, const unsigned char **in, long len); +int i2d_PKCS12(PKCS12 *a, unsigned char **out); +extern const ASN1_ITEM PKCS12_it; +PKCS12_MAC_DATA *PKCS12_MAC_DATA_new(void); +void PKCS12_MAC_DATA_free(PKCS12_MAC_DATA *a); +PKCS12_MAC_DATA *d2i_PKCS12_MAC_DATA(PKCS12_MAC_DATA **a, const unsigned char **in, long len); +int i2d_PKCS12_MAC_DATA(PKCS12_MAC_DATA *a, unsigned char **out); +extern const ASN1_ITEM PKCS12_MAC_DATA_it; +PKCS12_SAFEBAG *PKCS12_SAFEBAG_new(void); +void PKCS12_SAFEBAG_free(PKCS12_SAFEBAG *a); +PKCS12_SAFEBAG *d2i_PKCS12_SAFEBAG(PKCS12_SAFEBAG **a, const unsigned char **in, long len); +int i2d_PKCS12_SAFEBAG(PKCS12_SAFEBAG *a, unsigned char **out); +extern const ASN1_ITEM PKCS12_SAFEBAG_it; +PKCS12_BAGS *PKCS12_BAGS_new(void); +void PKCS12_BAGS_free(PKCS12_BAGS *a); +PKCS12_BAGS *d2i_PKCS12_BAGS(PKCS12_BAGS **a, const unsigned char **in, long len); +int i2d_PKCS12_BAGS(PKCS12_BAGS *a, unsigned char **out); +extern const ASN1_ITEM PKCS12_BAGS_it; + +extern const ASN1_ITEM PKCS12_SAFEBAGS_it; +extern const ASN1_ITEM PKCS12_AUTHSAFES_it; + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, + STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, + int mac_iter, int keytype); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, EVP_PKEY *key, + int key_usage, int iter, int key_nid, char *pass); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, char *pass); +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); + +int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); +int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +int PKCS12_newpass(PKCS12 *p12, char *oldpass, char *newpass); + +/* 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. + */ +void ERR_load_PKCS12_strings(void); + +/* Error codes for the PKCS12 functions. */ + +/* Function codes. */ +#define PKCS12_F_PARSE_BAG 129 +#define PKCS12_F_PARSE_BAGS 103 +#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME 100 +#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC 127 +#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI 102 +#define PKCS12_F_PKCS12_ADD_LOCALKEYID 104 +#define PKCS12_F_PKCS12_CREATE 105 +#define PKCS12_F_PKCS12_GEN_MAC 107 +#define PKCS12_F_PKCS12_INIT 109 +#define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 106 +#define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 108 +#define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 117 +#define PKCS12_F_PKCS12_KEY_GEN_ASC 110 +#define PKCS12_F_PKCS12_KEY_GEN_UNI 111 +#define PKCS12_F_PKCS12_MAKE_KEYBAG 112 +#define PKCS12_F_PKCS12_MAKE_SHKEYBAG 113 +#define PKCS12_F_PKCS12_NEWPASS 128 +#define PKCS12_F_PKCS12_PACK_P7DATA 114 +#define PKCS12_F_PKCS12_PACK_P7ENCDATA 115 +#define PKCS12_F_PKCS12_PARSE 118 +#define PKCS12_F_PKCS12_PBE_CRYPT 119 +#define PKCS12_F_PKCS12_PBE_KEYIVGEN 120 +#define PKCS12_F_PKCS12_SETUP_MAC 122 +#define PKCS12_F_PKCS12_SET_MAC 123 +#define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 130 +#define PKCS12_F_PKCS12_UNPACK_P7DATA 131 +#define PKCS12_F_PKCS12_VERIFY_MAC 126 +#define PKCS12_F_PKCS8_ADD_KEYUSAGE 124 +#define PKCS12_F_PKCS8_ENCRYPT 125 + +/* Reason codes. */ +#define PKCS12_R_CANT_PACK_STRUCTURE 100 +#define PKCS12_R_CONTENT_TYPE_NOT_DATA 121 +#define PKCS12_R_DECODE_ERROR 101 +#define PKCS12_R_ENCODE_ERROR 102 +#define PKCS12_R_ENCRYPT_ERROR 103 +#define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120 +#define PKCS12_R_INVALID_NULL_ARGUMENT 104 +#define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105 +#define PKCS12_R_IV_GEN_ERROR 106 +#define PKCS12_R_KEY_GEN_ERROR 107 +#define PKCS12_R_MAC_ABSENT 108 +#define PKCS12_R_MAC_GENERATION_ERROR 109 +#define PKCS12_R_MAC_SETUP_ERROR 110 +#define PKCS12_R_MAC_STRING_SET_ERROR 111 +#define PKCS12_R_MAC_VERIFY_ERROR 112 +#define PKCS12_R_MAC_VERIFY_FAILURE 113 +#define PKCS12_R_PARSE_ERROR 114 +#define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR 115 +#define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116 +#define PKCS12_R_PKCS12_PBE_CRYPT_ERROR 117 +#define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118 +#define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/pkcs7.h b/src/3rdparty/win32_include/openssl/pkcs7.h new file mode 100644 index 000000000..cff7c9665 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/pkcs7.h @@ -0,0 +1,529 @@ +/* $OpenBSD: pkcs7.h,v 1.18 2016/12/27 16:12:47 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_PKCS7_H +#define HEADER_PKCS7_H + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) && defined(__WINCRYPT_H__) +#ifndef LIBRESSL_INTERNAL +#ifdef _MSC_VER +#pragma message("Warning, overriding WinCrypt defines") +#else +#warning overriding WinCrypt defines +#endif +#endif +#undef PKCS7_ISSUER_AND_SERIAL +#undef PKCS7_SIGNER_INFO +#endif + +/* +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct pkcs7_issuer_and_serial_st { + X509_NAME *issuer; + ASN1_INTEGER *serial; +} PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; + ASN1_OCTET_STRING *enc_digest; + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + + /* The private key to sign with */ + EVP_PKEY *pkey; +} PKCS7_SIGNER_INFO; + +DECLARE_STACK_OF(PKCS7_SIGNER_INFO) + +typedef struct pkcs7_recip_info_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ +} PKCS7_RECIP_INFO; + +DECLARE_STACK_OF(PKCS7_RECIP_INFO) + +typedef struct pkcs7_signed_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + + struct pkcs7_st *contents; +} PKCS7_SIGNED; +/* The above structure is very very similar to PKCS7_SIGN_ENVELOPE. + * How about merging the two */ + +typedef struct pkcs7_enc_content_st { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; +} PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; +} PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; +} PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENCRYPT; + +typedef struct pkcs7_st { + /* The following is non NULL if it contains ASN1 encoding of + * this structure */ + unsigned char *asn1; + long length; + +#define PKCS7_S_HEADER 0 +#define PKCS7_S_BODY 1 +#define PKCS7_S_TAIL 2 + int state; /* used during processing */ + + int detached; + + ASN1_OBJECT *type; + /* content as defined by the type */ + /* all encryption/message digests are applied to the 'contents', + * leaving out the 'type' field. */ + union { + char *ptr; + + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; + + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + + /* Anything else */ + ASN1_TYPE *other; + } d; +} PKCS7; + +DECLARE_STACK_OF(PKCS7) +DECLARE_PKCS12_STACK_OF(PKCS7) + +#define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +#define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +#define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +#define PKCS7_get_attributes(si) ((si)->unauth_attr) + +#define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +#define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +#define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +#define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +#define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +#define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) +#define PKCS7_type_is_encrypted(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) + +#define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +#define PKCS7_set_detached(p,v) \ + PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) +#define PKCS7_get_detached(p) \ + PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) + +#define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +#define PKCS7_TEXT 0x1 +#define PKCS7_NOCERTS 0x2 +#define PKCS7_NOSIGS 0x4 +#define PKCS7_NOCHAIN 0x8 +#define PKCS7_NOINTERN 0x10 +#define PKCS7_NOVERIFY 0x20 +#define PKCS7_DETACHED 0x40 +#define PKCS7_BINARY 0x80 +#define PKCS7_NOATTR 0x100 +#define PKCS7_NOSMIMECAP 0x200 +#define PKCS7_NOOLDMIMETYPE 0x400 +#define PKCS7_CRLFEOL 0x800 +#define PKCS7_STREAM 0x1000 +#define PKCS7_NOCRL 0x2000 +#define PKCS7_PARTIAL 0x4000 +#define PKCS7_REUSE_DIGEST 0x8000 + +/* Flags: for compatibility with older code */ + +#define SMIME_TEXT PKCS7_TEXT +#define SMIME_NOCERTS PKCS7_NOCERTS +#define SMIME_NOSIGS PKCS7_NOSIGS +#define SMIME_NOCHAIN PKCS7_NOCHAIN +#define SMIME_NOINTERN PKCS7_NOINTERN +#define SMIME_NOVERIFY PKCS7_NOVERIFY +#define SMIME_DETACHED PKCS7_DETACHED +#define SMIME_BINARY PKCS7_BINARY +#define SMIME_NOATTR PKCS7_NOATTR + +PKCS7_ISSUER_AND_SERIAL *PKCS7_ISSUER_AND_SERIAL_new(void); +void PKCS7_ISSUER_AND_SERIAL_free(PKCS7_ISSUER_AND_SERIAL *a); +PKCS7_ISSUER_AND_SERIAL *d2i_PKCS7_ISSUER_AND_SERIAL(PKCS7_ISSUER_AND_SERIAL **a, const unsigned char **in, long len); +int i2d_PKCS7_ISSUER_AND_SERIAL(PKCS7_ISSUER_AND_SERIAL *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_ISSUER_AND_SERIAL_it; + +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, + const EVP_MD *type, unsigned char *md, unsigned int *len); +PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7); +PKCS7 *PKCS7_dup(PKCS7 *p7); +PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7); +int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); +int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); + +PKCS7_SIGNER_INFO *PKCS7_SIGNER_INFO_new(void); +void PKCS7_SIGNER_INFO_free(PKCS7_SIGNER_INFO *a); +PKCS7_SIGNER_INFO *d2i_PKCS7_SIGNER_INFO(PKCS7_SIGNER_INFO **a, const unsigned char **in, long len); +int i2d_PKCS7_SIGNER_INFO(PKCS7_SIGNER_INFO *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_SIGNER_INFO_it; +PKCS7_RECIP_INFO *PKCS7_RECIP_INFO_new(void); +void PKCS7_RECIP_INFO_free(PKCS7_RECIP_INFO *a); +PKCS7_RECIP_INFO *d2i_PKCS7_RECIP_INFO(PKCS7_RECIP_INFO **a, const unsigned char **in, long len); +int i2d_PKCS7_RECIP_INFO(PKCS7_RECIP_INFO *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_RECIP_INFO_it; +PKCS7_SIGNED *PKCS7_SIGNED_new(void); +void PKCS7_SIGNED_free(PKCS7_SIGNED *a); +PKCS7_SIGNED *d2i_PKCS7_SIGNED(PKCS7_SIGNED **a, const unsigned char **in, long len); +int i2d_PKCS7_SIGNED(PKCS7_SIGNED *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_SIGNED_it; +PKCS7_ENC_CONTENT *PKCS7_ENC_CONTENT_new(void); +void PKCS7_ENC_CONTENT_free(PKCS7_ENC_CONTENT *a); +PKCS7_ENC_CONTENT *d2i_PKCS7_ENC_CONTENT(PKCS7_ENC_CONTENT **a, const unsigned char **in, long len); +int i2d_PKCS7_ENC_CONTENT(PKCS7_ENC_CONTENT *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_ENC_CONTENT_it; +PKCS7_ENVELOPE *PKCS7_ENVELOPE_new(void); +void PKCS7_ENVELOPE_free(PKCS7_ENVELOPE *a); +PKCS7_ENVELOPE *d2i_PKCS7_ENVELOPE(PKCS7_ENVELOPE **a, const unsigned char **in, long len); +int i2d_PKCS7_ENVELOPE(PKCS7_ENVELOPE *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_ENVELOPE_it; +PKCS7_SIGN_ENVELOPE *PKCS7_SIGN_ENVELOPE_new(void); +void PKCS7_SIGN_ENVELOPE_free(PKCS7_SIGN_ENVELOPE *a); +PKCS7_SIGN_ENVELOPE *d2i_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE **a, const unsigned char **in, long len); +int i2d_PKCS7_SIGN_ENVELOPE(PKCS7_SIGN_ENVELOPE *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_SIGN_ENVELOPE_it; +PKCS7_DIGEST *PKCS7_DIGEST_new(void); +void PKCS7_DIGEST_free(PKCS7_DIGEST *a); +PKCS7_DIGEST *d2i_PKCS7_DIGEST(PKCS7_DIGEST **a, const unsigned char **in, long len); +int i2d_PKCS7_DIGEST(PKCS7_DIGEST *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_DIGEST_it; +PKCS7_ENCRYPT *PKCS7_ENCRYPT_new(void); +void PKCS7_ENCRYPT_free(PKCS7_ENCRYPT *a); +PKCS7_ENCRYPT *d2i_PKCS7_ENCRYPT(PKCS7_ENCRYPT **a, const unsigned char **in, long len); +int i2d_PKCS7_ENCRYPT(PKCS7_ENCRYPT *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_ENCRYPT_it; +PKCS7 *PKCS7_new(void); +void PKCS7_free(PKCS7 *a); +PKCS7 *d2i_PKCS7(PKCS7 **a, const unsigned char **in, long len); +int i2d_PKCS7(PKCS7 *a, unsigned char **out); +extern const ASN1_ITEM PKCS7_it; + +extern const ASN1_ITEM PKCS7_ATTR_SIGN_it; +extern const ASN1_ITEM PKCS7_ATTR_VERIFY_it; + +int i2d_PKCS7_NDEF(PKCS7 *a, unsigned char **out); +int PKCS7_print_ctx(BIO *out, PKCS7 *x, int indent, const ASN1_PCTX *pctx); + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); +int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); +int PKCS7_add_certificate(PKCS7 *p7, X509 *x509); +int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509); +int PKCS7_content_new(PKCS7 *p7, int nid); +int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *x509); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, + X509_ALGOR **pdig, X509_ALGOR **psig); +void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); +int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); +int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); +int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); +int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, + void *data); +int PKCS7_add_attribute (PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *value); +ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid); +ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid); +int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, STACK_OF(X509_ATTRIBUTE) *sk); + + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); + +PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, + X509 *signcert, EVP_PKEY *pkey, const EVP_MD *md, + int flags); + +int PKCS7_final(PKCS7 *p7, BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, + const unsigned char *md, int mdlen); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); + +BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); + + +/* 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. + */ +void ERR_load_PKCS7_strings(void); + +/* Error codes for the PKCS7 functions. */ + +/* Function codes. */ +#define PKCS7_F_B64_READ_PKCS7 120 +#define PKCS7_F_B64_WRITE_PKCS7 121 +#define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB 136 +#define PKCS7_F_I2D_PKCS7_BIO_STREAM 140 +#define PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME 135 +#define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP 118 +#define PKCS7_F_PKCS7_ADD_CERTIFICATE 100 +#define PKCS7_F_PKCS7_ADD_CRL 101 +#define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO 102 +#define PKCS7_F_PKCS7_ADD_SIGNATURE 131 +#define PKCS7_F_PKCS7_ADD_SIGNER 103 +#define PKCS7_F_PKCS7_BIO_ADD_DIGEST 125 +#define PKCS7_F_PKCS7_COPY_EXISTING_DIGEST 138 +#define PKCS7_F_PKCS7_CTRL 104 +#define PKCS7_F_PKCS7_DATADECODE 112 +#define PKCS7_F_PKCS7_DATAFINAL 128 +#define PKCS7_F_PKCS7_DATAINIT 105 +#define PKCS7_F_PKCS7_DATASIGN 106 +#define PKCS7_F_PKCS7_DATAVERIFY 107 +#define PKCS7_F_PKCS7_DECRYPT 114 +#define PKCS7_F_PKCS7_DECRYPT_RINFO 133 +#define PKCS7_F_PKCS7_ENCODE_RINFO 132 +#define PKCS7_F_PKCS7_ENCRYPT 115 +#define PKCS7_F_PKCS7_FINAL 134 +#define PKCS7_F_PKCS7_FIND_DIGEST 127 +#define PKCS7_F_PKCS7_GET0_SIGNERS 124 +#define PKCS7_F_PKCS7_RECIP_INFO_SET 130 +#define PKCS7_F_PKCS7_SET_CIPHER 108 +#define PKCS7_F_PKCS7_SET_CONTENT 109 +#define PKCS7_F_PKCS7_SET_DIGEST 126 +#define PKCS7_F_PKCS7_SET_TYPE 110 +#define PKCS7_F_PKCS7_SIGN 116 +#define PKCS7_F_PKCS7_SIGNATUREVERIFY 113 +#define PKCS7_F_PKCS7_SIGNER_INFO_SET 129 +#define PKCS7_F_PKCS7_SIGNER_INFO_SIGN 139 +#define PKCS7_F_PKCS7_SIGN_ADD_SIGNER 137 +#define PKCS7_F_PKCS7_SIMPLE_SMIMECAP 119 +#define PKCS7_F_PKCS7_VERIFY 117 +#define PKCS7_F_SMIME_READ_PKCS7 122 +#define PKCS7_F_SMIME_TEXT 123 + +/* Reason codes. */ +#define PKCS7_R_CERTIFICATE_VERIFY_ERROR 117 +#define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 144 +#define PKCS7_R_CIPHER_NOT_INITIALIZED 116 +#define PKCS7_R_CONTENT_AND_DATA_PRESENT 118 +#define PKCS7_R_CTRL_ERROR 152 +#define PKCS7_R_DECODE_ERROR 130 +#define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH 100 +#define PKCS7_R_DECRYPT_ERROR 119 +#define PKCS7_R_DIGEST_FAILURE 101 +#define PKCS7_R_ENCRYPTION_CTRL_FAILURE 149 +#define PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 150 +#define PKCS7_R_ERROR_ADDING_RECIPIENT 120 +#define PKCS7_R_ERROR_SETTING_CIPHER 121 +#define PKCS7_R_INVALID_MIME_TYPE 131 +#define PKCS7_R_INVALID_NULL_POINTER 143 +#define PKCS7_R_MIME_NO_CONTENT_TYPE 132 +#define PKCS7_R_MIME_PARSE_ERROR 133 +#define PKCS7_R_MIME_SIG_PARSE_ERROR 134 +#define PKCS7_R_MISSING_CERIPEND_INFO 103 +#define PKCS7_R_NO_CONTENT 122 +#define PKCS7_R_NO_CONTENT_TYPE 135 +#define PKCS7_R_NO_DEFAULT_DIGEST 151 +#define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND 154 +#define PKCS7_R_NO_MULTIPART_BODY_FAILURE 136 +#define PKCS7_R_NO_MULTIPART_BOUNDARY 137 +#define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 +#define PKCS7_R_NO_RECIPIENT_MATCHES_KEY 146 +#define PKCS7_R_NO_SIGNATURES_ON_DATA 123 +#define PKCS7_R_NO_SIGNERS 142 +#define PKCS7_R_NO_SIG_CONTENT_TYPE 138 +#define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE 104 +#define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR 124 +#define PKCS7_R_PKCS7_ADD_SIGNER_ERROR 153 +#define PKCS7_R_PKCS7_DATAFINAL 126 +#define PKCS7_R_PKCS7_DATAFINAL_ERROR 125 +#define PKCS7_R_PKCS7_DATASIGN 145 +#define PKCS7_R_PKCS7_PARSE_ERROR 139 +#define PKCS7_R_PKCS7_SIG_PARSE_ERROR 140 +#define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 127 +#define PKCS7_R_SIGNATURE_FAILURE 105 +#define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND 128 +#define PKCS7_R_SIGNING_CTRL_FAILURE 147 +#define PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 148 +#define PKCS7_R_SIG_INVALID_MIME_TYPE 141 +#define PKCS7_R_SMIME_TEXT_ERROR 129 +#define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE 106 +#define PKCS7_R_UNABLE_TO_FIND_MEM_BIO 107 +#define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST 108 +#define PKCS7_R_UNKNOWN_DIGEST_TYPE 109 +#define PKCS7_R_UNKNOWN_OPERATION 110 +#define PKCS7_R_UNSUPPORTED_CIPHER_TYPE 111 +#define PKCS7_R_UNSUPPORTED_CONTENT_TYPE 112 +#define PKCS7_R_WRONG_CONTENT_TYPE 113 +#define PKCS7_R_WRONG_PKCS7_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/poly1305.h b/src/3rdparty/win32_include/openssl/poly1305.h new file mode 100644 index 000000000..00ab0bfd2 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/poly1305.h @@ -0,0 +1,49 @@ +/* $OpenBSD: poly1305.h,v 1.3 2014/07/25 14:04:51 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. + */ + +#ifndef HEADER_POLY1305_H +#define HEADER_POLY1305_H + +#include + +#if defined(OPENSSL_NO_POLY1305) +#error Poly1305 is disabled. +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct poly1305_context { + size_t aligner; + unsigned char opaque[136]; +} poly1305_context; + +typedef struct poly1305_context poly1305_state; + +void CRYPTO_poly1305_init(poly1305_context *ctx, const unsigned char key[32]); +void CRYPTO_poly1305_update(poly1305_context *ctx, const unsigned char *in, + size_t len); +void CRYPTO_poly1305_finish(poly1305_context *ctx, unsigned char mac[16]); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_POLY1305_H */ diff --git a/src/3rdparty/win32_include/openssl/rand.h b/src/3rdparty/win32_include/openssl/rand.h new file mode 100644 index 000000000..fcb2e9218 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/rand.h @@ -0,0 +1,127 @@ +/* $OpenBSD: rand.h,v 1.22 2014/10/22 14:02:52 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include + +#ifndef HEADER_RAND_H +#define HEADER_RAND_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct rand_meth_st RAND_METHOD; */ + +struct rand_meth_st { + void (*seed)(const void *buf, int num); + int (*bytes)(unsigned char *buf, int num); + void (*cleanup)(void); + void (*add)(const void *buf, int num, double entropy); + int (*pseudorand)(unsigned char *buf, int num); + int (*status)(void); +}; + +int RAND_set_rand_method(const RAND_METHOD *meth); +const RAND_METHOD *RAND_get_rand_method(void); +#ifndef OPENSSL_NO_ENGINE +int RAND_set_rand_engine(ENGINE *engine); +#endif +RAND_METHOD *RAND_SSLeay(void); + +#ifndef LIBRESSL_INTERNAL +void RAND_cleanup(void ); +int RAND_bytes(unsigned char *buf, int num); +int RAND_pseudo_bytes(unsigned char *buf, int num); +void RAND_seed(const void *buf, int num); +void RAND_add(const void *buf, int num, double entropy); +int RAND_load_file(const char *file, long max_bytes); +int RAND_write_file(const char *file); +const char *RAND_file_name(char *file, size_t num); +int RAND_status(void); +int RAND_poll(void); +#endif + +/* 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. + */ +void ERR_load_RAND_strings(void); + +/* Error codes for the RAND functions. (no longer used) */ + +/* Function codes. */ +#define RAND_F_RAND_GET_RAND_METHOD 101 +#define RAND_F_RAND_INIT_FIPS 102 +#define RAND_F_SSLEAY_RAND_BYTES 100 + +/* Reason codes. */ +#define RAND_R_DUAL_EC_DRBG_DISABLED 104 +#define RAND_R_ERROR_INITIALISING_DRBG 102 +#define RAND_R_ERROR_INSTANTIATING_DRBG 103 +#define RAND_R_NO_FIPS_RANDOM_METHOD_SET 101 +#define RAND_R_PRNG_NOT_SEEDED 100 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/rc2.h b/src/3rdparty/win32_include/openssl/rc2.h new file mode 100644 index 000000000..21511ff36 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/rc2.h @@ -0,0 +1,101 @@ +/* $OpenBSD: rc2.h,v 1.11 2014/07/10 22:45:57 jsing Exp $ */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC2_H +#define HEADER_RC2_H + +#include /* OPENSSL_NO_RC2, RC2_INT */ + +#ifdef OPENSSL_NO_RC2 +#error RC2 is disabled. +#endif + +#define RC2_ENCRYPT 1 +#define RC2_DECRYPT 0 + +#define RC2_BLOCK 8 +#define RC2_KEY_LENGTH 16 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc2_key_st + { + RC2_INT data[64]; + } RC2_KEY; + +void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data,int bits); +void RC2_ecb_encrypt(const unsigned char *in,unsigned char *out,RC2_KEY *key, + int enc); +void RC2_encrypt(unsigned long *data,RC2_KEY *key); +void RC2_decrypt(unsigned long *data,RC2_KEY *key); +void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + RC2_KEY *ks, unsigned char *iv, int enc); +void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num, int enc); +void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, RC2_KEY *schedule, unsigned char *ivec, + int *num); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/rc4.h b/src/3rdparty/win32_include/openssl/rc4.h new file mode 100644 index 000000000..f59185ed3 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/rc4.h @@ -0,0 +1,89 @@ +/* $OpenBSD: rc4.h,v 1.13 2015/10/20 15:50:13 jsing Exp $ */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RC4_H +#define HEADER_RC4_H + +#include /* OPENSSL_NO_RC4, RC4_INT */ + +#ifdef OPENSSL_NO_RC4 +#error RC4 is disabled. +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rc4_key_st { + RC4_INT x, y; + RC4_INT data[256]; +} RC4_KEY; + +const char *RC4_options(void); +void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); +void RC4(RC4_KEY *key, size_t len, const unsigned char *indata, + unsigned char *outdata); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/ripemd.h b/src/3rdparty/win32_include/openssl/ripemd.h new file mode 100644 index 000000000..a5f3a1293 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ripemd.h @@ -0,0 +1,105 @@ +/* $OpenBSD: ripemd.h,v 1.14 2014/07/10 22:45:57 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include + +#ifndef HEADER_RIPEMD_H +#define HEADER_RIPEMD_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_NO_RIPEMD +#error RIPEMD is disabled. +#endif + +#if defined(__LP32__) +#define RIPEMD160_LONG unsigned long +#elif defined(__ILP64__) +#define RIPEMD160_LONG unsigned long +#define RIPEMD160_LONG_LOG2 3 +#else +#define RIPEMD160_LONG unsigned int +#endif + +#define RIPEMD160_CBLOCK 64 +#define RIPEMD160_LBLOCK (RIPEMD160_CBLOCK/4) +#define RIPEMD160_DIGEST_LENGTH 20 + +typedef struct RIPEMD160state_st + { + RIPEMD160_LONG A,B,C,D,E; + RIPEMD160_LONG Nl,Nh; + RIPEMD160_LONG data[RIPEMD160_LBLOCK]; + unsigned int num; + } RIPEMD160_CTX; + +int RIPEMD160_Init(RIPEMD160_CTX *c); +int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); +int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); +unsigned char *RIPEMD160(const unsigned char *d, size_t n, + unsigned char *md); +void RIPEMD160_Transform(RIPEMD160_CTX *c, const unsigned char *b); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/rsa.h b/src/3rdparty/win32_include/openssl/rsa.h new file mode 100644 index 000000000..febeb297d --- /dev/null +++ b/src/3rdparty/win32_include/openssl/rsa.h @@ -0,0 +1,556 @@ +/* $OpenBSD: rsa.h,v 1.29 2016/09/04 17:25:27 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_RSA_H +#define HEADER_RSA_H + +#include + +#include + +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif + +#ifdef OPENSSL_NO_RSA +#error RSA is disabled. +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct rsa_st RSA; */ +/* typedef struct rsa_meth_st RSA_METHOD; */ + +struct rsa_meth_st { + const char *name; + int (*rsa_pub_enc)(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_pub_dec)(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_enc)(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_priv_dec)(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); + int (*rsa_mod_exp)(BIGNUM *r0, const BIGNUM *I, RSA *rsa, + BN_CTX *ctx); /* Can be null */ + int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); /* Can be null */ + int (*init)(RSA *rsa); /* called at new */ + int (*finish)(RSA *rsa); /* called at free */ + int flags; /* RSA_METHOD_FLAG_* things */ + char *app_data; /* may be needed! */ +/* New sign and verify functions: some libraries don't allow arbitrary data + * to be signed/verified: this allows them to be used. Note: for this to work + * the RSA_public_decrypt() and RSA_private_encrypt() should *NOT* be used + * RSA_sign(), RSA_verify() should be used instead. Note: for backwards + * compatibility this functionality is only enabled if the RSA_FLAG_SIGN_VER + * option is set in 'flags'. + */ + int (*rsa_sign)(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, const RSA *rsa); + int (*rsa_verify)(int dtype, const unsigned char *m, + unsigned int m_length, const unsigned char *sigbuf, + unsigned int siglen, const RSA *rsa); +/* If this callback is NULL, the builtin software RSA key-gen will be used. This + * is for behavioural compatibility whilst the code gets rewired, but one day + * it would be nice to assume there are no such things as "builtin software" + * implementations. */ + int (*rsa_keygen)(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); +}; + +struct rsa_st { + /* The first parameter is used to pickup errors where + * this is passed instead of aEVP_PKEY, it is set to 0 */ + int pad; + long version; + const RSA_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + BIGNUM *n; + BIGNUM *e; + BIGNUM *d; + BIGNUM *p; + BIGNUM *q; + BIGNUM *dmp1; + BIGNUM *dmq1; + BIGNUM *iqmp; + /* be careful using this if the RSA structure is shared */ + CRYPTO_EX_DATA ex_data; + int references; + int flags; + + /* Used to cache montgomery values */ + BN_MONT_CTX *_method_mod_n; + BN_MONT_CTX *_method_mod_p; + BN_MONT_CTX *_method_mod_q; + + /* all BIGNUM values are actually in the following data, if it is not + * NULL */ + BN_BLINDING *blinding; + BN_BLINDING *mt_blinding; +}; + +#ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +#endif + +#ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +#endif +#ifndef OPENSSL_RSA_MAX_PUBEXP_BITS +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 /* exponent limit enforced for "large" modulus only */ +#endif + +#define RSA_3 0x3L +#define RSA_F4 0x10001L + +/* Don't check pub/private match. */ +#define RSA_METHOD_FLAG_NO_CHECK 0x0001 + +#define RSA_FLAG_CACHE_PUBLIC 0x0002 +#define RSA_FLAG_CACHE_PRIVATE 0x0004 +#define RSA_FLAG_BLINDING 0x0008 +#define RSA_FLAG_THREAD_SAFE 0x0010 + +/* + * This flag means the private key operations will be handled by rsa_mod_exp + * and that they do not depend on the private key components being present: + * for example a key stored in external hardware. Without this flag bn_mod_exp + * gets called when private key components are absent. + */ +#define RSA_FLAG_EXT_PKEY 0x0020 + +/* + * This flag in the RSA_METHOD enables the new rsa_sign, rsa_verify functions. + */ +#define RSA_FLAG_SIGN_VER 0x0040 + +/* + * The built-in RSA implementation uses blinding by default, but other engines + * might not need it. + */ +#define RSA_FLAG_NO_BLINDING 0x0080 + +#define EVP_PKEY_CTX_set_rsa_padding(ctx, pad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING, \ + pad, NULL) + +#define EVP_PKEY_CTX_get_rsa_padding(ctx, ppad) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, \ + EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad) + +#define EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, len) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_RSA_PSS_SALTLEN, \ + len, NULL) + +#define EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, plen) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, \ + (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \ + EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, \ + 0, plen) + +#define EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL) + +#define EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN, \ + EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp) + +#define EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)md) + +#define EVP_PKEY_CTX_get_rsa_mgf1_md(ctx, pmd) \ + EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_SIG, \ + EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)pmd) + +#define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1) +#define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 2) + +#define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 3) +#define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4) +#define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 5) + +#define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 6) +#define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 7) +#define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 8) + +#define RSA_PKCS1_PADDING 1 +#define RSA_SSLV23_PADDING 2 +#define RSA_NO_PADDING 3 +#define RSA_PKCS1_OAEP_PADDING 4 +#define RSA_X931_PADDING 5 +/* EVP_PKEY_ only */ +#define RSA_PKCS1_PSS_PADDING 6 + +#define RSA_PKCS1_PADDING_SIZE 11 + +#define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,arg) +#define RSA_get_app_data(s) RSA_get_ex_data(s,0) + +RSA *RSA_new(void); +RSA *RSA_new_method(ENGINE *engine); +int RSA_size(const RSA *rsa); + +/* Deprecated version */ +#ifndef OPENSSL_NO_DEPRECATED +RSA *RSA_generate_key(int bits, unsigned long e, + void (*callback)(int, int, void *), void *cb_arg); +#endif /* !defined(OPENSSL_NO_DEPRECATED) */ + +/* New version */ +int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); + +int RSA_check_key(const RSA *); +/* next 4 return -1 on error */ +int RSA_public_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_encrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_public_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +int RSA_private_decrypt(int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, int padding); +void RSA_free(RSA *r); +/* "up" the RSA object's reference count */ +int RSA_up_ref(RSA *r); + +int RSA_flags(const RSA *r); + +void RSA_set_default_method(const RSA_METHOD *meth); +const RSA_METHOD *RSA_get_default_method(void); +const RSA_METHOD *RSA_get_method(const RSA *rsa); +int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); + +/* these are the actual SSLeay RSA functions */ +const RSA_METHOD *RSA_PKCS1_SSLeay(void); + +const RSA_METHOD *RSA_null_method(void); + +RSA *d2i_RSAPublicKey(RSA **a, const unsigned char **in, long len); +int i2d_RSAPublicKey(const RSA *a, unsigned char **out); +extern const ASN1_ITEM RSAPublicKey_it; +RSA *d2i_RSAPrivateKey(RSA **a, const unsigned char **in, long len); +int i2d_RSAPrivateKey(const RSA *a, unsigned char **out); +extern const ASN1_ITEM RSAPrivateKey_it; + +typedef struct rsa_pss_params_st { + X509_ALGOR *hashAlgorithm; + X509_ALGOR *maskGenAlgorithm; + ASN1_INTEGER *saltLength; + ASN1_INTEGER *trailerField; +} RSA_PSS_PARAMS; + +RSA_PSS_PARAMS *RSA_PSS_PARAMS_new(void); +void RSA_PSS_PARAMS_free(RSA_PSS_PARAMS *a); +RSA_PSS_PARAMS *d2i_RSA_PSS_PARAMS(RSA_PSS_PARAMS **a, const unsigned char **in, long len); +int i2d_RSA_PSS_PARAMS(RSA_PSS_PARAMS *a, unsigned char **out); +extern const ASN1_ITEM RSA_PSS_PARAMS_it; + +int RSA_print_fp(FILE *fp, const RSA *r, int offset); + +#ifndef OPENSSL_NO_BIO +int RSA_print(BIO *bp, const RSA *r, int offset); +#endif + +#ifndef OPENSSL_NO_RC4 +int i2d_RSA_NET(const RSA *a, unsigned char **pp, + int (*cb)(char *buf, int len, const char *prompt, int verify), int sgckey); +RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length, + int (*cb)(char *buf, int len, const char *prompt, int verify), int sgckey); + +int i2d_Netscape_RSA(const RSA *a, unsigned char **pp, + int (*cb)(char *buf, int len, const char *prompt, int verify)); +RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, + int (*cb)(char *buf, int len, const char *prompt, int verify)); +#endif + +/* The following 2 functions sign and verify a X509_SIG ASN1 object + * inside PKCS#1 padded RSA encryption */ +int RSA_sign(int type, const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, RSA *rsa); +int RSA_verify(int type, const unsigned char *m, unsigned int m_length, + const unsigned char *sigbuf, unsigned int siglen, RSA *rsa); + +/* The following 2 function sign and verify a ASN1_OCTET_STRING + * object inside PKCS#1 padded RSA encryption */ +int RSA_sign_ASN1_OCTET_STRING(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigret, unsigned int *siglen, + RSA *rsa); +int RSA_verify_ASN1_OCTET_STRING(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigbuf, unsigned int siglen, + RSA *rsa); + +int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); +void RSA_blinding_off(RSA *rsa); +BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); + +int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int PKCS1_MGF1(unsigned char *mask, long len, + const unsigned char *seed, long seedlen, const EVP_MD *dgst); +int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, + const unsigned char *p, int pl); +int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len, + const unsigned char *p, int pl); +int RSA_padding_add_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_SSLv23(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_none(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_none(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_padding_add_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl); +int RSA_padding_check_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len); +int RSA_X931_hash_id(int nid); + +int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const unsigned char *EM, int sLen); +int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, const EVP_MD *Hash, int sLen); + +int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, const unsigned char *EM, + int sLen); + +int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, const EVP_MD *Hash, const EVP_MD *mgf1Hash, + int sLen); + +int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int RSA_set_ex_data(RSA *r, int idx, void *arg); +void *RSA_get_ex_data(const RSA *r, int idx); + +RSA *RSAPublicKey_dup(RSA *rsa); +RSA *RSAPrivateKey_dup(RSA *rsa); + +/* If this flag is set the RSA method is FIPS compliant and can be used + * in FIPS mode. This is set in the validated module method. If an + * application sets this flag in its own methods it is its responsibility + * to ensure the result is compliant. + */ + +#define RSA_FLAG_FIPS_METHOD 0x0400 + +/* If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +#define RSA_FLAG_NON_FIPS_ALLOW 0x0400 +/* Application has decided PRNG is good enough to generate a key: don't + * check. + */ +#define RSA_FLAG_CHECKED 0x0800 + +/* 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. + */ +void ERR_load_RSA_strings(void); + +/* Error codes for the RSA functions. */ + +/* Function codes. */ +#define RSA_F_CHECK_PADDING_MD 140 +#define RSA_F_DO_RSA_PRINT 146 +#define RSA_F_INT_RSA_VERIFY 145 +#define RSA_F_MEMORY_LOCK 100 +#define RSA_F_OLD_RSA_PRIV_DECODE 147 +#define RSA_F_PKEY_RSA_CTRL 143 +#define RSA_F_PKEY_RSA_CTRL_STR 144 +#define RSA_F_PKEY_RSA_SIGN 142 +#define RSA_F_PKEY_RSA_VERIFY 154 +#define RSA_F_PKEY_RSA_VERIFYRECOVER 141 +#define RSA_F_RSA_BUILTIN_KEYGEN 129 +#define RSA_F_RSA_CHECK_KEY 123 +#define RSA_F_RSA_EAY_MOD_EXP 157 +#define RSA_F_RSA_EAY_PRIVATE_DECRYPT 101 +#define RSA_F_RSA_EAY_PRIVATE_ENCRYPT 102 +#define RSA_F_RSA_EAY_PUBLIC_DECRYPT 103 +#define RSA_F_RSA_EAY_PUBLIC_ENCRYPT 104 +#define RSA_F_RSA_GENERATE_KEY 105 +#define RSA_F_RSA_GENERATE_KEY_EX 155 +#define RSA_F_RSA_ITEM_VERIFY 156 +#define RSA_F_RSA_MEMORY_LOCK 130 +#define RSA_F_RSA_NEW_METHOD 106 +#define RSA_F_RSA_NULL 124 +#define RSA_F_RSA_NULL_MOD_EXP 131 +#define RSA_F_RSA_NULL_PRIVATE_DECRYPT 132 +#define RSA_F_RSA_NULL_PRIVATE_ENCRYPT 133 +#define RSA_F_RSA_NULL_PUBLIC_DECRYPT 134 +#define RSA_F_RSA_NULL_PUBLIC_ENCRYPT 135 +#define RSA_F_RSA_PADDING_ADD_NONE 107 +#define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 121 +#define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 125 +#define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 148 +#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 108 +#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 109 +#define RSA_F_RSA_PADDING_ADD_SSLV23 110 +#define RSA_F_RSA_PADDING_ADD_X931 127 +#define RSA_F_RSA_PADDING_CHECK_NONE 111 +#define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 122 +#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 112 +#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 113 +#define RSA_F_RSA_PADDING_CHECK_SSLV23 114 +#define RSA_F_RSA_PADDING_CHECK_X931 128 +#define RSA_F_RSA_PRINT 115 +#define RSA_F_RSA_PRINT_FP 116 +#define RSA_F_RSA_PRIVATE_DECRYPT 150 +#define RSA_F_RSA_PRIVATE_ENCRYPT 151 +#define RSA_F_RSA_PRIV_DECODE 137 +#define RSA_F_RSA_PRIV_ENCODE 138 +#define RSA_F_RSA_PUBLIC_DECRYPT 152 +#define RSA_F_RSA_PUBLIC_ENCRYPT 153 +#define RSA_F_RSA_PUB_DECODE 139 +#define RSA_F_RSA_SETUP_BLINDING 136 +#define RSA_F_RSA_SIGN 117 +#define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 118 +#define RSA_F_RSA_VERIFY 119 +#define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING 120 +#define RSA_F_RSA_VERIFY_PKCS1_PSS 126 +#define RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1 149 + +/* Reason codes. */ +#define RSA_R_ALGORITHM_MISMATCH 100 +#define RSA_R_BAD_E_VALUE 101 +#define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 +#define RSA_R_BAD_PAD_BYTE_COUNT 103 +#define RSA_R_BAD_SIGNATURE 104 +#define RSA_R_BLOCK_TYPE_IS_NOT_01 106 +#define RSA_R_BLOCK_TYPE_IS_NOT_02 107 +#define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 +#define RSA_R_DATA_TOO_LARGE 109 +#define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 +#define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 +#define RSA_R_DATA_TOO_SMALL 111 +#define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 +#define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112 +#define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124 +#define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125 +#define RSA_R_D_E_NOT_CONGRUENT_TO_1 123 +#define RSA_R_FIRST_OCTET_INVALID 133 +#define RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 144 +#define RSA_R_INVALID_DIGEST_LENGTH 143 +#define RSA_R_INVALID_HEADER 137 +#define RSA_R_INVALID_KEYBITS 145 +#define RSA_R_INVALID_MESSAGE_LENGTH 131 +#define RSA_R_INVALID_MGF1_MD 156 +#define RSA_R_INVALID_PADDING 138 +#define RSA_R_INVALID_PADDING_MODE 141 +#define RSA_R_INVALID_PSS_PARAMETERS 149 +#define RSA_R_INVALID_PSS_SALTLEN 146 +#define RSA_R_INVALID_SALT_LENGTH 150 +#define RSA_R_INVALID_TRAILER 139 +#define RSA_R_INVALID_X931_DIGEST 142 +#define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 +#define RSA_R_KEY_SIZE_TOO_SMALL 120 +#define RSA_R_LAST_OCTET_INVALID 134 +#define RSA_R_MODULUS_TOO_LARGE 105 +#define RSA_R_NON_FIPS_RSA_METHOD 157 +#define RSA_R_NO_PUBLIC_EXPONENT 140 +#define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 +#define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 +#define RSA_R_OAEP_DECODING_ERROR 121 +#define RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE 158 +#define RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 148 +#define RSA_R_PADDING_CHECK_FAILED 114 +#define RSA_R_P_NOT_PRIME 128 +#define RSA_R_Q_NOT_PRIME 129 +#define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 +#define RSA_R_SLEN_CHECK_FAILED 136 +#define RSA_R_SLEN_RECOVERY_FAILED 135 +#define RSA_R_SSLV3_ROLLBACK_ATTACK 115 +#define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 +#define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 +#define RSA_R_UNKNOWN_MASK_DIGEST 151 +#define RSA_R_UNKNOWN_PADDING_TYPE 118 +#define RSA_R_UNKNOWN_PSS_DIGEST 152 +#define RSA_R_UNSUPPORTED_MASK_ALGORITHM 153 +#define RSA_R_UNSUPPORTED_MASK_PARAMETER 154 +#define RSA_R_UNSUPPORTED_SIGNATURE_TYPE 155 +#define RSA_R_VALUE_MISSING 147 +#define RSA_R_WRONG_SIGNATURE_LENGTH 119 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/safestack.h b/src/3rdparty/win32_include/openssl/safestack.h new file mode 100644 index 000000000..6540174d0 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/safestack.h @@ -0,0 +1,2667 @@ +/* $OpenBSD: safestack.h,v 1.15 2016/12/27 16:02:40 jsing Exp $ */ +/* ==================================================================== + * Copyright (c) 1999 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_SAFESTACK_H +#define HEADER_SAFESTACK_H + +#include + +#ifndef CHECKED_PTR_OF +#define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +#endif + +/* In C++ we get problems because an explicit cast is needed from (void *) + * we use CHECKED_STACK_OF to ensure the correct type is passed in the macros + * below. + */ + +#define CHECKED_STACK_OF(type, p) \ + ((_STACK*) (1 ? p : (STACK_OF(type)*)0)) + +#define CHECKED_SK_FREE_FUNC(type, p) \ + ((void (*)(void *)) ((1 ? p : (void (*)(type *))0))) + +#define CHECKED_SK_FREE_FUNC2(type, p) \ + ((void (*)(void *)) ((1 ? p : (void (*)(type))0))) + +#define CHECKED_SK_CMP_FUNC(type, p) \ + ((int (*)(const void *, const void *)) \ + ((1 ? p : (int (*)(const type * const *, const type * const *))0))) + +#define STACK_OF(type) struct stack_st_##type +#define PREDECLARE_STACK_OF(type) STACK_OF(type); + +#define DECLARE_STACK_OF(type) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; +#define DECLARE_SPECIAL_STACK_OF(type, type2) \ +STACK_OF(type) \ + { \ + _STACK stack; \ + }; + +#define IMPLEMENT_STACK_OF(type) /* nada (obsolete in new safestack approach)*/ + + +/* Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * +o * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; + +typedef const char *OPENSSL_CSTRING; + +/* Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as + * mentioned above, instead of a single char each entry is a + * NUL-terminated array of chars. So, we have to implement STRING + * specially for STACK_OF. This is dealt with in the autogenerated + * macros below. + */ + +DECLARE_SPECIAL_STACK_OF(OPENSSL_STRING, char) + +/* Similarly, we sometimes use a block of characters, NOT + * nul-terminated. These should also be distinguished from "normal" + * stacks. */ + +typedef void *OPENSSL_BLOCK; +DECLARE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void) + +/* SKM_sk_... stack macros are internal to safestack.h: + * never use them directly, use sk__... instead */ +#define SKM_sk_new(type, cmp) \ + ((STACK_OF(type) *)sk_new(CHECKED_SK_CMP_FUNC(type, cmp))) +#define SKM_sk_new_null(type) \ + ((STACK_OF(type) *)sk_new_null()) +#define SKM_sk_free(type, st) \ + sk_free(CHECKED_STACK_OF(type, st)) +#define SKM_sk_num(type, st) \ + sk_num(CHECKED_STACK_OF(type, st)) +#define SKM_sk_value(type, st,i) \ + ((type *)sk_value(CHECKED_STACK_OF(type, st), i)) +#define SKM_sk_set(type, st,i,val) \ + sk_set(CHECKED_STACK_OF(type, st), i, CHECKED_PTR_OF(type, val)) +#define SKM_sk_zero(type, st) \ + sk_zero(CHECKED_STACK_OF(type, st)) +#define SKM_sk_push(type, st, val) \ + sk_push(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +#define SKM_sk_unshift(type, st, val) \ + sk_unshift(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +#define SKM_sk_find(type, st, val) \ + sk_find(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)) +#define SKM_sk_find_ex(type, st, val) \ + sk_find_ex(CHECKED_STACK_OF(type, st), \ + CHECKED_PTR_OF(type, val)) +#define SKM_sk_delete(type, st, i) \ + (type *)sk_delete(CHECKED_STACK_OF(type, st), i) +#define SKM_sk_delete_ptr(type, st, ptr) \ + (type *)sk_delete_ptr(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, ptr)) +#define SKM_sk_insert(type, st,val, i) \ + sk_insert(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val), i) +#define SKM_sk_set_cmp_func(type, st, cmp) \ + ((int (*)(const type * const *,const type * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(type, st), CHECKED_SK_CMP_FUNC(type, cmp))) +#define SKM_sk_dup(type, st) \ + (STACK_OF(type) *)sk_dup(CHECKED_STACK_OF(type, st)) +#define SKM_sk_pop_free(type, st, free_func) \ + sk_pop_free(CHECKED_STACK_OF(type, st), CHECKED_SK_FREE_FUNC(type, free_func)) +#define SKM_sk_shift(type, st) \ + (type *)sk_shift(CHECKED_STACK_OF(type, st)) +#define SKM_sk_pop(type, st) \ + (type *)sk_pop(CHECKED_STACK_OF(type, st)) +#define SKM_sk_sort(type, st) \ + sk_sort(CHECKED_STACK_OF(type, st)) +#define SKM_sk_is_sorted(type, st) \ + sk_is_sorted(CHECKED_STACK_OF(type, st)) + +#ifndef LIBRESSL_INTERNAL +#define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + (STACK_OF(type) *)d2i_ASN1_SET( \ + (STACK_OF(OPENSSL_BLOCK) **)CHECKED_PTR_OF(STACK_OF(type)*, st), \ + pp, length, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + ex_tag, ex_class) + +#define SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \ + i2d_ASN1_SET((STACK_OF(OPENSSL_BLOCK) *)CHECKED_STACK_OF(type, st), pp, \ + CHECKED_I2D_OF(type, i2d_func), \ + ex_tag, ex_class, is_set) + +#define SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \ + ASN1_seq_pack(CHECKED_PTR_OF(STACK_OF(type), st), \ + CHECKED_I2D_OF(type, i2d_func), buf, len) + +#define SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \ + (STACK_OF(type) *)ASN1_seq_unpack(buf, len, CHECKED_D2I_OF(type, d2i_func), CHECKED_SK_FREE_FUNC(type, free_func)) + +#define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \ + (STACK_OF(type) *)PKCS12_decrypt_d2i(algor, \ + CHECKED_D2I_OF(type, d2i_func), \ + CHECKED_SK_FREE_FUNC(type, free_func), \ + pass, passlen, oct, seq) +#endif + +/* This block of defines is updated by util/mkstack.pl, please do not touch! */ +#define sk_ACCESS_DESCRIPTION_new(cmp) SKM_sk_new(ACCESS_DESCRIPTION, (cmp)) +#define sk_ACCESS_DESCRIPTION_new_null() SKM_sk_new_null(ACCESS_DESCRIPTION) +#define sk_ACCESS_DESCRIPTION_free(st) SKM_sk_free(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_num(st) SKM_sk_num(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_value(st, i) SKM_sk_value(ACCESS_DESCRIPTION, (st), (i)) +#define sk_ACCESS_DESCRIPTION_set(st, i, val) SKM_sk_set(ACCESS_DESCRIPTION, (st), (i), (val)) +#define sk_ACCESS_DESCRIPTION_zero(st) SKM_sk_zero(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_push(st, val) SKM_sk_push(ACCESS_DESCRIPTION, (st), (val)) +#define sk_ACCESS_DESCRIPTION_unshift(st, val) SKM_sk_unshift(ACCESS_DESCRIPTION, (st), (val)) +#define sk_ACCESS_DESCRIPTION_find(st, val) SKM_sk_find(ACCESS_DESCRIPTION, (st), (val)) +#define sk_ACCESS_DESCRIPTION_find_ex(st, val) SKM_sk_find_ex(ACCESS_DESCRIPTION, (st), (val)) +#define sk_ACCESS_DESCRIPTION_delete(st, i) SKM_sk_delete(ACCESS_DESCRIPTION, (st), (i)) +#define sk_ACCESS_DESCRIPTION_delete_ptr(st, ptr) SKM_sk_delete_ptr(ACCESS_DESCRIPTION, (st), (ptr)) +#define sk_ACCESS_DESCRIPTION_insert(st, val, i) SKM_sk_insert(ACCESS_DESCRIPTION, (st), (val), (i)) +#define sk_ACCESS_DESCRIPTION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ACCESS_DESCRIPTION, (st), (cmp)) +#define sk_ACCESS_DESCRIPTION_dup(st) SKM_sk_dup(ACCESS_DESCRIPTION, st) +#define sk_ACCESS_DESCRIPTION_pop_free(st, free_func) SKM_sk_pop_free(ACCESS_DESCRIPTION, (st), (free_func)) +#define sk_ACCESS_DESCRIPTION_shift(st) SKM_sk_shift(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_pop(st) SKM_sk_pop(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_sort(st) SKM_sk_sort(ACCESS_DESCRIPTION, (st)) +#define sk_ACCESS_DESCRIPTION_is_sorted(st) SKM_sk_is_sorted(ACCESS_DESCRIPTION, (st)) + +#define sk_ASIdOrRange_new(cmp) SKM_sk_new(ASIdOrRange, (cmp)) +#define sk_ASIdOrRange_new_null() SKM_sk_new_null(ASIdOrRange) +#define sk_ASIdOrRange_free(st) SKM_sk_free(ASIdOrRange, (st)) +#define sk_ASIdOrRange_num(st) SKM_sk_num(ASIdOrRange, (st)) +#define sk_ASIdOrRange_value(st, i) SKM_sk_value(ASIdOrRange, (st), (i)) +#define sk_ASIdOrRange_set(st, i, val) SKM_sk_set(ASIdOrRange, (st), (i), (val)) +#define sk_ASIdOrRange_zero(st) SKM_sk_zero(ASIdOrRange, (st)) +#define sk_ASIdOrRange_push(st, val) SKM_sk_push(ASIdOrRange, (st), (val)) +#define sk_ASIdOrRange_unshift(st, val) SKM_sk_unshift(ASIdOrRange, (st), (val)) +#define sk_ASIdOrRange_find(st, val) SKM_sk_find(ASIdOrRange, (st), (val)) +#define sk_ASIdOrRange_find_ex(st, val) SKM_sk_find_ex(ASIdOrRange, (st), (val)) +#define sk_ASIdOrRange_delete(st, i) SKM_sk_delete(ASIdOrRange, (st), (i)) +#define sk_ASIdOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASIdOrRange, (st), (ptr)) +#define sk_ASIdOrRange_insert(st, val, i) SKM_sk_insert(ASIdOrRange, (st), (val), (i)) +#define sk_ASIdOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASIdOrRange, (st), (cmp)) +#define sk_ASIdOrRange_dup(st) SKM_sk_dup(ASIdOrRange, st) +#define sk_ASIdOrRange_pop_free(st, free_func) SKM_sk_pop_free(ASIdOrRange, (st), (free_func)) +#define sk_ASIdOrRange_shift(st) SKM_sk_shift(ASIdOrRange, (st)) +#define sk_ASIdOrRange_pop(st) SKM_sk_pop(ASIdOrRange, (st)) +#define sk_ASIdOrRange_sort(st) SKM_sk_sort(ASIdOrRange, (st)) +#define sk_ASIdOrRange_is_sorted(st) SKM_sk_is_sorted(ASIdOrRange, (st)) + +#define sk_ASN1_GENERALSTRING_new(cmp) SKM_sk_new(ASN1_GENERALSTRING, (cmp)) +#define sk_ASN1_GENERALSTRING_new_null() SKM_sk_new_null(ASN1_GENERALSTRING) +#define sk_ASN1_GENERALSTRING_free(st) SKM_sk_free(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_num(st) SKM_sk_num(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_value(st, i) SKM_sk_value(ASN1_GENERALSTRING, (st), (i)) +#define sk_ASN1_GENERALSTRING_set(st, i, val) SKM_sk_set(ASN1_GENERALSTRING, (st), (i), (val)) +#define sk_ASN1_GENERALSTRING_zero(st) SKM_sk_zero(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_push(st, val) SKM_sk_push(ASN1_GENERALSTRING, (st), (val)) +#define sk_ASN1_GENERALSTRING_unshift(st, val) SKM_sk_unshift(ASN1_GENERALSTRING, (st), (val)) +#define sk_ASN1_GENERALSTRING_find(st, val) SKM_sk_find(ASN1_GENERALSTRING, (st), (val)) +#define sk_ASN1_GENERALSTRING_find_ex(st, val) SKM_sk_find_ex(ASN1_GENERALSTRING, (st), (val)) +#define sk_ASN1_GENERALSTRING_delete(st, i) SKM_sk_delete(ASN1_GENERALSTRING, (st), (i)) +#define sk_ASN1_GENERALSTRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_GENERALSTRING, (st), (ptr)) +#define sk_ASN1_GENERALSTRING_insert(st, val, i) SKM_sk_insert(ASN1_GENERALSTRING, (st), (val), (i)) +#define sk_ASN1_GENERALSTRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_GENERALSTRING, (st), (cmp)) +#define sk_ASN1_GENERALSTRING_dup(st) SKM_sk_dup(ASN1_GENERALSTRING, st) +#define sk_ASN1_GENERALSTRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_GENERALSTRING, (st), (free_func)) +#define sk_ASN1_GENERALSTRING_shift(st) SKM_sk_shift(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_pop(st) SKM_sk_pop(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_sort(st) SKM_sk_sort(ASN1_GENERALSTRING, (st)) +#define sk_ASN1_GENERALSTRING_is_sorted(st) SKM_sk_is_sorted(ASN1_GENERALSTRING, (st)) + +#define sk_ASN1_INTEGER_new(cmp) SKM_sk_new(ASN1_INTEGER, (cmp)) +#define sk_ASN1_INTEGER_new_null() SKM_sk_new_null(ASN1_INTEGER) +#define sk_ASN1_INTEGER_free(st) SKM_sk_free(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_num(st) SKM_sk_num(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_value(st, i) SKM_sk_value(ASN1_INTEGER, (st), (i)) +#define sk_ASN1_INTEGER_set(st, i, val) SKM_sk_set(ASN1_INTEGER, (st), (i), (val)) +#define sk_ASN1_INTEGER_zero(st) SKM_sk_zero(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_push(st, val) SKM_sk_push(ASN1_INTEGER, (st), (val)) +#define sk_ASN1_INTEGER_unshift(st, val) SKM_sk_unshift(ASN1_INTEGER, (st), (val)) +#define sk_ASN1_INTEGER_find(st, val) SKM_sk_find(ASN1_INTEGER, (st), (val)) +#define sk_ASN1_INTEGER_find_ex(st, val) SKM_sk_find_ex(ASN1_INTEGER, (st), (val)) +#define sk_ASN1_INTEGER_delete(st, i) SKM_sk_delete(ASN1_INTEGER, (st), (i)) +#define sk_ASN1_INTEGER_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_INTEGER, (st), (ptr)) +#define sk_ASN1_INTEGER_insert(st, val, i) SKM_sk_insert(ASN1_INTEGER, (st), (val), (i)) +#define sk_ASN1_INTEGER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_INTEGER, (st), (cmp)) +#define sk_ASN1_INTEGER_dup(st) SKM_sk_dup(ASN1_INTEGER, st) +#define sk_ASN1_INTEGER_pop_free(st, free_func) SKM_sk_pop_free(ASN1_INTEGER, (st), (free_func)) +#define sk_ASN1_INTEGER_shift(st) SKM_sk_shift(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_pop(st) SKM_sk_pop(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_sort(st) SKM_sk_sort(ASN1_INTEGER, (st)) +#define sk_ASN1_INTEGER_is_sorted(st) SKM_sk_is_sorted(ASN1_INTEGER, (st)) + +#define sk_ASN1_OBJECT_new(cmp) SKM_sk_new(ASN1_OBJECT, (cmp)) +#define sk_ASN1_OBJECT_new_null() SKM_sk_new_null(ASN1_OBJECT) +#define sk_ASN1_OBJECT_free(st) SKM_sk_free(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_num(st) SKM_sk_num(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_value(st, i) SKM_sk_value(ASN1_OBJECT, (st), (i)) +#define sk_ASN1_OBJECT_set(st, i, val) SKM_sk_set(ASN1_OBJECT, (st), (i), (val)) +#define sk_ASN1_OBJECT_zero(st) SKM_sk_zero(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_push(st, val) SKM_sk_push(ASN1_OBJECT, (st), (val)) +#define sk_ASN1_OBJECT_unshift(st, val) SKM_sk_unshift(ASN1_OBJECT, (st), (val)) +#define sk_ASN1_OBJECT_find(st, val) SKM_sk_find(ASN1_OBJECT, (st), (val)) +#define sk_ASN1_OBJECT_find_ex(st, val) SKM_sk_find_ex(ASN1_OBJECT, (st), (val)) +#define sk_ASN1_OBJECT_delete(st, i) SKM_sk_delete(ASN1_OBJECT, (st), (i)) +#define sk_ASN1_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_OBJECT, (st), (ptr)) +#define sk_ASN1_OBJECT_insert(st, val, i) SKM_sk_insert(ASN1_OBJECT, (st), (val), (i)) +#define sk_ASN1_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_OBJECT, (st), (cmp)) +#define sk_ASN1_OBJECT_dup(st) SKM_sk_dup(ASN1_OBJECT, st) +#define sk_ASN1_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(ASN1_OBJECT, (st), (free_func)) +#define sk_ASN1_OBJECT_shift(st) SKM_sk_shift(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_pop(st) SKM_sk_pop(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_sort(st) SKM_sk_sort(ASN1_OBJECT, (st)) +#define sk_ASN1_OBJECT_is_sorted(st) SKM_sk_is_sorted(ASN1_OBJECT, (st)) + +#define sk_ASN1_STRING_TABLE_new(cmp) SKM_sk_new(ASN1_STRING_TABLE, (cmp)) +#define sk_ASN1_STRING_TABLE_new_null() SKM_sk_new_null(ASN1_STRING_TABLE) +#define sk_ASN1_STRING_TABLE_free(st) SKM_sk_free(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_num(st) SKM_sk_num(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_value(st, i) SKM_sk_value(ASN1_STRING_TABLE, (st), (i)) +#define sk_ASN1_STRING_TABLE_set(st, i, val) SKM_sk_set(ASN1_STRING_TABLE, (st), (i), (val)) +#define sk_ASN1_STRING_TABLE_zero(st) SKM_sk_zero(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_push(st, val) SKM_sk_push(ASN1_STRING_TABLE, (st), (val)) +#define sk_ASN1_STRING_TABLE_unshift(st, val) SKM_sk_unshift(ASN1_STRING_TABLE, (st), (val)) +#define sk_ASN1_STRING_TABLE_find(st, val) SKM_sk_find(ASN1_STRING_TABLE, (st), (val)) +#define sk_ASN1_STRING_TABLE_find_ex(st, val) SKM_sk_find_ex(ASN1_STRING_TABLE, (st), (val)) +#define sk_ASN1_STRING_TABLE_delete(st, i) SKM_sk_delete(ASN1_STRING_TABLE, (st), (i)) +#define sk_ASN1_STRING_TABLE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_STRING_TABLE, (st), (ptr)) +#define sk_ASN1_STRING_TABLE_insert(st, val, i) SKM_sk_insert(ASN1_STRING_TABLE, (st), (val), (i)) +#define sk_ASN1_STRING_TABLE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_STRING_TABLE, (st), (cmp)) +#define sk_ASN1_STRING_TABLE_dup(st) SKM_sk_dup(ASN1_STRING_TABLE, st) +#define sk_ASN1_STRING_TABLE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_STRING_TABLE, (st), (free_func)) +#define sk_ASN1_STRING_TABLE_shift(st) SKM_sk_shift(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_pop(st) SKM_sk_pop(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_sort(st) SKM_sk_sort(ASN1_STRING_TABLE, (st)) +#define sk_ASN1_STRING_TABLE_is_sorted(st) SKM_sk_is_sorted(ASN1_STRING_TABLE, (st)) + +#define sk_ASN1_TYPE_new(cmp) SKM_sk_new(ASN1_TYPE, (cmp)) +#define sk_ASN1_TYPE_new_null() SKM_sk_new_null(ASN1_TYPE) +#define sk_ASN1_TYPE_free(st) SKM_sk_free(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_num(st) SKM_sk_num(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_value(st, i) SKM_sk_value(ASN1_TYPE, (st), (i)) +#define sk_ASN1_TYPE_set(st, i, val) SKM_sk_set(ASN1_TYPE, (st), (i), (val)) +#define sk_ASN1_TYPE_zero(st) SKM_sk_zero(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_push(st, val) SKM_sk_push(ASN1_TYPE, (st), (val)) +#define sk_ASN1_TYPE_unshift(st, val) SKM_sk_unshift(ASN1_TYPE, (st), (val)) +#define sk_ASN1_TYPE_find(st, val) SKM_sk_find(ASN1_TYPE, (st), (val)) +#define sk_ASN1_TYPE_find_ex(st, val) SKM_sk_find_ex(ASN1_TYPE, (st), (val)) +#define sk_ASN1_TYPE_delete(st, i) SKM_sk_delete(ASN1_TYPE, (st), (i)) +#define sk_ASN1_TYPE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_TYPE, (st), (ptr)) +#define sk_ASN1_TYPE_insert(st, val, i) SKM_sk_insert(ASN1_TYPE, (st), (val), (i)) +#define sk_ASN1_TYPE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_TYPE, (st), (cmp)) +#define sk_ASN1_TYPE_dup(st) SKM_sk_dup(ASN1_TYPE, st) +#define sk_ASN1_TYPE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_TYPE, (st), (free_func)) +#define sk_ASN1_TYPE_shift(st) SKM_sk_shift(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_pop(st) SKM_sk_pop(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_sort(st) SKM_sk_sort(ASN1_TYPE, (st)) +#define sk_ASN1_TYPE_is_sorted(st) SKM_sk_is_sorted(ASN1_TYPE, (st)) + +#define sk_ASN1_UTF8STRING_new(cmp) SKM_sk_new(ASN1_UTF8STRING, (cmp)) +#define sk_ASN1_UTF8STRING_new_null() SKM_sk_new_null(ASN1_UTF8STRING) +#define sk_ASN1_UTF8STRING_free(st) SKM_sk_free(ASN1_UTF8STRING, (st)) +#define sk_ASN1_UTF8STRING_num(st) SKM_sk_num(ASN1_UTF8STRING, (st)) +#define sk_ASN1_UTF8STRING_value(st, i) SKM_sk_value(ASN1_UTF8STRING, (st), (i)) +#define sk_ASN1_UTF8STRING_set(st, i, val) SKM_sk_set(ASN1_UTF8STRING, (st), (i), (val)) +#define sk_ASN1_UTF8STRING_zero(st) SKM_sk_zero(ASN1_UTF8STRING, (st)) +#define sk_ASN1_UTF8STRING_push(st, val) SKM_sk_push(ASN1_UTF8STRING, (st), (val)) +#define sk_ASN1_UTF8STRING_unshift(st, val) SKM_sk_unshift(ASN1_UTF8STRING, (st), (val)) +#define sk_ASN1_UTF8STRING_find(st, val) SKM_sk_find(ASN1_UTF8STRING, (st), (val)) +#define sk_ASN1_UTF8STRING_find_ex(st, val) SKM_sk_find_ex(ASN1_UTF8STRING, (st), (val)) +#define sk_ASN1_UTF8STRING_delete(st, i) SKM_sk_delete(ASN1_UTF8STRING, (st), (i)) +#define sk_ASN1_UTF8STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_UTF8STRING, (st), (ptr)) +#define sk_ASN1_UTF8STRING_insert(st, val, i) SKM_sk_insert(ASN1_UTF8STRING, (st), (val), (i)) +#define sk_ASN1_UTF8STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_UTF8STRING, (st), (cmp)) +#define sk_ASN1_UTF8STRING_dup(st) SKM_sk_dup(ASN1_UTF8STRING, st) +#define sk_ASN1_UTF8STRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_UTF8STRING, (st), (free_func)) +#define sk_ASN1_UTF8STRING_shift(st) SKM_sk_shift(ASN1_UTF8STRING, (st)) +#define sk_ASN1_UTF8STRING_pop(st) SKM_sk_pop(ASN1_UTF8STRING, (st)) +#define sk_ASN1_UTF8STRING_sort(st) SKM_sk_sort(ASN1_UTF8STRING, (st)) +#define sk_ASN1_UTF8STRING_is_sorted(st) SKM_sk_is_sorted(ASN1_UTF8STRING, (st)) + +#define sk_ASN1_VALUE_new(cmp) SKM_sk_new(ASN1_VALUE, (cmp)) +#define sk_ASN1_VALUE_new_null() SKM_sk_new_null(ASN1_VALUE) +#define sk_ASN1_VALUE_free(st) SKM_sk_free(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_num(st) SKM_sk_num(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_value(st, i) SKM_sk_value(ASN1_VALUE, (st), (i)) +#define sk_ASN1_VALUE_set(st, i, val) SKM_sk_set(ASN1_VALUE, (st), (i), (val)) +#define sk_ASN1_VALUE_zero(st) SKM_sk_zero(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_push(st, val) SKM_sk_push(ASN1_VALUE, (st), (val)) +#define sk_ASN1_VALUE_unshift(st, val) SKM_sk_unshift(ASN1_VALUE, (st), (val)) +#define sk_ASN1_VALUE_find(st, val) SKM_sk_find(ASN1_VALUE, (st), (val)) +#define sk_ASN1_VALUE_find_ex(st, val) SKM_sk_find_ex(ASN1_VALUE, (st), (val)) +#define sk_ASN1_VALUE_delete(st, i) SKM_sk_delete(ASN1_VALUE, (st), (i)) +#define sk_ASN1_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_VALUE, (st), (ptr)) +#define sk_ASN1_VALUE_insert(st, val, i) SKM_sk_insert(ASN1_VALUE, (st), (val), (i)) +#define sk_ASN1_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_VALUE, (st), (cmp)) +#define sk_ASN1_VALUE_dup(st) SKM_sk_dup(ASN1_VALUE, st) +#define sk_ASN1_VALUE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_VALUE, (st), (free_func)) +#define sk_ASN1_VALUE_shift(st) SKM_sk_shift(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_pop(st) SKM_sk_pop(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_sort(st) SKM_sk_sort(ASN1_VALUE, (st)) +#define sk_ASN1_VALUE_is_sorted(st) SKM_sk_is_sorted(ASN1_VALUE, (st)) + +#define sk_BIO_new(cmp) SKM_sk_new(BIO, (cmp)) +#define sk_BIO_new_null() SKM_sk_new_null(BIO) +#define sk_BIO_free(st) SKM_sk_free(BIO, (st)) +#define sk_BIO_num(st) SKM_sk_num(BIO, (st)) +#define sk_BIO_value(st, i) SKM_sk_value(BIO, (st), (i)) +#define sk_BIO_set(st, i, val) SKM_sk_set(BIO, (st), (i), (val)) +#define sk_BIO_zero(st) SKM_sk_zero(BIO, (st)) +#define sk_BIO_push(st, val) SKM_sk_push(BIO, (st), (val)) +#define sk_BIO_unshift(st, val) SKM_sk_unshift(BIO, (st), (val)) +#define sk_BIO_find(st, val) SKM_sk_find(BIO, (st), (val)) +#define sk_BIO_find_ex(st, val) SKM_sk_find_ex(BIO, (st), (val)) +#define sk_BIO_delete(st, i) SKM_sk_delete(BIO, (st), (i)) +#define sk_BIO_delete_ptr(st, ptr) SKM_sk_delete_ptr(BIO, (st), (ptr)) +#define sk_BIO_insert(st, val, i) SKM_sk_insert(BIO, (st), (val), (i)) +#define sk_BIO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BIO, (st), (cmp)) +#define sk_BIO_dup(st) SKM_sk_dup(BIO, st) +#define sk_BIO_pop_free(st, free_func) SKM_sk_pop_free(BIO, (st), (free_func)) +#define sk_BIO_shift(st) SKM_sk_shift(BIO, (st)) +#define sk_BIO_pop(st) SKM_sk_pop(BIO, (st)) +#define sk_BIO_sort(st) SKM_sk_sort(BIO, (st)) +#define sk_BIO_is_sorted(st) SKM_sk_is_sorted(BIO, (st)) + +#define sk_BY_DIR_ENTRY_new(cmp) SKM_sk_new(BY_DIR_ENTRY, (cmp)) +#define sk_BY_DIR_ENTRY_new_null() SKM_sk_new_null(BY_DIR_ENTRY) +#define sk_BY_DIR_ENTRY_free(st) SKM_sk_free(BY_DIR_ENTRY, (st)) +#define sk_BY_DIR_ENTRY_num(st) SKM_sk_num(BY_DIR_ENTRY, (st)) +#define sk_BY_DIR_ENTRY_value(st, i) SKM_sk_value(BY_DIR_ENTRY, (st), (i)) +#define sk_BY_DIR_ENTRY_set(st, i, val) SKM_sk_set(BY_DIR_ENTRY, (st), (i), (val)) +#define sk_BY_DIR_ENTRY_zero(st) SKM_sk_zero(BY_DIR_ENTRY, (st)) +#define sk_BY_DIR_ENTRY_push(st, val) SKM_sk_push(BY_DIR_ENTRY, (st), (val)) +#define sk_BY_DIR_ENTRY_unshift(st, val) SKM_sk_unshift(BY_DIR_ENTRY, (st), (val)) +#define sk_BY_DIR_ENTRY_find(st, val) SKM_sk_find(BY_DIR_ENTRY, (st), (val)) +#define sk_BY_DIR_ENTRY_find_ex(st, val) SKM_sk_find_ex(BY_DIR_ENTRY, (st), (val)) +#define sk_BY_DIR_ENTRY_delete(st, i) SKM_sk_delete(BY_DIR_ENTRY, (st), (i)) +#define sk_BY_DIR_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_ENTRY, (st), (ptr)) +#define sk_BY_DIR_ENTRY_insert(st, val, i) SKM_sk_insert(BY_DIR_ENTRY, (st), (val), (i)) +#define sk_BY_DIR_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_ENTRY, (st), (cmp)) +#define sk_BY_DIR_ENTRY_dup(st) SKM_sk_dup(BY_DIR_ENTRY, st) +#define sk_BY_DIR_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_ENTRY, (st), (free_func)) +#define sk_BY_DIR_ENTRY_shift(st) SKM_sk_shift(BY_DIR_ENTRY, (st)) +#define sk_BY_DIR_ENTRY_pop(st) SKM_sk_pop(BY_DIR_ENTRY, (st)) +#define sk_BY_DIR_ENTRY_sort(st) SKM_sk_sort(BY_DIR_ENTRY, (st)) +#define sk_BY_DIR_ENTRY_is_sorted(st) SKM_sk_is_sorted(BY_DIR_ENTRY, (st)) + +#define sk_BY_DIR_HASH_new(cmp) SKM_sk_new(BY_DIR_HASH, (cmp)) +#define sk_BY_DIR_HASH_new_null() SKM_sk_new_null(BY_DIR_HASH) +#define sk_BY_DIR_HASH_free(st) SKM_sk_free(BY_DIR_HASH, (st)) +#define sk_BY_DIR_HASH_num(st) SKM_sk_num(BY_DIR_HASH, (st)) +#define sk_BY_DIR_HASH_value(st, i) SKM_sk_value(BY_DIR_HASH, (st), (i)) +#define sk_BY_DIR_HASH_set(st, i, val) SKM_sk_set(BY_DIR_HASH, (st), (i), (val)) +#define sk_BY_DIR_HASH_zero(st) SKM_sk_zero(BY_DIR_HASH, (st)) +#define sk_BY_DIR_HASH_push(st, val) SKM_sk_push(BY_DIR_HASH, (st), (val)) +#define sk_BY_DIR_HASH_unshift(st, val) SKM_sk_unshift(BY_DIR_HASH, (st), (val)) +#define sk_BY_DIR_HASH_find(st, val) SKM_sk_find(BY_DIR_HASH, (st), (val)) +#define sk_BY_DIR_HASH_find_ex(st, val) SKM_sk_find_ex(BY_DIR_HASH, (st), (val)) +#define sk_BY_DIR_HASH_delete(st, i) SKM_sk_delete(BY_DIR_HASH, (st), (i)) +#define sk_BY_DIR_HASH_delete_ptr(st, ptr) SKM_sk_delete_ptr(BY_DIR_HASH, (st), (ptr)) +#define sk_BY_DIR_HASH_insert(st, val, i) SKM_sk_insert(BY_DIR_HASH, (st), (val), (i)) +#define sk_BY_DIR_HASH_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BY_DIR_HASH, (st), (cmp)) +#define sk_BY_DIR_HASH_dup(st) SKM_sk_dup(BY_DIR_HASH, st) +#define sk_BY_DIR_HASH_pop_free(st, free_func) SKM_sk_pop_free(BY_DIR_HASH, (st), (free_func)) +#define sk_BY_DIR_HASH_shift(st) SKM_sk_shift(BY_DIR_HASH, (st)) +#define sk_BY_DIR_HASH_pop(st) SKM_sk_pop(BY_DIR_HASH, (st)) +#define sk_BY_DIR_HASH_sort(st) SKM_sk_sort(BY_DIR_HASH, (st)) +#define sk_BY_DIR_HASH_is_sorted(st) SKM_sk_is_sorted(BY_DIR_HASH, (st)) + +#define sk_CMS_CertificateChoices_new(cmp) SKM_sk_new(CMS_CertificateChoices, (cmp)) +#define sk_CMS_CertificateChoices_new_null() SKM_sk_new_null(CMS_CertificateChoices) +#define sk_CMS_CertificateChoices_free(st) SKM_sk_free(CMS_CertificateChoices, (st)) +#define sk_CMS_CertificateChoices_num(st) SKM_sk_num(CMS_CertificateChoices, (st)) +#define sk_CMS_CertificateChoices_value(st, i) SKM_sk_value(CMS_CertificateChoices, (st), (i)) +#define sk_CMS_CertificateChoices_set(st, i, val) SKM_sk_set(CMS_CertificateChoices, (st), (i), (val)) +#define sk_CMS_CertificateChoices_zero(st) SKM_sk_zero(CMS_CertificateChoices, (st)) +#define sk_CMS_CertificateChoices_push(st, val) SKM_sk_push(CMS_CertificateChoices, (st), (val)) +#define sk_CMS_CertificateChoices_unshift(st, val) SKM_sk_unshift(CMS_CertificateChoices, (st), (val)) +#define sk_CMS_CertificateChoices_find(st, val) SKM_sk_find(CMS_CertificateChoices, (st), (val)) +#define sk_CMS_CertificateChoices_find_ex(st, val) SKM_sk_find_ex(CMS_CertificateChoices, (st), (val)) +#define sk_CMS_CertificateChoices_delete(st, i) SKM_sk_delete(CMS_CertificateChoices, (st), (i)) +#define sk_CMS_CertificateChoices_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_CertificateChoices, (st), (ptr)) +#define sk_CMS_CertificateChoices_insert(st, val, i) SKM_sk_insert(CMS_CertificateChoices, (st), (val), (i)) +#define sk_CMS_CertificateChoices_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_CertificateChoices, (st), (cmp)) +#define sk_CMS_CertificateChoices_dup(st) SKM_sk_dup(CMS_CertificateChoices, st) +#define sk_CMS_CertificateChoices_pop_free(st, free_func) SKM_sk_pop_free(CMS_CertificateChoices, (st), (free_func)) +#define sk_CMS_CertificateChoices_shift(st) SKM_sk_shift(CMS_CertificateChoices, (st)) +#define sk_CMS_CertificateChoices_pop(st) SKM_sk_pop(CMS_CertificateChoices, (st)) +#define sk_CMS_CertificateChoices_sort(st) SKM_sk_sort(CMS_CertificateChoices, (st)) +#define sk_CMS_CertificateChoices_is_sorted(st) SKM_sk_is_sorted(CMS_CertificateChoices, (st)) + +#define sk_CMS_RecipientInfo_new(cmp) SKM_sk_new(CMS_RecipientInfo, (cmp)) +#define sk_CMS_RecipientInfo_new_null() SKM_sk_new_null(CMS_RecipientInfo) +#define sk_CMS_RecipientInfo_free(st) SKM_sk_free(CMS_RecipientInfo, (st)) +#define sk_CMS_RecipientInfo_num(st) SKM_sk_num(CMS_RecipientInfo, (st)) +#define sk_CMS_RecipientInfo_value(st, i) SKM_sk_value(CMS_RecipientInfo, (st), (i)) +#define sk_CMS_RecipientInfo_set(st, i, val) SKM_sk_set(CMS_RecipientInfo, (st), (i), (val)) +#define sk_CMS_RecipientInfo_zero(st) SKM_sk_zero(CMS_RecipientInfo, (st)) +#define sk_CMS_RecipientInfo_push(st, val) SKM_sk_push(CMS_RecipientInfo, (st), (val)) +#define sk_CMS_RecipientInfo_unshift(st, val) SKM_sk_unshift(CMS_RecipientInfo, (st), (val)) +#define sk_CMS_RecipientInfo_find(st, val) SKM_sk_find(CMS_RecipientInfo, (st), (val)) +#define sk_CMS_RecipientInfo_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientInfo, (st), (val)) +#define sk_CMS_RecipientInfo_delete(st, i) SKM_sk_delete(CMS_RecipientInfo, (st), (i)) +#define sk_CMS_RecipientInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientInfo, (st), (ptr)) +#define sk_CMS_RecipientInfo_insert(st, val, i) SKM_sk_insert(CMS_RecipientInfo, (st), (val), (i)) +#define sk_CMS_RecipientInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientInfo, (st), (cmp)) +#define sk_CMS_RecipientInfo_dup(st) SKM_sk_dup(CMS_RecipientInfo, st) +#define sk_CMS_RecipientInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientInfo, (st), (free_func)) +#define sk_CMS_RecipientInfo_shift(st) SKM_sk_shift(CMS_RecipientInfo, (st)) +#define sk_CMS_RecipientInfo_pop(st) SKM_sk_pop(CMS_RecipientInfo, (st)) +#define sk_CMS_RecipientInfo_sort(st) SKM_sk_sort(CMS_RecipientInfo, (st)) +#define sk_CMS_RecipientInfo_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientInfo, (st)) + +#define sk_CMS_RevocationInfoChoice_new(cmp) SKM_sk_new(CMS_RevocationInfoChoice, (cmp)) +#define sk_CMS_RevocationInfoChoice_new_null() SKM_sk_new_null(CMS_RevocationInfoChoice) +#define sk_CMS_RevocationInfoChoice_free(st) SKM_sk_free(CMS_RevocationInfoChoice, (st)) +#define sk_CMS_RevocationInfoChoice_num(st) SKM_sk_num(CMS_RevocationInfoChoice, (st)) +#define sk_CMS_RevocationInfoChoice_value(st, i) SKM_sk_value(CMS_RevocationInfoChoice, (st), (i)) +#define sk_CMS_RevocationInfoChoice_set(st, i, val) SKM_sk_set(CMS_RevocationInfoChoice, (st), (i), (val)) +#define sk_CMS_RevocationInfoChoice_zero(st) SKM_sk_zero(CMS_RevocationInfoChoice, (st)) +#define sk_CMS_RevocationInfoChoice_push(st, val) SKM_sk_push(CMS_RevocationInfoChoice, (st), (val)) +#define sk_CMS_RevocationInfoChoice_unshift(st, val) SKM_sk_unshift(CMS_RevocationInfoChoice, (st), (val)) +#define sk_CMS_RevocationInfoChoice_find(st, val) SKM_sk_find(CMS_RevocationInfoChoice, (st), (val)) +#define sk_CMS_RevocationInfoChoice_find_ex(st, val) SKM_sk_find_ex(CMS_RevocationInfoChoice, (st), (val)) +#define sk_CMS_RevocationInfoChoice_delete(st, i) SKM_sk_delete(CMS_RevocationInfoChoice, (st), (i)) +#define sk_CMS_RevocationInfoChoice_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RevocationInfoChoice, (st), (ptr)) +#define sk_CMS_RevocationInfoChoice_insert(st, val, i) SKM_sk_insert(CMS_RevocationInfoChoice, (st), (val), (i)) +#define sk_CMS_RevocationInfoChoice_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RevocationInfoChoice, (st), (cmp)) +#define sk_CMS_RevocationInfoChoice_dup(st) SKM_sk_dup(CMS_RevocationInfoChoice, st) +#define sk_CMS_RevocationInfoChoice_pop_free(st, free_func) SKM_sk_pop_free(CMS_RevocationInfoChoice, (st), (free_func)) +#define sk_CMS_RevocationInfoChoice_shift(st) SKM_sk_shift(CMS_RevocationInfoChoice, (st)) +#define sk_CMS_RevocationInfoChoice_pop(st) SKM_sk_pop(CMS_RevocationInfoChoice, (st)) +#define sk_CMS_RevocationInfoChoice_sort(st) SKM_sk_sort(CMS_RevocationInfoChoice, (st)) +#define sk_CMS_RevocationInfoChoice_is_sorted(st) SKM_sk_is_sorted(CMS_RevocationInfoChoice, (st)) + +#define sk_CMS_SignerInfo_new(cmp) SKM_sk_new(CMS_SignerInfo, (cmp)) +#define sk_CMS_SignerInfo_new_null() SKM_sk_new_null(CMS_SignerInfo) +#define sk_CMS_SignerInfo_free(st) SKM_sk_free(CMS_SignerInfo, (st)) +#define sk_CMS_SignerInfo_num(st) SKM_sk_num(CMS_SignerInfo, (st)) +#define sk_CMS_SignerInfo_value(st, i) SKM_sk_value(CMS_SignerInfo, (st), (i)) +#define sk_CMS_SignerInfo_set(st, i, val) SKM_sk_set(CMS_SignerInfo, (st), (i), (val)) +#define sk_CMS_SignerInfo_zero(st) SKM_sk_zero(CMS_SignerInfo, (st)) +#define sk_CMS_SignerInfo_push(st, val) SKM_sk_push(CMS_SignerInfo, (st), (val)) +#define sk_CMS_SignerInfo_unshift(st, val) SKM_sk_unshift(CMS_SignerInfo, (st), (val)) +#define sk_CMS_SignerInfo_find(st, val) SKM_sk_find(CMS_SignerInfo, (st), (val)) +#define sk_CMS_SignerInfo_find_ex(st, val) SKM_sk_find_ex(CMS_SignerInfo, (st), (val)) +#define sk_CMS_SignerInfo_delete(st, i) SKM_sk_delete(CMS_SignerInfo, (st), (i)) +#define sk_CMS_SignerInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_SignerInfo, (st), (ptr)) +#define sk_CMS_SignerInfo_insert(st, val, i) SKM_sk_insert(CMS_SignerInfo, (st), (val), (i)) +#define sk_CMS_SignerInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_SignerInfo, (st), (cmp)) +#define sk_CMS_SignerInfo_dup(st) SKM_sk_dup(CMS_SignerInfo, st) +#define sk_CMS_SignerInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_SignerInfo, (st), (free_func)) +#define sk_CMS_SignerInfo_shift(st) SKM_sk_shift(CMS_SignerInfo, (st)) +#define sk_CMS_SignerInfo_pop(st) SKM_sk_pop(CMS_SignerInfo, (st)) +#define sk_CMS_SignerInfo_sort(st) SKM_sk_sort(CMS_SignerInfo, (st)) +#define sk_CMS_SignerInfo_is_sorted(st) SKM_sk_is_sorted(CMS_SignerInfo, (st)) + +#define sk_CONF_IMODULE_new(cmp) SKM_sk_new(CONF_IMODULE, (cmp)) +#define sk_CONF_IMODULE_new_null() SKM_sk_new_null(CONF_IMODULE) +#define sk_CONF_IMODULE_free(st) SKM_sk_free(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_num(st) SKM_sk_num(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_value(st, i) SKM_sk_value(CONF_IMODULE, (st), (i)) +#define sk_CONF_IMODULE_set(st, i, val) SKM_sk_set(CONF_IMODULE, (st), (i), (val)) +#define sk_CONF_IMODULE_zero(st) SKM_sk_zero(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_push(st, val) SKM_sk_push(CONF_IMODULE, (st), (val)) +#define sk_CONF_IMODULE_unshift(st, val) SKM_sk_unshift(CONF_IMODULE, (st), (val)) +#define sk_CONF_IMODULE_find(st, val) SKM_sk_find(CONF_IMODULE, (st), (val)) +#define sk_CONF_IMODULE_find_ex(st, val) SKM_sk_find_ex(CONF_IMODULE, (st), (val)) +#define sk_CONF_IMODULE_delete(st, i) SKM_sk_delete(CONF_IMODULE, (st), (i)) +#define sk_CONF_IMODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_IMODULE, (st), (ptr)) +#define sk_CONF_IMODULE_insert(st, val, i) SKM_sk_insert(CONF_IMODULE, (st), (val), (i)) +#define sk_CONF_IMODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_IMODULE, (st), (cmp)) +#define sk_CONF_IMODULE_dup(st) SKM_sk_dup(CONF_IMODULE, st) +#define sk_CONF_IMODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_IMODULE, (st), (free_func)) +#define sk_CONF_IMODULE_shift(st) SKM_sk_shift(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_pop(st) SKM_sk_pop(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_sort(st) SKM_sk_sort(CONF_IMODULE, (st)) +#define sk_CONF_IMODULE_is_sorted(st) SKM_sk_is_sorted(CONF_IMODULE, (st)) + +#define sk_CONF_MODULE_new(cmp) SKM_sk_new(CONF_MODULE, (cmp)) +#define sk_CONF_MODULE_new_null() SKM_sk_new_null(CONF_MODULE) +#define sk_CONF_MODULE_free(st) SKM_sk_free(CONF_MODULE, (st)) +#define sk_CONF_MODULE_num(st) SKM_sk_num(CONF_MODULE, (st)) +#define sk_CONF_MODULE_value(st, i) SKM_sk_value(CONF_MODULE, (st), (i)) +#define sk_CONF_MODULE_set(st, i, val) SKM_sk_set(CONF_MODULE, (st), (i), (val)) +#define sk_CONF_MODULE_zero(st) SKM_sk_zero(CONF_MODULE, (st)) +#define sk_CONF_MODULE_push(st, val) SKM_sk_push(CONF_MODULE, (st), (val)) +#define sk_CONF_MODULE_unshift(st, val) SKM_sk_unshift(CONF_MODULE, (st), (val)) +#define sk_CONF_MODULE_find(st, val) SKM_sk_find(CONF_MODULE, (st), (val)) +#define sk_CONF_MODULE_find_ex(st, val) SKM_sk_find_ex(CONF_MODULE, (st), (val)) +#define sk_CONF_MODULE_delete(st, i) SKM_sk_delete(CONF_MODULE, (st), (i)) +#define sk_CONF_MODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_MODULE, (st), (ptr)) +#define sk_CONF_MODULE_insert(st, val, i) SKM_sk_insert(CONF_MODULE, (st), (val), (i)) +#define sk_CONF_MODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_MODULE, (st), (cmp)) +#define sk_CONF_MODULE_dup(st) SKM_sk_dup(CONF_MODULE, st) +#define sk_CONF_MODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_MODULE, (st), (free_func)) +#define sk_CONF_MODULE_shift(st) SKM_sk_shift(CONF_MODULE, (st)) +#define sk_CONF_MODULE_pop(st) SKM_sk_pop(CONF_MODULE, (st)) +#define sk_CONF_MODULE_sort(st) SKM_sk_sort(CONF_MODULE, (st)) +#define sk_CONF_MODULE_is_sorted(st) SKM_sk_is_sorted(CONF_MODULE, (st)) + +#define sk_CONF_VALUE_new(cmp) SKM_sk_new(CONF_VALUE, (cmp)) +#define sk_CONF_VALUE_new_null() SKM_sk_new_null(CONF_VALUE) +#define sk_CONF_VALUE_free(st) SKM_sk_free(CONF_VALUE, (st)) +#define sk_CONF_VALUE_num(st) SKM_sk_num(CONF_VALUE, (st)) +#define sk_CONF_VALUE_value(st, i) SKM_sk_value(CONF_VALUE, (st), (i)) +#define sk_CONF_VALUE_set(st, i, val) SKM_sk_set(CONF_VALUE, (st), (i), (val)) +#define sk_CONF_VALUE_zero(st) SKM_sk_zero(CONF_VALUE, (st)) +#define sk_CONF_VALUE_push(st, val) SKM_sk_push(CONF_VALUE, (st), (val)) +#define sk_CONF_VALUE_unshift(st, val) SKM_sk_unshift(CONF_VALUE, (st), (val)) +#define sk_CONF_VALUE_find(st, val) SKM_sk_find(CONF_VALUE, (st), (val)) +#define sk_CONF_VALUE_find_ex(st, val) SKM_sk_find_ex(CONF_VALUE, (st), (val)) +#define sk_CONF_VALUE_delete(st, i) SKM_sk_delete(CONF_VALUE, (st), (i)) +#define sk_CONF_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_VALUE, (st), (ptr)) +#define sk_CONF_VALUE_insert(st, val, i) SKM_sk_insert(CONF_VALUE, (st), (val), (i)) +#define sk_CONF_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_VALUE, (st), (cmp)) +#define sk_CONF_VALUE_dup(st) SKM_sk_dup(CONF_VALUE, st) +#define sk_CONF_VALUE_pop_free(st, free_func) SKM_sk_pop_free(CONF_VALUE, (st), (free_func)) +#define sk_CONF_VALUE_shift(st) SKM_sk_shift(CONF_VALUE, (st)) +#define sk_CONF_VALUE_pop(st) SKM_sk_pop(CONF_VALUE, (st)) +#define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st)) +#define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st)) + +#define sk_CRYPTO_EX_DATA_FUNCS_new(cmp) SKM_sk_new(CRYPTO_EX_DATA_FUNCS, (cmp)) +#define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS) +#define sk_CRYPTO_EX_DATA_FUNCS_free(st) SKM_sk_free(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i)) +#define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_zero(st) SKM_sk_zero(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_unshift(st, val) SKM_sk_unshift(CRYPTO_EX_DATA_FUNCS, (st), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_find(st, val) SKM_sk_find(CRYPTO_EX_DATA_FUNCS, (st), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_find_ex(st, val) SKM_sk_find_ex(CRYPTO_EX_DATA_FUNCS, (st), (val)) +#define sk_CRYPTO_EX_DATA_FUNCS_delete(st, i) SKM_sk_delete(CRYPTO_EX_DATA_FUNCS, (st), (i)) +#define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_EX_DATA_FUNCS, (st), (ptr)) +#define sk_CRYPTO_EX_DATA_FUNCS_insert(st, val, i) SKM_sk_insert(CRYPTO_EX_DATA_FUNCS, (st), (val), (i)) +#define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_EX_DATA_FUNCS, (st), (cmp)) +#define sk_CRYPTO_EX_DATA_FUNCS_dup(st) SKM_sk_dup(CRYPTO_EX_DATA_FUNCS, st) +#define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func)) +#define sk_CRYPTO_EX_DATA_FUNCS_shift(st) SKM_sk_shift(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_pop(st) SKM_sk_pop(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_sort(st) SKM_sk_sort(CRYPTO_EX_DATA_FUNCS, (st)) +#define sk_CRYPTO_EX_DATA_FUNCS_is_sorted(st) SKM_sk_is_sorted(CRYPTO_EX_DATA_FUNCS, (st)) + +#define sk_CRYPTO_dynlock_new(cmp) SKM_sk_new(CRYPTO_dynlock, (cmp)) +#define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock) +#define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_num(st) SKM_sk_num(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_value(st, i) SKM_sk_value(CRYPTO_dynlock, (st), (i)) +#define sk_CRYPTO_dynlock_set(st, i, val) SKM_sk_set(CRYPTO_dynlock, (st), (i), (val)) +#define sk_CRYPTO_dynlock_zero(st) SKM_sk_zero(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_push(st, val) SKM_sk_push(CRYPTO_dynlock, (st), (val)) +#define sk_CRYPTO_dynlock_unshift(st, val) SKM_sk_unshift(CRYPTO_dynlock, (st), (val)) +#define sk_CRYPTO_dynlock_find(st, val) SKM_sk_find(CRYPTO_dynlock, (st), (val)) +#define sk_CRYPTO_dynlock_find_ex(st, val) SKM_sk_find_ex(CRYPTO_dynlock, (st), (val)) +#define sk_CRYPTO_dynlock_delete(st, i) SKM_sk_delete(CRYPTO_dynlock, (st), (i)) +#define sk_CRYPTO_dynlock_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_dynlock, (st), (ptr)) +#define sk_CRYPTO_dynlock_insert(st, val, i) SKM_sk_insert(CRYPTO_dynlock, (st), (val), (i)) +#define sk_CRYPTO_dynlock_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_dynlock, (st), (cmp)) +#define sk_CRYPTO_dynlock_dup(st) SKM_sk_dup(CRYPTO_dynlock, st) +#define sk_CRYPTO_dynlock_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_dynlock, (st), (free_func)) +#define sk_CRYPTO_dynlock_shift(st) SKM_sk_shift(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_pop(st) SKM_sk_pop(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_sort(st) SKM_sk_sort(CRYPTO_dynlock, (st)) +#define sk_CRYPTO_dynlock_is_sorted(st) SKM_sk_is_sorted(CRYPTO_dynlock, (st)) + +#define sk_DIST_POINT_new(cmp) SKM_sk_new(DIST_POINT, (cmp)) +#define sk_DIST_POINT_new_null() SKM_sk_new_null(DIST_POINT) +#define sk_DIST_POINT_free(st) SKM_sk_free(DIST_POINT, (st)) +#define sk_DIST_POINT_num(st) SKM_sk_num(DIST_POINT, (st)) +#define sk_DIST_POINT_value(st, i) SKM_sk_value(DIST_POINT, (st), (i)) +#define sk_DIST_POINT_set(st, i, val) SKM_sk_set(DIST_POINT, (st), (i), (val)) +#define sk_DIST_POINT_zero(st) SKM_sk_zero(DIST_POINT, (st)) +#define sk_DIST_POINT_push(st, val) SKM_sk_push(DIST_POINT, (st), (val)) +#define sk_DIST_POINT_unshift(st, val) SKM_sk_unshift(DIST_POINT, (st), (val)) +#define sk_DIST_POINT_find(st, val) SKM_sk_find(DIST_POINT, (st), (val)) +#define sk_DIST_POINT_find_ex(st, val) SKM_sk_find_ex(DIST_POINT, (st), (val)) +#define sk_DIST_POINT_delete(st, i) SKM_sk_delete(DIST_POINT, (st), (i)) +#define sk_DIST_POINT_delete_ptr(st, ptr) SKM_sk_delete_ptr(DIST_POINT, (st), (ptr)) +#define sk_DIST_POINT_insert(st, val, i) SKM_sk_insert(DIST_POINT, (st), (val), (i)) +#define sk_DIST_POINT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(DIST_POINT, (st), (cmp)) +#define sk_DIST_POINT_dup(st) SKM_sk_dup(DIST_POINT, st) +#define sk_DIST_POINT_pop_free(st, free_func) SKM_sk_pop_free(DIST_POINT, (st), (free_func)) +#define sk_DIST_POINT_shift(st) SKM_sk_shift(DIST_POINT, (st)) +#define sk_DIST_POINT_pop(st) SKM_sk_pop(DIST_POINT, (st)) +#define sk_DIST_POINT_sort(st) SKM_sk_sort(DIST_POINT, (st)) +#define sk_DIST_POINT_is_sorted(st) SKM_sk_is_sorted(DIST_POINT, (st)) + +#define sk_ENGINE_new(cmp) SKM_sk_new(ENGINE, (cmp)) +#define sk_ENGINE_new_null() SKM_sk_new_null(ENGINE) +#define sk_ENGINE_free(st) SKM_sk_free(ENGINE, (st)) +#define sk_ENGINE_num(st) SKM_sk_num(ENGINE, (st)) +#define sk_ENGINE_value(st, i) SKM_sk_value(ENGINE, (st), (i)) +#define sk_ENGINE_set(st, i, val) SKM_sk_set(ENGINE, (st), (i), (val)) +#define sk_ENGINE_zero(st) SKM_sk_zero(ENGINE, (st)) +#define sk_ENGINE_push(st, val) SKM_sk_push(ENGINE, (st), (val)) +#define sk_ENGINE_unshift(st, val) SKM_sk_unshift(ENGINE, (st), (val)) +#define sk_ENGINE_find(st, val) SKM_sk_find(ENGINE, (st), (val)) +#define sk_ENGINE_find_ex(st, val) SKM_sk_find_ex(ENGINE, (st), (val)) +#define sk_ENGINE_delete(st, i) SKM_sk_delete(ENGINE, (st), (i)) +#define sk_ENGINE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE, (st), (ptr)) +#define sk_ENGINE_insert(st, val, i) SKM_sk_insert(ENGINE, (st), (val), (i)) +#define sk_ENGINE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE, (st), (cmp)) +#define sk_ENGINE_dup(st) SKM_sk_dup(ENGINE, st) +#define sk_ENGINE_pop_free(st, free_func) SKM_sk_pop_free(ENGINE, (st), (free_func)) +#define sk_ENGINE_shift(st) SKM_sk_shift(ENGINE, (st)) +#define sk_ENGINE_pop(st) SKM_sk_pop(ENGINE, (st)) +#define sk_ENGINE_sort(st) SKM_sk_sort(ENGINE, (st)) +#define sk_ENGINE_is_sorted(st) SKM_sk_is_sorted(ENGINE, (st)) + +#define sk_ENGINE_CLEANUP_ITEM_new(cmp) SKM_sk_new(ENGINE_CLEANUP_ITEM, (cmp)) +#define sk_ENGINE_CLEANUP_ITEM_new_null() SKM_sk_new_null(ENGINE_CLEANUP_ITEM) +#define sk_ENGINE_CLEANUP_ITEM_free(st) SKM_sk_free(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_num(st) SKM_sk_num(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_value(st, i) SKM_sk_value(ENGINE_CLEANUP_ITEM, (st), (i)) +#define sk_ENGINE_CLEANUP_ITEM_set(st, i, val) SKM_sk_set(ENGINE_CLEANUP_ITEM, (st), (i), (val)) +#define sk_ENGINE_CLEANUP_ITEM_zero(st) SKM_sk_zero(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_push(st, val) SKM_sk_push(ENGINE_CLEANUP_ITEM, (st), (val)) +#define sk_ENGINE_CLEANUP_ITEM_unshift(st, val) SKM_sk_unshift(ENGINE_CLEANUP_ITEM, (st), (val)) +#define sk_ENGINE_CLEANUP_ITEM_find(st, val) SKM_sk_find(ENGINE_CLEANUP_ITEM, (st), (val)) +#define sk_ENGINE_CLEANUP_ITEM_find_ex(st, val) SKM_sk_find_ex(ENGINE_CLEANUP_ITEM, (st), (val)) +#define sk_ENGINE_CLEANUP_ITEM_delete(st, i) SKM_sk_delete(ENGINE_CLEANUP_ITEM, (st), (i)) +#define sk_ENGINE_CLEANUP_ITEM_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE_CLEANUP_ITEM, (st), (ptr)) +#define sk_ENGINE_CLEANUP_ITEM_insert(st, val, i) SKM_sk_insert(ENGINE_CLEANUP_ITEM, (st), (val), (i)) +#define sk_ENGINE_CLEANUP_ITEM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE_CLEANUP_ITEM, (st), (cmp)) +#define sk_ENGINE_CLEANUP_ITEM_dup(st) SKM_sk_dup(ENGINE_CLEANUP_ITEM, st) +#define sk_ENGINE_CLEANUP_ITEM_pop_free(st, free_func) SKM_sk_pop_free(ENGINE_CLEANUP_ITEM, (st), (free_func)) +#define sk_ENGINE_CLEANUP_ITEM_shift(st) SKM_sk_shift(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_pop(st) SKM_sk_pop(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_sort(st) SKM_sk_sort(ENGINE_CLEANUP_ITEM, (st)) +#define sk_ENGINE_CLEANUP_ITEM_is_sorted(st) SKM_sk_is_sorted(ENGINE_CLEANUP_ITEM, (st)) + +#define sk_ESS_CERT_ID_new(cmp) SKM_sk_new(ESS_CERT_ID, (cmp)) +#define sk_ESS_CERT_ID_new_null() SKM_sk_new_null(ESS_CERT_ID) +#define sk_ESS_CERT_ID_free(st) SKM_sk_free(ESS_CERT_ID, (st)) +#define sk_ESS_CERT_ID_num(st) SKM_sk_num(ESS_CERT_ID, (st)) +#define sk_ESS_CERT_ID_value(st, i) SKM_sk_value(ESS_CERT_ID, (st), (i)) +#define sk_ESS_CERT_ID_set(st, i, val) SKM_sk_set(ESS_CERT_ID, (st), (i), (val)) +#define sk_ESS_CERT_ID_zero(st) SKM_sk_zero(ESS_CERT_ID, (st)) +#define sk_ESS_CERT_ID_push(st, val) SKM_sk_push(ESS_CERT_ID, (st), (val)) +#define sk_ESS_CERT_ID_unshift(st, val) SKM_sk_unshift(ESS_CERT_ID, (st), (val)) +#define sk_ESS_CERT_ID_find(st, val) SKM_sk_find(ESS_CERT_ID, (st), (val)) +#define sk_ESS_CERT_ID_find_ex(st, val) SKM_sk_find_ex(ESS_CERT_ID, (st), (val)) +#define sk_ESS_CERT_ID_delete(st, i) SKM_sk_delete(ESS_CERT_ID, (st), (i)) +#define sk_ESS_CERT_ID_delete_ptr(st, ptr) SKM_sk_delete_ptr(ESS_CERT_ID, (st), (ptr)) +#define sk_ESS_CERT_ID_insert(st, val, i) SKM_sk_insert(ESS_CERT_ID, (st), (val), (i)) +#define sk_ESS_CERT_ID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ESS_CERT_ID, (st), (cmp)) +#define sk_ESS_CERT_ID_dup(st) SKM_sk_dup(ESS_CERT_ID, st) +#define sk_ESS_CERT_ID_pop_free(st, free_func) SKM_sk_pop_free(ESS_CERT_ID, (st), (free_func)) +#define sk_ESS_CERT_ID_shift(st) SKM_sk_shift(ESS_CERT_ID, (st)) +#define sk_ESS_CERT_ID_pop(st) SKM_sk_pop(ESS_CERT_ID, (st)) +#define sk_ESS_CERT_ID_sort(st) SKM_sk_sort(ESS_CERT_ID, (st)) +#define sk_ESS_CERT_ID_is_sorted(st) SKM_sk_is_sorted(ESS_CERT_ID, (st)) + +#define sk_EVP_MD_new(cmp) SKM_sk_new(EVP_MD, (cmp)) +#define sk_EVP_MD_new_null() SKM_sk_new_null(EVP_MD) +#define sk_EVP_MD_free(st) SKM_sk_free(EVP_MD, (st)) +#define sk_EVP_MD_num(st) SKM_sk_num(EVP_MD, (st)) +#define sk_EVP_MD_value(st, i) SKM_sk_value(EVP_MD, (st), (i)) +#define sk_EVP_MD_set(st, i, val) SKM_sk_set(EVP_MD, (st), (i), (val)) +#define sk_EVP_MD_zero(st) SKM_sk_zero(EVP_MD, (st)) +#define sk_EVP_MD_push(st, val) SKM_sk_push(EVP_MD, (st), (val)) +#define sk_EVP_MD_unshift(st, val) SKM_sk_unshift(EVP_MD, (st), (val)) +#define sk_EVP_MD_find(st, val) SKM_sk_find(EVP_MD, (st), (val)) +#define sk_EVP_MD_find_ex(st, val) SKM_sk_find_ex(EVP_MD, (st), (val)) +#define sk_EVP_MD_delete(st, i) SKM_sk_delete(EVP_MD, (st), (i)) +#define sk_EVP_MD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_MD, (st), (ptr)) +#define sk_EVP_MD_insert(st, val, i) SKM_sk_insert(EVP_MD, (st), (val), (i)) +#define sk_EVP_MD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_MD, (st), (cmp)) +#define sk_EVP_MD_dup(st) SKM_sk_dup(EVP_MD, st) +#define sk_EVP_MD_pop_free(st, free_func) SKM_sk_pop_free(EVP_MD, (st), (free_func)) +#define sk_EVP_MD_shift(st) SKM_sk_shift(EVP_MD, (st)) +#define sk_EVP_MD_pop(st) SKM_sk_pop(EVP_MD, (st)) +#define sk_EVP_MD_sort(st) SKM_sk_sort(EVP_MD, (st)) +#define sk_EVP_MD_is_sorted(st) SKM_sk_is_sorted(EVP_MD, (st)) + +#define sk_EVP_PBE_CTL_new(cmp) SKM_sk_new(EVP_PBE_CTL, (cmp)) +#define sk_EVP_PBE_CTL_new_null() SKM_sk_new_null(EVP_PBE_CTL) +#define sk_EVP_PBE_CTL_free(st) SKM_sk_free(EVP_PBE_CTL, (st)) +#define sk_EVP_PBE_CTL_num(st) SKM_sk_num(EVP_PBE_CTL, (st)) +#define sk_EVP_PBE_CTL_value(st, i) SKM_sk_value(EVP_PBE_CTL, (st), (i)) +#define sk_EVP_PBE_CTL_set(st, i, val) SKM_sk_set(EVP_PBE_CTL, (st), (i), (val)) +#define sk_EVP_PBE_CTL_zero(st) SKM_sk_zero(EVP_PBE_CTL, (st)) +#define sk_EVP_PBE_CTL_push(st, val) SKM_sk_push(EVP_PBE_CTL, (st), (val)) +#define sk_EVP_PBE_CTL_unshift(st, val) SKM_sk_unshift(EVP_PBE_CTL, (st), (val)) +#define sk_EVP_PBE_CTL_find(st, val) SKM_sk_find(EVP_PBE_CTL, (st), (val)) +#define sk_EVP_PBE_CTL_find_ex(st, val) SKM_sk_find_ex(EVP_PBE_CTL, (st), (val)) +#define sk_EVP_PBE_CTL_delete(st, i) SKM_sk_delete(EVP_PBE_CTL, (st), (i)) +#define sk_EVP_PBE_CTL_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PBE_CTL, (st), (ptr)) +#define sk_EVP_PBE_CTL_insert(st, val, i) SKM_sk_insert(EVP_PBE_CTL, (st), (val), (i)) +#define sk_EVP_PBE_CTL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PBE_CTL, (st), (cmp)) +#define sk_EVP_PBE_CTL_dup(st) SKM_sk_dup(EVP_PBE_CTL, st) +#define sk_EVP_PBE_CTL_pop_free(st, free_func) SKM_sk_pop_free(EVP_PBE_CTL, (st), (free_func)) +#define sk_EVP_PBE_CTL_shift(st) SKM_sk_shift(EVP_PBE_CTL, (st)) +#define sk_EVP_PBE_CTL_pop(st) SKM_sk_pop(EVP_PBE_CTL, (st)) +#define sk_EVP_PBE_CTL_sort(st) SKM_sk_sort(EVP_PBE_CTL, (st)) +#define sk_EVP_PBE_CTL_is_sorted(st) SKM_sk_is_sorted(EVP_PBE_CTL, (st)) + +#define sk_EVP_PKEY_ASN1_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_ASN1_METHOD, (cmp)) +#define sk_EVP_PKEY_ASN1_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_ASN1_METHOD) +#define sk_EVP_PKEY_ASN1_METHOD_free(st) SKM_sk_free(EVP_PKEY_ASN1_METHOD, (st)) +#define sk_EVP_PKEY_ASN1_METHOD_num(st) SKM_sk_num(EVP_PKEY_ASN1_METHOD, (st)) +#define sk_EVP_PKEY_ASN1_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_ASN1_METHOD, (st), (i)) +#define sk_EVP_PKEY_ASN1_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_ASN1_METHOD, (st), (i), (val)) +#define sk_EVP_PKEY_ASN1_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_ASN1_METHOD, (st)) +#define sk_EVP_PKEY_ASN1_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_ASN1_METHOD, (st), (val)) +#define sk_EVP_PKEY_ASN1_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_ASN1_METHOD, (st), (val)) +#define sk_EVP_PKEY_ASN1_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_ASN1_METHOD, (st), (val)) +#define sk_EVP_PKEY_ASN1_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_ASN1_METHOD, (st), (val)) +#define sk_EVP_PKEY_ASN1_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_ASN1_METHOD, (st), (i)) +#define sk_EVP_PKEY_ASN1_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_ASN1_METHOD, (st), (ptr)) +#define sk_EVP_PKEY_ASN1_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_ASN1_METHOD, (st), (val), (i)) +#define sk_EVP_PKEY_ASN1_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_ASN1_METHOD, (st), (cmp)) +#define sk_EVP_PKEY_ASN1_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_ASN1_METHOD, st) +#define sk_EVP_PKEY_ASN1_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_ASN1_METHOD, (st), (free_func)) +#define sk_EVP_PKEY_ASN1_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_ASN1_METHOD, (st)) +#define sk_EVP_PKEY_ASN1_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_ASN1_METHOD, (st)) +#define sk_EVP_PKEY_ASN1_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_ASN1_METHOD, (st)) +#define sk_EVP_PKEY_ASN1_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_ASN1_METHOD, (st)) + +#define sk_EVP_PKEY_METHOD_new(cmp) SKM_sk_new(EVP_PKEY_METHOD, (cmp)) +#define sk_EVP_PKEY_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_METHOD) +#define sk_EVP_PKEY_METHOD_free(st) SKM_sk_free(EVP_PKEY_METHOD, (st)) +#define sk_EVP_PKEY_METHOD_num(st) SKM_sk_num(EVP_PKEY_METHOD, (st)) +#define sk_EVP_PKEY_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_METHOD, (st), (i)) +#define sk_EVP_PKEY_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_METHOD, (st), (i), (val)) +#define sk_EVP_PKEY_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_METHOD, (st)) +#define sk_EVP_PKEY_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_METHOD, (st), (val)) +#define sk_EVP_PKEY_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_METHOD, (st), (val)) +#define sk_EVP_PKEY_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_METHOD, (st), (val)) +#define sk_EVP_PKEY_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_METHOD, (st), (val)) +#define sk_EVP_PKEY_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_METHOD, (st), (i)) +#define sk_EVP_PKEY_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_METHOD, (st), (ptr)) +#define sk_EVP_PKEY_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_METHOD, (st), (val), (i)) +#define sk_EVP_PKEY_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_METHOD, (st), (cmp)) +#define sk_EVP_PKEY_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_METHOD, st) +#define sk_EVP_PKEY_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_METHOD, (st), (free_func)) +#define sk_EVP_PKEY_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_METHOD, (st)) +#define sk_EVP_PKEY_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_METHOD, (st)) +#define sk_EVP_PKEY_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_METHOD, (st)) +#define sk_EVP_PKEY_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_METHOD, (st)) + +#define sk_GENERAL_NAME_new(cmp) SKM_sk_new(GENERAL_NAME, (cmp)) +#define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME) +#define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i)) +#define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val)) +#define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val)) +#define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val)) +#define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val)) +#define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st), (val)) +#define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i)) +#define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st), (ptr)) +#define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val), (i)) +#define sk_GENERAL_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp)) +#define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st) +#define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME, (st), (free_func)) +#define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st)) +#define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st)) + +#define sk_GENERAL_NAMES_new(cmp) SKM_sk_new(GENERAL_NAMES, (cmp)) +#define sk_GENERAL_NAMES_new_null() SKM_sk_new_null(GENERAL_NAMES) +#define sk_GENERAL_NAMES_free(st) SKM_sk_free(GENERAL_NAMES, (st)) +#define sk_GENERAL_NAMES_num(st) SKM_sk_num(GENERAL_NAMES, (st)) +#define sk_GENERAL_NAMES_value(st, i) SKM_sk_value(GENERAL_NAMES, (st), (i)) +#define sk_GENERAL_NAMES_set(st, i, val) SKM_sk_set(GENERAL_NAMES, (st), (i), (val)) +#define sk_GENERAL_NAMES_zero(st) SKM_sk_zero(GENERAL_NAMES, (st)) +#define sk_GENERAL_NAMES_push(st, val) SKM_sk_push(GENERAL_NAMES, (st), (val)) +#define sk_GENERAL_NAMES_unshift(st, val) SKM_sk_unshift(GENERAL_NAMES, (st), (val)) +#define sk_GENERAL_NAMES_find(st, val) SKM_sk_find(GENERAL_NAMES, (st), (val)) +#define sk_GENERAL_NAMES_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAMES, (st), (val)) +#define sk_GENERAL_NAMES_delete(st, i) SKM_sk_delete(GENERAL_NAMES, (st), (i)) +#define sk_GENERAL_NAMES_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAMES, (st), (ptr)) +#define sk_GENERAL_NAMES_insert(st, val, i) SKM_sk_insert(GENERAL_NAMES, (st), (val), (i)) +#define sk_GENERAL_NAMES_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAMES, (st), (cmp)) +#define sk_GENERAL_NAMES_dup(st) SKM_sk_dup(GENERAL_NAMES, st) +#define sk_GENERAL_NAMES_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAMES, (st), (free_func)) +#define sk_GENERAL_NAMES_shift(st) SKM_sk_shift(GENERAL_NAMES, (st)) +#define sk_GENERAL_NAMES_pop(st) SKM_sk_pop(GENERAL_NAMES, (st)) +#define sk_GENERAL_NAMES_sort(st) SKM_sk_sort(GENERAL_NAMES, (st)) +#define sk_GENERAL_NAMES_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAMES, (st)) + +#define sk_GENERAL_SUBTREE_new(cmp) SKM_sk_new(GENERAL_SUBTREE, (cmp)) +#define sk_GENERAL_SUBTREE_new_null() SKM_sk_new_null(GENERAL_SUBTREE) +#define sk_GENERAL_SUBTREE_free(st) SKM_sk_free(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_num(st) SKM_sk_num(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_value(st, i) SKM_sk_value(GENERAL_SUBTREE, (st), (i)) +#define sk_GENERAL_SUBTREE_set(st, i, val) SKM_sk_set(GENERAL_SUBTREE, (st), (i), (val)) +#define sk_GENERAL_SUBTREE_zero(st) SKM_sk_zero(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_push(st, val) SKM_sk_push(GENERAL_SUBTREE, (st), (val)) +#define sk_GENERAL_SUBTREE_unshift(st, val) SKM_sk_unshift(GENERAL_SUBTREE, (st), (val)) +#define sk_GENERAL_SUBTREE_find(st, val) SKM_sk_find(GENERAL_SUBTREE, (st), (val)) +#define sk_GENERAL_SUBTREE_find_ex(st, val) SKM_sk_find_ex(GENERAL_SUBTREE, (st), (val)) +#define sk_GENERAL_SUBTREE_delete(st, i) SKM_sk_delete(GENERAL_SUBTREE, (st), (i)) +#define sk_GENERAL_SUBTREE_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_SUBTREE, (st), (ptr)) +#define sk_GENERAL_SUBTREE_insert(st, val, i) SKM_sk_insert(GENERAL_SUBTREE, (st), (val), (i)) +#define sk_GENERAL_SUBTREE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_SUBTREE, (st), (cmp)) +#define sk_GENERAL_SUBTREE_dup(st) SKM_sk_dup(GENERAL_SUBTREE, st) +#define sk_GENERAL_SUBTREE_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_SUBTREE, (st), (free_func)) +#define sk_GENERAL_SUBTREE_shift(st) SKM_sk_shift(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_pop(st) SKM_sk_pop(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_sort(st) SKM_sk_sort(GENERAL_SUBTREE, (st)) +#define sk_GENERAL_SUBTREE_is_sorted(st) SKM_sk_is_sorted(GENERAL_SUBTREE, (st)) + +#define sk_IPAddressFamily_new(cmp) SKM_sk_new(IPAddressFamily, (cmp)) +#define sk_IPAddressFamily_new_null() SKM_sk_new_null(IPAddressFamily) +#define sk_IPAddressFamily_free(st) SKM_sk_free(IPAddressFamily, (st)) +#define sk_IPAddressFamily_num(st) SKM_sk_num(IPAddressFamily, (st)) +#define sk_IPAddressFamily_value(st, i) SKM_sk_value(IPAddressFamily, (st), (i)) +#define sk_IPAddressFamily_set(st, i, val) SKM_sk_set(IPAddressFamily, (st), (i), (val)) +#define sk_IPAddressFamily_zero(st) SKM_sk_zero(IPAddressFamily, (st)) +#define sk_IPAddressFamily_push(st, val) SKM_sk_push(IPAddressFamily, (st), (val)) +#define sk_IPAddressFamily_unshift(st, val) SKM_sk_unshift(IPAddressFamily, (st), (val)) +#define sk_IPAddressFamily_find(st, val) SKM_sk_find(IPAddressFamily, (st), (val)) +#define sk_IPAddressFamily_find_ex(st, val) SKM_sk_find_ex(IPAddressFamily, (st), (val)) +#define sk_IPAddressFamily_delete(st, i) SKM_sk_delete(IPAddressFamily, (st), (i)) +#define sk_IPAddressFamily_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressFamily, (st), (ptr)) +#define sk_IPAddressFamily_insert(st, val, i) SKM_sk_insert(IPAddressFamily, (st), (val), (i)) +#define sk_IPAddressFamily_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressFamily, (st), (cmp)) +#define sk_IPAddressFamily_dup(st) SKM_sk_dup(IPAddressFamily, st) +#define sk_IPAddressFamily_pop_free(st, free_func) SKM_sk_pop_free(IPAddressFamily, (st), (free_func)) +#define sk_IPAddressFamily_shift(st) SKM_sk_shift(IPAddressFamily, (st)) +#define sk_IPAddressFamily_pop(st) SKM_sk_pop(IPAddressFamily, (st)) +#define sk_IPAddressFamily_sort(st) SKM_sk_sort(IPAddressFamily, (st)) +#define sk_IPAddressFamily_is_sorted(st) SKM_sk_is_sorted(IPAddressFamily, (st)) + +#define sk_IPAddressOrRange_new(cmp) SKM_sk_new(IPAddressOrRange, (cmp)) +#define sk_IPAddressOrRange_new_null() SKM_sk_new_null(IPAddressOrRange) +#define sk_IPAddressOrRange_free(st) SKM_sk_free(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_num(st) SKM_sk_num(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_value(st, i) SKM_sk_value(IPAddressOrRange, (st), (i)) +#define sk_IPAddressOrRange_set(st, i, val) SKM_sk_set(IPAddressOrRange, (st), (i), (val)) +#define sk_IPAddressOrRange_zero(st) SKM_sk_zero(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_push(st, val) SKM_sk_push(IPAddressOrRange, (st), (val)) +#define sk_IPAddressOrRange_unshift(st, val) SKM_sk_unshift(IPAddressOrRange, (st), (val)) +#define sk_IPAddressOrRange_find(st, val) SKM_sk_find(IPAddressOrRange, (st), (val)) +#define sk_IPAddressOrRange_find_ex(st, val) SKM_sk_find_ex(IPAddressOrRange, (st), (val)) +#define sk_IPAddressOrRange_delete(st, i) SKM_sk_delete(IPAddressOrRange, (st), (i)) +#define sk_IPAddressOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressOrRange, (st), (ptr)) +#define sk_IPAddressOrRange_insert(st, val, i) SKM_sk_insert(IPAddressOrRange, (st), (val), (i)) +#define sk_IPAddressOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressOrRange, (st), (cmp)) +#define sk_IPAddressOrRange_dup(st) SKM_sk_dup(IPAddressOrRange, st) +#define sk_IPAddressOrRange_pop_free(st, free_func) SKM_sk_pop_free(IPAddressOrRange, (st), (free_func)) +#define sk_IPAddressOrRange_shift(st) SKM_sk_shift(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_pop(st) SKM_sk_pop(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_sort(st) SKM_sk_sort(IPAddressOrRange, (st)) +#define sk_IPAddressOrRange_is_sorted(st) SKM_sk_is_sorted(IPAddressOrRange, (st)) + +#define sk_KRB5_APREQBODY_new(cmp) SKM_sk_new(KRB5_APREQBODY, (cmp)) +#define sk_KRB5_APREQBODY_new_null() SKM_sk_new_null(KRB5_APREQBODY) +#define sk_KRB5_APREQBODY_free(st) SKM_sk_free(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_num(st) SKM_sk_num(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_value(st, i) SKM_sk_value(KRB5_APREQBODY, (st), (i)) +#define sk_KRB5_APREQBODY_set(st, i, val) SKM_sk_set(KRB5_APREQBODY, (st), (i), (val)) +#define sk_KRB5_APREQBODY_zero(st) SKM_sk_zero(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_push(st, val) SKM_sk_push(KRB5_APREQBODY, (st), (val)) +#define sk_KRB5_APREQBODY_unshift(st, val) SKM_sk_unshift(KRB5_APREQBODY, (st), (val)) +#define sk_KRB5_APREQBODY_find(st, val) SKM_sk_find(KRB5_APREQBODY, (st), (val)) +#define sk_KRB5_APREQBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_APREQBODY, (st), (val)) +#define sk_KRB5_APREQBODY_delete(st, i) SKM_sk_delete(KRB5_APREQBODY, (st), (i)) +#define sk_KRB5_APREQBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_APREQBODY, (st), (ptr)) +#define sk_KRB5_APREQBODY_insert(st, val, i) SKM_sk_insert(KRB5_APREQBODY, (st), (val), (i)) +#define sk_KRB5_APREQBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_APREQBODY, (st), (cmp)) +#define sk_KRB5_APREQBODY_dup(st) SKM_sk_dup(KRB5_APREQBODY, st) +#define sk_KRB5_APREQBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_APREQBODY, (st), (free_func)) +#define sk_KRB5_APREQBODY_shift(st) SKM_sk_shift(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_pop(st) SKM_sk_pop(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_sort(st) SKM_sk_sort(KRB5_APREQBODY, (st)) +#define sk_KRB5_APREQBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_APREQBODY, (st)) + +#define sk_KRB5_AUTHDATA_new(cmp) SKM_sk_new(KRB5_AUTHDATA, (cmp)) +#define sk_KRB5_AUTHDATA_new_null() SKM_sk_new_null(KRB5_AUTHDATA) +#define sk_KRB5_AUTHDATA_free(st) SKM_sk_free(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_num(st) SKM_sk_num(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_value(st, i) SKM_sk_value(KRB5_AUTHDATA, (st), (i)) +#define sk_KRB5_AUTHDATA_set(st, i, val) SKM_sk_set(KRB5_AUTHDATA, (st), (i), (val)) +#define sk_KRB5_AUTHDATA_zero(st) SKM_sk_zero(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_push(st, val) SKM_sk_push(KRB5_AUTHDATA, (st), (val)) +#define sk_KRB5_AUTHDATA_unshift(st, val) SKM_sk_unshift(KRB5_AUTHDATA, (st), (val)) +#define sk_KRB5_AUTHDATA_find(st, val) SKM_sk_find(KRB5_AUTHDATA, (st), (val)) +#define sk_KRB5_AUTHDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHDATA, (st), (val)) +#define sk_KRB5_AUTHDATA_delete(st, i) SKM_sk_delete(KRB5_AUTHDATA, (st), (i)) +#define sk_KRB5_AUTHDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHDATA, (st), (ptr)) +#define sk_KRB5_AUTHDATA_insert(st, val, i) SKM_sk_insert(KRB5_AUTHDATA, (st), (val), (i)) +#define sk_KRB5_AUTHDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHDATA, (st), (cmp)) +#define sk_KRB5_AUTHDATA_dup(st) SKM_sk_dup(KRB5_AUTHDATA, st) +#define sk_KRB5_AUTHDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHDATA, (st), (free_func)) +#define sk_KRB5_AUTHDATA_shift(st) SKM_sk_shift(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_pop(st) SKM_sk_pop(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_sort(st) SKM_sk_sort(KRB5_AUTHDATA, (st)) +#define sk_KRB5_AUTHDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHDATA, (st)) + +#define sk_KRB5_AUTHENTBODY_new(cmp) SKM_sk_new(KRB5_AUTHENTBODY, (cmp)) +#define sk_KRB5_AUTHENTBODY_new_null() SKM_sk_new_null(KRB5_AUTHENTBODY) +#define sk_KRB5_AUTHENTBODY_free(st) SKM_sk_free(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_num(st) SKM_sk_num(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_value(st, i) SKM_sk_value(KRB5_AUTHENTBODY, (st), (i)) +#define sk_KRB5_AUTHENTBODY_set(st, i, val) SKM_sk_set(KRB5_AUTHENTBODY, (st), (i), (val)) +#define sk_KRB5_AUTHENTBODY_zero(st) SKM_sk_zero(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_push(st, val) SKM_sk_push(KRB5_AUTHENTBODY, (st), (val)) +#define sk_KRB5_AUTHENTBODY_unshift(st, val) SKM_sk_unshift(KRB5_AUTHENTBODY, (st), (val)) +#define sk_KRB5_AUTHENTBODY_find(st, val) SKM_sk_find(KRB5_AUTHENTBODY, (st), (val)) +#define sk_KRB5_AUTHENTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHENTBODY, (st), (val)) +#define sk_KRB5_AUTHENTBODY_delete(st, i) SKM_sk_delete(KRB5_AUTHENTBODY, (st), (i)) +#define sk_KRB5_AUTHENTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHENTBODY, (st), (ptr)) +#define sk_KRB5_AUTHENTBODY_insert(st, val, i) SKM_sk_insert(KRB5_AUTHENTBODY, (st), (val), (i)) +#define sk_KRB5_AUTHENTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHENTBODY, (st), (cmp)) +#define sk_KRB5_AUTHENTBODY_dup(st) SKM_sk_dup(KRB5_AUTHENTBODY, st) +#define sk_KRB5_AUTHENTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHENTBODY, (st), (free_func)) +#define sk_KRB5_AUTHENTBODY_shift(st) SKM_sk_shift(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_pop(st) SKM_sk_pop(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_sort(st) SKM_sk_sort(KRB5_AUTHENTBODY, (st)) +#define sk_KRB5_AUTHENTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHENTBODY, (st)) + +#define sk_KRB5_CHECKSUM_new(cmp) SKM_sk_new(KRB5_CHECKSUM, (cmp)) +#define sk_KRB5_CHECKSUM_new_null() SKM_sk_new_null(KRB5_CHECKSUM) +#define sk_KRB5_CHECKSUM_free(st) SKM_sk_free(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_num(st) SKM_sk_num(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_value(st, i) SKM_sk_value(KRB5_CHECKSUM, (st), (i)) +#define sk_KRB5_CHECKSUM_set(st, i, val) SKM_sk_set(KRB5_CHECKSUM, (st), (i), (val)) +#define sk_KRB5_CHECKSUM_zero(st) SKM_sk_zero(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_push(st, val) SKM_sk_push(KRB5_CHECKSUM, (st), (val)) +#define sk_KRB5_CHECKSUM_unshift(st, val) SKM_sk_unshift(KRB5_CHECKSUM, (st), (val)) +#define sk_KRB5_CHECKSUM_find(st, val) SKM_sk_find(KRB5_CHECKSUM, (st), (val)) +#define sk_KRB5_CHECKSUM_find_ex(st, val) SKM_sk_find_ex(KRB5_CHECKSUM, (st), (val)) +#define sk_KRB5_CHECKSUM_delete(st, i) SKM_sk_delete(KRB5_CHECKSUM, (st), (i)) +#define sk_KRB5_CHECKSUM_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_CHECKSUM, (st), (ptr)) +#define sk_KRB5_CHECKSUM_insert(st, val, i) SKM_sk_insert(KRB5_CHECKSUM, (st), (val), (i)) +#define sk_KRB5_CHECKSUM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_CHECKSUM, (st), (cmp)) +#define sk_KRB5_CHECKSUM_dup(st) SKM_sk_dup(KRB5_CHECKSUM, st) +#define sk_KRB5_CHECKSUM_pop_free(st, free_func) SKM_sk_pop_free(KRB5_CHECKSUM, (st), (free_func)) +#define sk_KRB5_CHECKSUM_shift(st) SKM_sk_shift(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_pop(st) SKM_sk_pop(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_sort(st) SKM_sk_sort(KRB5_CHECKSUM, (st)) +#define sk_KRB5_CHECKSUM_is_sorted(st) SKM_sk_is_sorted(KRB5_CHECKSUM, (st)) + +#define sk_KRB5_ENCDATA_new(cmp) SKM_sk_new(KRB5_ENCDATA, (cmp)) +#define sk_KRB5_ENCDATA_new_null() SKM_sk_new_null(KRB5_ENCDATA) +#define sk_KRB5_ENCDATA_free(st) SKM_sk_free(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_num(st) SKM_sk_num(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_value(st, i) SKM_sk_value(KRB5_ENCDATA, (st), (i)) +#define sk_KRB5_ENCDATA_set(st, i, val) SKM_sk_set(KRB5_ENCDATA, (st), (i), (val)) +#define sk_KRB5_ENCDATA_zero(st) SKM_sk_zero(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_push(st, val) SKM_sk_push(KRB5_ENCDATA, (st), (val)) +#define sk_KRB5_ENCDATA_unshift(st, val) SKM_sk_unshift(KRB5_ENCDATA, (st), (val)) +#define sk_KRB5_ENCDATA_find(st, val) SKM_sk_find(KRB5_ENCDATA, (st), (val)) +#define sk_KRB5_ENCDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCDATA, (st), (val)) +#define sk_KRB5_ENCDATA_delete(st, i) SKM_sk_delete(KRB5_ENCDATA, (st), (i)) +#define sk_KRB5_ENCDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCDATA, (st), (ptr)) +#define sk_KRB5_ENCDATA_insert(st, val, i) SKM_sk_insert(KRB5_ENCDATA, (st), (val), (i)) +#define sk_KRB5_ENCDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCDATA, (st), (cmp)) +#define sk_KRB5_ENCDATA_dup(st) SKM_sk_dup(KRB5_ENCDATA, st) +#define sk_KRB5_ENCDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCDATA, (st), (free_func)) +#define sk_KRB5_ENCDATA_shift(st) SKM_sk_shift(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_pop(st) SKM_sk_pop(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_sort(st) SKM_sk_sort(KRB5_ENCDATA, (st)) +#define sk_KRB5_ENCDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCDATA, (st)) + +#define sk_KRB5_ENCKEY_new(cmp) SKM_sk_new(KRB5_ENCKEY, (cmp)) +#define sk_KRB5_ENCKEY_new_null() SKM_sk_new_null(KRB5_ENCKEY) +#define sk_KRB5_ENCKEY_free(st) SKM_sk_free(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_num(st) SKM_sk_num(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_value(st, i) SKM_sk_value(KRB5_ENCKEY, (st), (i)) +#define sk_KRB5_ENCKEY_set(st, i, val) SKM_sk_set(KRB5_ENCKEY, (st), (i), (val)) +#define sk_KRB5_ENCKEY_zero(st) SKM_sk_zero(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_push(st, val) SKM_sk_push(KRB5_ENCKEY, (st), (val)) +#define sk_KRB5_ENCKEY_unshift(st, val) SKM_sk_unshift(KRB5_ENCKEY, (st), (val)) +#define sk_KRB5_ENCKEY_find(st, val) SKM_sk_find(KRB5_ENCKEY, (st), (val)) +#define sk_KRB5_ENCKEY_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCKEY, (st), (val)) +#define sk_KRB5_ENCKEY_delete(st, i) SKM_sk_delete(KRB5_ENCKEY, (st), (i)) +#define sk_KRB5_ENCKEY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCKEY, (st), (ptr)) +#define sk_KRB5_ENCKEY_insert(st, val, i) SKM_sk_insert(KRB5_ENCKEY, (st), (val), (i)) +#define sk_KRB5_ENCKEY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCKEY, (st), (cmp)) +#define sk_KRB5_ENCKEY_dup(st) SKM_sk_dup(KRB5_ENCKEY, st) +#define sk_KRB5_ENCKEY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCKEY, (st), (free_func)) +#define sk_KRB5_ENCKEY_shift(st) SKM_sk_shift(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_pop(st) SKM_sk_pop(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_sort(st) SKM_sk_sort(KRB5_ENCKEY, (st)) +#define sk_KRB5_ENCKEY_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCKEY, (st)) + +#define sk_KRB5_PRINCNAME_new(cmp) SKM_sk_new(KRB5_PRINCNAME, (cmp)) +#define sk_KRB5_PRINCNAME_new_null() SKM_sk_new_null(KRB5_PRINCNAME) +#define sk_KRB5_PRINCNAME_free(st) SKM_sk_free(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_num(st) SKM_sk_num(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_value(st, i) SKM_sk_value(KRB5_PRINCNAME, (st), (i)) +#define sk_KRB5_PRINCNAME_set(st, i, val) SKM_sk_set(KRB5_PRINCNAME, (st), (i), (val)) +#define sk_KRB5_PRINCNAME_zero(st) SKM_sk_zero(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_push(st, val) SKM_sk_push(KRB5_PRINCNAME, (st), (val)) +#define sk_KRB5_PRINCNAME_unshift(st, val) SKM_sk_unshift(KRB5_PRINCNAME, (st), (val)) +#define sk_KRB5_PRINCNAME_find(st, val) SKM_sk_find(KRB5_PRINCNAME, (st), (val)) +#define sk_KRB5_PRINCNAME_find_ex(st, val) SKM_sk_find_ex(KRB5_PRINCNAME, (st), (val)) +#define sk_KRB5_PRINCNAME_delete(st, i) SKM_sk_delete(KRB5_PRINCNAME, (st), (i)) +#define sk_KRB5_PRINCNAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_PRINCNAME, (st), (ptr)) +#define sk_KRB5_PRINCNAME_insert(st, val, i) SKM_sk_insert(KRB5_PRINCNAME, (st), (val), (i)) +#define sk_KRB5_PRINCNAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_PRINCNAME, (st), (cmp)) +#define sk_KRB5_PRINCNAME_dup(st) SKM_sk_dup(KRB5_PRINCNAME, st) +#define sk_KRB5_PRINCNAME_pop_free(st, free_func) SKM_sk_pop_free(KRB5_PRINCNAME, (st), (free_func)) +#define sk_KRB5_PRINCNAME_shift(st) SKM_sk_shift(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_pop(st) SKM_sk_pop(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_sort(st) SKM_sk_sort(KRB5_PRINCNAME, (st)) +#define sk_KRB5_PRINCNAME_is_sorted(st) SKM_sk_is_sorted(KRB5_PRINCNAME, (st)) + +#define sk_KRB5_TKTBODY_new(cmp) SKM_sk_new(KRB5_TKTBODY, (cmp)) +#define sk_KRB5_TKTBODY_new_null() SKM_sk_new_null(KRB5_TKTBODY) +#define sk_KRB5_TKTBODY_free(st) SKM_sk_free(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_num(st) SKM_sk_num(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_value(st, i) SKM_sk_value(KRB5_TKTBODY, (st), (i)) +#define sk_KRB5_TKTBODY_set(st, i, val) SKM_sk_set(KRB5_TKTBODY, (st), (i), (val)) +#define sk_KRB5_TKTBODY_zero(st) SKM_sk_zero(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_push(st, val) SKM_sk_push(KRB5_TKTBODY, (st), (val)) +#define sk_KRB5_TKTBODY_unshift(st, val) SKM_sk_unshift(KRB5_TKTBODY, (st), (val)) +#define sk_KRB5_TKTBODY_find(st, val) SKM_sk_find(KRB5_TKTBODY, (st), (val)) +#define sk_KRB5_TKTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_TKTBODY, (st), (val)) +#define sk_KRB5_TKTBODY_delete(st, i) SKM_sk_delete(KRB5_TKTBODY, (st), (i)) +#define sk_KRB5_TKTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_TKTBODY, (st), (ptr)) +#define sk_KRB5_TKTBODY_insert(st, val, i) SKM_sk_insert(KRB5_TKTBODY, (st), (val), (i)) +#define sk_KRB5_TKTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_TKTBODY, (st), (cmp)) +#define sk_KRB5_TKTBODY_dup(st) SKM_sk_dup(KRB5_TKTBODY, st) +#define sk_KRB5_TKTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_TKTBODY, (st), (free_func)) +#define sk_KRB5_TKTBODY_shift(st) SKM_sk_shift(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_pop(st) SKM_sk_pop(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_sort(st) SKM_sk_sort(KRB5_TKTBODY, (st)) +#define sk_KRB5_TKTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_TKTBODY, (st)) + +#define sk_MEM_OBJECT_DATA_new(cmp) SKM_sk_new(MEM_OBJECT_DATA, (cmp)) +#define sk_MEM_OBJECT_DATA_new_null() SKM_sk_new_null(MEM_OBJECT_DATA) +#define sk_MEM_OBJECT_DATA_free(st) SKM_sk_free(MEM_OBJECT_DATA, (st)) +#define sk_MEM_OBJECT_DATA_num(st) SKM_sk_num(MEM_OBJECT_DATA, (st)) +#define sk_MEM_OBJECT_DATA_value(st, i) SKM_sk_value(MEM_OBJECT_DATA, (st), (i)) +#define sk_MEM_OBJECT_DATA_set(st, i, val) SKM_sk_set(MEM_OBJECT_DATA, (st), (i), (val)) +#define sk_MEM_OBJECT_DATA_zero(st) SKM_sk_zero(MEM_OBJECT_DATA, (st)) +#define sk_MEM_OBJECT_DATA_push(st, val) SKM_sk_push(MEM_OBJECT_DATA, (st), (val)) +#define sk_MEM_OBJECT_DATA_unshift(st, val) SKM_sk_unshift(MEM_OBJECT_DATA, (st), (val)) +#define sk_MEM_OBJECT_DATA_find(st, val) SKM_sk_find(MEM_OBJECT_DATA, (st), (val)) +#define sk_MEM_OBJECT_DATA_find_ex(st, val) SKM_sk_find_ex(MEM_OBJECT_DATA, (st), (val)) +#define sk_MEM_OBJECT_DATA_delete(st, i) SKM_sk_delete(MEM_OBJECT_DATA, (st), (i)) +#define sk_MEM_OBJECT_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(MEM_OBJECT_DATA, (st), (ptr)) +#define sk_MEM_OBJECT_DATA_insert(st, val, i) SKM_sk_insert(MEM_OBJECT_DATA, (st), (val), (i)) +#define sk_MEM_OBJECT_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MEM_OBJECT_DATA, (st), (cmp)) +#define sk_MEM_OBJECT_DATA_dup(st) SKM_sk_dup(MEM_OBJECT_DATA, st) +#define sk_MEM_OBJECT_DATA_pop_free(st, free_func) SKM_sk_pop_free(MEM_OBJECT_DATA, (st), (free_func)) +#define sk_MEM_OBJECT_DATA_shift(st) SKM_sk_shift(MEM_OBJECT_DATA, (st)) +#define sk_MEM_OBJECT_DATA_pop(st) SKM_sk_pop(MEM_OBJECT_DATA, (st)) +#define sk_MEM_OBJECT_DATA_sort(st) SKM_sk_sort(MEM_OBJECT_DATA, (st)) +#define sk_MEM_OBJECT_DATA_is_sorted(st) SKM_sk_is_sorted(MEM_OBJECT_DATA, (st)) + +#define sk_MIME_HEADER_new(cmp) SKM_sk_new(MIME_HEADER, (cmp)) +#define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER) +#define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st)) +#define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st)) +#define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i)) +#define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val)) +#define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st)) +#define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val)) +#define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val)) +#define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val)) +#define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val)) +#define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i)) +#define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr)) +#define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i)) +#define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp)) +#define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st) +#define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func)) +#define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st)) +#define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st)) +#define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st)) +#define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st)) + +#define sk_MIME_PARAM_new(cmp) SKM_sk_new(MIME_PARAM, (cmp)) +#define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM) +#define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st)) +#define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st)) +#define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i)) +#define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val)) +#define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st)) +#define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val)) +#define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val)) +#define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val)) +#define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val)) +#define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i)) +#define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr)) +#define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i)) +#define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp)) +#define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st) +#define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func)) +#define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st)) +#define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st)) +#define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st)) +#define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st)) + +#define sk_NAME_FUNCS_new(cmp) SKM_sk_new(NAME_FUNCS, (cmp)) +#define sk_NAME_FUNCS_new_null() SKM_sk_new_null(NAME_FUNCS) +#define sk_NAME_FUNCS_free(st) SKM_sk_free(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_num(st) SKM_sk_num(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_value(st, i) SKM_sk_value(NAME_FUNCS, (st), (i)) +#define sk_NAME_FUNCS_set(st, i, val) SKM_sk_set(NAME_FUNCS, (st), (i), (val)) +#define sk_NAME_FUNCS_zero(st) SKM_sk_zero(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_push(st, val) SKM_sk_push(NAME_FUNCS, (st), (val)) +#define sk_NAME_FUNCS_unshift(st, val) SKM_sk_unshift(NAME_FUNCS, (st), (val)) +#define sk_NAME_FUNCS_find(st, val) SKM_sk_find(NAME_FUNCS, (st), (val)) +#define sk_NAME_FUNCS_find_ex(st, val) SKM_sk_find_ex(NAME_FUNCS, (st), (val)) +#define sk_NAME_FUNCS_delete(st, i) SKM_sk_delete(NAME_FUNCS, (st), (i)) +#define sk_NAME_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(NAME_FUNCS, (st), (ptr)) +#define sk_NAME_FUNCS_insert(st, val, i) SKM_sk_insert(NAME_FUNCS, (st), (val), (i)) +#define sk_NAME_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(NAME_FUNCS, (st), (cmp)) +#define sk_NAME_FUNCS_dup(st) SKM_sk_dup(NAME_FUNCS, st) +#define sk_NAME_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(NAME_FUNCS, (st), (free_func)) +#define sk_NAME_FUNCS_shift(st) SKM_sk_shift(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_pop(st) SKM_sk_pop(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_sort(st) SKM_sk_sort(NAME_FUNCS, (st)) +#define sk_NAME_FUNCS_is_sorted(st) SKM_sk_is_sorted(NAME_FUNCS, (st)) + +#define sk_OCSP_CERTID_new(cmp) SKM_sk_new(OCSP_CERTID, (cmp)) +#define sk_OCSP_CERTID_new_null() SKM_sk_new_null(OCSP_CERTID) +#define sk_OCSP_CERTID_free(st) SKM_sk_free(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_num(st) SKM_sk_num(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_value(st, i) SKM_sk_value(OCSP_CERTID, (st), (i)) +#define sk_OCSP_CERTID_set(st, i, val) SKM_sk_set(OCSP_CERTID, (st), (i), (val)) +#define sk_OCSP_CERTID_zero(st) SKM_sk_zero(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_push(st, val) SKM_sk_push(OCSP_CERTID, (st), (val)) +#define sk_OCSP_CERTID_unshift(st, val) SKM_sk_unshift(OCSP_CERTID, (st), (val)) +#define sk_OCSP_CERTID_find(st, val) SKM_sk_find(OCSP_CERTID, (st), (val)) +#define sk_OCSP_CERTID_find_ex(st, val) SKM_sk_find_ex(OCSP_CERTID, (st), (val)) +#define sk_OCSP_CERTID_delete(st, i) SKM_sk_delete(OCSP_CERTID, (st), (i)) +#define sk_OCSP_CERTID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_CERTID, (st), (ptr)) +#define sk_OCSP_CERTID_insert(st, val, i) SKM_sk_insert(OCSP_CERTID, (st), (val), (i)) +#define sk_OCSP_CERTID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_CERTID, (st), (cmp)) +#define sk_OCSP_CERTID_dup(st) SKM_sk_dup(OCSP_CERTID, st) +#define sk_OCSP_CERTID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_CERTID, (st), (free_func)) +#define sk_OCSP_CERTID_shift(st) SKM_sk_shift(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_pop(st) SKM_sk_pop(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_sort(st) SKM_sk_sort(OCSP_CERTID, (st)) +#define sk_OCSP_CERTID_is_sorted(st) SKM_sk_is_sorted(OCSP_CERTID, (st)) + +#define sk_OCSP_ONEREQ_new(cmp) SKM_sk_new(OCSP_ONEREQ, (cmp)) +#define sk_OCSP_ONEREQ_new_null() SKM_sk_new_null(OCSP_ONEREQ) +#define sk_OCSP_ONEREQ_free(st) SKM_sk_free(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_num(st) SKM_sk_num(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_value(st, i) SKM_sk_value(OCSP_ONEREQ, (st), (i)) +#define sk_OCSP_ONEREQ_set(st, i, val) SKM_sk_set(OCSP_ONEREQ, (st), (i), (val)) +#define sk_OCSP_ONEREQ_zero(st) SKM_sk_zero(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_push(st, val) SKM_sk_push(OCSP_ONEREQ, (st), (val)) +#define sk_OCSP_ONEREQ_unshift(st, val) SKM_sk_unshift(OCSP_ONEREQ, (st), (val)) +#define sk_OCSP_ONEREQ_find(st, val) SKM_sk_find(OCSP_ONEREQ, (st), (val)) +#define sk_OCSP_ONEREQ_find_ex(st, val) SKM_sk_find_ex(OCSP_ONEREQ, (st), (val)) +#define sk_OCSP_ONEREQ_delete(st, i) SKM_sk_delete(OCSP_ONEREQ, (st), (i)) +#define sk_OCSP_ONEREQ_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_ONEREQ, (st), (ptr)) +#define sk_OCSP_ONEREQ_insert(st, val, i) SKM_sk_insert(OCSP_ONEREQ, (st), (val), (i)) +#define sk_OCSP_ONEREQ_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_ONEREQ, (st), (cmp)) +#define sk_OCSP_ONEREQ_dup(st) SKM_sk_dup(OCSP_ONEREQ, st) +#define sk_OCSP_ONEREQ_pop_free(st, free_func) SKM_sk_pop_free(OCSP_ONEREQ, (st), (free_func)) +#define sk_OCSP_ONEREQ_shift(st) SKM_sk_shift(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_pop(st) SKM_sk_pop(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_sort(st) SKM_sk_sort(OCSP_ONEREQ, (st)) +#define sk_OCSP_ONEREQ_is_sorted(st) SKM_sk_is_sorted(OCSP_ONEREQ, (st)) + +#define sk_OCSP_RESPID_new(cmp) SKM_sk_new(OCSP_RESPID, (cmp)) +#define sk_OCSP_RESPID_new_null() SKM_sk_new_null(OCSP_RESPID) +#define sk_OCSP_RESPID_free(st) SKM_sk_free(OCSP_RESPID, (st)) +#define sk_OCSP_RESPID_num(st) SKM_sk_num(OCSP_RESPID, (st)) +#define sk_OCSP_RESPID_value(st, i) SKM_sk_value(OCSP_RESPID, (st), (i)) +#define sk_OCSP_RESPID_set(st, i, val) SKM_sk_set(OCSP_RESPID, (st), (i), (val)) +#define sk_OCSP_RESPID_zero(st) SKM_sk_zero(OCSP_RESPID, (st)) +#define sk_OCSP_RESPID_push(st, val) SKM_sk_push(OCSP_RESPID, (st), (val)) +#define sk_OCSP_RESPID_unshift(st, val) SKM_sk_unshift(OCSP_RESPID, (st), (val)) +#define sk_OCSP_RESPID_find(st, val) SKM_sk_find(OCSP_RESPID, (st), (val)) +#define sk_OCSP_RESPID_find_ex(st, val) SKM_sk_find_ex(OCSP_RESPID, (st), (val)) +#define sk_OCSP_RESPID_delete(st, i) SKM_sk_delete(OCSP_RESPID, (st), (i)) +#define sk_OCSP_RESPID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_RESPID, (st), (ptr)) +#define sk_OCSP_RESPID_insert(st, val, i) SKM_sk_insert(OCSP_RESPID, (st), (val), (i)) +#define sk_OCSP_RESPID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_RESPID, (st), (cmp)) +#define sk_OCSP_RESPID_dup(st) SKM_sk_dup(OCSP_RESPID, st) +#define sk_OCSP_RESPID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_RESPID, (st), (free_func)) +#define sk_OCSP_RESPID_shift(st) SKM_sk_shift(OCSP_RESPID, (st)) +#define sk_OCSP_RESPID_pop(st) SKM_sk_pop(OCSP_RESPID, (st)) +#define sk_OCSP_RESPID_sort(st) SKM_sk_sort(OCSP_RESPID, (st)) +#define sk_OCSP_RESPID_is_sorted(st) SKM_sk_is_sorted(OCSP_RESPID, (st)) + +#define sk_OCSP_SINGLERESP_new(cmp) SKM_sk_new(OCSP_SINGLERESP, (cmp)) +#define sk_OCSP_SINGLERESP_new_null() SKM_sk_new_null(OCSP_SINGLERESP) +#define sk_OCSP_SINGLERESP_free(st) SKM_sk_free(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_num(st) SKM_sk_num(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_value(st, i) SKM_sk_value(OCSP_SINGLERESP, (st), (i)) +#define sk_OCSP_SINGLERESP_set(st, i, val) SKM_sk_set(OCSP_SINGLERESP, (st), (i), (val)) +#define sk_OCSP_SINGLERESP_zero(st) SKM_sk_zero(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_push(st, val) SKM_sk_push(OCSP_SINGLERESP, (st), (val)) +#define sk_OCSP_SINGLERESP_unshift(st, val) SKM_sk_unshift(OCSP_SINGLERESP, (st), (val)) +#define sk_OCSP_SINGLERESP_find(st, val) SKM_sk_find(OCSP_SINGLERESP, (st), (val)) +#define sk_OCSP_SINGLERESP_find_ex(st, val) SKM_sk_find_ex(OCSP_SINGLERESP, (st), (val)) +#define sk_OCSP_SINGLERESP_delete(st, i) SKM_sk_delete(OCSP_SINGLERESP, (st), (i)) +#define sk_OCSP_SINGLERESP_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_SINGLERESP, (st), (ptr)) +#define sk_OCSP_SINGLERESP_insert(st, val, i) SKM_sk_insert(OCSP_SINGLERESP, (st), (val), (i)) +#define sk_OCSP_SINGLERESP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_SINGLERESP, (st), (cmp)) +#define sk_OCSP_SINGLERESP_dup(st) SKM_sk_dup(OCSP_SINGLERESP, st) +#define sk_OCSP_SINGLERESP_pop_free(st, free_func) SKM_sk_pop_free(OCSP_SINGLERESP, (st), (free_func)) +#define sk_OCSP_SINGLERESP_shift(st) SKM_sk_shift(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_pop(st) SKM_sk_pop(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_sort(st) SKM_sk_sort(OCSP_SINGLERESP, (st)) +#define sk_OCSP_SINGLERESP_is_sorted(st) SKM_sk_is_sorted(OCSP_SINGLERESP, (st)) + +#define sk_PKCS12_SAFEBAG_new(cmp) SKM_sk_new(PKCS12_SAFEBAG, (cmp)) +#define sk_PKCS12_SAFEBAG_new_null() SKM_sk_new_null(PKCS12_SAFEBAG) +#define sk_PKCS12_SAFEBAG_free(st) SKM_sk_free(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_num(st) SKM_sk_num(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_value(st, i) SKM_sk_value(PKCS12_SAFEBAG, (st), (i)) +#define sk_PKCS12_SAFEBAG_set(st, i, val) SKM_sk_set(PKCS12_SAFEBAG, (st), (i), (val)) +#define sk_PKCS12_SAFEBAG_zero(st) SKM_sk_zero(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_push(st, val) SKM_sk_push(PKCS12_SAFEBAG, (st), (val)) +#define sk_PKCS12_SAFEBAG_unshift(st, val) SKM_sk_unshift(PKCS12_SAFEBAG, (st), (val)) +#define sk_PKCS12_SAFEBAG_find(st, val) SKM_sk_find(PKCS12_SAFEBAG, (st), (val)) +#define sk_PKCS12_SAFEBAG_find_ex(st, val) SKM_sk_find_ex(PKCS12_SAFEBAG, (st), (val)) +#define sk_PKCS12_SAFEBAG_delete(st, i) SKM_sk_delete(PKCS12_SAFEBAG, (st), (i)) +#define sk_PKCS12_SAFEBAG_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS12_SAFEBAG, (st), (ptr)) +#define sk_PKCS12_SAFEBAG_insert(st, val, i) SKM_sk_insert(PKCS12_SAFEBAG, (st), (val), (i)) +#define sk_PKCS12_SAFEBAG_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS12_SAFEBAG, (st), (cmp)) +#define sk_PKCS12_SAFEBAG_dup(st) SKM_sk_dup(PKCS12_SAFEBAG, st) +#define sk_PKCS12_SAFEBAG_pop_free(st, free_func) SKM_sk_pop_free(PKCS12_SAFEBAG, (st), (free_func)) +#define sk_PKCS12_SAFEBAG_shift(st) SKM_sk_shift(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_pop(st) SKM_sk_pop(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_sort(st) SKM_sk_sort(PKCS12_SAFEBAG, (st)) +#define sk_PKCS12_SAFEBAG_is_sorted(st) SKM_sk_is_sorted(PKCS12_SAFEBAG, (st)) + +#define sk_PKCS7_new(cmp) SKM_sk_new(PKCS7, (cmp)) +#define sk_PKCS7_new_null() SKM_sk_new_null(PKCS7) +#define sk_PKCS7_free(st) SKM_sk_free(PKCS7, (st)) +#define sk_PKCS7_num(st) SKM_sk_num(PKCS7, (st)) +#define sk_PKCS7_value(st, i) SKM_sk_value(PKCS7, (st), (i)) +#define sk_PKCS7_set(st, i, val) SKM_sk_set(PKCS7, (st), (i), (val)) +#define sk_PKCS7_zero(st) SKM_sk_zero(PKCS7, (st)) +#define sk_PKCS7_push(st, val) SKM_sk_push(PKCS7, (st), (val)) +#define sk_PKCS7_unshift(st, val) SKM_sk_unshift(PKCS7, (st), (val)) +#define sk_PKCS7_find(st, val) SKM_sk_find(PKCS7, (st), (val)) +#define sk_PKCS7_find_ex(st, val) SKM_sk_find_ex(PKCS7, (st), (val)) +#define sk_PKCS7_delete(st, i) SKM_sk_delete(PKCS7, (st), (i)) +#define sk_PKCS7_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7, (st), (ptr)) +#define sk_PKCS7_insert(st, val, i) SKM_sk_insert(PKCS7, (st), (val), (i)) +#define sk_PKCS7_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7, (st), (cmp)) +#define sk_PKCS7_dup(st) SKM_sk_dup(PKCS7, st) +#define sk_PKCS7_pop_free(st, free_func) SKM_sk_pop_free(PKCS7, (st), (free_func)) +#define sk_PKCS7_shift(st) SKM_sk_shift(PKCS7, (st)) +#define sk_PKCS7_pop(st) SKM_sk_pop(PKCS7, (st)) +#define sk_PKCS7_sort(st) SKM_sk_sort(PKCS7, (st)) +#define sk_PKCS7_is_sorted(st) SKM_sk_is_sorted(PKCS7, (st)) + +#define sk_PKCS7_RECIP_INFO_new(cmp) SKM_sk_new(PKCS7_RECIP_INFO, (cmp)) +#define sk_PKCS7_RECIP_INFO_new_null() SKM_sk_new_null(PKCS7_RECIP_INFO) +#define sk_PKCS7_RECIP_INFO_free(st) SKM_sk_free(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_num(st) SKM_sk_num(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_value(st, i) SKM_sk_value(PKCS7_RECIP_INFO, (st), (i)) +#define sk_PKCS7_RECIP_INFO_set(st, i, val) SKM_sk_set(PKCS7_RECIP_INFO, (st), (i), (val)) +#define sk_PKCS7_RECIP_INFO_zero(st) SKM_sk_zero(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_push(st, val) SKM_sk_push(PKCS7_RECIP_INFO, (st), (val)) +#define sk_PKCS7_RECIP_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_RECIP_INFO, (st), (val)) +#define sk_PKCS7_RECIP_INFO_find(st, val) SKM_sk_find(PKCS7_RECIP_INFO, (st), (val)) +#define sk_PKCS7_RECIP_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_RECIP_INFO, (st), (val)) +#define sk_PKCS7_RECIP_INFO_delete(st, i) SKM_sk_delete(PKCS7_RECIP_INFO, (st), (i)) +#define sk_PKCS7_RECIP_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_RECIP_INFO, (st), (ptr)) +#define sk_PKCS7_RECIP_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_RECIP_INFO, (st), (val), (i)) +#define sk_PKCS7_RECIP_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_RECIP_INFO, (st), (cmp)) +#define sk_PKCS7_RECIP_INFO_dup(st) SKM_sk_dup(PKCS7_RECIP_INFO, st) +#define sk_PKCS7_RECIP_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_RECIP_INFO, (st), (free_func)) +#define sk_PKCS7_RECIP_INFO_shift(st) SKM_sk_shift(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_pop(st) SKM_sk_pop(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_sort(st) SKM_sk_sort(PKCS7_RECIP_INFO, (st)) +#define sk_PKCS7_RECIP_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_RECIP_INFO, (st)) + +#define sk_PKCS7_SIGNER_INFO_new(cmp) SKM_sk_new(PKCS7_SIGNER_INFO, (cmp)) +#define sk_PKCS7_SIGNER_INFO_new_null() SKM_sk_new_null(PKCS7_SIGNER_INFO) +#define sk_PKCS7_SIGNER_INFO_free(st) SKM_sk_free(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_num(st) SKM_sk_num(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_value(st, i) SKM_sk_value(PKCS7_SIGNER_INFO, (st), (i)) +#define sk_PKCS7_SIGNER_INFO_set(st, i, val) SKM_sk_set(PKCS7_SIGNER_INFO, (st), (i), (val)) +#define sk_PKCS7_SIGNER_INFO_zero(st) SKM_sk_zero(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_push(st, val) SKM_sk_push(PKCS7_SIGNER_INFO, (st), (val)) +#define sk_PKCS7_SIGNER_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_SIGNER_INFO, (st), (val)) +#define sk_PKCS7_SIGNER_INFO_find(st, val) SKM_sk_find(PKCS7_SIGNER_INFO, (st), (val)) +#define sk_PKCS7_SIGNER_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_SIGNER_INFO, (st), (val)) +#define sk_PKCS7_SIGNER_INFO_delete(st, i) SKM_sk_delete(PKCS7_SIGNER_INFO, (st), (i)) +#define sk_PKCS7_SIGNER_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_SIGNER_INFO, (st), (ptr)) +#define sk_PKCS7_SIGNER_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_SIGNER_INFO, (st), (val), (i)) +#define sk_PKCS7_SIGNER_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_SIGNER_INFO, (st), (cmp)) +#define sk_PKCS7_SIGNER_INFO_dup(st) SKM_sk_dup(PKCS7_SIGNER_INFO, st) +#define sk_PKCS7_SIGNER_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_SIGNER_INFO, (st), (free_func)) +#define sk_PKCS7_SIGNER_INFO_shift(st) SKM_sk_shift(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_pop(st) SKM_sk_pop(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_sort(st) SKM_sk_sort(PKCS7_SIGNER_INFO, (st)) +#define sk_PKCS7_SIGNER_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_SIGNER_INFO, (st)) + +#define sk_POLICYINFO_new(cmp) SKM_sk_new(POLICYINFO, (cmp)) +#define sk_POLICYINFO_new_null() SKM_sk_new_null(POLICYINFO) +#define sk_POLICYINFO_free(st) SKM_sk_free(POLICYINFO, (st)) +#define sk_POLICYINFO_num(st) SKM_sk_num(POLICYINFO, (st)) +#define sk_POLICYINFO_value(st, i) SKM_sk_value(POLICYINFO, (st), (i)) +#define sk_POLICYINFO_set(st, i, val) SKM_sk_set(POLICYINFO, (st), (i), (val)) +#define sk_POLICYINFO_zero(st) SKM_sk_zero(POLICYINFO, (st)) +#define sk_POLICYINFO_push(st, val) SKM_sk_push(POLICYINFO, (st), (val)) +#define sk_POLICYINFO_unshift(st, val) SKM_sk_unshift(POLICYINFO, (st), (val)) +#define sk_POLICYINFO_find(st, val) SKM_sk_find(POLICYINFO, (st), (val)) +#define sk_POLICYINFO_find_ex(st, val) SKM_sk_find_ex(POLICYINFO, (st), (val)) +#define sk_POLICYINFO_delete(st, i) SKM_sk_delete(POLICYINFO, (st), (i)) +#define sk_POLICYINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYINFO, (st), (ptr)) +#define sk_POLICYINFO_insert(st, val, i) SKM_sk_insert(POLICYINFO, (st), (val), (i)) +#define sk_POLICYINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYINFO, (st), (cmp)) +#define sk_POLICYINFO_dup(st) SKM_sk_dup(POLICYINFO, st) +#define sk_POLICYINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYINFO, (st), (free_func)) +#define sk_POLICYINFO_shift(st) SKM_sk_shift(POLICYINFO, (st)) +#define sk_POLICYINFO_pop(st) SKM_sk_pop(POLICYINFO, (st)) +#define sk_POLICYINFO_sort(st) SKM_sk_sort(POLICYINFO, (st)) +#define sk_POLICYINFO_is_sorted(st) SKM_sk_is_sorted(POLICYINFO, (st)) + +#define sk_POLICYQUALINFO_new(cmp) SKM_sk_new(POLICYQUALINFO, (cmp)) +#define sk_POLICYQUALINFO_new_null() SKM_sk_new_null(POLICYQUALINFO) +#define sk_POLICYQUALINFO_free(st) SKM_sk_free(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_num(st) SKM_sk_num(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_value(st, i) SKM_sk_value(POLICYQUALINFO, (st), (i)) +#define sk_POLICYQUALINFO_set(st, i, val) SKM_sk_set(POLICYQUALINFO, (st), (i), (val)) +#define sk_POLICYQUALINFO_zero(st) SKM_sk_zero(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_push(st, val) SKM_sk_push(POLICYQUALINFO, (st), (val)) +#define sk_POLICYQUALINFO_unshift(st, val) SKM_sk_unshift(POLICYQUALINFO, (st), (val)) +#define sk_POLICYQUALINFO_find(st, val) SKM_sk_find(POLICYQUALINFO, (st), (val)) +#define sk_POLICYQUALINFO_find_ex(st, val) SKM_sk_find_ex(POLICYQUALINFO, (st), (val)) +#define sk_POLICYQUALINFO_delete(st, i) SKM_sk_delete(POLICYQUALINFO, (st), (i)) +#define sk_POLICYQUALINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYQUALINFO, (st), (ptr)) +#define sk_POLICYQUALINFO_insert(st, val, i) SKM_sk_insert(POLICYQUALINFO, (st), (val), (i)) +#define sk_POLICYQUALINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYQUALINFO, (st), (cmp)) +#define sk_POLICYQUALINFO_dup(st) SKM_sk_dup(POLICYQUALINFO, st) +#define sk_POLICYQUALINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYQUALINFO, (st), (free_func)) +#define sk_POLICYQUALINFO_shift(st) SKM_sk_shift(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_pop(st) SKM_sk_pop(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_sort(st) SKM_sk_sort(POLICYQUALINFO, (st)) +#define sk_POLICYQUALINFO_is_sorted(st) SKM_sk_is_sorted(POLICYQUALINFO, (st)) + +#define sk_POLICY_MAPPING_new(cmp) SKM_sk_new(POLICY_MAPPING, (cmp)) +#define sk_POLICY_MAPPING_new_null() SKM_sk_new_null(POLICY_MAPPING) +#define sk_POLICY_MAPPING_free(st) SKM_sk_free(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_num(st) SKM_sk_num(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_value(st, i) SKM_sk_value(POLICY_MAPPING, (st), (i)) +#define sk_POLICY_MAPPING_set(st, i, val) SKM_sk_set(POLICY_MAPPING, (st), (i), (val)) +#define sk_POLICY_MAPPING_zero(st) SKM_sk_zero(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_push(st, val) SKM_sk_push(POLICY_MAPPING, (st), (val)) +#define sk_POLICY_MAPPING_unshift(st, val) SKM_sk_unshift(POLICY_MAPPING, (st), (val)) +#define sk_POLICY_MAPPING_find(st, val) SKM_sk_find(POLICY_MAPPING, (st), (val)) +#define sk_POLICY_MAPPING_find_ex(st, val) SKM_sk_find_ex(POLICY_MAPPING, (st), (val)) +#define sk_POLICY_MAPPING_delete(st, i) SKM_sk_delete(POLICY_MAPPING, (st), (i)) +#define sk_POLICY_MAPPING_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICY_MAPPING, (st), (ptr)) +#define sk_POLICY_MAPPING_insert(st, val, i) SKM_sk_insert(POLICY_MAPPING, (st), (val), (i)) +#define sk_POLICY_MAPPING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICY_MAPPING, (st), (cmp)) +#define sk_POLICY_MAPPING_dup(st) SKM_sk_dup(POLICY_MAPPING, st) +#define sk_POLICY_MAPPING_pop_free(st, free_func) SKM_sk_pop_free(POLICY_MAPPING, (st), (free_func)) +#define sk_POLICY_MAPPING_shift(st) SKM_sk_shift(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_pop(st) SKM_sk_pop(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_sort(st) SKM_sk_sort(POLICY_MAPPING, (st)) +#define sk_POLICY_MAPPING_is_sorted(st) SKM_sk_is_sorted(POLICY_MAPPING, (st)) + +#define sk_SRP_gN_new(cmp) SKM_sk_new(SRP_gN, (cmp)) +#define sk_SRP_gN_new_null() SKM_sk_new_null(SRP_gN) +#define sk_SRP_gN_free(st) SKM_sk_free(SRP_gN, (st)) +#define sk_SRP_gN_num(st) SKM_sk_num(SRP_gN, (st)) +#define sk_SRP_gN_value(st, i) SKM_sk_value(SRP_gN, (st), (i)) +#define sk_SRP_gN_set(st, i, val) SKM_sk_set(SRP_gN, (st), (i), (val)) +#define sk_SRP_gN_zero(st) SKM_sk_zero(SRP_gN, (st)) +#define sk_SRP_gN_push(st, val) SKM_sk_push(SRP_gN, (st), (val)) +#define sk_SRP_gN_unshift(st, val) SKM_sk_unshift(SRP_gN, (st), (val)) +#define sk_SRP_gN_find(st, val) SKM_sk_find(SRP_gN, (st), (val)) +#define sk_SRP_gN_find_ex(st, val) SKM_sk_find_ex(SRP_gN, (st), (val)) +#define sk_SRP_gN_delete(st, i) SKM_sk_delete(SRP_gN, (st), (i)) +#define sk_SRP_gN_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN, (st), (ptr)) +#define sk_SRP_gN_insert(st, val, i) SKM_sk_insert(SRP_gN, (st), (val), (i)) +#define sk_SRP_gN_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN, (st), (cmp)) +#define sk_SRP_gN_dup(st) SKM_sk_dup(SRP_gN, st) +#define sk_SRP_gN_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN, (st), (free_func)) +#define sk_SRP_gN_shift(st) SKM_sk_shift(SRP_gN, (st)) +#define sk_SRP_gN_pop(st) SKM_sk_pop(SRP_gN, (st)) +#define sk_SRP_gN_sort(st) SKM_sk_sort(SRP_gN, (st)) +#define sk_SRP_gN_is_sorted(st) SKM_sk_is_sorted(SRP_gN, (st)) + +#define sk_SRP_gN_cache_new(cmp) SKM_sk_new(SRP_gN_cache, (cmp)) +#define sk_SRP_gN_cache_new_null() SKM_sk_new_null(SRP_gN_cache) +#define sk_SRP_gN_cache_free(st) SKM_sk_free(SRP_gN_cache, (st)) +#define sk_SRP_gN_cache_num(st) SKM_sk_num(SRP_gN_cache, (st)) +#define sk_SRP_gN_cache_value(st, i) SKM_sk_value(SRP_gN_cache, (st), (i)) +#define sk_SRP_gN_cache_set(st, i, val) SKM_sk_set(SRP_gN_cache, (st), (i), (val)) +#define sk_SRP_gN_cache_zero(st) SKM_sk_zero(SRP_gN_cache, (st)) +#define sk_SRP_gN_cache_push(st, val) SKM_sk_push(SRP_gN_cache, (st), (val)) +#define sk_SRP_gN_cache_unshift(st, val) SKM_sk_unshift(SRP_gN_cache, (st), (val)) +#define sk_SRP_gN_cache_find(st, val) SKM_sk_find(SRP_gN_cache, (st), (val)) +#define sk_SRP_gN_cache_find_ex(st, val) SKM_sk_find_ex(SRP_gN_cache, (st), (val)) +#define sk_SRP_gN_cache_delete(st, i) SKM_sk_delete(SRP_gN_cache, (st), (i)) +#define sk_SRP_gN_cache_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN_cache, (st), (ptr)) +#define sk_SRP_gN_cache_insert(st, val, i) SKM_sk_insert(SRP_gN_cache, (st), (val), (i)) +#define sk_SRP_gN_cache_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN_cache, (st), (cmp)) +#define sk_SRP_gN_cache_dup(st) SKM_sk_dup(SRP_gN_cache, st) +#define sk_SRP_gN_cache_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN_cache, (st), (free_func)) +#define sk_SRP_gN_cache_shift(st) SKM_sk_shift(SRP_gN_cache, (st)) +#define sk_SRP_gN_cache_pop(st) SKM_sk_pop(SRP_gN_cache, (st)) +#define sk_SRP_gN_cache_sort(st) SKM_sk_sort(SRP_gN_cache, (st)) +#define sk_SRP_gN_cache_is_sorted(st) SKM_sk_is_sorted(SRP_gN_cache, (st)) + +#define sk_SRP_user_pwd_new(cmp) SKM_sk_new(SRP_user_pwd, (cmp)) +#define sk_SRP_user_pwd_new_null() SKM_sk_new_null(SRP_user_pwd) +#define sk_SRP_user_pwd_free(st) SKM_sk_free(SRP_user_pwd, (st)) +#define sk_SRP_user_pwd_num(st) SKM_sk_num(SRP_user_pwd, (st)) +#define sk_SRP_user_pwd_value(st, i) SKM_sk_value(SRP_user_pwd, (st), (i)) +#define sk_SRP_user_pwd_set(st, i, val) SKM_sk_set(SRP_user_pwd, (st), (i), (val)) +#define sk_SRP_user_pwd_zero(st) SKM_sk_zero(SRP_user_pwd, (st)) +#define sk_SRP_user_pwd_push(st, val) SKM_sk_push(SRP_user_pwd, (st), (val)) +#define sk_SRP_user_pwd_unshift(st, val) SKM_sk_unshift(SRP_user_pwd, (st), (val)) +#define sk_SRP_user_pwd_find(st, val) SKM_sk_find(SRP_user_pwd, (st), (val)) +#define sk_SRP_user_pwd_find_ex(st, val) SKM_sk_find_ex(SRP_user_pwd, (st), (val)) +#define sk_SRP_user_pwd_delete(st, i) SKM_sk_delete(SRP_user_pwd, (st), (i)) +#define sk_SRP_user_pwd_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_user_pwd, (st), (ptr)) +#define sk_SRP_user_pwd_insert(st, val, i) SKM_sk_insert(SRP_user_pwd, (st), (val), (i)) +#define sk_SRP_user_pwd_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_user_pwd, (st), (cmp)) +#define sk_SRP_user_pwd_dup(st) SKM_sk_dup(SRP_user_pwd, st) +#define sk_SRP_user_pwd_pop_free(st, free_func) SKM_sk_pop_free(SRP_user_pwd, (st), (free_func)) +#define sk_SRP_user_pwd_shift(st) SKM_sk_shift(SRP_user_pwd, (st)) +#define sk_SRP_user_pwd_pop(st) SKM_sk_pop(SRP_user_pwd, (st)) +#define sk_SRP_user_pwd_sort(st) SKM_sk_sort(SRP_user_pwd, (st)) +#define sk_SRP_user_pwd_is_sorted(st) SKM_sk_is_sorted(SRP_user_pwd, (st)) + +#define sk_SRTP_PROTECTION_PROFILE_new(cmp) SKM_sk_new(SRTP_PROTECTION_PROFILE, (cmp)) +#define sk_SRTP_PROTECTION_PROFILE_new_null() SKM_sk_new_null(SRTP_PROTECTION_PROFILE) +#define sk_SRTP_PROTECTION_PROFILE_free(st) SKM_sk_free(SRTP_PROTECTION_PROFILE, (st)) +#define sk_SRTP_PROTECTION_PROFILE_num(st) SKM_sk_num(SRTP_PROTECTION_PROFILE, (st)) +#define sk_SRTP_PROTECTION_PROFILE_value(st, i) SKM_sk_value(SRTP_PROTECTION_PROFILE, (st), (i)) +#define sk_SRTP_PROTECTION_PROFILE_set(st, i, val) SKM_sk_set(SRTP_PROTECTION_PROFILE, (st), (i), (val)) +#define sk_SRTP_PROTECTION_PROFILE_zero(st) SKM_sk_zero(SRTP_PROTECTION_PROFILE, (st)) +#define sk_SRTP_PROTECTION_PROFILE_push(st, val) SKM_sk_push(SRTP_PROTECTION_PROFILE, (st), (val)) +#define sk_SRTP_PROTECTION_PROFILE_unshift(st, val) SKM_sk_unshift(SRTP_PROTECTION_PROFILE, (st), (val)) +#define sk_SRTP_PROTECTION_PROFILE_find(st, val) SKM_sk_find(SRTP_PROTECTION_PROFILE, (st), (val)) +#define sk_SRTP_PROTECTION_PROFILE_find_ex(st, val) SKM_sk_find_ex(SRTP_PROTECTION_PROFILE, (st), (val)) +#define sk_SRTP_PROTECTION_PROFILE_delete(st, i) SKM_sk_delete(SRTP_PROTECTION_PROFILE, (st), (i)) +#define sk_SRTP_PROTECTION_PROFILE_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRTP_PROTECTION_PROFILE, (st), (ptr)) +#define sk_SRTP_PROTECTION_PROFILE_insert(st, val, i) SKM_sk_insert(SRTP_PROTECTION_PROFILE, (st), (val), (i)) +#define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRTP_PROTECTION_PROFILE, (st), (cmp)) +#define sk_SRTP_PROTECTION_PROFILE_dup(st) SKM_sk_dup(SRTP_PROTECTION_PROFILE, st) +#define sk_SRTP_PROTECTION_PROFILE_pop_free(st, free_func) SKM_sk_pop_free(SRTP_PROTECTION_PROFILE, (st), (free_func)) +#define sk_SRTP_PROTECTION_PROFILE_shift(st) SKM_sk_shift(SRTP_PROTECTION_PROFILE, (st)) +#define sk_SRTP_PROTECTION_PROFILE_pop(st) SKM_sk_pop(SRTP_PROTECTION_PROFILE, (st)) +#define sk_SRTP_PROTECTION_PROFILE_sort(st) SKM_sk_sort(SRTP_PROTECTION_PROFILE, (st)) +#define sk_SRTP_PROTECTION_PROFILE_is_sorted(st) SKM_sk_is_sorted(SRTP_PROTECTION_PROFILE, (st)) + +#define sk_SSL_CIPHER_new(cmp) SKM_sk_new(SSL_CIPHER, (cmp)) +#define sk_SSL_CIPHER_new_null() SKM_sk_new_null(SSL_CIPHER) +#define sk_SSL_CIPHER_free(st) SKM_sk_free(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_num(st) SKM_sk_num(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_value(st, i) SKM_sk_value(SSL_CIPHER, (st), (i)) +#define sk_SSL_CIPHER_set(st, i, val) SKM_sk_set(SSL_CIPHER, (st), (i), (val)) +#define sk_SSL_CIPHER_zero(st) SKM_sk_zero(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_push(st, val) SKM_sk_push(SSL_CIPHER, (st), (val)) +#define sk_SSL_CIPHER_unshift(st, val) SKM_sk_unshift(SSL_CIPHER, (st), (val)) +#define sk_SSL_CIPHER_find(st, val) SKM_sk_find(SSL_CIPHER, (st), (val)) +#define sk_SSL_CIPHER_find_ex(st, val) SKM_sk_find_ex(SSL_CIPHER, (st), (val)) +#define sk_SSL_CIPHER_delete(st, i) SKM_sk_delete(SSL_CIPHER, (st), (i)) +#define sk_SSL_CIPHER_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_CIPHER, (st), (ptr)) +#define sk_SSL_CIPHER_insert(st, val, i) SKM_sk_insert(SSL_CIPHER, (st), (val), (i)) +#define sk_SSL_CIPHER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_CIPHER, (st), (cmp)) +#define sk_SSL_CIPHER_dup(st) SKM_sk_dup(SSL_CIPHER, st) +#define sk_SSL_CIPHER_pop_free(st, free_func) SKM_sk_pop_free(SSL_CIPHER, (st), (free_func)) +#define sk_SSL_CIPHER_shift(st) SKM_sk_shift(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_pop(st) SKM_sk_pop(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_sort(st) SKM_sk_sort(SSL_CIPHER, (st)) +#define sk_SSL_CIPHER_is_sorted(st) SKM_sk_is_sorted(SSL_CIPHER, (st)) + +#define sk_SSL_COMP_new(cmp) SKM_sk_new(SSL_COMP, (cmp)) +#define sk_SSL_COMP_new_null() SKM_sk_new_null(SSL_COMP) +#define sk_SSL_COMP_free(st) SKM_sk_free(SSL_COMP, (st)) +#define sk_SSL_COMP_num(st) SKM_sk_num(SSL_COMP, (st)) +#define sk_SSL_COMP_value(st, i) SKM_sk_value(SSL_COMP, (st), (i)) +#define sk_SSL_COMP_set(st, i, val) SKM_sk_set(SSL_COMP, (st), (i), (val)) +#define sk_SSL_COMP_zero(st) SKM_sk_zero(SSL_COMP, (st)) +#define sk_SSL_COMP_push(st, val) SKM_sk_push(SSL_COMP, (st), (val)) +#define sk_SSL_COMP_unshift(st, val) SKM_sk_unshift(SSL_COMP, (st), (val)) +#define sk_SSL_COMP_find(st, val) SKM_sk_find(SSL_COMP, (st), (val)) +#define sk_SSL_COMP_find_ex(st, val) SKM_sk_find_ex(SSL_COMP, (st), (val)) +#define sk_SSL_COMP_delete(st, i) SKM_sk_delete(SSL_COMP, (st), (i)) +#define sk_SSL_COMP_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_COMP, (st), (ptr)) +#define sk_SSL_COMP_insert(st, val, i) SKM_sk_insert(SSL_COMP, (st), (val), (i)) +#define sk_SSL_COMP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_COMP, (st), (cmp)) +#define sk_SSL_COMP_dup(st) SKM_sk_dup(SSL_COMP, st) +#define sk_SSL_COMP_pop_free(st, free_func) SKM_sk_pop_free(SSL_COMP, (st), (free_func)) +#define sk_SSL_COMP_shift(st) SKM_sk_shift(SSL_COMP, (st)) +#define sk_SSL_COMP_pop(st) SKM_sk_pop(SSL_COMP, (st)) +#define sk_SSL_COMP_sort(st) SKM_sk_sort(SSL_COMP, (st)) +#define sk_SSL_COMP_is_sorted(st) SKM_sk_is_sorted(SSL_COMP, (st)) + +#define sk_STACK_OF_X509_NAME_ENTRY_new(cmp) SKM_sk_new(STACK_OF_X509_NAME_ENTRY, (cmp)) +#define sk_STACK_OF_X509_NAME_ENTRY_new_null() SKM_sk_new_null(STACK_OF_X509_NAME_ENTRY) +#define sk_STACK_OF_X509_NAME_ENTRY_free(st) SKM_sk_free(STACK_OF_X509_NAME_ENTRY, (st)) +#define sk_STACK_OF_X509_NAME_ENTRY_num(st) SKM_sk_num(STACK_OF_X509_NAME_ENTRY, (st)) +#define sk_STACK_OF_X509_NAME_ENTRY_value(st, i) SKM_sk_value(STACK_OF_X509_NAME_ENTRY, (st), (i)) +#define sk_STACK_OF_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(STACK_OF_X509_NAME_ENTRY, (st), (i), (val)) +#define sk_STACK_OF_X509_NAME_ENTRY_zero(st) SKM_sk_zero(STACK_OF_X509_NAME_ENTRY, (st)) +#define sk_STACK_OF_X509_NAME_ENTRY_push(st, val) SKM_sk_push(STACK_OF_X509_NAME_ENTRY, (st), (val)) +#define sk_STACK_OF_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(STACK_OF_X509_NAME_ENTRY, (st), (val)) +#define sk_STACK_OF_X509_NAME_ENTRY_find(st, val) SKM_sk_find(STACK_OF_X509_NAME_ENTRY, (st), (val)) +#define sk_STACK_OF_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(STACK_OF_X509_NAME_ENTRY, (st), (val)) +#define sk_STACK_OF_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(STACK_OF_X509_NAME_ENTRY, (st), (i)) +#define sk_STACK_OF_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(STACK_OF_X509_NAME_ENTRY, (st), (ptr)) +#define sk_STACK_OF_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(STACK_OF_X509_NAME_ENTRY, (st), (val), (i)) +#define sk_STACK_OF_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STACK_OF_X509_NAME_ENTRY, (st), (cmp)) +#define sk_STACK_OF_X509_NAME_ENTRY_dup(st) SKM_sk_dup(STACK_OF_X509_NAME_ENTRY, st) +#define sk_STACK_OF_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(STACK_OF_X509_NAME_ENTRY, (st), (free_func)) +#define sk_STACK_OF_X509_NAME_ENTRY_shift(st) SKM_sk_shift(STACK_OF_X509_NAME_ENTRY, (st)) +#define sk_STACK_OF_X509_NAME_ENTRY_pop(st) SKM_sk_pop(STACK_OF_X509_NAME_ENTRY, (st)) +#define sk_STACK_OF_X509_NAME_ENTRY_sort(st) SKM_sk_sort(STACK_OF_X509_NAME_ENTRY, (st)) +#define sk_STACK_OF_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(STACK_OF_X509_NAME_ENTRY, (st)) + +#define sk_STORE_ATTR_INFO_new(cmp) SKM_sk_new(STORE_ATTR_INFO, (cmp)) +#define sk_STORE_ATTR_INFO_new_null() SKM_sk_new_null(STORE_ATTR_INFO) +#define sk_STORE_ATTR_INFO_free(st) SKM_sk_free(STORE_ATTR_INFO, (st)) +#define sk_STORE_ATTR_INFO_num(st) SKM_sk_num(STORE_ATTR_INFO, (st)) +#define sk_STORE_ATTR_INFO_value(st, i) SKM_sk_value(STORE_ATTR_INFO, (st), (i)) +#define sk_STORE_ATTR_INFO_set(st, i, val) SKM_sk_set(STORE_ATTR_INFO, (st), (i), (val)) +#define sk_STORE_ATTR_INFO_zero(st) SKM_sk_zero(STORE_ATTR_INFO, (st)) +#define sk_STORE_ATTR_INFO_push(st, val) SKM_sk_push(STORE_ATTR_INFO, (st), (val)) +#define sk_STORE_ATTR_INFO_unshift(st, val) SKM_sk_unshift(STORE_ATTR_INFO, (st), (val)) +#define sk_STORE_ATTR_INFO_find(st, val) SKM_sk_find(STORE_ATTR_INFO, (st), (val)) +#define sk_STORE_ATTR_INFO_find_ex(st, val) SKM_sk_find_ex(STORE_ATTR_INFO, (st), (val)) +#define sk_STORE_ATTR_INFO_delete(st, i) SKM_sk_delete(STORE_ATTR_INFO, (st), (i)) +#define sk_STORE_ATTR_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_ATTR_INFO, (st), (ptr)) +#define sk_STORE_ATTR_INFO_insert(st, val, i) SKM_sk_insert(STORE_ATTR_INFO, (st), (val), (i)) +#define sk_STORE_ATTR_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_ATTR_INFO, (st), (cmp)) +#define sk_STORE_ATTR_INFO_dup(st) SKM_sk_dup(STORE_ATTR_INFO, st) +#define sk_STORE_ATTR_INFO_pop_free(st, free_func) SKM_sk_pop_free(STORE_ATTR_INFO, (st), (free_func)) +#define sk_STORE_ATTR_INFO_shift(st) SKM_sk_shift(STORE_ATTR_INFO, (st)) +#define sk_STORE_ATTR_INFO_pop(st) SKM_sk_pop(STORE_ATTR_INFO, (st)) +#define sk_STORE_ATTR_INFO_sort(st) SKM_sk_sort(STORE_ATTR_INFO, (st)) +#define sk_STORE_ATTR_INFO_is_sorted(st) SKM_sk_is_sorted(STORE_ATTR_INFO, (st)) + +#define sk_STORE_OBJECT_new(cmp) SKM_sk_new(STORE_OBJECT, (cmp)) +#define sk_STORE_OBJECT_new_null() SKM_sk_new_null(STORE_OBJECT) +#define sk_STORE_OBJECT_free(st) SKM_sk_free(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_num(st) SKM_sk_num(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_value(st, i) SKM_sk_value(STORE_OBJECT, (st), (i)) +#define sk_STORE_OBJECT_set(st, i, val) SKM_sk_set(STORE_OBJECT, (st), (i), (val)) +#define sk_STORE_OBJECT_zero(st) SKM_sk_zero(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_push(st, val) SKM_sk_push(STORE_OBJECT, (st), (val)) +#define sk_STORE_OBJECT_unshift(st, val) SKM_sk_unshift(STORE_OBJECT, (st), (val)) +#define sk_STORE_OBJECT_find(st, val) SKM_sk_find(STORE_OBJECT, (st), (val)) +#define sk_STORE_OBJECT_find_ex(st, val) SKM_sk_find_ex(STORE_OBJECT, (st), (val)) +#define sk_STORE_OBJECT_delete(st, i) SKM_sk_delete(STORE_OBJECT, (st), (i)) +#define sk_STORE_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_OBJECT, (st), (ptr)) +#define sk_STORE_OBJECT_insert(st, val, i) SKM_sk_insert(STORE_OBJECT, (st), (val), (i)) +#define sk_STORE_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_OBJECT, (st), (cmp)) +#define sk_STORE_OBJECT_dup(st) SKM_sk_dup(STORE_OBJECT, st) +#define sk_STORE_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(STORE_OBJECT, (st), (free_func)) +#define sk_STORE_OBJECT_shift(st) SKM_sk_shift(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_pop(st) SKM_sk_pop(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_sort(st) SKM_sk_sort(STORE_OBJECT, (st)) +#define sk_STORE_OBJECT_is_sorted(st) SKM_sk_is_sorted(STORE_OBJECT, (st)) + +#define sk_SXNETID_new(cmp) SKM_sk_new(SXNETID, (cmp)) +#define sk_SXNETID_new_null() SKM_sk_new_null(SXNETID) +#define sk_SXNETID_free(st) SKM_sk_free(SXNETID, (st)) +#define sk_SXNETID_num(st) SKM_sk_num(SXNETID, (st)) +#define sk_SXNETID_value(st, i) SKM_sk_value(SXNETID, (st), (i)) +#define sk_SXNETID_set(st, i, val) SKM_sk_set(SXNETID, (st), (i), (val)) +#define sk_SXNETID_zero(st) SKM_sk_zero(SXNETID, (st)) +#define sk_SXNETID_push(st, val) SKM_sk_push(SXNETID, (st), (val)) +#define sk_SXNETID_unshift(st, val) SKM_sk_unshift(SXNETID, (st), (val)) +#define sk_SXNETID_find(st, val) SKM_sk_find(SXNETID, (st), (val)) +#define sk_SXNETID_find_ex(st, val) SKM_sk_find_ex(SXNETID, (st), (val)) +#define sk_SXNETID_delete(st, i) SKM_sk_delete(SXNETID, (st), (i)) +#define sk_SXNETID_delete_ptr(st, ptr) SKM_sk_delete_ptr(SXNETID, (st), (ptr)) +#define sk_SXNETID_insert(st, val, i) SKM_sk_insert(SXNETID, (st), (val), (i)) +#define sk_SXNETID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SXNETID, (st), (cmp)) +#define sk_SXNETID_dup(st) SKM_sk_dup(SXNETID, st) +#define sk_SXNETID_pop_free(st, free_func) SKM_sk_pop_free(SXNETID, (st), (free_func)) +#define sk_SXNETID_shift(st) SKM_sk_shift(SXNETID, (st)) +#define sk_SXNETID_pop(st) SKM_sk_pop(SXNETID, (st)) +#define sk_SXNETID_sort(st) SKM_sk_sort(SXNETID, (st)) +#define sk_SXNETID_is_sorted(st) SKM_sk_is_sorted(SXNETID, (st)) + +#define sk_UI_STRING_new(cmp) SKM_sk_new(UI_STRING, (cmp)) +#define sk_UI_STRING_new_null() SKM_sk_new_null(UI_STRING) +#define sk_UI_STRING_free(st) SKM_sk_free(UI_STRING, (st)) +#define sk_UI_STRING_num(st) SKM_sk_num(UI_STRING, (st)) +#define sk_UI_STRING_value(st, i) SKM_sk_value(UI_STRING, (st), (i)) +#define sk_UI_STRING_set(st, i, val) SKM_sk_set(UI_STRING, (st), (i), (val)) +#define sk_UI_STRING_zero(st) SKM_sk_zero(UI_STRING, (st)) +#define sk_UI_STRING_push(st, val) SKM_sk_push(UI_STRING, (st), (val)) +#define sk_UI_STRING_unshift(st, val) SKM_sk_unshift(UI_STRING, (st), (val)) +#define sk_UI_STRING_find(st, val) SKM_sk_find(UI_STRING, (st), (val)) +#define sk_UI_STRING_find_ex(st, val) SKM_sk_find_ex(UI_STRING, (st), (val)) +#define sk_UI_STRING_delete(st, i) SKM_sk_delete(UI_STRING, (st), (i)) +#define sk_UI_STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(UI_STRING, (st), (ptr)) +#define sk_UI_STRING_insert(st, val, i) SKM_sk_insert(UI_STRING, (st), (val), (i)) +#define sk_UI_STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(UI_STRING, (st), (cmp)) +#define sk_UI_STRING_dup(st) SKM_sk_dup(UI_STRING, st) +#define sk_UI_STRING_pop_free(st, free_func) SKM_sk_pop_free(UI_STRING, (st), (free_func)) +#define sk_UI_STRING_shift(st) SKM_sk_shift(UI_STRING, (st)) +#define sk_UI_STRING_pop(st) SKM_sk_pop(UI_STRING, (st)) +#define sk_UI_STRING_sort(st) SKM_sk_sort(UI_STRING, (st)) +#define sk_UI_STRING_is_sorted(st) SKM_sk_is_sorted(UI_STRING, (st)) + +#define sk_X509_new(cmp) SKM_sk_new(X509, (cmp)) +#define sk_X509_new_null() SKM_sk_new_null(X509) +#define sk_X509_free(st) SKM_sk_free(X509, (st)) +#define sk_X509_num(st) SKM_sk_num(X509, (st)) +#define sk_X509_value(st, i) SKM_sk_value(X509, (st), (i)) +#define sk_X509_set(st, i, val) SKM_sk_set(X509, (st), (i), (val)) +#define sk_X509_zero(st) SKM_sk_zero(X509, (st)) +#define sk_X509_push(st, val) SKM_sk_push(X509, (st), (val)) +#define sk_X509_unshift(st, val) SKM_sk_unshift(X509, (st), (val)) +#define sk_X509_find(st, val) SKM_sk_find(X509, (st), (val)) +#define sk_X509_find_ex(st, val) SKM_sk_find_ex(X509, (st), (val)) +#define sk_X509_delete(st, i) SKM_sk_delete(X509, (st), (i)) +#define sk_X509_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509, (st), (ptr)) +#define sk_X509_insert(st, val, i) SKM_sk_insert(X509, (st), (val), (i)) +#define sk_X509_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509, (st), (cmp)) +#define sk_X509_dup(st) SKM_sk_dup(X509, st) +#define sk_X509_pop_free(st, free_func) SKM_sk_pop_free(X509, (st), (free_func)) +#define sk_X509_shift(st) SKM_sk_shift(X509, (st)) +#define sk_X509_pop(st) SKM_sk_pop(X509, (st)) +#define sk_X509_sort(st) SKM_sk_sort(X509, (st)) +#define sk_X509_is_sorted(st) SKM_sk_is_sorted(X509, (st)) + +#define sk_X509V3_EXT_METHOD_new(cmp) SKM_sk_new(X509V3_EXT_METHOD, (cmp)) +#define sk_X509V3_EXT_METHOD_new_null() SKM_sk_new_null(X509V3_EXT_METHOD) +#define sk_X509V3_EXT_METHOD_free(st) SKM_sk_free(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_num(st) SKM_sk_num(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_value(st, i) SKM_sk_value(X509V3_EXT_METHOD, (st), (i)) +#define sk_X509V3_EXT_METHOD_set(st, i, val) SKM_sk_set(X509V3_EXT_METHOD, (st), (i), (val)) +#define sk_X509V3_EXT_METHOD_zero(st) SKM_sk_zero(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_push(st, val) SKM_sk_push(X509V3_EXT_METHOD, (st), (val)) +#define sk_X509V3_EXT_METHOD_unshift(st, val) SKM_sk_unshift(X509V3_EXT_METHOD, (st), (val)) +#define sk_X509V3_EXT_METHOD_find(st, val) SKM_sk_find(X509V3_EXT_METHOD, (st), (val)) +#define sk_X509V3_EXT_METHOD_find_ex(st, val) SKM_sk_find_ex(X509V3_EXT_METHOD, (st), (val)) +#define sk_X509V3_EXT_METHOD_delete(st, i) SKM_sk_delete(X509V3_EXT_METHOD, (st), (i)) +#define sk_X509V3_EXT_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509V3_EXT_METHOD, (st), (ptr)) +#define sk_X509V3_EXT_METHOD_insert(st, val, i) SKM_sk_insert(X509V3_EXT_METHOD, (st), (val), (i)) +#define sk_X509V3_EXT_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509V3_EXT_METHOD, (st), (cmp)) +#define sk_X509V3_EXT_METHOD_dup(st) SKM_sk_dup(X509V3_EXT_METHOD, st) +#define sk_X509V3_EXT_METHOD_pop_free(st, free_func) SKM_sk_pop_free(X509V3_EXT_METHOD, (st), (free_func)) +#define sk_X509V3_EXT_METHOD_shift(st) SKM_sk_shift(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_pop(st) SKM_sk_pop(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_sort(st) SKM_sk_sort(X509V3_EXT_METHOD, (st)) +#define sk_X509V3_EXT_METHOD_is_sorted(st) SKM_sk_is_sorted(X509V3_EXT_METHOD, (st)) + +#define sk_X509_ALGOR_new(cmp) SKM_sk_new(X509_ALGOR, (cmp)) +#define sk_X509_ALGOR_new_null() SKM_sk_new_null(X509_ALGOR) +#define sk_X509_ALGOR_free(st) SKM_sk_free(X509_ALGOR, (st)) +#define sk_X509_ALGOR_num(st) SKM_sk_num(X509_ALGOR, (st)) +#define sk_X509_ALGOR_value(st, i) SKM_sk_value(X509_ALGOR, (st), (i)) +#define sk_X509_ALGOR_set(st, i, val) SKM_sk_set(X509_ALGOR, (st), (i), (val)) +#define sk_X509_ALGOR_zero(st) SKM_sk_zero(X509_ALGOR, (st)) +#define sk_X509_ALGOR_push(st, val) SKM_sk_push(X509_ALGOR, (st), (val)) +#define sk_X509_ALGOR_unshift(st, val) SKM_sk_unshift(X509_ALGOR, (st), (val)) +#define sk_X509_ALGOR_find(st, val) SKM_sk_find(X509_ALGOR, (st), (val)) +#define sk_X509_ALGOR_find_ex(st, val) SKM_sk_find_ex(X509_ALGOR, (st), (val)) +#define sk_X509_ALGOR_delete(st, i) SKM_sk_delete(X509_ALGOR, (st), (i)) +#define sk_X509_ALGOR_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ALGOR, (st), (ptr)) +#define sk_X509_ALGOR_insert(st, val, i) SKM_sk_insert(X509_ALGOR, (st), (val), (i)) +#define sk_X509_ALGOR_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ALGOR, (st), (cmp)) +#define sk_X509_ALGOR_dup(st) SKM_sk_dup(X509_ALGOR, st) +#define sk_X509_ALGOR_pop_free(st, free_func) SKM_sk_pop_free(X509_ALGOR, (st), (free_func)) +#define sk_X509_ALGOR_shift(st) SKM_sk_shift(X509_ALGOR, (st)) +#define sk_X509_ALGOR_pop(st) SKM_sk_pop(X509_ALGOR, (st)) +#define sk_X509_ALGOR_sort(st) SKM_sk_sort(X509_ALGOR, (st)) +#define sk_X509_ALGOR_is_sorted(st) SKM_sk_is_sorted(X509_ALGOR, (st)) + +#define sk_X509_ATTRIBUTE_new(cmp) SKM_sk_new(X509_ATTRIBUTE, (cmp)) +#define sk_X509_ATTRIBUTE_new_null() SKM_sk_new_null(X509_ATTRIBUTE) +#define sk_X509_ATTRIBUTE_free(st) SKM_sk_free(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_num(st) SKM_sk_num(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_value(st, i) SKM_sk_value(X509_ATTRIBUTE, (st), (i)) +#define sk_X509_ATTRIBUTE_set(st, i, val) SKM_sk_set(X509_ATTRIBUTE, (st), (i), (val)) +#define sk_X509_ATTRIBUTE_zero(st) SKM_sk_zero(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_push(st, val) SKM_sk_push(X509_ATTRIBUTE, (st), (val)) +#define sk_X509_ATTRIBUTE_unshift(st, val) SKM_sk_unshift(X509_ATTRIBUTE, (st), (val)) +#define sk_X509_ATTRIBUTE_find(st, val) SKM_sk_find(X509_ATTRIBUTE, (st), (val)) +#define sk_X509_ATTRIBUTE_find_ex(st, val) SKM_sk_find_ex(X509_ATTRIBUTE, (st), (val)) +#define sk_X509_ATTRIBUTE_delete(st, i) SKM_sk_delete(X509_ATTRIBUTE, (st), (i)) +#define sk_X509_ATTRIBUTE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ATTRIBUTE, (st), (ptr)) +#define sk_X509_ATTRIBUTE_insert(st, val, i) SKM_sk_insert(X509_ATTRIBUTE, (st), (val), (i)) +#define sk_X509_ATTRIBUTE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ATTRIBUTE, (st), (cmp)) +#define sk_X509_ATTRIBUTE_dup(st) SKM_sk_dup(X509_ATTRIBUTE, st) +#define sk_X509_ATTRIBUTE_pop_free(st, free_func) SKM_sk_pop_free(X509_ATTRIBUTE, (st), (free_func)) +#define sk_X509_ATTRIBUTE_shift(st) SKM_sk_shift(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_pop(st) SKM_sk_pop(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_sort(st) SKM_sk_sort(X509_ATTRIBUTE, (st)) +#define sk_X509_ATTRIBUTE_is_sorted(st) SKM_sk_is_sorted(X509_ATTRIBUTE, (st)) + +#define sk_X509_CRL_new(cmp) SKM_sk_new(X509_CRL, (cmp)) +#define sk_X509_CRL_new_null() SKM_sk_new_null(X509_CRL) +#define sk_X509_CRL_free(st) SKM_sk_free(X509_CRL, (st)) +#define sk_X509_CRL_num(st) SKM_sk_num(X509_CRL, (st)) +#define sk_X509_CRL_value(st, i) SKM_sk_value(X509_CRL, (st), (i)) +#define sk_X509_CRL_set(st, i, val) SKM_sk_set(X509_CRL, (st), (i), (val)) +#define sk_X509_CRL_zero(st) SKM_sk_zero(X509_CRL, (st)) +#define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val)) +#define sk_X509_CRL_unshift(st, val) SKM_sk_unshift(X509_CRL, (st), (val)) +#define sk_X509_CRL_find(st, val) SKM_sk_find(X509_CRL, (st), (val)) +#define sk_X509_CRL_find_ex(st, val) SKM_sk_find_ex(X509_CRL, (st), (val)) +#define sk_X509_CRL_delete(st, i) SKM_sk_delete(X509_CRL, (st), (i)) +#define sk_X509_CRL_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_CRL, (st), (ptr)) +#define sk_X509_CRL_insert(st, val, i) SKM_sk_insert(X509_CRL, (st), (val), (i)) +#define sk_X509_CRL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_CRL, (st), (cmp)) +#define sk_X509_CRL_dup(st) SKM_sk_dup(X509_CRL, st) +#define sk_X509_CRL_pop_free(st, free_func) SKM_sk_pop_free(X509_CRL, (st), (free_func)) +#define sk_X509_CRL_shift(st) SKM_sk_shift(X509_CRL, (st)) +#define sk_X509_CRL_pop(st) SKM_sk_pop(X509_CRL, (st)) +#define sk_X509_CRL_sort(st) SKM_sk_sort(X509_CRL, (st)) +#define sk_X509_CRL_is_sorted(st) SKM_sk_is_sorted(X509_CRL, (st)) + +#define sk_X509_EXTENSION_new(cmp) SKM_sk_new(X509_EXTENSION, (cmp)) +#define sk_X509_EXTENSION_new_null() SKM_sk_new_null(X509_EXTENSION) +#define sk_X509_EXTENSION_free(st) SKM_sk_free(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_num(st) SKM_sk_num(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_value(st, i) SKM_sk_value(X509_EXTENSION, (st), (i)) +#define sk_X509_EXTENSION_set(st, i, val) SKM_sk_set(X509_EXTENSION, (st), (i), (val)) +#define sk_X509_EXTENSION_zero(st) SKM_sk_zero(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_push(st, val) SKM_sk_push(X509_EXTENSION, (st), (val)) +#define sk_X509_EXTENSION_unshift(st, val) SKM_sk_unshift(X509_EXTENSION, (st), (val)) +#define sk_X509_EXTENSION_find(st, val) SKM_sk_find(X509_EXTENSION, (st), (val)) +#define sk_X509_EXTENSION_find_ex(st, val) SKM_sk_find_ex(X509_EXTENSION, (st), (val)) +#define sk_X509_EXTENSION_delete(st, i) SKM_sk_delete(X509_EXTENSION, (st), (i)) +#define sk_X509_EXTENSION_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_EXTENSION, (st), (ptr)) +#define sk_X509_EXTENSION_insert(st, val, i) SKM_sk_insert(X509_EXTENSION, (st), (val), (i)) +#define sk_X509_EXTENSION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_EXTENSION, (st), (cmp)) +#define sk_X509_EXTENSION_dup(st) SKM_sk_dup(X509_EXTENSION, st) +#define sk_X509_EXTENSION_pop_free(st, free_func) SKM_sk_pop_free(X509_EXTENSION, (st), (free_func)) +#define sk_X509_EXTENSION_shift(st) SKM_sk_shift(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_pop(st) SKM_sk_pop(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_sort(st) SKM_sk_sort(X509_EXTENSION, (st)) +#define sk_X509_EXTENSION_is_sorted(st) SKM_sk_is_sorted(X509_EXTENSION, (st)) + +#define sk_X509_INFO_new(cmp) SKM_sk_new(X509_INFO, (cmp)) +#define sk_X509_INFO_new_null() SKM_sk_new_null(X509_INFO) +#define sk_X509_INFO_free(st) SKM_sk_free(X509_INFO, (st)) +#define sk_X509_INFO_num(st) SKM_sk_num(X509_INFO, (st)) +#define sk_X509_INFO_value(st, i) SKM_sk_value(X509_INFO, (st), (i)) +#define sk_X509_INFO_set(st, i, val) SKM_sk_set(X509_INFO, (st), (i), (val)) +#define sk_X509_INFO_zero(st) SKM_sk_zero(X509_INFO, (st)) +#define sk_X509_INFO_push(st, val) SKM_sk_push(X509_INFO, (st), (val)) +#define sk_X509_INFO_unshift(st, val) SKM_sk_unshift(X509_INFO, (st), (val)) +#define sk_X509_INFO_find(st, val) SKM_sk_find(X509_INFO, (st), (val)) +#define sk_X509_INFO_find_ex(st, val) SKM_sk_find_ex(X509_INFO, (st), (val)) +#define sk_X509_INFO_delete(st, i) SKM_sk_delete(X509_INFO, (st), (i)) +#define sk_X509_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_INFO, (st), (ptr)) +#define sk_X509_INFO_insert(st, val, i) SKM_sk_insert(X509_INFO, (st), (val), (i)) +#define sk_X509_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_INFO, (st), (cmp)) +#define sk_X509_INFO_dup(st) SKM_sk_dup(X509_INFO, st) +#define sk_X509_INFO_pop_free(st, free_func) SKM_sk_pop_free(X509_INFO, (st), (free_func)) +#define sk_X509_INFO_shift(st) SKM_sk_shift(X509_INFO, (st)) +#define sk_X509_INFO_pop(st) SKM_sk_pop(X509_INFO, (st)) +#define sk_X509_INFO_sort(st) SKM_sk_sort(X509_INFO, (st)) +#define sk_X509_INFO_is_sorted(st) SKM_sk_is_sorted(X509_INFO, (st)) + +#define sk_X509_LOOKUP_new(cmp) SKM_sk_new(X509_LOOKUP, (cmp)) +#define sk_X509_LOOKUP_new_null() SKM_sk_new_null(X509_LOOKUP) +#define sk_X509_LOOKUP_free(st) SKM_sk_free(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_num(st) SKM_sk_num(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_value(st, i) SKM_sk_value(X509_LOOKUP, (st), (i)) +#define sk_X509_LOOKUP_set(st, i, val) SKM_sk_set(X509_LOOKUP, (st), (i), (val)) +#define sk_X509_LOOKUP_zero(st) SKM_sk_zero(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_push(st, val) SKM_sk_push(X509_LOOKUP, (st), (val)) +#define sk_X509_LOOKUP_unshift(st, val) SKM_sk_unshift(X509_LOOKUP, (st), (val)) +#define sk_X509_LOOKUP_find(st, val) SKM_sk_find(X509_LOOKUP, (st), (val)) +#define sk_X509_LOOKUP_find_ex(st, val) SKM_sk_find_ex(X509_LOOKUP, (st), (val)) +#define sk_X509_LOOKUP_delete(st, i) SKM_sk_delete(X509_LOOKUP, (st), (i)) +#define sk_X509_LOOKUP_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_LOOKUP, (st), (ptr)) +#define sk_X509_LOOKUP_insert(st, val, i) SKM_sk_insert(X509_LOOKUP, (st), (val), (i)) +#define sk_X509_LOOKUP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_LOOKUP, (st), (cmp)) +#define sk_X509_LOOKUP_dup(st) SKM_sk_dup(X509_LOOKUP, st) +#define sk_X509_LOOKUP_pop_free(st, free_func) SKM_sk_pop_free(X509_LOOKUP, (st), (free_func)) +#define sk_X509_LOOKUP_shift(st) SKM_sk_shift(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_pop(st) SKM_sk_pop(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_sort(st) SKM_sk_sort(X509_LOOKUP, (st)) +#define sk_X509_LOOKUP_is_sorted(st) SKM_sk_is_sorted(X509_LOOKUP, (st)) + +#define sk_X509_NAME_new(cmp) SKM_sk_new(X509_NAME, (cmp)) +#define sk_X509_NAME_new_null() SKM_sk_new_null(X509_NAME) +#define sk_X509_NAME_free(st) SKM_sk_free(X509_NAME, (st)) +#define sk_X509_NAME_num(st) SKM_sk_num(X509_NAME, (st)) +#define sk_X509_NAME_value(st, i) SKM_sk_value(X509_NAME, (st), (i)) +#define sk_X509_NAME_set(st, i, val) SKM_sk_set(X509_NAME, (st), (i), (val)) +#define sk_X509_NAME_zero(st) SKM_sk_zero(X509_NAME, (st)) +#define sk_X509_NAME_push(st, val) SKM_sk_push(X509_NAME, (st), (val)) +#define sk_X509_NAME_unshift(st, val) SKM_sk_unshift(X509_NAME, (st), (val)) +#define sk_X509_NAME_find(st, val) SKM_sk_find(X509_NAME, (st), (val)) +#define sk_X509_NAME_find_ex(st, val) SKM_sk_find_ex(X509_NAME, (st), (val)) +#define sk_X509_NAME_delete(st, i) SKM_sk_delete(X509_NAME, (st), (i)) +#define sk_X509_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME, (st), (ptr)) +#define sk_X509_NAME_insert(st, val, i) SKM_sk_insert(X509_NAME, (st), (val), (i)) +#define sk_X509_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME, (st), (cmp)) +#define sk_X509_NAME_dup(st) SKM_sk_dup(X509_NAME, st) +#define sk_X509_NAME_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME, (st), (free_func)) +#define sk_X509_NAME_shift(st) SKM_sk_shift(X509_NAME, (st)) +#define sk_X509_NAME_pop(st) SKM_sk_pop(X509_NAME, (st)) +#define sk_X509_NAME_sort(st) SKM_sk_sort(X509_NAME, (st)) +#define sk_X509_NAME_is_sorted(st) SKM_sk_is_sorted(X509_NAME, (st)) + +#define sk_X509_NAME_ENTRY_new(cmp) SKM_sk_new(X509_NAME_ENTRY, (cmp)) +#define sk_X509_NAME_ENTRY_new_null() SKM_sk_new_null(X509_NAME_ENTRY) +#define sk_X509_NAME_ENTRY_free(st) SKM_sk_free(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_num(st) SKM_sk_num(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_value(st, i) SKM_sk_value(X509_NAME_ENTRY, (st), (i)) +#define sk_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(X509_NAME_ENTRY, (st), (i), (val)) +#define sk_X509_NAME_ENTRY_zero(st) SKM_sk_zero(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_push(st, val) SKM_sk_push(X509_NAME_ENTRY, (st), (val)) +#define sk_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(X509_NAME_ENTRY, (st), (val)) +#define sk_X509_NAME_ENTRY_find(st, val) SKM_sk_find(X509_NAME_ENTRY, (st), (val)) +#define sk_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(X509_NAME_ENTRY, (st), (val)) +#define sk_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(X509_NAME_ENTRY, (st), (i)) +#define sk_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME_ENTRY, (st), (ptr)) +#define sk_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(X509_NAME_ENTRY, (st), (val), (i)) +#define sk_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME_ENTRY, (st), (cmp)) +#define sk_X509_NAME_ENTRY_dup(st) SKM_sk_dup(X509_NAME_ENTRY, st) +#define sk_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME_ENTRY, (st), (free_func)) +#define sk_X509_NAME_ENTRY_shift(st) SKM_sk_shift(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_pop(st) SKM_sk_pop(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_sort(st) SKM_sk_sort(X509_NAME_ENTRY, (st)) +#define sk_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(X509_NAME_ENTRY, (st)) + +#define sk_X509_OBJECT_new(cmp) SKM_sk_new(X509_OBJECT, (cmp)) +#define sk_X509_OBJECT_new_null() SKM_sk_new_null(X509_OBJECT) +#define sk_X509_OBJECT_free(st) SKM_sk_free(X509_OBJECT, (st)) +#define sk_X509_OBJECT_num(st) SKM_sk_num(X509_OBJECT, (st)) +#define sk_X509_OBJECT_value(st, i) SKM_sk_value(X509_OBJECT, (st), (i)) +#define sk_X509_OBJECT_set(st, i, val) SKM_sk_set(X509_OBJECT, (st), (i), (val)) +#define sk_X509_OBJECT_zero(st) SKM_sk_zero(X509_OBJECT, (st)) +#define sk_X509_OBJECT_push(st, val) SKM_sk_push(X509_OBJECT, (st), (val)) +#define sk_X509_OBJECT_unshift(st, val) SKM_sk_unshift(X509_OBJECT, (st), (val)) +#define sk_X509_OBJECT_find(st, val) SKM_sk_find(X509_OBJECT, (st), (val)) +#define sk_X509_OBJECT_find_ex(st, val) SKM_sk_find_ex(X509_OBJECT, (st), (val)) +#define sk_X509_OBJECT_delete(st, i) SKM_sk_delete(X509_OBJECT, (st), (i)) +#define sk_X509_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_OBJECT, (st), (ptr)) +#define sk_X509_OBJECT_insert(st, val, i) SKM_sk_insert(X509_OBJECT, (st), (val), (i)) +#define sk_X509_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_OBJECT, (st), (cmp)) +#define sk_X509_OBJECT_dup(st) SKM_sk_dup(X509_OBJECT, st) +#define sk_X509_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(X509_OBJECT, (st), (free_func)) +#define sk_X509_OBJECT_shift(st) SKM_sk_shift(X509_OBJECT, (st)) +#define sk_X509_OBJECT_pop(st) SKM_sk_pop(X509_OBJECT, (st)) +#define sk_X509_OBJECT_sort(st) SKM_sk_sort(X509_OBJECT, (st)) +#define sk_X509_OBJECT_is_sorted(st) SKM_sk_is_sorted(X509_OBJECT, (st)) + +#define sk_X509_POLICY_DATA_new(cmp) SKM_sk_new(X509_POLICY_DATA, (cmp)) +#define sk_X509_POLICY_DATA_new_null() SKM_sk_new_null(X509_POLICY_DATA) +#define sk_X509_POLICY_DATA_free(st) SKM_sk_free(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_num(st) SKM_sk_num(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_value(st, i) SKM_sk_value(X509_POLICY_DATA, (st), (i)) +#define sk_X509_POLICY_DATA_set(st, i, val) SKM_sk_set(X509_POLICY_DATA, (st), (i), (val)) +#define sk_X509_POLICY_DATA_zero(st) SKM_sk_zero(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_push(st, val) SKM_sk_push(X509_POLICY_DATA, (st), (val)) +#define sk_X509_POLICY_DATA_unshift(st, val) SKM_sk_unshift(X509_POLICY_DATA, (st), (val)) +#define sk_X509_POLICY_DATA_find(st, val) SKM_sk_find(X509_POLICY_DATA, (st), (val)) +#define sk_X509_POLICY_DATA_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_DATA, (st), (val)) +#define sk_X509_POLICY_DATA_delete(st, i) SKM_sk_delete(X509_POLICY_DATA, (st), (i)) +#define sk_X509_POLICY_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_DATA, (st), (ptr)) +#define sk_X509_POLICY_DATA_insert(st, val, i) SKM_sk_insert(X509_POLICY_DATA, (st), (val), (i)) +#define sk_X509_POLICY_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_DATA, (st), (cmp)) +#define sk_X509_POLICY_DATA_dup(st) SKM_sk_dup(X509_POLICY_DATA, st) +#define sk_X509_POLICY_DATA_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_DATA, (st), (free_func)) +#define sk_X509_POLICY_DATA_shift(st) SKM_sk_shift(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_pop(st) SKM_sk_pop(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_sort(st) SKM_sk_sort(X509_POLICY_DATA, (st)) +#define sk_X509_POLICY_DATA_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_DATA, (st)) + +#define sk_X509_POLICY_NODE_new(cmp) SKM_sk_new(X509_POLICY_NODE, (cmp)) +#define sk_X509_POLICY_NODE_new_null() SKM_sk_new_null(X509_POLICY_NODE) +#define sk_X509_POLICY_NODE_free(st) SKM_sk_free(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_num(st) SKM_sk_num(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_value(st, i) SKM_sk_value(X509_POLICY_NODE, (st), (i)) +#define sk_X509_POLICY_NODE_set(st, i, val) SKM_sk_set(X509_POLICY_NODE, (st), (i), (val)) +#define sk_X509_POLICY_NODE_zero(st) SKM_sk_zero(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_push(st, val) SKM_sk_push(X509_POLICY_NODE, (st), (val)) +#define sk_X509_POLICY_NODE_unshift(st, val) SKM_sk_unshift(X509_POLICY_NODE, (st), (val)) +#define sk_X509_POLICY_NODE_find(st, val) SKM_sk_find(X509_POLICY_NODE, (st), (val)) +#define sk_X509_POLICY_NODE_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_NODE, (st), (val)) +#define sk_X509_POLICY_NODE_delete(st, i) SKM_sk_delete(X509_POLICY_NODE, (st), (i)) +#define sk_X509_POLICY_NODE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_NODE, (st), (ptr)) +#define sk_X509_POLICY_NODE_insert(st, val, i) SKM_sk_insert(X509_POLICY_NODE, (st), (val), (i)) +#define sk_X509_POLICY_NODE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_NODE, (st), (cmp)) +#define sk_X509_POLICY_NODE_dup(st) SKM_sk_dup(X509_POLICY_NODE, st) +#define sk_X509_POLICY_NODE_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_NODE, (st), (free_func)) +#define sk_X509_POLICY_NODE_shift(st) SKM_sk_shift(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_pop(st) SKM_sk_pop(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_sort(st) SKM_sk_sort(X509_POLICY_NODE, (st)) +#define sk_X509_POLICY_NODE_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_NODE, (st)) + +#define sk_X509_PURPOSE_new(cmp) SKM_sk_new(X509_PURPOSE, (cmp)) +#define sk_X509_PURPOSE_new_null() SKM_sk_new_null(X509_PURPOSE) +#define sk_X509_PURPOSE_free(st) SKM_sk_free(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_num(st) SKM_sk_num(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_value(st, i) SKM_sk_value(X509_PURPOSE, (st), (i)) +#define sk_X509_PURPOSE_set(st, i, val) SKM_sk_set(X509_PURPOSE, (st), (i), (val)) +#define sk_X509_PURPOSE_zero(st) SKM_sk_zero(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_push(st, val) SKM_sk_push(X509_PURPOSE, (st), (val)) +#define sk_X509_PURPOSE_unshift(st, val) SKM_sk_unshift(X509_PURPOSE, (st), (val)) +#define sk_X509_PURPOSE_find(st, val) SKM_sk_find(X509_PURPOSE, (st), (val)) +#define sk_X509_PURPOSE_find_ex(st, val) SKM_sk_find_ex(X509_PURPOSE, (st), (val)) +#define sk_X509_PURPOSE_delete(st, i) SKM_sk_delete(X509_PURPOSE, (st), (i)) +#define sk_X509_PURPOSE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_PURPOSE, (st), (ptr)) +#define sk_X509_PURPOSE_insert(st, val, i) SKM_sk_insert(X509_PURPOSE, (st), (val), (i)) +#define sk_X509_PURPOSE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_PURPOSE, (st), (cmp)) +#define sk_X509_PURPOSE_dup(st) SKM_sk_dup(X509_PURPOSE, st) +#define sk_X509_PURPOSE_pop_free(st, free_func) SKM_sk_pop_free(X509_PURPOSE, (st), (free_func)) +#define sk_X509_PURPOSE_shift(st) SKM_sk_shift(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_pop(st) SKM_sk_pop(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_sort(st) SKM_sk_sort(X509_PURPOSE, (st)) +#define sk_X509_PURPOSE_is_sorted(st) SKM_sk_is_sorted(X509_PURPOSE, (st)) + +#define sk_X509_REVOKED_new(cmp) SKM_sk_new(X509_REVOKED, (cmp)) +#define sk_X509_REVOKED_new_null() SKM_sk_new_null(X509_REVOKED) +#define sk_X509_REVOKED_free(st) SKM_sk_free(X509_REVOKED, (st)) +#define sk_X509_REVOKED_num(st) SKM_sk_num(X509_REVOKED, (st)) +#define sk_X509_REVOKED_value(st, i) SKM_sk_value(X509_REVOKED, (st), (i)) +#define sk_X509_REVOKED_set(st, i, val) SKM_sk_set(X509_REVOKED, (st), (i), (val)) +#define sk_X509_REVOKED_zero(st) SKM_sk_zero(X509_REVOKED, (st)) +#define sk_X509_REVOKED_push(st, val) SKM_sk_push(X509_REVOKED, (st), (val)) +#define sk_X509_REVOKED_unshift(st, val) SKM_sk_unshift(X509_REVOKED, (st), (val)) +#define sk_X509_REVOKED_find(st, val) SKM_sk_find(X509_REVOKED, (st), (val)) +#define sk_X509_REVOKED_find_ex(st, val) SKM_sk_find_ex(X509_REVOKED, (st), (val)) +#define sk_X509_REVOKED_delete(st, i) SKM_sk_delete(X509_REVOKED, (st), (i)) +#define sk_X509_REVOKED_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_REVOKED, (st), (ptr)) +#define sk_X509_REVOKED_insert(st, val, i) SKM_sk_insert(X509_REVOKED, (st), (val), (i)) +#define sk_X509_REVOKED_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_REVOKED, (st), (cmp)) +#define sk_X509_REVOKED_dup(st) SKM_sk_dup(X509_REVOKED, st) +#define sk_X509_REVOKED_pop_free(st, free_func) SKM_sk_pop_free(X509_REVOKED, (st), (free_func)) +#define sk_X509_REVOKED_shift(st) SKM_sk_shift(X509_REVOKED, (st)) +#define sk_X509_REVOKED_pop(st) SKM_sk_pop(X509_REVOKED, (st)) +#define sk_X509_REVOKED_sort(st) SKM_sk_sort(X509_REVOKED, (st)) +#define sk_X509_REVOKED_is_sorted(st) SKM_sk_is_sorted(X509_REVOKED, (st)) + +#define sk_X509_TRUST_new(cmp) SKM_sk_new(X509_TRUST, (cmp)) +#define sk_X509_TRUST_new_null() SKM_sk_new_null(X509_TRUST) +#define sk_X509_TRUST_free(st) SKM_sk_free(X509_TRUST, (st)) +#define sk_X509_TRUST_num(st) SKM_sk_num(X509_TRUST, (st)) +#define sk_X509_TRUST_value(st, i) SKM_sk_value(X509_TRUST, (st), (i)) +#define sk_X509_TRUST_set(st, i, val) SKM_sk_set(X509_TRUST, (st), (i), (val)) +#define sk_X509_TRUST_zero(st) SKM_sk_zero(X509_TRUST, (st)) +#define sk_X509_TRUST_push(st, val) SKM_sk_push(X509_TRUST, (st), (val)) +#define sk_X509_TRUST_unshift(st, val) SKM_sk_unshift(X509_TRUST, (st), (val)) +#define sk_X509_TRUST_find(st, val) SKM_sk_find(X509_TRUST, (st), (val)) +#define sk_X509_TRUST_find_ex(st, val) SKM_sk_find_ex(X509_TRUST, (st), (val)) +#define sk_X509_TRUST_delete(st, i) SKM_sk_delete(X509_TRUST, (st), (i)) +#define sk_X509_TRUST_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_TRUST, (st), (ptr)) +#define sk_X509_TRUST_insert(st, val, i) SKM_sk_insert(X509_TRUST, (st), (val), (i)) +#define sk_X509_TRUST_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_TRUST, (st), (cmp)) +#define sk_X509_TRUST_dup(st) SKM_sk_dup(X509_TRUST, st) +#define sk_X509_TRUST_pop_free(st, free_func) SKM_sk_pop_free(X509_TRUST, (st), (free_func)) +#define sk_X509_TRUST_shift(st) SKM_sk_shift(X509_TRUST, (st)) +#define sk_X509_TRUST_pop(st) SKM_sk_pop(X509_TRUST, (st)) +#define sk_X509_TRUST_sort(st) SKM_sk_sort(X509_TRUST, (st)) +#define sk_X509_TRUST_is_sorted(st) SKM_sk_is_sorted(X509_TRUST, (st)) + +#define sk_X509_VERIFY_PARAM_new(cmp) SKM_sk_new(X509_VERIFY_PARAM, (cmp)) +#define sk_X509_VERIFY_PARAM_new_null() SKM_sk_new_null(X509_VERIFY_PARAM) +#define sk_X509_VERIFY_PARAM_free(st) SKM_sk_free(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_num(st) SKM_sk_num(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_value(st, i) SKM_sk_value(X509_VERIFY_PARAM, (st), (i)) +#define sk_X509_VERIFY_PARAM_set(st, i, val) SKM_sk_set(X509_VERIFY_PARAM, (st), (i), (val)) +#define sk_X509_VERIFY_PARAM_zero(st) SKM_sk_zero(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_push(st, val) SKM_sk_push(X509_VERIFY_PARAM, (st), (val)) +#define sk_X509_VERIFY_PARAM_unshift(st, val) SKM_sk_unshift(X509_VERIFY_PARAM, (st), (val)) +#define sk_X509_VERIFY_PARAM_find(st, val) SKM_sk_find(X509_VERIFY_PARAM, (st), (val)) +#define sk_X509_VERIFY_PARAM_find_ex(st, val) SKM_sk_find_ex(X509_VERIFY_PARAM, (st), (val)) +#define sk_X509_VERIFY_PARAM_delete(st, i) SKM_sk_delete(X509_VERIFY_PARAM, (st), (i)) +#define sk_X509_VERIFY_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_VERIFY_PARAM, (st), (ptr)) +#define sk_X509_VERIFY_PARAM_insert(st, val, i) SKM_sk_insert(X509_VERIFY_PARAM, (st), (val), (i)) +#define sk_X509_VERIFY_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_VERIFY_PARAM, (st), (cmp)) +#define sk_X509_VERIFY_PARAM_dup(st) SKM_sk_dup(X509_VERIFY_PARAM, st) +#define sk_X509_VERIFY_PARAM_pop_free(st, free_func) SKM_sk_pop_free(X509_VERIFY_PARAM, (st), (free_func)) +#define sk_X509_VERIFY_PARAM_shift(st) SKM_sk_shift(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_pop(st) SKM_sk_pop(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_sort(st) SKM_sk_sort(X509_VERIFY_PARAM, (st)) +#define sk_X509_VERIFY_PARAM_is_sorted(st) SKM_sk_is_sorted(X509_VERIFY_PARAM, (st)) + +#define sk_nid_triple_new(cmp) SKM_sk_new(nid_triple, (cmp)) +#define sk_nid_triple_new_null() SKM_sk_new_null(nid_triple) +#define sk_nid_triple_free(st) SKM_sk_free(nid_triple, (st)) +#define sk_nid_triple_num(st) SKM_sk_num(nid_triple, (st)) +#define sk_nid_triple_value(st, i) SKM_sk_value(nid_triple, (st), (i)) +#define sk_nid_triple_set(st, i, val) SKM_sk_set(nid_triple, (st), (i), (val)) +#define sk_nid_triple_zero(st) SKM_sk_zero(nid_triple, (st)) +#define sk_nid_triple_push(st, val) SKM_sk_push(nid_triple, (st), (val)) +#define sk_nid_triple_unshift(st, val) SKM_sk_unshift(nid_triple, (st), (val)) +#define sk_nid_triple_find(st, val) SKM_sk_find(nid_triple, (st), (val)) +#define sk_nid_triple_find_ex(st, val) SKM_sk_find_ex(nid_triple, (st), (val)) +#define sk_nid_triple_delete(st, i) SKM_sk_delete(nid_triple, (st), (i)) +#define sk_nid_triple_delete_ptr(st, ptr) SKM_sk_delete_ptr(nid_triple, (st), (ptr)) +#define sk_nid_triple_insert(st, val, i) SKM_sk_insert(nid_triple, (st), (val), (i)) +#define sk_nid_triple_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(nid_triple, (st), (cmp)) +#define sk_nid_triple_dup(st) SKM_sk_dup(nid_triple, st) +#define sk_nid_triple_pop_free(st, free_func) SKM_sk_pop_free(nid_triple, (st), (free_func)) +#define sk_nid_triple_shift(st) SKM_sk_shift(nid_triple, (st)) +#define sk_nid_triple_pop(st) SKM_sk_pop(nid_triple, (st)) +#define sk_nid_triple_sort(st) SKM_sk_sort(nid_triple, (st)) +#define sk_nid_triple_is_sorted(st) SKM_sk_is_sorted(nid_triple, (st)) + +#define sk_void_new(cmp) SKM_sk_new(void, (cmp)) +#define sk_void_new_null() SKM_sk_new_null(void) +#define sk_void_free(st) SKM_sk_free(void, (st)) +#define sk_void_num(st) SKM_sk_num(void, (st)) +#define sk_void_value(st, i) SKM_sk_value(void, (st), (i)) +#define sk_void_set(st, i, val) SKM_sk_set(void, (st), (i), (val)) +#define sk_void_zero(st) SKM_sk_zero(void, (st)) +#define sk_void_push(st, val) SKM_sk_push(void, (st), (val)) +#define sk_void_unshift(st, val) SKM_sk_unshift(void, (st), (val)) +#define sk_void_find(st, val) SKM_sk_find(void, (st), (val)) +#define sk_void_find_ex(st, val) SKM_sk_find_ex(void, (st), (val)) +#define sk_void_delete(st, i) SKM_sk_delete(void, (st), (i)) +#define sk_void_delete_ptr(st, ptr) SKM_sk_delete_ptr(void, (st), (ptr)) +#define sk_void_insert(st, val, i) SKM_sk_insert(void, (st), (val), (i)) +#define sk_void_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(void, (st), (cmp)) +#define sk_void_dup(st) SKM_sk_dup(void, st) +#define sk_void_pop_free(st, free_func) SKM_sk_pop_free(void, (st), (free_func)) +#define sk_void_shift(st) SKM_sk_shift(void, (st)) +#define sk_void_pop(st) SKM_sk_pop(void, (st)) +#define sk_void_sort(st) SKM_sk_sort(void, (st)) +#define sk_void_is_sorted(st) SKM_sk_is_sorted(void, (st)) + +#define sk_OPENSSL_STRING_new(cmp) ((STACK_OF(OPENSSL_STRING) *)sk_new(CHECKED_SK_CMP_FUNC(char, cmp))) +#define sk_OPENSSL_STRING_new_null() ((STACK_OF(OPENSSL_STRING) *)sk_new_null()) +#define sk_OPENSSL_STRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +#define sk_OPENSSL_STRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +#define sk_OPENSSL_STRING_value(st, i) ((OPENSSL_STRING)sk_value(CHECKED_STACK_OF(OPENSSL_STRING, st), i)) +#define sk_OPENSSL_STRING_num(st) SKM_sk_num(OPENSSL_STRING, st) +#define sk_OPENSSL_STRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_FREE_FUNC2(OPENSSL_STRING, free_func)) +#define sk_OPENSSL_STRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val), i) +#define sk_OPENSSL_STRING_free(st) SKM_sk_free(OPENSSL_STRING, st) +#define sk_OPENSSL_STRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_STRING, st), i, CHECKED_PTR_OF(char, val)) +#define sk_OPENSSL_STRING_zero(st) SKM_sk_zero(OPENSSL_STRING, (st)) +#define sk_OPENSSL_STRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, val)) +#define sk_OPENSSL_STRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_STRING), st), CHECKED_CONST_PTR_OF(char, val)) +#define sk_OPENSSL_STRING_delete(st, i) SKM_sk_delete(OPENSSL_STRING, (st), (i)) +#define sk_OPENSSL_STRING_delete_ptr(st, ptr) (OPENSSL_STRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_PTR_OF(char, ptr)) +#define sk_OPENSSL_STRING_set_cmp_func(st, cmp) \ + ((int (*)(const char * const *,const char * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_STRING, st), CHECKED_SK_CMP_FUNC(char, cmp))) +#define sk_OPENSSL_STRING_dup(st) SKM_sk_dup(OPENSSL_STRING, st) +#define sk_OPENSSL_STRING_shift(st) SKM_sk_shift(OPENSSL_STRING, (st)) +#define sk_OPENSSL_STRING_pop(st) (char *)sk_pop(CHECKED_STACK_OF(OPENSSL_STRING, st)) +#define sk_OPENSSL_STRING_sort(st) SKM_sk_sort(OPENSSL_STRING, (st)) +#define sk_OPENSSL_STRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_STRING, (st)) + + +#define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)sk_new(CHECKED_SK_CMP_FUNC(void, cmp))) +#define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)sk_new_null()) +#define sk_OPENSSL_BLOCK_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +#define sk_OPENSSL_BLOCK_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +#define sk_OPENSSL_BLOCK_value(st, i) ((OPENSSL_BLOCK)sk_value(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i)) +#define sk_OPENSSL_BLOCK_num(st) SKM_sk_num(OPENSSL_BLOCK, st) +#define sk_OPENSSL_BLOCK_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_FREE_FUNC2(OPENSSL_BLOCK, free_func)) +#define sk_OPENSSL_BLOCK_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val), i) +#define sk_OPENSSL_BLOCK_free(st) SKM_sk_free(OPENSSL_BLOCK, st) +#define sk_OPENSSL_BLOCK_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_BLOCK, st), i, CHECKED_PTR_OF(void, val)) +#define sk_OPENSSL_BLOCK_zero(st) SKM_sk_zero(OPENSSL_BLOCK, (st)) +#define sk_OPENSSL_BLOCK_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, val)) +#define sk_OPENSSL_BLOCK_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_BLOCK), st), CHECKED_CONST_PTR_OF(void, val)) +#define sk_OPENSSL_BLOCK_delete(st, i) SKM_sk_delete(OPENSSL_BLOCK, (st), (i)) +#define sk_OPENSSL_BLOCK_delete_ptr(st, ptr) (OPENSSL_BLOCK *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_PTR_OF(void, ptr)) +#define sk_OPENSSL_BLOCK_set_cmp_func(st, cmp) \ + ((int (*)(const void * const *,const void * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_BLOCK, st), CHECKED_SK_CMP_FUNC(void, cmp))) +#define sk_OPENSSL_BLOCK_dup(st) SKM_sk_dup(OPENSSL_BLOCK, st) +#define sk_OPENSSL_BLOCK_shift(st) SKM_sk_shift(OPENSSL_BLOCK, (st)) +#define sk_OPENSSL_BLOCK_pop(st) (void *)sk_pop(CHECKED_STACK_OF(OPENSSL_BLOCK, st)) +#define sk_OPENSSL_BLOCK_sort(st) SKM_sk_sort(OPENSSL_BLOCK, (st)) +#define sk_OPENSSL_BLOCK_is_sorted(st) SKM_sk_is_sorted(OPENSSL_BLOCK, (st)) + + +#define sk_OPENSSL_PSTRING_new(cmp) ((STACK_OF(OPENSSL_PSTRING) *)sk_new(CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +#define sk_OPENSSL_PSTRING_new_null() ((STACK_OF(OPENSSL_PSTRING) *)sk_new_null()) +#define sk_OPENSSL_PSTRING_push(st, val) sk_push(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +#define sk_OPENSSL_PSTRING_find(st, val) sk_find(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +#define sk_OPENSSL_PSTRING_value(st, i) ((OPENSSL_PSTRING)sk_value(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i)) +#define sk_OPENSSL_PSTRING_num(st) SKM_sk_num(OPENSSL_PSTRING, st) +#define sk_OPENSSL_PSTRING_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_FREE_FUNC2(OPENSSL_PSTRING, free_func)) +#define sk_OPENSSL_PSTRING_insert(st, val, i) sk_insert(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val), i) +#define sk_OPENSSL_PSTRING_free(st) SKM_sk_free(OPENSSL_PSTRING, st) +#define sk_OPENSSL_PSTRING_set(st, i, val) sk_set(CHECKED_STACK_OF(OPENSSL_PSTRING, st), i, CHECKED_PTR_OF(OPENSSL_STRING, val)) +#define sk_OPENSSL_PSTRING_zero(st) SKM_sk_zero(OPENSSL_PSTRING, (st)) +#define sk_OPENSSL_PSTRING_unshift(st, val) sk_unshift(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, val)) +#define sk_OPENSSL_PSTRING_find_ex(st, val) sk_find_ex((_STACK *)CHECKED_CONST_PTR_OF(STACK_OF(OPENSSL_PSTRING), st), CHECKED_CONST_PTR_OF(OPENSSL_STRING, val)) +#define sk_OPENSSL_PSTRING_delete(st, i) SKM_sk_delete(OPENSSL_PSTRING, (st), (i)) +#define sk_OPENSSL_PSTRING_delete_ptr(st, ptr) (OPENSSL_PSTRING *)sk_delete_ptr(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_PTR_OF(OPENSSL_STRING, ptr)) +#define sk_OPENSSL_PSTRING_set_cmp_func(st, cmp) \ + ((int (*)(const OPENSSL_STRING * const *,const OPENSSL_STRING * const *)) \ + sk_set_cmp_func(CHECKED_STACK_OF(OPENSSL_PSTRING, st), CHECKED_SK_CMP_FUNC(OPENSSL_STRING, cmp))) +#define sk_OPENSSL_PSTRING_dup(st) SKM_sk_dup(OPENSSL_PSTRING, st) +#define sk_OPENSSL_PSTRING_shift(st) SKM_sk_shift(OPENSSL_PSTRING, (st)) +#define sk_OPENSSL_PSTRING_pop(st) (OPENSSL_STRING *)sk_pop(CHECKED_STACK_OF(OPENSSL_PSTRING, st)) +#define sk_OPENSSL_PSTRING_sort(st) SKM_sk_sort(OPENSSL_PSTRING, (st)) +#define sk_OPENSSL_PSTRING_is_sorted(st) SKM_sk_is_sorted(OPENSSL_PSTRING, (st)) + +#ifndef LIBRESSL_INTERNAL +#define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ACCESS_DESCRIPTION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ACCESS_DESCRIPTION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ACCESS_DESCRIPTION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ACCESS_DESCRIPTION, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ACCESS_DESCRIPTION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ACCESS_DESCRIPTION, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_ASN1_INTEGER(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_INTEGER, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ASN1_INTEGER(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_INTEGER, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ASN1_INTEGER(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_INTEGER, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ASN1_INTEGER(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_INTEGER, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_ASN1_OBJECT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_OBJECT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ASN1_OBJECT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_OBJECT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ASN1_OBJECT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_OBJECT, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ASN1_OBJECT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_OBJECT, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_ASN1_TYPE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_TYPE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ASN1_TYPE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_TYPE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ASN1_TYPE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_TYPE, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ASN1_TYPE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_TYPE, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ASN1_UTF8STRING, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ASN1_UTF8STRING(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ASN1_UTF8STRING, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ASN1_UTF8STRING(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ASN1_UTF8STRING, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ASN1_UTF8STRING(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ASN1_UTF8STRING, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_DIST_POINT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(DIST_POINT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_DIST_POINT(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(DIST_POINT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_DIST_POINT(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(DIST_POINT, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_DIST_POINT(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(DIST_POINT, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_ESS_CERT_ID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(ESS_CERT_ID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_ESS_CERT_ID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(ESS_CERT_ID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_ESS_CERT_ID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(ESS_CERT_ID, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_ESS_CERT_ID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(ESS_CERT_ID, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_EVP_MD(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(EVP_MD, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_EVP_MD(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(EVP_MD, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_EVP_MD(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(EVP_MD, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_EVP_MD(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(EVP_MD, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_GENERAL_NAME(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(GENERAL_NAME, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_GENERAL_NAME(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(GENERAL_NAME, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_GENERAL_NAME(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(GENERAL_NAME, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_GENERAL_NAME(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(GENERAL_NAME, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_OCSP_ONEREQ(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_ONEREQ, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_OCSP_ONEREQ(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_ONEREQ, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_OCSP_ONEREQ(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_ONEREQ, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_OCSP_ONEREQ(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_ONEREQ, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(OCSP_SINGLERESP, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(OCSP_SINGLERESP, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_OCSP_SINGLERESP(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(OCSP_SINGLERESP, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_OCSP_SINGLERESP(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(OCSP_SINGLERESP, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS12_SAFEBAG, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS12_SAFEBAG, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_PKCS12_SAFEBAG(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS12_SAFEBAG, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_PKCS12_SAFEBAG(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS12_SAFEBAG, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_PKCS7(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_PKCS7(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_PKCS7(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_PKCS7(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_RECIP_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_RECIP_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_PKCS7_RECIP_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_RECIP_INFO, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_PKCS7_RECIP_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_RECIP_INFO, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(PKCS7_SIGNER_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(PKCS7_SIGNER_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_PKCS7_SIGNER_INFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(PKCS7_SIGNER_INFO, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_PKCS7_SIGNER_INFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(PKCS7_SIGNER_INFO, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_POLICYINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_POLICYINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_POLICYINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYINFO, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_POLICYINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYINFO, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_POLICYQUALINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(POLICYQUALINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_POLICYQUALINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(POLICYQUALINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_POLICYQUALINFO(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(POLICYQUALINFO, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_POLICYQUALINFO(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(POLICYQUALINFO, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_SXNETID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(SXNETID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_SXNETID(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(SXNETID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_SXNETID(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(SXNETID, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_SXNETID(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(SXNETID, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_ALGOR(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ALGOR, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_ALGOR(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ALGOR, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_ALGOR(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ALGOR, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_ALGOR(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ALGOR, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_ATTRIBUTE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_ATTRIBUTE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_ATTRIBUTE(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_ATTRIBUTE, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_ATTRIBUTE(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_ATTRIBUTE, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_CRL(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_CRL, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_CRL(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_CRL, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_CRL(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_CRL, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_CRL(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_CRL, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_EXTENSION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_EXTENSION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_EXTENSION(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_EXTENSION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_EXTENSION(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_EXTENSION, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_EXTENSION(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_EXTENSION, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_NAME_ENTRY, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_NAME_ENTRY, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_NAME_ENTRY(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_NAME_ENTRY, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_NAME_ENTRY(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_NAME_ENTRY, (buf), (len), (d2i_func), (free_func)) + +#define d2i_ASN1_SET_OF_X509_REVOKED(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \ + SKM_ASN1_SET_OF_d2i(X509_REVOKED, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) +#define i2d_ASN1_SET_OF_X509_REVOKED(st, pp, i2d_func, ex_tag, ex_class, is_set) \ + SKM_ASN1_SET_OF_i2d(X509_REVOKED, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set)) +#define ASN1_seq_pack_X509_REVOKED(st, i2d_func, buf, len) \ + SKM_ASN1_seq_pack(X509_REVOKED, (st), (i2d_func), (buf), (len)) +#define ASN1_seq_unpack_X509_REVOKED(buf, len, d2i_func, free_func) \ + SKM_ASN1_seq_unpack(X509_REVOKED, (buf), (len), (d2i_func), (free_func)) + +#define PKCS12_decrypt_d2i_PKCS12_SAFEBAG(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS12_SAFEBAG, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) + +#define PKCS12_decrypt_d2i_PKCS7(algor, d2i_func, free_func, pass, passlen, oct, seq) \ + SKM_PKCS12_decrypt_d2i(PKCS7, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq)) +#endif /* !LIBRESSL_INTERNAL */ + +#define lh_ADDED_OBJ_new() LHM_lh_new(ADDED_OBJ,added_obj) +#define lh_ADDED_OBJ_insert(lh,inst) LHM_lh_insert(ADDED_OBJ,lh,inst) +#define lh_ADDED_OBJ_retrieve(lh,inst) LHM_lh_retrieve(ADDED_OBJ,lh,inst) +#define lh_ADDED_OBJ_delete(lh,inst) LHM_lh_delete(ADDED_OBJ,lh,inst) +#define lh_ADDED_OBJ_doall(lh,fn) LHM_lh_doall(ADDED_OBJ,lh,fn) +#define lh_ADDED_OBJ_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ADDED_OBJ,lh,fn,arg_type,arg) +#define lh_ADDED_OBJ_error(lh) LHM_lh_error(ADDED_OBJ,lh) +#define lh_ADDED_OBJ_num_items(lh) LHM_lh_num_items(ADDED_OBJ,lh) +#define lh_ADDED_OBJ_down_load(lh) LHM_lh_down_load(ADDED_OBJ,lh) +#define lh_ADDED_OBJ_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ADDED_OBJ,lh,out) +#define lh_ADDED_OBJ_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ADDED_OBJ,lh,out) +#define lh_ADDED_OBJ_stats_bio(lh,out) \ + LHM_lh_stats_bio(ADDED_OBJ,lh,out) +#define lh_ADDED_OBJ_free(lh) LHM_lh_free(ADDED_OBJ,lh) + +#define lh_APP_INFO_new() LHM_lh_new(APP_INFO,app_info) +#define lh_APP_INFO_insert(lh,inst) LHM_lh_insert(APP_INFO,lh,inst) +#define lh_APP_INFO_retrieve(lh,inst) LHM_lh_retrieve(APP_INFO,lh,inst) +#define lh_APP_INFO_delete(lh,inst) LHM_lh_delete(APP_INFO,lh,inst) +#define lh_APP_INFO_doall(lh,fn) LHM_lh_doall(APP_INFO,lh,fn) +#define lh_APP_INFO_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(APP_INFO,lh,fn,arg_type,arg) +#define lh_APP_INFO_error(lh) LHM_lh_error(APP_INFO,lh) +#define lh_APP_INFO_num_items(lh) LHM_lh_num_items(APP_INFO,lh) +#define lh_APP_INFO_down_load(lh) LHM_lh_down_load(APP_INFO,lh) +#define lh_APP_INFO_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(APP_INFO,lh,out) +#define lh_APP_INFO_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(APP_INFO,lh,out) +#define lh_APP_INFO_stats_bio(lh,out) \ + LHM_lh_stats_bio(APP_INFO,lh,out) +#define lh_APP_INFO_free(lh) LHM_lh_free(APP_INFO,lh) + +#define lh_CONF_VALUE_new() LHM_lh_new(CONF_VALUE,conf_value) +#define lh_CONF_VALUE_insert(lh,inst) LHM_lh_insert(CONF_VALUE,lh,inst) +#define lh_CONF_VALUE_retrieve(lh,inst) LHM_lh_retrieve(CONF_VALUE,lh,inst) +#define lh_CONF_VALUE_delete(lh,inst) LHM_lh_delete(CONF_VALUE,lh,inst) +#define lh_CONF_VALUE_doall(lh,fn) LHM_lh_doall(CONF_VALUE,lh,fn) +#define lh_CONF_VALUE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(CONF_VALUE,lh,fn,arg_type,arg) +#define lh_CONF_VALUE_error(lh) LHM_lh_error(CONF_VALUE,lh) +#define lh_CONF_VALUE_num_items(lh) LHM_lh_num_items(CONF_VALUE,lh) +#define lh_CONF_VALUE_down_load(lh) LHM_lh_down_load(CONF_VALUE,lh) +#define lh_CONF_VALUE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(CONF_VALUE,lh,out) +#define lh_CONF_VALUE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(CONF_VALUE,lh,out) +#define lh_CONF_VALUE_stats_bio(lh,out) \ + LHM_lh_stats_bio(CONF_VALUE,lh,out) +#define lh_CONF_VALUE_free(lh) LHM_lh_free(CONF_VALUE,lh) + +#define lh_ENGINE_PILE_new() LHM_lh_new(ENGINE_PILE,engine_pile) +#define lh_ENGINE_PILE_insert(lh,inst) LHM_lh_insert(ENGINE_PILE,lh,inst) +#define lh_ENGINE_PILE_retrieve(lh,inst) LHM_lh_retrieve(ENGINE_PILE,lh,inst) +#define lh_ENGINE_PILE_delete(lh,inst) LHM_lh_delete(ENGINE_PILE,lh,inst) +#define lh_ENGINE_PILE_doall(lh,fn) LHM_lh_doall(ENGINE_PILE,lh,fn) +#define lh_ENGINE_PILE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ENGINE_PILE,lh,fn,arg_type,arg) +#define lh_ENGINE_PILE_error(lh) LHM_lh_error(ENGINE_PILE,lh) +#define lh_ENGINE_PILE_num_items(lh) LHM_lh_num_items(ENGINE_PILE,lh) +#define lh_ENGINE_PILE_down_load(lh) LHM_lh_down_load(ENGINE_PILE,lh) +#define lh_ENGINE_PILE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ENGINE_PILE,lh,out) +#define lh_ENGINE_PILE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ENGINE_PILE,lh,out) +#define lh_ENGINE_PILE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ENGINE_PILE,lh,out) +#define lh_ENGINE_PILE_free(lh) LHM_lh_free(ENGINE_PILE,lh) + +#define lh_ERR_STATE_new() LHM_lh_new(ERR_STATE,err_state) +#define lh_ERR_STATE_insert(lh,inst) LHM_lh_insert(ERR_STATE,lh,inst) +#define lh_ERR_STATE_retrieve(lh,inst) LHM_lh_retrieve(ERR_STATE,lh,inst) +#define lh_ERR_STATE_delete(lh,inst) LHM_lh_delete(ERR_STATE,lh,inst) +#define lh_ERR_STATE_doall(lh,fn) LHM_lh_doall(ERR_STATE,lh,fn) +#define lh_ERR_STATE_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STATE,lh,fn,arg_type,arg) +#define lh_ERR_STATE_error(lh) LHM_lh_error(ERR_STATE,lh) +#define lh_ERR_STATE_num_items(lh) LHM_lh_num_items(ERR_STATE,lh) +#define lh_ERR_STATE_down_load(lh) LHM_lh_down_load(ERR_STATE,lh) +#define lh_ERR_STATE_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STATE,lh,out) +#define lh_ERR_STATE_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STATE,lh,out) +#define lh_ERR_STATE_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STATE,lh,out) +#define lh_ERR_STATE_free(lh) LHM_lh_free(ERR_STATE,lh) + +#define lh_ERR_STRING_DATA_new() LHM_lh_new(ERR_STRING_DATA,err_string_data) +#define lh_ERR_STRING_DATA_insert(lh,inst) LHM_lh_insert(ERR_STRING_DATA,lh,inst) +#define lh_ERR_STRING_DATA_retrieve(lh,inst) LHM_lh_retrieve(ERR_STRING_DATA,lh,inst) +#define lh_ERR_STRING_DATA_delete(lh,inst) LHM_lh_delete(ERR_STRING_DATA,lh,inst) +#define lh_ERR_STRING_DATA_doall(lh,fn) LHM_lh_doall(ERR_STRING_DATA,lh,fn) +#define lh_ERR_STRING_DATA_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(ERR_STRING_DATA,lh,fn,arg_type,arg) +#define lh_ERR_STRING_DATA_error(lh) LHM_lh_error(ERR_STRING_DATA,lh) +#define lh_ERR_STRING_DATA_num_items(lh) LHM_lh_num_items(ERR_STRING_DATA,lh) +#define lh_ERR_STRING_DATA_down_load(lh) LHM_lh_down_load(ERR_STRING_DATA,lh) +#define lh_ERR_STRING_DATA_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(ERR_STRING_DATA,lh,out) +#define lh_ERR_STRING_DATA_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(ERR_STRING_DATA,lh,out) +#define lh_ERR_STRING_DATA_stats_bio(lh,out) \ + LHM_lh_stats_bio(ERR_STRING_DATA,lh,out) +#define lh_ERR_STRING_DATA_free(lh) LHM_lh_free(ERR_STRING_DATA,lh) + +#define lh_EX_CLASS_ITEM_new() LHM_lh_new(EX_CLASS_ITEM,ex_class_item) +#define lh_EX_CLASS_ITEM_insert(lh,inst) LHM_lh_insert(EX_CLASS_ITEM,lh,inst) +#define lh_EX_CLASS_ITEM_retrieve(lh,inst) LHM_lh_retrieve(EX_CLASS_ITEM,lh,inst) +#define lh_EX_CLASS_ITEM_delete(lh,inst) LHM_lh_delete(EX_CLASS_ITEM,lh,inst) +#define lh_EX_CLASS_ITEM_doall(lh,fn) LHM_lh_doall(EX_CLASS_ITEM,lh,fn) +#define lh_EX_CLASS_ITEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(EX_CLASS_ITEM,lh,fn,arg_type,arg) +#define lh_EX_CLASS_ITEM_error(lh) LHM_lh_error(EX_CLASS_ITEM,lh) +#define lh_EX_CLASS_ITEM_num_items(lh) LHM_lh_num_items(EX_CLASS_ITEM,lh) +#define lh_EX_CLASS_ITEM_down_load(lh) LHM_lh_down_load(EX_CLASS_ITEM,lh) +#define lh_EX_CLASS_ITEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(EX_CLASS_ITEM,lh,out) +#define lh_EX_CLASS_ITEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(EX_CLASS_ITEM,lh,out) +#define lh_EX_CLASS_ITEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(EX_CLASS_ITEM,lh,out) +#define lh_EX_CLASS_ITEM_free(lh) LHM_lh_free(EX_CLASS_ITEM,lh) + +#define lh_FUNCTION_new() LHM_lh_new(FUNCTION,function) +#define lh_FUNCTION_insert(lh,inst) LHM_lh_insert(FUNCTION,lh,inst) +#define lh_FUNCTION_retrieve(lh,inst) LHM_lh_retrieve(FUNCTION,lh,inst) +#define lh_FUNCTION_delete(lh,inst) LHM_lh_delete(FUNCTION,lh,inst) +#define lh_FUNCTION_doall(lh,fn) LHM_lh_doall(FUNCTION,lh,fn) +#define lh_FUNCTION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(FUNCTION,lh,fn,arg_type,arg) +#define lh_FUNCTION_error(lh) LHM_lh_error(FUNCTION,lh) +#define lh_FUNCTION_num_items(lh) LHM_lh_num_items(FUNCTION,lh) +#define lh_FUNCTION_down_load(lh) LHM_lh_down_load(FUNCTION,lh) +#define lh_FUNCTION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(FUNCTION,lh,out) +#define lh_FUNCTION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(FUNCTION,lh,out) +#define lh_FUNCTION_stats_bio(lh,out) \ + LHM_lh_stats_bio(FUNCTION,lh,out) +#define lh_FUNCTION_free(lh) LHM_lh_free(FUNCTION,lh) + +#define lh_MEM_new() LHM_lh_new(MEM,mem) +#define lh_MEM_insert(lh,inst) LHM_lh_insert(MEM,lh,inst) +#define lh_MEM_retrieve(lh,inst) LHM_lh_retrieve(MEM,lh,inst) +#define lh_MEM_delete(lh,inst) LHM_lh_delete(MEM,lh,inst) +#define lh_MEM_doall(lh,fn) LHM_lh_doall(MEM,lh,fn) +#define lh_MEM_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(MEM,lh,fn,arg_type,arg) +#define lh_MEM_error(lh) LHM_lh_error(MEM,lh) +#define lh_MEM_num_items(lh) LHM_lh_num_items(MEM,lh) +#define lh_MEM_down_load(lh) LHM_lh_down_load(MEM,lh) +#define lh_MEM_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(MEM,lh,out) +#define lh_MEM_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(MEM,lh,out) +#define lh_MEM_stats_bio(lh,out) \ + LHM_lh_stats_bio(MEM,lh,out) +#define lh_MEM_free(lh) LHM_lh_free(MEM,lh) + +#define lh_OBJ_NAME_new() LHM_lh_new(OBJ_NAME,obj_name) +#define lh_OBJ_NAME_insert(lh,inst) LHM_lh_insert(OBJ_NAME,lh,inst) +#define lh_OBJ_NAME_retrieve(lh,inst) LHM_lh_retrieve(OBJ_NAME,lh,inst) +#define lh_OBJ_NAME_delete(lh,inst) LHM_lh_delete(OBJ_NAME,lh,inst) +#define lh_OBJ_NAME_doall(lh,fn) LHM_lh_doall(OBJ_NAME,lh,fn) +#define lh_OBJ_NAME_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OBJ_NAME,lh,fn,arg_type,arg) +#define lh_OBJ_NAME_error(lh) LHM_lh_error(OBJ_NAME,lh) +#define lh_OBJ_NAME_num_items(lh) LHM_lh_num_items(OBJ_NAME,lh) +#define lh_OBJ_NAME_down_load(lh) LHM_lh_down_load(OBJ_NAME,lh) +#define lh_OBJ_NAME_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OBJ_NAME,lh,out) +#define lh_OBJ_NAME_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OBJ_NAME,lh,out) +#define lh_OBJ_NAME_stats_bio(lh,out) \ + LHM_lh_stats_bio(OBJ_NAME,lh,out) +#define lh_OBJ_NAME_free(lh) LHM_lh_free(OBJ_NAME,lh) + +#define lh_OPENSSL_CSTRING_new() LHM_lh_new(OPENSSL_CSTRING,openssl_cstring) +#define lh_OPENSSL_CSTRING_insert(lh,inst) LHM_lh_insert(OPENSSL_CSTRING,lh,inst) +#define lh_OPENSSL_CSTRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_CSTRING,lh,inst) +#define lh_OPENSSL_CSTRING_delete(lh,inst) LHM_lh_delete(OPENSSL_CSTRING,lh,inst) +#define lh_OPENSSL_CSTRING_doall(lh,fn) LHM_lh_doall(OPENSSL_CSTRING,lh,fn) +#define lh_OPENSSL_CSTRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_CSTRING,lh,fn,arg_type,arg) +#define lh_OPENSSL_CSTRING_error(lh) LHM_lh_error(OPENSSL_CSTRING,lh) +#define lh_OPENSSL_CSTRING_num_items(lh) LHM_lh_num_items(OPENSSL_CSTRING,lh) +#define lh_OPENSSL_CSTRING_down_load(lh) LHM_lh_down_load(OPENSSL_CSTRING,lh) +#define lh_OPENSSL_CSTRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_CSTRING,lh,out) +#define lh_OPENSSL_CSTRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_CSTRING,lh,out) +#define lh_OPENSSL_CSTRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_CSTRING,lh,out) +#define lh_OPENSSL_CSTRING_free(lh) LHM_lh_free(OPENSSL_CSTRING,lh) + +#define lh_OPENSSL_STRING_new() LHM_lh_new(OPENSSL_STRING,openssl_string) +#define lh_OPENSSL_STRING_insert(lh,inst) LHM_lh_insert(OPENSSL_STRING,lh,inst) +#define lh_OPENSSL_STRING_retrieve(lh,inst) LHM_lh_retrieve(OPENSSL_STRING,lh,inst) +#define lh_OPENSSL_STRING_delete(lh,inst) LHM_lh_delete(OPENSSL_STRING,lh,inst) +#define lh_OPENSSL_STRING_doall(lh,fn) LHM_lh_doall(OPENSSL_STRING,lh,fn) +#define lh_OPENSSL_STRING_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(OPENSSL_STRING,lh,fn,arg_type,arg) +#define lh_OPENSSL_STRING_error(lh) LHM_lh_error(OPENSSL_STRING,lh) +#define lh_OPENSSL_STRING_num_items(lh) LHM_lh_num_items(OPENSSL_STRING,lh) +#define lh_OPENSSL_STRING_down_load(lh) LHM_lh_down_load(OPENSSL_STRING,lh) +#define lh_OPENSSL_STRING_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(OPENSSL_STRING,lh,out) +#define lh_OPENSSL_STRING_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(OPENSSL_STRING,lh,out) +#define lh_OPENSSL_STRING_stats_bio(lh,out) \ + LHM_lh_stats_bio(OPENSSL_STRING,lh,out) +#define lh_OPENSSL_STRING_free(lh) LHM_lh_free(OPENSSL_STRING,lh) + +#define lh_SSL_SESSION_new() LHM_lh_new(SSL_SESSION,ssl_session) +#define lh_SSL_SESSION_insert(lh,inst) LHM_lh_insert(SSL_SESSION,lh,inst) +#define lh_SSL_SESSION_retrieve(lh,inst) LHM_lh_retrieve(SSL_SESSION,lh,inst) +#define lh_SSL_SESSION_delete(lh,inst) LHM_lh_delete(SSL_SESSION,lh,inst) +#define lh_SSL_SESSION_doall(lh,fn) LHM_lh_doall(SSL_SESSION,lh,fn) +#define lh_SSL_SESSION_doall_arg(lh,fn,arg_type,arg) \ + LHM_lh_doall_arg(SSL_SESSION,lh,fn,arg_type,arg) +#define lh_SSL_SESSION_error(lh) LHM_lh_error(SSL_SESSION,lh) +#define lh_SSL_SESSION_num_items(lh) LHM_lh_num_items(SSL_SESSION,lh) +#define lh_SSL_SESSION_down_load(lh) LHM_lh_down_load(SSL_SESSION,lh) +#define lh_SSL_SESSION_node_stats_bio(lh,out) \ + LHM_lh_node_stats_bio(SSL_SESSION,lh,out) +#define lh_SSL_SESSION_node_usage_stats_bio(lh,out) \ + LHM_lh_node_usage_stats_bio(SSL_SESSION,lh,out) +#define lh_SSL_SESSION_stats_bio(lh,out) \ + LHM_lh_stats_bio(SSL_SESSION,lh,out) +#define lh_SSL_SESSION_free(lh) LHM_lh_free(SSL_SESSION,lh) +/* End of util/mkstack.pl block, you may now edit :-) */ + +#endif /* !defined HEADER_SAFESTACK_H */ diff --git a/src/3rdparty/win32_include/openssl/sha.h b/src/3rdparty/win32_include/openssl/sha.h new file mode 100644 index 000000000..87fdf8d18 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/sha.h @@ -0,0 +1,192 @@ +/* $OpenBSD: sha.h,v 1.21 2015/09/13 21:09:56 doug Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include + +#ifndef HEADER_SHA_H +#define HEADER_SHA_H +#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__OpenBSD__) +#define __bounded__(x, y, z) +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(OPENSSL_NO_SHA) || defined(OPENSSL_NO_SHA1) +#error SHA is disabled. +#endif + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#define SHA_LONG unsigned int + +#define SHA_LBLOCK 16 +#define SHA_CBLOCK (SHA_LBLOCK*4) /* SHA treats input data as a + * contiguous array of 32 bit + * wide big-endian values. */ +#define SHA_LAST_BLOCK (SHA_CBLOCK-8) +#define SHA_DIGEST_LENGTH 20 + +typedef struct SHAstate_st + { + SHA_LONG h0,h1,h2,h3,h4; + SHA_LONG Nl,Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num; + } SHA_CTX; + +#ifndef OPENSSL_NO_SHA1 +int SHA1_Init(SHA_CTX *c); +int SHA1_Update(SHA_CTX *c, const void *data, size_t len) + __attribute__ ((__bounded__(__buffer__,2,3))); +int SHA1_Final(unsigned char *md, SHA_CTX *c); +unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md) + __attribute__ ((__bounded__(__buffer__,1,2))); +void SHA1_Transform(SHA_CTX *c, const unsigned char *data); +#endif + +#define SHA256_CBLOCK (SHA_LBLOCK*4) /* SHA-256 treats input data as a + * contiguous array of 32 bit + * wide big-endian values. */ +#define SHA224_DIGEST_LENGTH 28 +#define SHA256_DIGEST_LENGTH 32 + +typedef struct SHA256state_st + { + SHA_LONG h[8]; + SHA_LONG Nl,Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num,md_len; + } SHA256_CTX; + +#ifndef OPENSSL_NO_SHA256 +int SHA224_Init(SHA256_CTX *c); +int SHA224_Update(SHA256_CTX *c, const void *data, size_t len) + __attribute__ ((__bounded__(__buffer__,2,3))); +int SHA224_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA224(const unsigned char *d, size_t n,unsigned char *md) + __attribute__ ((__bounded__(__buffer__,1,2))); +int SHA256_Init(SHA256_CTX *c); +int SHA256_Update(SHA256_CTX *c, const void *data, size_t len) + __attribute__ ((__bounded__(__buffer__,2,3))); +int SHA256_Final(unsigned char *md, SHA256_CTX *c); +unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md) + __attribute__ ((__bounded__(__buffer__,1,2))); +void SHA256_Transform(SHA256_CTX *c, const unsigned char *data); +#endif + +#define SHA384_DIGEST_LENGTH 48 +#define SHA512_DIGEST_LENGTH 64 + +#ifndef OPENSSL_NO_SHA512 +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +#define SHA512_CBLOCK (SHA_LBLOCK*8) /* SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. */ +#if defined(_LP64) +#define SHA_LONG64 unsigned long +#define U64(C) C##UL +#else +#define SHA_LONG64 unsigned long long +#define U64(C) C##ULL +#endif + +typedef struct SHA512state_st + { + SHA_LONG64 h[8]; + SHA_LONG64 Nl,Nh; + union { + SHA_LONG64 d[SHA_LBLOCK]; + unsigned char p[SHA512_CBLOCK]; + } u; + unsigned int num,md_len; + } SHA512_CTX; +#endif + +#ifndef OPENSSL_NO_SHA512 +int SHA384_Init(SHA512_CTX *c); +int SHA384_Update(SHA512_CTX *c, const void *data, size_t len) + __attribute__ ((__bounded__(__buffer__,2,3))); +int SHA384_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA384(const unsigned char *d, size_t n,unsigned char *md) + __attribute__ ((__bounded__(__buffer__,1,2))); +int SHA512_Init(SHA512_CTX *c); +int SHA512_Update(SHA512_CTX *c, const void *data, size_t len) + __attribute__ ((__bounded__(__buffer__,2,3))); +int SHA512_Final(unsigned char *md, SHA512_CTX *c); +unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md) + __attribute__ ((__bounded__(__buffer__,1,2))); +void SHA512_Transform(SHA512_CTX *c, const unsigned char *data); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/srtp.h b/src/3rdparty/win32_include/openssl/srtp.h new file mode 100644 index 000000000..6daa02a79 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/srtp.h @@ -0,0 +1,142 @@ +/* $OpenBSD: srtp.h,v 1.6 2015/09/01 15:18:23 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* + * DTLS code by Eric Rescorla + * + * Copyright (C) 2006, Network Resonance, Inc. + * Copyright (C) 2011, RTFM, Inc. + */ + +#ifndef HEADER_D1_SRTP_H +#define HEADER_D1_SRTP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define SRTP_AES128_CM_SHA1_80 0x0001 +#define SRTP_AES128_CM_SHA1_32 0x0002 +#define SRTP_AES128_F8_SHA1_80 0x0003 +#define SRTP_AES128_F8_SHA1_32 0x0004 +#define SRTP_NULL_SHA1_80 0x0005 +#define SRTP_NULL_SHA1_32 0x0006 + +int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); +int SSL_set_tlsext_use_srtp(SSL *ctx, const char *profiles); + +STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); +SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/ssl.h b/src/3rdparty/win32_include/openssl/ssl.h new file mode 100644 index 000000000..0789b914b --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ssl.h @@ -0,0 +1,2066 @@ +/* $OpenBSD: ssl.h,v 1.127 2017/02/05 15:06:05 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_SSL_H +#define HEADER_SSL_H + +#include + +#include +#include +#include +#include + +#include + +#ifndef OPENSSL_NO_DEPRECATED +#include +#include +#include + +#ifndef OPENSSL_NO_X509 +#include +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* SSLeay version number for ASN.1 encoding of the session information */ +/* Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +#define SSL_SESSION_ASN1_VERSION 0x0001 + +/* text strings for the ciphers */ +#define SSL_TXT_NULL_WITH_MD5 SSL2_TXT_NULL_WITH_MD5 +#define SSL_TXT_RC4_128_WITH_MD5 SSL2_TXT_RC4_128_WITH_MD5 +#define SSL_TXT_RC4_128_EXPORT40_WITH_MD5 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 +#define SSL_TXT_RC2_128_CBC_WITH_MD5 SSL2_TXT_RC2_128_CBC_WITH_MD5 +#define SSL_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 +#define SSL_TXT_IDEA_128_CBC_WITH_MD5 SSL2_TXT_IDEA_128_CBC_WITH_MD5 +#define SSL_TXT_DES_64_CBC_WITH_MD5 SSL2_TXT_DES_64_CBC_WITH_MD5 +#define SSL_TXT_DES_64_CBC_WITH_SHA SSL2_TXT_DES_64_CBC_WITH_SHA +#define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 +#define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA + +/* VRS Additional Kerberos5 entries + */ +#define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +#define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +#define SSL_TXT_KRB5_RC4_128_SHA SSL3_TXT_KRB5_RC4_128_SHA +#define SSL_TXT_KRB5_IDEA_128_CBC_SHA SSL3_TXT_KRB5_IDEA_128_CBC_SHA +#define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +#define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +#define SSL_TXT_KRB5_RC4_128_MD5 SSL3_TXT_KRB5_RC4_128_MD5 +#define SSL_TXT_KRB5_IDEA_128_CBC_MD5 SSL3_TXT_KRB5_IDEA_128_CBC_MD5 + +#define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +#define SSL_TXT_KRB5_RC2_40_CBC_SHA SSL3_TXT_KRB5_RC2_40_CBC_SHA +#define SSL_TXT_KRB5_RC4_40_SHA SSL3_TXT_KRB5_RC4_40_SHA +#define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +#define SSL_TXT_KRB5_RC2_40_CBC_MD5 SSL3_TXT_KRB5_RC2_40_CBC_MD5 +#define SSL_TXT_KRB5_RC4_40_MD5 SSL3_TXT_KRB5_RC4_40_MD5 + +#define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA +#define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 +#define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA +#define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 +#define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA +#define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 +#define SSL_MAX_KRB5_PRINCIPAL_LENGTH 256 + +#define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +#define SSL_MAX_SID_CTX_LENGTH 32 + +#define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) +#define SSL_MAX_KEY_ARG_LENGTH 8 +#define SSL_MAX_MASTER_KEY_LENGTH 48 + + +/* These are used to specify which ciphers to use and not to use */ + +#define SSL_TXT_LOW "LOW" +#define SSL_TXT_MEDIUM "MEDIUM" +#define SSL_TXT_HIGH "HIGH" + +#define SSL_TXT_kFZA "kFZA" /* unused! */ +#define SSL_TXT_aFZA "aFZA" /* unused! */ +#define SSL_TXT_eFZA "eFZA" /* unused! */ +#define SSL_TXT_FZA "FZA" /* unused! */ + +#define SSL_TXT_aNULL "aNULL" +#define SSL_TXT_eNULL "eNULL" +#define SSL_TXT_NULL "NULL" + +#define SSL_TXT_kRSA "kRSA" +#define SSL_TXT_kDHr "kDHr" /* no such ciphersuites supported! */ +#define SSL_TXT_kDHd "kDHd" /* no such ciphersuites supported! */ +#define SSL_TXT_kDH "kDH" /* no such ciphersuites supported! */ +#define SSL_TXT_kEDH "kEDH" +#define SSL_TXT_kKRB5 "kKRB5" +#define SSL_TXT_kECDHr "kECDHr" +#define SSL_TXT_kECDHe "kECDHe" +#define SSL_TXT_kECDH "kECDH" +#define SSL_TXT_kEECDH "kEECDH" +#define SSL_TXT_kPSK "kPSK" +#define SSL_TXT_kGOST "kGOST" +#define SSL_TXT_kSRP "kSRP" + +#define SSL_TXT_aRSA "aRSA" +#define SSL_TXT_aDSS "aDSS" +#define SSL_TXT_aDH "aDH" /* no such ciphersuites supported! */ +#define SSL_TXT_aECDH "aECDH" +#define SSL_TXT_aKRB5 "aKRB5" +#define SSL_TXT_aECDSA "aECDSA" +#define SSL_TXT_aPSK "aPSK" +#define SSL_TXT_aGOST94 "aGOST94" +#define SSL_TXT_aGOST01 "aGOST01" +#define SSL_TXT_aGOST "aGOST" + +#define SSL_TXT_DSS "DSS" +#define SSL_TXT_DH "DH" +#define SSL_TXT_DHE "DHE" /* same as "kDHE:-ADH" */ +#define SSL_TXT_EDH "EDH" /* previous name for DHE */ +#define SSL_TXT_ADH "ADH" +#define SSL_TXT_RSA "RSA" +#define SSL_TXT_ECDH "ECDH" +#define SSL_TXT_ECDHE "ECDHE" /* same as "kECDHE:-AECDH" */ +#define SSL_TXT_EECDH "EECDH" /* previous name for ECDHE */ +#define SSL_TXT_AECDH "AECDH" +#define SSL_TXT_ECDSA "ECDSA" +#define SSL_TXT_KRB5 "KRB5" +#define SSL_TXT_PSK "PSK" +#define SSL_TXT_SRP "SRP" + +#define SSL_TXT_DES "DES" +#define SSL_TXT_3DES "3DES" +#define SSL_TXT_RC4 "RC4" +#define SSL_TXT_RC2 "RC2" +#define SSL_TXT_IDEA "IDEA" +#define SSL_TXT_SEED "SEED" +#define SSL_TXT_AES128 "AES128" +#define SSL_TXT_AES256 "AES256" +#define SSL_TXT_AES "AES" +#define SSL_TXT_AES_GCM "AESGCM" +#define SSL_TXT_CAMELLIA128 "CAMELLIA128" +#define SSL_TXT_CAMELLIA256 "CAMELLIA256" +#define SSL_TXT_CAMELLIA "CAMELLIA" +#define SSL_TXT_CHACHA20 "CHACHA20" + +#define SSL_TXT_AEAD "AEAD" +#define SSL_TXT_MD5 "MD5" +#define SSL_TXT_SHA1 "SHA1" +#define SSL_TXT_SHA "SHA" /* same as "SHA1" */ +#define SSL_TXT_GOST94 "GOST94" +#define SSL_TXT_GOST89MAC "GOST89MAC" +#define SSL_TXT_SHA256 "SHA256" +#define SSL_TXT_SHA384 "SHA384" +#define SSL_TXT_STREEBOG256 "STREEBOG256" +#define SSL_TXT_STREEBOG512 "STREEBOG512" + +#define SSL_TXT_DTLS1 "DTLSv1" +#define SSL_TXT_SSLV2 "SSLv2" +#define SSL_TXT_SSLV3 "SSLv3" +#define SSL_TXT_TLSV1 "TLSv1" +#define SSL_TXT_TLSV1_1 "TLSv1.1" +#define SSL_TXT_TLSV1_2 "TLSv1.2" + +#define SSL_TXT_EXP "EXP" +#define SSL_TXT_EXPORT "EXPORT" + +#define SSL_TXT_ALL "ALL" + +/* + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +#define SSL_TXT_CMPALL "COMPLEMENTOFALL" +#define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* The following cipher list is used by default. + * It also is substituted when an application-defined cipher list string + * starts with 'DEFAULT'. */ +#define SSL_DEFAULT_CIPHER_LIST "ALL:!aNULL:!eNULL:!SSLv2" +/* As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always + * starts with a reasonable order, and all we have to do for DEFAULT is + * throwing out anonymous and unencrypted ciphersuites! + * (The latter are not actually enabled by ALL, but "ALL:RSA" would enable + * some of them.) + */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +#define SSL_SENT_SHUTDOWN 1 +#define SSL_RECEIVED_SHUTDOWN 2 + + +#define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +#define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* This is needed to stop compilers complaining about the + * 'struct ssl_st *' function parameters used to prototype callbacks + * in SSL_CTX. */ +typedef struct ssl_st *ssl_crock_st; + +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; + +DECLARE_STACK_OF(SSL_CIPHER) + +/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ +typedef struct srtp_protection_profile_st { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; + +DECLARE_STACK_OF(SRTP_PROTECTION_PROFILE) + +typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data, + int len, void *arg); +typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len, + STACK_OF(SSL_CIPHER) *peer_ciphers, SSL_CIPHER **cipher, void *arg); + +#ifndef OPENSSL_NO_SSL_INTERN + +/* used to hold info on the particular ciphers used */ +struct ssl_cipher_st { + int valid; + const char *name; /* text name */ + unsigned long id; /* id, 4 bytes, first is version */ + + unsigned long algorithm_mkey; /* key exchange algorithm */ + unsigned long algorithm_auth; /* server authentication */ + unsigned long algorithm_enc; /* symmetric encryption */ + unsigned long algorithm_mac; /* symmetric authentication */ + unsigned long algorithm_ssl; /* (major) protocol version */ + + unsigned long algo_strength; /* strength and export flags */ + unsigned long algorithm2; /* Extra flags */ + int strength_bits; /* Number of bits really used */ + int alg_bits; /* Number of bits for algorithm */ +}; + + +/* Used to hold functions for SSLv3/TLSv1 functions */ +struct ssl_method_internal_st; + +struct ssl_method_st { + int (*ssl_dispatch_alert)(SSL *s); + int (*num_ciphers)(void); + const SSL_CIPHER *(*get_cipher)(unsigned ncipher); + const SSL_CIPHER *(*get_cipher_by_char)(const unsigned char *ptr); + int (*put_cipher_by_char)(const SSL_CIPHER *cipher, unsigned char *ptr); + + const struct ssl_method_internal_st *internal; +}; + +/* Lets make this into an ASN.1 type structure as follows + * SSL_SESSION_ID ::= SEQUENCE { + * version INTEGER, -- structure version number + * SSLversion INTEGER, -- SSL version number + * Cipher OCTET STRING, -- the 3 byte cipher ID + * Session_ID OCTET STRING, -- the Session ID + * Master_key OCTET STRING, -- the master key + * KRB5_principal OCTET STRING -- optional Kerberos principal + * Time [ 1 ] EXPLICIT INTEGER, -- optional Start Time + * Timeout [ 2 ] EXPLICIT INTEGER, -- optional Timeout ins seconds + * Peer [ 3 ] EXPLICIT X509, -- optional Peer Certificate + * Session_ID_context [ 4 ] EXPLICIT OCTET STRING, -- the Session ID context + * Verify_result [ 5 ] EXPLICIT INTEGER, -- X509_V_... code for `Peer' + * HostName [ 6 ] EXPLICIT OCTET STRING, -- optional HostName from servername TLS extension + * PSK_identity_hint [ 7 ] EXPLICIT OCTET STRING, -- optional PSK identity hint + * PSK_identity [ 8 ] EXPLICIT OCTET STRING, -- optional PSK identity + * Ticket_lifetime_hint [9] EXPLICIT INTEGER, -- server's lifetime hint for session ticket + * Ticket [10] EXPLICIT OCTET STRING, -- session ticket (clients only) + * Compression_meth [11] EXPLICIT OCTET STRING, -- optional compression method + * SRP_username [ 12 ] EXPLICIT OCTET STRING -- optional SRP username + * } + * Look in ssl/ssl_asn1.c for more details + * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-). + */ +struct ssl_session_internal_st; + +struct ssl_session_st { + int ssl_version; /* what ssl version session info is + * being kept in here? */ + + int master_key_length; + unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH]; + + /* session_id - valid? */ + unsigned int session_id_length; + unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]; + + /* this is used to determine whether the session is being reused in + * the appropriate context. It is up to the application to set this, + * via SSL_new */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + + /* This is the cert for the other end. */ + X509 *peer; + + /* when app_verify_callback accepts a session where the peer's certificate + * is not ok, we must remember the error for session reuse: */ + long verify_result; /* only for servers */ + + long timeout; + time_t time; + int references; + + const SSL_CIPHER *cipher; + unsigned long cipher_id; /* when ASN.1 loaded, this + * needs to be used to load + * the 'cipher' structure */ + + STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */ + + char *tlsext_hostname; + + /* RFC4507 info */ + unsigned char *tlsext_tick; /* Session ticket */ + size_t tlsext_ticklen; /* Session ticket length */ + long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ + + struct ssl_session_internal_st *internal; +}; + +#endif + +/* Allow initial connection to servers that don't support RI */ +#define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004L +#define SSL_OP_TLSEXT_PADDING 0x00000010L + +/* Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added + * in OpenSSL 0.9.6d. Usually (depending on the application protocol) + * the workaround is not needed. + * Unfortunately some broken SSL/TLS implementations cannot handle it + * at all, which is why it was previously included in SSL_OP_ALL. + * Now it's not. + */ +#define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0x00000800L + +/* DTLS options */ +#define SSL_OP_NO_QUERY_MTU 0x00001000L +/* Turn on Cookie Exchange (on relevant for servers) */ +#define SSL_OP_COOKIE_EXCHANGE 0x00002000L +/* Don't use RFC4507 ticket extension */ +#define SSL_OP_NO_TICKET 0x00004000L + +/* As server, disallow session resumption on renegotiation */ +#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L +/* Disallow client initiated renegotiation. */ +#define SSL_OP_NO_CLIENT_RENEGOTIATION 0x00020000L +/* If set, always create a new key when using tmp_ecdh parameters */ +#define SSL_OP_SINGLE_ECDH_USE 0x00080000L +/* If set, always create a new key when using tmp_dh parameters */ +#define SSL_OP_SINGLE_DH_USE 0x00100000L +/* Set on servers to choose the cipher according to the server's + * preferences */ +#define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L +/* If set, a server will allow a client to issue a SSLv3.0 version number + * as latest version supported in the premaster secret, even when TLSv1.0 + * (version 3.1) was announced in the client hello. Normally this is + * forbidden to prevent version rollback attacks. */ +#define SSL_OP_TLS_ROLLBACK_BUG 0x00800000L + +#define SSL_OP_NO_TLSv1 0x04000000L +#define SSL_OP_NO_TLSv1_2 0x08000000L +#define SSL_OP_NO_TLSv1_1 0x10000000L + +/* Make server add server-hello extension from early version of + * cryptopro draft, when GOST ciphersuite is negotiated. + * Required for interoperability with CryptoPro CSP 3.x + */ +#define SSL_OP_CRYPTOPRO_TLSEXT_BUG 0x80000000L + +/* SSL_OP_ALL: various bug workarounds that should be rather harmless. */ +#define SSL_OP_ALL \ + (SSL_OP_LEGACY_SERVER_CONNECT | \ + SSL_OP_TLSEXT_PADDING | \ + SSL_OP_CRYPTOPRO_TLSEXT_BUG) + +/* Obsolete flags kept for compatibility. No sane code should use them. */ +#define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x0 +#define SSL_OP_CISCO_ANYCONNECT 0x0 +#define SSL_OP_EPHEMERAL_RSA 0x0 +#define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x0 +#define SSL_OP_MICROSOFT_SESS_ID_BUG 0x0 +#define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +#define SSL_OP_NETSCAPE_CA_DN_BUG 0x0 +#define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x0 +#define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x0 +#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x0 +#define SSL_OP_NO_COMPRESSION 0x0 +#define SSL_OP_NO_SSLv2 0x0 +#define SSL_OP_NO_SSLv3 0x0 +#define SSL_OP_PKCS1_CHECK_1 0x0 +#define SSL_OP_PKCS1_CHECK_2 0x0 +#define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x0 +#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x0 +#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 +#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x0 +#define SSL_OP_TLS_D5_BUG 0x0 + +/* Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): */ +#define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L +/* Make it possible to retry SSL_write() with changed buffer location + * (buffer contents must stay the same!); this is not the default to avoid + * the misconception that non-blocking SSL_write() behaves like + * non-blocking write(): */ +#define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L +/* Never bother the application with retries if the transport + * is blocking: */ +#define SSL_MODE_AUTO_RETRY 0x00000004L +/* Don't attempt to automatically build certificate chain */ +#define SSL_MODE_NO_AUTO_CHAIN 0x00000008L +/* Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) "Released" buffers are put onto a free-list in the context + * or just freed (depending on the context's setting for freelist_max_len). */ +#define SSL_MODE_RELEASE_BUFFERS 0x00000010L + +/* Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, + * they cannot be used to clear bits. */ + +#define SSL_CTX_set_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL) +#define SSL_CTX_clear_options(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +#define SSL_CTX_get_options(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL) +#define SSL_set_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL) +#define SSL_clear_options(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_OPTIONS,(op),NULL) +#define SSL_get_options(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL) + +#define SSL_CTX_set_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) +#define SSL_CTX_clear_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL) +#define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) +#define SSL_clear_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL) +#define SSL_set_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) +#define SSL_get_mode(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) +#define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) + +#define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, + int version, int content_type, const void *buf, size_t len, SSL *ssl, + void *arg)); +void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, + int content_type, const void *buf, size_t len, SSL *ssl, void *arg)); +#define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +#define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +struct ssl_aead_ctx_st; +typedef struct ssl_aead_ctx_st SSL_AEAD_CTX; + +#define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */ + +#define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) + +/* This callback type is used inside SSL_CTX, SSL, and in the functions that set + * them. It is used to override the generation of SSL/TLS session IDs in a + * server. Return value should be zero on an error, non-zero to proceed. Also, + * callbacks should themselves check if the id they generate is unique otherwise + * the SSL handshake will fail with an error - callbacks can do this using the + * 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) + * The length value passed in is set at the maximum size the session ID can be. + * In SSLv2 this is 16 bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback + * can alter this length to be less if desired, but under SSLv2 session IDs are + * supposed to be fixed at 16 bytes so the id will be padded after the callback + * returns in this case. It is also an error for the callback to set the size to + * zero. */ +typedef int (*GEN_SESSION_CB)(const SSL *ssl, unsigned char *id, + unsigned int *id_len); + +typedef struct ssl_comp_st SSL_COMP; + +#ifndef OPENSSL_NO_SSL_INTERN + +struct ssl_comp_st { + int id; + const char *name; +}; + +DECLARE_STACK_OF(SSL_COMP) +struct lhash_st_SSL_SESSION { + int dummy; +}; + +struct ssl_ctx_internal_st; + +struct ssl_ctx_st { + const SSL_METHOD *method; + + STACK_OF(SSL_CIPHER) *cipher_list; + + struct x509_store_st /* X509_STORE */ *cert_store; + + /* If timeout is not 0, it is the default timeout value set + * when SSL_new() is called. This has been put in to make + * life easier to set things up */ + long session_timeout; + + int references; + + /* Default values to use in SSL structures follow (these are copied by SSL_new) */ + + STACK_OF(X509) *extra_certs; + + int verify_mode; + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + + X509_VERIFY_PARAM *param; + + /* + * XXX + * default_passwd_cb used by python and openvpn, need to keep it until we + * add an accessor + */ + /* Default password callback. */ + pem_password_cb *default_passwd_callback; + + /* Default password callback user data. */ + void *default_passwd_callback_userdata; + + struct ssl_ctx_internal_st *internal; +}; + +#endif + +#define SSL_SESS_CACHE_OFF 0x0000 +#define SSL_SESS_CACHE_CLIENT 0x0001 +#define SSL_SESS_CACHE_SERVER 0x0002 +#define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER) +#define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +#define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +#define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE) + +struct lhash_st_SSL_SESSION *SSL_CTX_sessions(SSL_CTX *ctx); +#define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL) +#define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL) +#define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL) +#define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL) +#define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL) +#define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL) +#define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL) +#define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL) +#define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL) +#define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL) +#define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL) +#define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, + int (*new_session_cb)(struct ssl_st *ssl, SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(struct ssl_st *ssl, + SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, + void (*remove_session_cb)(struct ssl_ctx_st *ctx, SSL_SESSION *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(struct ssl_ctx_st *ctx, + SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, + SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl, unsigned char *data, + int len, int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(struct ssl_st *ssl, + unsigned char *Data, int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, void (*cb)(const SSL *ssl, + int type, int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl, int type, + int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, + int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL *ssl, X509 **x509, + EVP_PKEY **pkey); +#ifndef OPENSSL_NO_ENGINE +int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); +#endif +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, + int (*app_gen_cookie_cb)(SSL *ssl, unsigned char *cookie, + unsigned int *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, + int (*app_verify_cookie_cb)(SSL *ssl, unsigned char *cookie, + unsigned int cookie_len)); +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, int (*cb)(SSL *ssl, + const unsigned char **out, unsigned int *outlen, void *arg), void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, int (*cb)(SSL *ssl, + unsigned char **out, unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg), void *arg); + +int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, const unsigned char *client, + unsigned int client_len); +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); + +#define OPENSSL_NPN_UNSUPPORTED 0 +#define OPENSSL_NPN_NEGOTIATED 1 +#define OPENSSL_NPN_NO_OVERLAP 2 + +int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned int protos_len); +int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned int protos_len); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + int (*cb)(SSL *ssl, const unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, void *arg), void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned int *len); + +#define SSL_NOTHING 1 +#define SSL_WRITING 2 +#define SSL_READING 3 +#define SSL_X509_LOOKUP 4 + +/* These will only be used when doing non-blocking IO */ +#define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +#define SSL_want_read(s) (SSL_want(s) == SSL_READING) +#define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +#define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) + +#define SSL_MAC_FLAG_READ_MAC_STREAM 1 +#define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 + +#ifndef OPENSSL_NO_SSL_INTERN +struct ssl_internal_st; + +struct ssl_st { + /* protocol version + * (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION, DTLS1_VERSION) + */ + int version; + + const SSL_METHOD *method; /* SSLv3 */ + + /* There are 2 BIO's even though they are normally both the + * same. This is so data can be read and written to different + * handlers */ + + BIO *rbio; /* used by SSL_read */ + BIO *wbio; /* used by SSL_write */ + BIO *bbio; /* used during session-id reuse to concatenate + * messages */ + int server; /* are we the server side? - mostly used by SSL_clear*/ + + struct ssl3_state_st *s3; /* SSLv3 variables */ + struct dtls1_state_st *d1; /* DTLSv1 variables */ + + X509_VERIFY_PARAM *param; + + /* crypto */ + STACK_OF(SSL_CIPHER) *cipher_list; + + /* This is used to hold the server certificate used */ + struct cert_st /* CERT */ *cert; + + /* the session_id_context is used to ensure sessions are only reused + * in the appropriate context */ + unsigned int sid_ctx_length; + unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; + + /* This can also be in the session once a session is established */ + SSL_SESSION *session; + + /* Used in SSL2 and SSL3 */ + int verify_mode; /* 0 don't care about verify failure. + * 1 fail if verify fails */ + int error; /* error bytes to be written */ + int error_code; /* actual code */ + + SSL_CTX *ctx; + + long verify_result; + + int references; + + int client_version; /* what was passed, used for + * SSLv3/TLS rollback check */ + + unsigned int max_send_fragment; + + char *tlsext_hostname; + + /* certificate status request info */ + /* Status type or -1 if no status type */ + int tlsext_status_type; + + SSL_CTX * initial_ctx; /* initial ctx, used to store sessions */ +#define session_ctx initial_ctx + + /* + * XXX really should be internal, but is + * touched unnaturally by wpa-supplicant + * and freeradius and other perversions + */ + EVP_CIPHER_CTX *enc_read_ctx; /* cryptographic state */ + EVP_MD_CTX *read_hash; /* used for mac generation */ + + struct ssl_internal_st *internal; +}; + +#endif + +#ifdef __cplusplus +} +#endif + +#include +#include +#include /* This is mostly sslv3 with a few tweaks */ +#include /* Datagram TLS */ +#include +#include /* Support for the use_srtp extension */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* compatibility */ +#define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)arg)) +#define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) +#define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0,(char *)a)) +#define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0)) +#define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0)) +#define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0,(char *)arg)) + +/* The following are the possible values for ssl->state are are + * used to indicate where we are up to in the SSL connection establishment. + * The macros that follow are about the only things you should need to use + * and even then, only when using non-blocking IO. + * It can also be useful to work out where you were when the connection + * failed */ + +#define SSL_ST_CONNECT 0x1000 +#define SSL_ST_ACCEPT 0x2000 +#define SSL_ST_MASK 0x0FFF +#define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT) +#define SSL_ST_BEFORE 0x4000 +#define SSL_ST_OK 0x03 +#define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) + +#define SSL_CB_LOOP 0x01 +#define SSL_CB_EXIT 0x02 +#define SSL_CB_READ 0x04 +#define SSL_CB_WRITE 0x08 +#define SSL_CB_ALERT 0x4000 /* used in callback */ +#define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ) +#define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE) +#define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP) +#define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT) +#define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP) +#define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT) +#define SSL_CB_HANDSHAKE_START 0x10 +#define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +#define SSL_get_state(a) SSL_state(a) +#define SSL_is_init_finished(a) (SSL_state(a) == SSL_ST_OK) +#define SSL_in_init(a) (SSL_state(a)&SSL_ST_INIT) +#define SSL_in_before(a) (SSL_state(a)&SSL_ST_BEFORE) +#define SSL_in_connect_init(a) (SSL_state(a)&SSL_ST_CONNECT) +#define SSL_in_accept_init(a) (SSL_state(a)&SSL_ST_ACCEPT) + +/* The following 2 states are kept in ssl->rstate when reads fail, + * you should not need these */ +#define SSL_ST_READ_HEADER 0xF0 +#define SSL_ST_READ_BODY 0xF1 +#define SSL_ST_READ_DONE 0xF2 + +/* Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options + * are 'ored' with SSL_VERIFY_PEER if they are desired */ +#define SSL_VERIFY_NONE 0x00 +#define SSL_VERIFY_PEER 0x01 +#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +#define SSL_VERIFY_CLIENT_ONCE 0x04 + +#define OpenSSL_add_ssl_algorithms() SSL_library_init() +#define SSLeay_add_ssl_algorithms() SSL_library_init() + +/* More backward compatibility */ +#define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +#define SSL_get_cipher_bits(s,np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +#define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +#define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +#define SSL_get_time(a) SSL_SESSION_get_time(a) +#define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) +#define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +#define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) + +#define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) +#define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) + +SSL_SESSION *PEM_read_bio_SSL_SESSION(BIO *bp, SSL_SESSION **x, + pem_password_cb *cb, void *u); +SSL_SESSION *PEM_read_SSL_SESSION(FILE *fp, SSL_SESSION **x, + pem_password_cb *cb, void *u); +int PEM_write_bio_SSL_SESSION(BIO *bp, SSL_SESSION *x); +int PEM_write_SSL_SESSION(FILE *fp, SSL_SESSION *x); + +#define SSL_AD_REASON_OFFSET 1000 /* offset to get SSL_R_... value from SSL_AD_... */ + +/* These alert types are for SSLv3 and TLSv1 */ +#define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +#define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE /* fatal */ +#define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC /* fatal */ +#define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +#define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +#define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE/* fatal */ +#define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE/* fatal */ +#define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE /* Not for TLS */ +#define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +#define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +#define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +#define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +#define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +#define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER /* fatal */ +#define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA /* fatal */ +#define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED /* fatal */ +#define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR /* fatal */ +#define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +#define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION/* fatal */ +#define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION /* fatal */ +#define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY/* fatal */ +#define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR /* fatal */ +#define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK /* fatal */ +#define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +#define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +#define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +#define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +#define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +#define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +#define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +#define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY /* fatal */ + +#define SSL_ERROR_NONE 0 +#define SSL_ERROR_SSL 1 +#define SSL_ERROR_WANT_READ 2 +#define SSL_ERROR_WANT_WRITE 3 +#define SSL_ERROR_WANT_X509_LOOKUP 4 +#define SSL_ERROR_SYSCALL 5 /* look at error stack/return value/errno */ +#define SSL_ERROR_ZERO_RETURN 6 +#define SSL_ERROR_WANT_CONNECT 7 +#define SSL_ERROR_WANT_ACCEPT 8 + +#define SSL_CTRL_NEED_TMP_RSA 1 +#define SSL_CTRL_SET_TMP_RSA 2 +#define SSL_CTRL_SET_TMP_DH 3 +#define SSL_CTRL_SET_TMP_ECDH 4 +#define SSL_CTRL_SET_TMP_RSA_CB 5 +#define SSL_CTRL_SET_TMP_DH_CB 6 +#define SSL_CTRL_SET_TMP_ECDH_CB 7 + +#define SSL_CTRL_GET_SESSION_REUSED 8 +#define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +#define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +#define SSL_CTRL_GET_FLAGS 13 +#define SSL_CTRL_EXTRA_CHAIN_CERT 14 + +#define SSL_CTRL_SET_MSG_CALLBACK 15 +#define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 + +/* only applies to datagram connections */ +#define SSL_CTRL_SET_MTU 17 +/* Stats */ +#define SSL_CTRL_SESS_NUMBER 20 +#define SSL_CTRL_SESS_CONNECT 21 +#define SSL_CTRL_SESS_CONNECT_GOOD 22 +#define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +#define SSL_CTRL_SESS_ACCEPT 24 +#define SSL_CTRL_SESS_ACCEPT_GOOD 25 +#define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +#define SSL_CTRL_SESS_HIT 27 +#define SSL_CTRL_SESS_CB_HIT 28 +#define SSL_CTRL_SESS_MISSES 29 +#define SSL_CTRL_SESS_TIMEOUTS 30 +#define SSL_CTRL_SESS_CACHE_FULL 31 +#define SSL_CTRL_OPTIONS 32 +#define SSL_CTRL_MODE 33 + +#define SSL_CTRL_GET_READ_AHEAD 40 +#define SSL_CTRL_SET_READ_AHEAD 41 +#define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +#define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +#define SSL_CTRL_SET_SESS_CACHE_MODE 44 +#define SSL_CTRL_GET_SESS_CACHE_MODE 45 + +#define SSL_CTRL_GET_MAX_CERT_LIST 50 +#define SSL_CTRL_SET_MAX_CERT_LIST 51 + +#define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 + +/* see tls1.h for macros based on these */ +#define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +#define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +#define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +#define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +#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_SET_TLSEXT_STATUS_REQ_CB 63 +#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 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 + +#define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 + +#define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 +#define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 +#define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 + +#define SSL_CTRL_SET_SRP_ARG 78 +#define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 +#define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 +#define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 + +#define DTLS_CTRL_GET_TIMEOUT 73 +#define DTLS_CTRL_HANDLE_TIMEOUT 74 +#define DTLS_CTRL_LISTEN 75 + +#define SSL_CTRL_GET_RI_SUPPORT 76 +#define SSL_CTRL_CLEAR_OPTIONS 77 +#define SSL_CTRL_CLEAR_MODE 78 + +#define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +#define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 + +#define SSL_CTRL_SET_GROUPS 91 +#define SSL_CTRL_SET_GROUPS_LIST 92 + +#define SSL_CTRL_SET_ECDH_AUTO 94 + +#define SSL_CTRL_GET_SERVER_TMP_KEY 109 + +#define SSL_CTRL_SET_DH_AUTO 118 + +#define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg) +#define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL) +#define DTLSv1_listen(ssl, peer) \ + SSL_ctrl(ssl,DTLS_CTRL_LISTEN,0, (void *)peer) + +#define SSL_session_reused(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL) +#define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL) +#define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL) +#define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL) + +#define SSL_CTX_need_tmp_RSA(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_NEED_TMP_RSA,0,NULL) +#define SSL_CTX_set_tmp_rsa(ctx,rsa) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +#define SSL_CTX_set_tmp_dh(ctx,dh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +#define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +#define SSL_CTX_set_dh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_DH_AUTO,onoff,NULL) +#define SSL_CTX_set_ecdh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) + +#define SSL_need_tmp_RSA(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL) +#define SSL_set_tmp_rsa(ssl,rsa) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa) +#define SSL_set_tmp_dh(ssl,dh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh) +#define SSL_set_tmp_ecdh(ssl,ecdh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh) +#define SSL_set_dh_auto(s, onoff) \ + SSL_ctrl(s,SSL_CTRL_SET_DH_AUTO,onoff,NULL) +#define SSL_set_ecdh_auto(s, onoff) \ + SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) + +int SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t groups_len); +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); + +#ifndef LIBRESSL_INTERNAL +#define SSL_CTRL_SET_CURVES SSL_CTRL_SET_GROUPS +#define SSL_CTRL_SET_CURVES_LIST SSL_CTRL_SET_GROUPS_LIST + +#define SSL_CTX_set1_curves SSL_CTX_set1_groups +#define SSL_CTX_set1_curves_list SSL_CTX_set1_groups_list +#define SSL_set1_curves SSL_set1_groups +#define SSL_set1_curves_list SSL_set1_groups_list +#endif + +#define SSL_CTX_add_extra_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) +#define SSL_CTX_get_extra_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509) +#define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) + +#define SSL_get_server_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk) + +BIO_METHOD *BIO_f_ssl(void); +BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +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); + +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 *); +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 *); +int SSL_want(const SSL *s); +int SSL_clear(SSL *s); + +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); + +const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +const SSL_CIPHER *SSL_CIPHER_get_by_id(unsigned int id); +const SSL_CIPHER *SSL_CIPHER_get_by_value(uint16_t value); +int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +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_get_fd(const SSL *s); +int SSL_get_rfd(const SSL *s); +int SSL_get_wfd(const SSL *s); +const char * SSL_get_cipher_list(const SSL *s, int n); +char * SSL_get_shared_ciphers(const SSL *s, char *buf, int len); +int SSL_get_read_ahead(const SSL * s); +int SSL_pending(const SSL *s); +int SSL_set_fd(SSL *s, int fd); +int SSL_set_rfd(SSL *s, int fd); +int SSL_set_wfd(SSL *s, int fd); +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +BIO * SSL_get_rbio(const SSL *s); +BIO * SSL_get_wbio(const SSL *s); +int SSL_set_cipher_list(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +int SSL_get_verify_mode(const SSL *s); +int SSL_get_verify_depth(const SSL *s); +int (*SSL_get_verify_callback(const SSL *s))(int, X509_STORE_CTX *); +void SSL_set_verify(SSL *s, int mode, + int (*callback)(int ok, X509_STORE_CTX *ctx)); +void SSL_set_verify_depth(SSL *s, int depth); +int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len); +int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, long len); +int SSL_use_certificate(SSL *ssl, X509 *x); +int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); + +int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +int SSL_use_certificate_file(SSL *ssl, const char *file, int type); +int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); +int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */ +int SSL_CTX_use_certificate_chain_mem(SSL_CTX *ctx, void *buf, int len); +STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); + +void SSL_load_error_strings(void ); +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); +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_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, + unsigned int *len); +unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +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); +int SSL_CTX_remove_session(SSL_CTX *, SSL_SESSION *c); +int SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB); +int SSL_set_generate_session_id(SSL *, GEN_SESSION_CB); +int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, + long length); + +#ifdef HEADER_X509_H +X509 * SSL_get_peer_certificate(const SSL *s); +#endif + +STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int, X509_STORE_CTX *); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, + int (*callback)(int, X509_STORE_CTX *)); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *, void *), void *arg); +int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, long len); +int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, const unsigned char *d, long len); +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); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); + +int SSL_CTX_check_private_key(const SSL_CTX *ctx); +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); +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); + +int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + + +void SSL_free(SSL *ssl); +int SSL_accept(SSL *ssl); +int SSL_connect(SSL *ssl); +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); +long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +int SSL_get_error(const SSL *s, int ret_code); +const char *SSL_get_version(const SSL *s); + +/* This sets the 'default' SSL version that SSL_new() will create */ +int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); + +const SSL_METHOD *SSLv23_method(void); /* SSLv3 or TLSv1.* */ +const SSL_METHOD *SSLv23_server_method(void); /* SSLv3 or TLSv1.* */ +const SSL_METHOD *SSLv23_client_method(void); /* SSLv3 or TLSv1.* */ + +const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */ +const SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */ + +const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_server_method(void); /* TLSv1.1 */ +const SSL_METHOD *TLSv1_1_client_method(void); /* TLSv1.1 */ + +const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_server_method(void); /* TLSv1.2 */ +const SSL_METHOD *TLSv1_2_client_method(void); /* TLSv1.2 */ + +const SSL_METHOD *TLS_method(void); /* TLS v1.0 or later */ +const SSL_METHOD *TLS_server_method(void); /* TLS v1.0 or later */ +const SSL_METHOD *TLS_client_method(void); /* TLS v1.0 or later */ + +const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_server_method(void); /* DTLSv1.0 */ +const SSL_METHOD *DTLSv1_client_method(void); /* DTLSv1.0 */ + +STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); + +int SSL_do_handshake(SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +int SSL_renegotiate_pending(SSL *s); +int SSL_shutdown(SSL *s); + +const SSL_METHOD *SSL_get_ssl_method(SSL *s); +int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +const char *SSL_alert_type_string_long(int value); +const char *SSL_alert_type_string(int value); +const char *SSL_alert_desc_string_long(int value); +const char *SSL_alert_desc_string(int value); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +int SSL_add_client_CA(SSL *ssl, X509 *x); +int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +long SSL_get_default_timeout(const SSL *s); + +int SSL_library_init(void ); + +char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk); + +SSL *SSL_dup(SSL *ssl); + +X509 *SSL_get_certificate(const SSL *ssl); +/* EVP_PKEY */ struct evp_pkey_st *SSL_get_privatekey(SSL *ssl); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode); +int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl,int mode); +int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl,int mode); +int SSL_get_shutdown(const SSL *ssl); +int SSL_version(const SSL *ssl); +int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, + const char *CApath); +int SSL_CTX_load_verify_mem(SSL_CTX *ctx, void *buf, int len); +#define SSL_get0_session SSL_get_session /* just peek at pointer */ +SSL_SESSION *SSL_get_session(const SSL *ssl); +SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb)(const SSL *ssl, int type, int val)); +void (*SSL_get_info_callback(const SSL *ssl))(const SSL *ssl, int type, int val); +int SSL_state(const SSL *ssl); +void SSL_set_state(SSL *ssl, int state); + +void SSL_set_verify_result(SSL *ssl, long v); +long SSL_get_verify_result(const SSL *ssl); + +int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); +int SSL_SESSION_get_ex_new_index(long argl, void *argp, + CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); + +int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); +int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); + +int SSL_get_ex_data_X509_STORE_CTX_idx(void ); + +#define SSL_CTX_sess_set_cache_size(ctx,t) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL) +#define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL) +#define SSL_CTX_set_session_cache_mode(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL) +#define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL) + +#define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +#define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m) +#define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL) +#define SSL_CTX_set_read_ahead(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL) +#define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +#define SSL_CTX_set_max_cert_list(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) +#define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +#define SSL_set_max_cert_list(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) + +#define SSL_CTX_set_max_send_fragment(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) +#define SSL_set_max_send_fragment(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) + +/* NB: the keylength is only applicable when is_export is true */ +void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx, + RSA *(*cb)(SSL *ssl, int is_export, int keylength)); + +void SSL_set_tmp_rsa_callback(SSL *ssl, + RSA *(*cb)(SSL *ssl, int is_export, int keylength)); +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh)(SSL *ssl, int is_export, int keylength)); +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh)(SSL *ssl, int is_export, int keylength)); +void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx, + EC_KEY *(*ecdh)(SSL *ssl, int is_export, int keylength)); +void SSL_set_tmp_ecdh_callback(SSL *ssl, + EC_KEY *(*ecdh)(SSL *ssl, int is_export, int keylength)); + +const void *SSL_get_current_compression(SSL *s); +const void *SSL_get_current_expansion(SSL *s); + +const char *SSL_COMP_get_name(const void *comp); +void *SSL_COMP_get_compression_methods(void); +int SSL_COMP_add_compression_method(int id, void *cm); + +/* TLS extensions functions */ +int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +int SSL_set_session_ticket_ext_cb(SSL *s, + tls_session_ticket_ext_cb_fn cb, void *arg); + +/* Pre-shared secret session resumption functions */ +int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn tls_session_secret_cb, void *arg); + +void SSL_set_debug(SSL *s, int debug); +int SSL_cache_hit(SSL *s); + +/* 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. + */ +void ERR_load_SSL_strings(void); + +/* Error codes for the SSL functions. */ + +/* Function codes. */ +#define SSL_F_CLIENT_CERTIFICATE 100 +#define SSL_F_CLIENT_FINISHED 167 +#define SSL_F_CLIENT_HELLO 101 +#define SSL_F_CLIENT_MASTER_KEY 102 +#define SSL_F_D2I_SSL_SESSION 103 +#define SSL_F_DO_DTLS1_WRITE 245 +#define SSL_F_DO_SSL3_WRITE 104 +#define SSL_F_DTLS1_ACCEPT 246 +#define SSL_F_DTLS1_ADD_CERT_TO_BUF 295 +#define SSL_F_DTLS1_BUFFER_RECORD 247 +#define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 316 +#define SSL_F_DTLS1_CLIENT_HELLO 248 +#define SSL_F_DTLS1_CONNECT 249 +#define SSL_F_DTLS1_ENC 250 +#define SSL_F_DTLS1_GET_HELLO_VERIFY 251 +#define SSL_F_DTLS1_GET_MESSAGE 252 +#define SSL_F_DTLS1_GET_MESSAGE_FRAGMENT 253 +#define SSL_F_DTLS1_GET_RECORD 254 +#define SSL_F_DTLS1_HANDLE_TIMEOUT 297 +#define SSL_F_DTLS1_HEARTBEAT 305 +#define SSL_F_DTLS1_OUTPUT_CERT_CHAIN 255 +#define SSL_F_DTLS1_PREPROCESS_FRAGMENT 288 +#define SSL_F_DTLS1_PROCESS_OUT_OF_SEQ_MESSAGE 256 +#define SSL_F_DTLS1_PROCESS_RECORD 257 +#define SSL_F_DTLS1_READ_BYTES 258 +#define SSL_F_DTLS1_READ_FAILED 259 +#define SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST 260 +#define SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE 261 +#define SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE 262 +#define SSL_F_DTLS1_SEND_CLIENT_VERIFY 263 +#define SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST 264 +#define SSL_F_DTLS1_SEND_SERVER_CERTIFICATE 265 +#define SSL_F_DTLS1_SEND_SERVER_HELLO 266 +#define SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE 267 +#define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 268 +#define SSL_F_GET_CLIENT_FINISHED 105 +#define SSL_F_GET_CLIENT_HELLO 106 +#define SSL_F_GET_CLIENT_MASTER_KEY 107 +#define SSL_F_GET_SERVER_FINISHED 108 +#define SSL_F_GET_SERVER_HELLO 109 +#define SSL_F_GET_SERVER_VERIFY 110 +#define SSL_F_I2D_SSL_SESSION 111 +#define SSL_F_READ_N 112 +#define SSL_F_REQUEST_CERTIFICATE 113 +#define SSL_F_SERVER_FINISH 239 +#define SSL_F_SERVER_HELLO 114 +#define SSL_F_SERVER_VERIFY 240 +#define SSL_F_SSL23_ACCEPT 115 +#define SSL_F_SSL23_CLIENT_HELLO 116 +#define SSL_F_SSL23_CONNECT 117 +#define SSL_F_SSL23_GET_CLIENT_HELLO 118 +#define SSL_F_SSL23_GET_SERVER_HELLO 119 +#define SSL_F_SSL23_PEEK 237 +#define SSL_F_SSL23_READ 120 +#define SSL_F_SSL23_WRITE 121 +#define SSL_F_SSL2_ACCEPT 122 +#define SSL_F_SSL2_CONNECT 123 +#define SSL_F_SSL2_ENC_INIT 124 +#define SSL_F_SSL2_GENERATE_KEY_MATERIAL 241 +#define SSL_F_SSL2_PEEK 234 +#define SSL_F_SSL2_READ 125 +#define SSL_F_SSL2_READ_INTERNAL 236 +#define SSL_F_SSL2_SET_CERTIFICATE 126 +#define SSL_F_SSL2_WRITE 127 +#define SSL_F_SSL3_ACCEPT 128 +#define SSL_F_SSL3_ADD_CERT_TO_BUF 296 +#define SSL_F_SSL3_CALLBACK_CTRL 233 +#define SSL_F_SSL3_CHANGE_CIPHER_STATE 129 +#define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 130 +#define SSL_F_SSL3_CHECK_CLIENT_HELLO 304 +#define SSL_F_SSL3_CLIENT_HELLO 131 +#define SSL_F_SSL3_CONNECT 132 +#define SSL_F_SSL3_CTRL 213 +#define SSL_F_SSL3_CTX_CTRL 133 +#define SSL_F_SSL3_DIGEST_CACHED_RECORDS 293 +#define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC 292 +#define SSL_F_SSL3_ENC 134 +#define SSL_F_SSL3_GENERATE_KEY_BLOCK 238 +#define SSL_F_SSL3_GET_CERTIFICATE_REQUEST 135 +#define SSL_F_SSL3_GET_CERT_STATUS 289 +#define SSL_F_SSL3_GET_CERT_VERIFY 136 +#define SSL_F_SSL3_GET_CLIENT_CERTIFICATE 137 +#define SSL_F_SSL3_GET_CLIENT_HELLO 138 +#define SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE 139 +#define SSL_F_SSL3_GET_FINISHED 140 +#define SSL_F_SSL3_GET_KEY_EXCHANGE 141 +#define SSL_F_SSL3_GET_MESSAGE 142 +#define SSL_F_SSL3_GET_NEW_SESSION_TICKET 283 +#define SSL_F_SSL3_GET_NEXT_PROTO 306 +#define SSL_F_SSL3_GET_RECORD 143 +#define SSL_F_SSL3_GET_SERVER_CERTIFICATE 144 +#define SSL_F_SSL3_GET_SERVER_DONE 145 +#define SSL_F_SSL3_GET_SERVER_HELLO 146 +#define SSL_F_SSL3_HANDSHAKE_MAC 285 +#define SSL_F_SSL3_NEW_SESSION_TICKET 287 +#define SSL_F_SSL3_OUTPUT_CERT_CHAIN 147 +#define SSL_F_SSL3_PEEK 235 +#define SSL_F_SSL3_READ_BYTES 148 +#define SSL_F_SSL3_READ_N 149 +#define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST 150 +#define SSL_F_SSL3_SEND_CLIENT_CERTIFICATE 151 +#define SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE 152 +#define SSL_F_SSL3_SEND_CLIENT_VERIFY 153 +#define SSL_F_SSL3_SEND_SERVER_CERTIFICATE 154 +#define SSL_F_SSL3_SEND_SERVER_HELLO 242 +#define SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE 155 +#define SSL_F_SSL3_SETUP_KEY_BLOCK 157 +#define SSL_F_SSL3_SETUP_READ_BUFFER 156 +#define SSL_F_SSL3_SETUP_WRITE_BUFFER 291 +#define SSL_F_SSL3_WRITE_BYTES 158 +#define SSL_F_SSL3_WRITE_PENDING 159 +#define SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT 298 +#define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 277 +#define SSL_F_SSL_ADD_CLIENTHELLO_USE_SRTP_EXT 307 +#define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 215 +#define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 216 +#define SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT 299 +#define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 278 +#define SSL_F_SSL_ADD_SERVERHELLO_USE_SRTP_EXT 308 +#define SSL_F_SSL_BAD_METHOD 160 +#define SSL_F_SSL_BYTES_TO_CIPHER_LIST 161 +#define SSL_F_SSL_CERT_DUP 221 +#define SSL_F_SSL_CERT_INST 222 +#define SSL_F_SSL_CERT_INSTANTIATE 214 +#define SSL_F_SSL_CERT_NEW 162 +#define SSL_F_SSL_CHECK_PRIVATE_KEY 163 +#define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 280 +#define SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG 279 +#define SSL_F_SSL_CIPHER_PROCESS_RULESTR 230 +#define SSL_F_SSL_CIPHER_STRENGTH_SORT 231 +#define SSL_F_SSL_CLEAR 164 +#define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 165 +#define SSL_F_SSL_CREATE_CIPHER_LIST 166 +#define SSL_F_SSL_CTRL 232 +#define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 168 +#define SSL_F_SSL_CTX_MAKE_PROFILES 309 +#define SSL_F_SSL_CTX_NEW 169 +#define SSL_F_SSL_CTX_SET_CIPHER_LIST 269 +#define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE 290 +#define SSL_F_SSL_CTX_SET_PURPOSE 226 +#define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 219 +#define SSL_F_SSL_CTX_SET_SSL_VERSION 170 +#define SSL_F_SSL_CTX_SET_TRUST 229 +#define SSL_F_SSL_CTX_USE_CERTIFICATE 171 +#define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 172 +#define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE 220 +#define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 173 +#define SSL_F_SSL_CTX_USE_PRIVATEKEY 174 +#define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 175 +#define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 176 +#define SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT 272 +#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 177 +#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 178 +#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 179 +#define SSL_F_SSL_DO_HANDSHAKE 180 +#define SSL_F_SSL_GET_NEW_SESSION 181 +#define SSL_F_SSL_GET_PREV_SESSION 217 +#define SSL_F_SSL_GET_SERVER_SEND_CERT 182 +#define SSL_F_SSL_GET_SERVER_SEND_PKEY 317 +#define SSL_F_SSL_GET_SIGN_PKEY 183 +#define SSL_F_SSL_INIT_WBIO_BUFFER 184 +#define SSL_F_SSL_LOAD_CLIENT_CA_FILE 185 +#define SSL_F_SSL_NEW 186 +#define SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT 300 +#define SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT 302 +#define SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT 310 +#define SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT 301 +#define SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT 303 +#define SSL_F_SSL_PARSE_SERVERHELLO_USE_SRTP_EXT 311 +#define SSL_F_SSL_PEEK 270 +#define SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT 281 +#define SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT 282 +#define SSL_F_SSL_READ 223 +#define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187 +#define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188 +#define SSL_F_SSL_SESSION_NEW 189 +#define SSL_F_SSL_SESSION_PRINT_FP 190 +#define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 312 +#define SSL_F_SSL_SESS_CERT_NEW 225 +#define SSL_F_SSL_SET_CERT 191 +#define SSL_F_SSL_SET_CIPHER_LIST 271 +#define SSL_F_SSL_SET_FD 192 +#define SSL_F_SSL_SET_PKEY 193 +#define SSL_F_SSL_SET_PURPOSE 227 +#define SSL_F_SSL_SET_RFD 194 +#define SSL_F_SSL_SET_SESSION 195 +#define SSL_F_SSL_SET_SESSION_ID_CONTEXT 218 +#define SSL_F_SSL_SET_SESSION_TICKET_EXT 294 +#define SSL_F_SSL_SET_TRUST 228 +#define SSL_F_SSL_SET_WFD 196 +#define SSL_F_SSL_SHUTDOWN 224 +#define SSL_F_SSL_SRP_CTX_INIT 313 +#define SSL_F_SSL_UNDEFINED_CONST_FUNCTION 243 +#define SSL_F_SSL_UNDEFINED_FUNCTION 197 +#define SSL_F_SSL_UNDEFINED_VOID_FUNCTION 244 +#define SSL_F_SSL_USE_CERTIFICATE 198 +#define SSL_F_SSL_USE_CERTIFICATE_ASN1 199 +#define SSL_F_SSL_USE_CERTIFICATE_FILE 200 +#define SSL_F_SSL_USE_PRIVATEKEY 201 +#define SSL_F_SSL_USE_PRIVATEKEY_ASN1 202 +#define SSL_F_SSL_USE_PRIVATEKEY_FILE 203 +#define SSL_F_SSL_USE_PSK_IDENTITY_HINT 273 +#define SSL_F_SSL_USE_RSAPRIVATEKEY 204 +#define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 205 +#define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 206 +#define SSL_F_SSL_VERIFY_CERT_CHAIN 207 +#define SSL_F_SSL_WRITE 208 +#define SSL_F_TLS1_AEAD_CTX_INIT 339 +#define SSL_F_TLS1_CERT_VERIFY_MAC 286 +#define SSL_F_TLS1_CHANGE_CIPHER_STATE 209 +#define SSL_F_TLS1_CHANGE_CIPHER_STATE_AEAD 340 +#define SSL_F_TLS1_CHANGE_CIPHER_STATE_CIPHER 338 +#define SSL_F_TLS1_CHECK_SERVERHELLO_TLSEXT 274 +#define SSL_F_TLS1_ENC 210 +#define SSL_F_TLS1_EXPORT_KEYING_MATERIAL 314 +#define SSL_F_TLS1_HEARTBEAT 315 +#define SSL_F_TLS1_PREPARE_CLIENTHELLO_TLSEXT 275 +#define SSL_F_TLS1_PREPARE_SERVERHELLO_TLSEXT 276 +#define SSL_F_TLS1_PRF 284 +#define SSL_F_TLS1_SETUP_KEY_BLOCK 211 +#define SSL_F_WRITE_PENDING 212 + +/* Reason codes. */ +#define SSL_R_APP_DATA_IN_HANDSHAKE 100 +#define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 +#define SSL_R_BAD_ALERT_RECORD 101 +#define SSL_R_BAD_AUTHENTICATION_TYPE 102 +#define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 +#define SSL_R_BAD_CHECKSUM 104 +#define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 +#define SSL_R_BAD_DECOMPRESSION 107 +#define SSL_R_BAD_DH_G_LENGTH 108 +#define SSL_R_BAD_DH_PUB_KEY_LENGTH 109 +#define SSL_R_BAD_DH_P_LENGTH 110 +#define SSL_R_BAD_DIGEST_LENGTH 111 +#define SSL_R_BAD_DSA_SIGNATURE 112 +#define SSL_R_BAD_ECC_CERT 304 +#define SSL_R_BAD_ECDSA_SIGNATURE 305 +#define SSL_R_BAD_ECPOINT 306 +#define SSL_R_BAD_HANDSHAKE_LENGTH 332 +#define SSL_R_BAD_HELLO_REQUEST 105 +#define SSL_R_BAD_LENGTH 271 +#define SSL_R_BAD_MAC_DECODE 113 +#define SSL_R_BAD_MAC_LENGTH 333 +#define SSL_R_BAD_MESSAGE_TYPE 114 +#define SSL_R_BAD_PACKET_LENGTH 115 +#define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 +#define SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH 316 +#define SSL_R_BAD_RESPONSE_ARGUMENT 117 +#define SSL_R_BAD_RSA_DECRYPT 118 +#define SSL_R_BAD_RSA_ENCRYPT 119 +#define SSL_R_BAD_RSA_E_LENGTH 120 +#define SSL_R_BAD_RSA_MODULUS_LENGTH 121 +#define SSL_R_BAD_RSA_SIGNATURE 122 +#define SSL_R_BAD_SIGNATURE 123 +#define SSL_R_BAD_SRP_A_LENGTH 347 +#define SSL_R_BAD_SRP_B_LENGTH 348 +#define SSL_R_BAD_SRP_G_LENGTH 349 +#define SSL_R_BAD_SRP_N_LENGTH 350 +#define SSL_R_BAD_SRP_S_LENGTH 351 +#define SSL_R_BAD_SRTP_MKI_VALUE 352 +#define SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST 353 +#define SSL_R_BAD_SSL_FILETYPE 124 +#define SSL_R_BAD_SSL_SESSION_ID_LENGTH 125 +#define SSL_R_BAD_STATE 126 +#define SSL_R_BAD_WRITE_RETRY 127 +#define SSL_R_BIO_NOT_SET 128 +#define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129 +#define SSL_R_BN_LIB 130 +#define SSL_R_CA_DN_LENGTH_MISMATCH 131 +#define SSL_R_CA_DN_TOO_LONG 132 +#define SSL_R_CCS_RECEIVED_EARLY 133 +#define SSL_R_CERTIFICATE_VERIFY_FAILED 134 +#define SSL_R_CERT_LENGTH_MISMATCH 135 +#define SSL_R_CHALLENGE_IS_DIFFERENT 136 +#define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 +#define SSL_R_CIPHER_COMPRESSION_UNAVAILABLE 371 +#define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 138 +#define SSL_R_CIPHER_TABLE_SRC_ERROR 139 +#define SSL_R_CLIENTHELLO_TLSEXT 226 +#define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 +#define SSL_R_COMPRESSION_DISABLED 343 +#define SSL_R_COMPRESSION_FAILURE 141 +#define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE 307 +#define SSL_R_COMPRESSION_LIBRARY_ERROR 142 +#define SSL_R_CONNECTION_ID_IS_DIFFERENT 143 +#define SSL_R_CONNECTION_TYPE_NOT_SET 144 +#define SSL_R_COOKIE_MISMATCH 308 +#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145 +#define SSL_R_DATA_LENGTH_TOO_LONG 146 +#define SSL_R_DECRYPTION_FAILED 147 +#define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 +#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 +#define SSL_R_DIGEST_CHECK_FAILED 149 +#define SSL_R_DTLS_MESSAGE_TOO_BIG 334 +#define SSL_R_DUPLICATE_COMPRESSION_ID 309 +#define SSL_R_ECC_CERT_NOT_FOR_KEY_AGREEMENT 317 +#define SSL_R_ECC_CERT_NOT_FOR_SIGNING 318 +#define SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE 322 +#define SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE 323 +#define SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER 310 +#define SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST 354 +#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 +#define SSL_R_ERROR_GENERATING_TMP_RSA_KEY 282 +#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151 +#define SSL_R_EXCESSIVE_MESSAGE_SIZE 152 +#define SSL_R_EXTRA_DATA_IN_MESSAGE 153 +#define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154 +#define SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS 355 +#define SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION 356 +#define SSL_R_HTTPS_PROXY_REQUEST 155 +#define SSL_R_HTTP_REQUEST 156 +#define SSL_R_ILLEGAL_PADDING 283 +#define SSL_R_INAPPROPRIATE_FALLBACK 373 +#define SSL_R_INCONSISTENT_COMPRESSION 340 +#define SSL_R_INVALID_CHALLENGE_LENGTH 158 +#define SSL_R_INVALID_COMMAND 280 +#define SSL_R_INVALID_COMPRESSION_ALGORITHM 341 +#define SSL_R_INVALID_PURPOSE 278 +#define SSL_R_INVALID_SRP_USERNAME 357 +#define SSL_R_INVALID_STATUS_RESPONSE 328 +#define SSL_R_INVALID_TICKET_KEYS_LENGTH 325 +#define SSL_R_INVALID_TRUST 279 +#define SSL_R_KEY_ARG_TOO_LONG 284 +#define SSL_R_KRB5 285 +#define SSL_R_KRB5_C_CC_PRINC 286 +#define SSL_R_KRB5_C_GET_CRED 287 +#define SSL_R_KRB5_C_INIT 288 +#define SSL_R_KRB5_C_MK_REQ 289 +#define SSL_R_KRB5_S_BAD_TICKET 290 +#define SSL_R_KRB5_S_INIT 291 +#define SSL_R_KRB5_S_RD_REQ 292 +#define SSL_R_KRB5_S_TKT_EXPIRED 293 +#define SSL_R_KRB5_S_TKT_NYV 294 +#define SSL_R_KRB5_S_TKT_SKEW 295 +#define SSL_R_LENGTH_MISMATCH 159 +#define SSL_R_LENGTH_TOO_SHORT 160 +#define SSL_R_LIBRARY_BUG 274 +#define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 +#define SSL_R_MESSAGE_TOO_LONG 296 +#define SSL_R_MISSING_DH_DSA_CERT 162 +#define SSL_R_MISSING_DH_KEY 163 +#define SSL_R_MISSING_DH_RSA_CERT 164 +#define SSL_R_MISSING_DSA_SIGNING_CERT 165 +#define SSL_R_MISSING_EXPORT_TMP_DH_KEY 166 +#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY 167 +#define SSL_R_MISSING_RSA_CERTIFICATE 168 +#define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169 +#define SSL_R_MISSING_RSA_SIGNING_CERT 170 +#define SSL_R_MISSING_SRP_PARAM 358 +#define SSL_R_MISSING_TMP_DH_KEY 171 +#define SSL_R_MISSING_TMP_ECDH_KEY 311 +#define SSL_R_MISSING_TMP_RSA_KEY 172 +#define SSL_R_MISSING_TMP_RSA_PKEY 173 +#define SSL_R_MISSING_VERIFY_MESSAGE 174 +#define SSL_R_MULTIPLE_SGC_RESTARTS 346 +#define SSL_R_NON_SSLV2_INITIAL_PACKET 175 +#define SSL_R_NO_CERTIFICATES_RETURNED 176 +#define SSL_R_NO_CERTIFICATE_ASSIGNED 177 +#define SSL_R_NO_CERTIFICATE_RETURNED 178 +#define SSL_R_NO_CERTIFICATE_SET 179 +#define SSL_R_NO_CERTIFICATE_SPECIFIED 180 +#define SSL_R_NO_CIPHERS_AVAILABLE 181 +#define SSL_R_NO_CIPHERS_PASSED 182 +#define SSL_R_NO_CIPHERS_SPECIFIED 183 +#define SSL_R_NO_CIPHER_LIST 184 +#define SSL_R_NO_CIPHER_MATCH 185 +#define SSL_R_NO_CLIENT_CERT_METHOD 331 +#define SSL_R_NO_CLIENT_CERT_RECEIVED 186 +#define SSL_R_NO_COMPRESSION_SPECIFIED 187 +#define SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER 330 +#define SSL_R_NO_METHOD_SPECIFIED 188 +#define SSL_R_NO_PRIVATEKEY 189 +#define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 +#define SSL_R_NO_PROTOCOLS_AVAILABLE 191 +#define SSL_R_NO_PUBLICKEY 192 +#define SSL_R_NO_RENEGOTIATION 339 +#define SSL_R_NO_REQUIRED_DIGEST 324 +#define SSL_R_NO_SHARED_CIPHER 193 +#define SSL_R_NO_SRTP_PROFILES 359 +#define SSL_R_NO_VERIFY_CALLBACK 194 +#define SSL_R_NULL_SSL_CTX 195 +#define SSL_R_NULL_SSL_METHOD_PASSED 196 +#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197 +#define SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED 344 +#define SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE 297 +#define SSL_R_PACKET_LENGTH_TOO_LONG 198 +#define SSL_R_PARSE_TLSEXT 227 +#define SSL_R_PATH_TOO_LONG 270 +#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199 +#define SSL_R_PEER_ERROR 200 +#define SSL_R_PEER_ERROR_CERTIFICATE 201 +#define SSL_R_PEER_ERROR_NO_CERTIFICATE 202 +#define SSL_R_PEER_ERROR_NO_CIPHER 203 +#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 204 +#define SSL_R_PRE_MAC_LENGTH_TOO_LONG 205 +#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS 206 +#define SSL_R_PROTOCOL_IS_SHUTDOWN 207 +#define SSL_R_PSK_IDENTITY_NOT_FOUND 223 +#define SSL_R_PSK_NO_CLIENT_CB 224 +#define SSL_R_PSK_NO_SERVER_CB 225 +#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR 208 +#define SSL_R_PUBLIC_KEY_IS_NOT_RSA 209 +#define SSL_R_PUBLIC_KEY_NOT_RSA 210 +#define SSL_R_READ_BIO_NOT_SET 211 +#define SSL_R_READ_TIMEOUT_EXPIRED 312 +#define SSL_R_READ_WRONG_PACKET_TYPE 212 +#define SSL_R_RECORD_LENGTH_MISMATCH 213 +#define SSL_R_RECORD_TOO_LARGE 214 +#define SSL_R_RECORD_TOO_SMALL 298 +#define SSL_R_RENEGOTIATE_EXT_TOO_LONG 335 +#define SSL_R_RENEGOTIATION_ENCODING_ERR 336 +#define SSL_R_RENEGOTIATION_MISMATCH 337 +#define SSL_R_REQUIRED_CIPHER_MISSING 215 +#define SSL_R_REQUIRED_COMPRESSSION_ALGORITHM_MISSING 342 +#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO 216 +#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO 217 +#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO 218 +#define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 345 +#define SSL_R_SERVERHELLO_TLSEXT 275 +#define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 +#define SSL_R_SHORT_READ 219 +#define SSL_R_SIGNATURE_ALGORITHMS_ERROR 360 +#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220 +#define SSL_R_SRP_A_CALC 361 +#define SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES 362 +#define SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG 363 +#define SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE 364 +#define SSL_R_SSL23_DOING_SESSION_ID_REUSE 221 +#define SSL_R_SSL2_CONNECTION_ID_TOO_LONG 299 +#define SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT 321 +#define SSL_R_SSL3_EXT_INVALID_SERVERNAME 319 +#define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE 320 +#define SSL_R_SSL3_SESSION_ID_TOO_LONG 300 +#define SSL_R_SSL3_SESSION_ID_TOO_SHORT 222 +#define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 +#define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 +#define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 +#define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044 +#define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 +#define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 +#define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 +#define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 +#define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 +#define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 +#define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 +#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228 +#define SSL_R_SSL_HANDSHAKE_FAILURE 229 +#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230 +#define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 301 +#define SSL_R_SSL_SESSION_ID_CONFLICT 302 +#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_TLSV1_ALERT_ACCESS_DENIED 1049 +#define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 +#define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 +#define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 +#define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 +#define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 +#define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 +#define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 +#define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 +#define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 +#define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 +#define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 +#define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 +#define SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE 1114 +#define SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE 1113 +#define SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE 1111 +#define SSL_R_TLSV1_UNRECOGNIZED_NAME 1112 +#define SSL_R_TLSV1_UNSUPPORTED_EXTENSION 1110 +#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER 232 +#define SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT 365 +#define SSL_R_TLS_HEARTBEAT_PENDING 366 +#define SSL_R_TLS_ILLEGAL_EXPORTER_LABEL 367 +#define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 157 +#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233 +#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 234 +#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER 235 +#define SSL_R_UNABLE_TO_DECODE_DH_CERTS 236 +#define SSL_R_UNABLE_TO_DECODE_ECDH_CERTS 313 +#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY 237 +#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS 238 +#define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 +#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 +#define SSL_R_UNABLE_TO_FIND_SSL_METHOD 240 +#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES 241 +#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 +#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 +#define SSL_R_UNEXPECTED_MESSAGE 244 +#define SSL_R_UNEXPECTED_RECORD 245 +#define SSL_R_UNINITIALIZED 276 +#define SSL_R_UNKNOWN_ALERT_TYPE 246 +#define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 +#define SSL_R_UNKNOWN_CIPHER_RETURNED 248 +#define SSL_R_UNKNOWN_CIPHER_TYPE 249 +#define SSL_R_UNKNOWN_DIGEST 368 +#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250 +#define SSL_R_UNKNOWN_PKEY_TYPE 251 +#define SSL_R_UNKNOWN_PROTOCOL 252 +#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE 253 +#define SSL_R_UNKNOWN_SSL_VERSION 254 +#define SSL_R_UNKNOWN_STATE 255 +#define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 338 +#define SSL_R_UNSUPPORTED_CIPHER 256 +#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 +#define SSL_R_UNSUPPORTED_DIGEST_TYPE 326 +#define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 315 +#define SSL_R_UNSUPPORTED_PROTOCOL 258 +#define SSL_R_UNSUPPORTED_SSL_VERSION 259 +#define SSL_R_UNSUPPORTED_STATUS_TYPE 329 +#define SSL_R_USE_SRTP_NOT_NEGOTIATED 369 +#define SSL_R_WRITE_BIO_NOT_SET 260 +#define SSL_R_WRONG_CIPHER_RETURNED 261 +#define SSL_R_WRONG_CURVE 378 +#define SSL_R_WRONG_MESSAGE_TYPE 262 +#define SSL_R_WRONG_NUMBER_OF_KEY_BITS 263 +#define SSL_R_WRONG_SIGNATURE_LENGTH 264 +#define SSL_R_WRONG_SIGNATURE_SIZE 265 +#define SSL_R_WRONG_SIGNATURE_TYPE 370 +#define SSL_R_WRONG_SSL_VERSION 266 +#define SSL_R_WRONG_VERSION_NUMBER 267 +#define SSL_R_X509_LIB 268 +#define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 +#define SSL_R_PEER_BEHAVING_BADLY 666 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ssl2.h b/src/3rdparty/win32_include/openssl/ssl2.h new file mode 100644 index 000000000..3a8d30072 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ssl2.h @@ -0,0 +1,153 @@ +/* $OpenBSD: ssl2.h,v 1.12 2014/12/14 15:30:50 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL2_H +#define HEADER_SSL2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Protocol Version Codes */ +#define SSL2_VERSION 0x0002 +#define SSL2_VERSION_MAJOR 0x00 +#define SSL2_VERSION_MINOR 0x02 +/* #define SSL2_CLIENT_VERSION 0x0002 */ +/* #define SSL2_SERVER_VERSION 0x0002 */ + +/* Protocol Message Codes */ +#define SSL2_MT_ERROR 0 +#define SSL2_MT_CLIENT_HELLO 1 +#define SSL2_MT_CLIENT_MASTER_KEY 2 +#define SSL2_MT_CLIENT_FINISHED 3 +#define SSL2_MT_SERVER_HELLO 4 +#define SSL2_MT_SERVER_VERIFY 5 +#define SSL2_MT_SERVER_FINISHED 6 +#define SSL2_MT_REQUEST_CERTIFICATE 7 +#define SSL2_MT_CLIENT_CERTIFICATE 8 + +/* Error Message Codes */ +#define SSL2_PE_UNDEFINED_ERROR 0x0000 +#define SSL2_PE_NO_CIPHER 0x0001 +#define SSL2_PE_NO_CERTIFICATE 0x0002 +#define SSL2_PE_BAD_CERTIFICATE 0x0004 +#define SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE 0x0006 + +/* Cipher Kind Values */ +#define SSL2_CK_NULL_WITH_MD5 0x02000000 /* v3 */ +#define SSL2_CK_RC4_128_WITH_MD5 0x02010080 +#define SSL2_CK_RC4_128_EXPORT40_WITH_MD5 0x02020080 +#define SSL2_CK_RC2_128_CBC_WITH_MD5 0x02030080 +#define SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5 0x02040080 +#define SSL2_CK_IDEA_128_CBC_WITH_MD5 0x02050080 +#define SSL2_CK_DES_64_CBC_WITH_MD5 0x02060040 +#define SSL2_CK_DES_64_CBC_WITH_SHA 0x02060140 /* v3 */ +#define SSL2_CK_DES_192_EDE3_CBC_WITH_MD5 0x020700c0 +#define SSL2_CK_DES_192_EDE3_CBC_WITH_SHA 0x020701c0 /* v3 */ +#define SSL2_CK_RC4_64_WITH_MD5 0x02080080 /* MS hack */ + +#define SSL2_CK_DES_64_CFB64_WITH_MD5_1 0x02ff0800 /* SSLeay */ +#define SSL2_CK_NULL 0x02ff0810 /* SSLeay */ + +#define SSL2_TXT_DES_64_CFB64_WITH_MD5_1 "DES-CFB-M1" +#define SSL2_TXT_NULL_WITH_MD5 "NULL-MD5" +#define SSL2_TXT_RC4_128_WITH_MD5 "RC4-MD5" +#define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 "EXP-RC4-MD5" +#define SSL2_TXT_RC2_128_CBC_WITH_MD5 "RC2-CBC-MD5" +#define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5" +#define SSL2_TXT_IDEA_128_CBC_WITH_MD5 "IDEA-CBC-MD5" +#define SSL2_TXT_DES_64_CBC_WITH_MD5 "DES-CBC-MD5" +#define SSL2_TXT_DES_64_CBC_WITH_SHA "DES-CBC-SHA" +#define SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 "DES-CBC3-MD5" +#define SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA "DES-CBC3-SHA" +#define SSL2_TXT_RC4_64_WITH_MD5 "RC4-64-MD5" + +#define SSL2_TXT_NULL "NULL" + +/* Flags for the SSL_CIPHER.algorithm2 field */ +#define SSL2_CF_5_BYTE_ENC 0x01 +#define SSL2_CF_8_BYTE_ENC 0x02 + +/* Certificate Type Codes */ +#define SSL2_CT_X509_CERTIFICATE 0x01 + +/* Authentication Type Code */ +#define SSL2_AT_MD5_WITH_RSA_ENCRYPTION 0x01 + +#define SSL2_MAX_SSL_SESSION_ID_LENGTH 32 + +/* Upper/Lower Bounds */ +#define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS 256 +#define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 32767u /* 2^15-1 */ +#define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER 16383 /* 2^14-1 */ + +#define SSL2_CHALLENGE_LENGTH 16 +/*#define SSL2_CHALLENGE_LENGTH 32 */ +#define SSL2_MIN_CHALLENGE_LENGTH 16 +#define SSL2_MAX_CHALLENGE_LENGTH 32 +#define SSL2_CONNECTION_ID_LENGTH 16 +#define SSL2_MAX_CONNECTION_ID_LENGTH 16 +#define SSL2_SSL_SESSION_ID_LENGTH 16 +#define SSL2_MAX_CERT_CHALLENGE_LENGTH 32 +#define SSL2_MIN_CERT_CHALLENGE_LENGTH 16 +#define SSL2_MAX_KEY_MATERIAL_LENGTH 24 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ssl23.h b/src/3rdparty/win32_include/openssl/ssl23.h new file mode 100644 index 000000000..570e4b017 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ssl23.h @@ -0,0 +1,82 @@ +/* $OpenBSD: ssl23.h,v 1.4 2014/12/14 15:30:50 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_SSL23_H +#define HEADER_SSL23_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*client */ +/* write to server */ +#define SSL23_ST_CW_CLNT_HELLO_A (0x210|SSL_ST_CONNECT) +#define SSL23_ST_CW_CLNT_HELLO_B (0x211|SSL_ST_CONNECT) +/* read from server */ +#define SSL23_ST_CR_SRVR_HELLO_A (0x220|SSL_ST_CONNECT) +#define SSL23_ST_CR_SRVR_HELLO_B (0x221|SSL_ST_CONNECT) + +/* server */ +/* read from client */ +#define SSL23_ST_SR_CLNT_HELLO_A (0x210|SSL_ST_ACCEPT) +#define SSL23_ST_SR_CLNT_HELLO_B (0x211|SSL_ST_ACCEPT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ssl3.h b/src/3rdparty/win32_include/openssl/ssl3.h new file mode 100644 index 000000000..91cbaf29e --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ssl3.h @@ -0,0 +1,511 @@ +/* $OpenBSD: ssl3.h,v 1.45 2017/01/22 09:02:07 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECC cipher suite support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_SSL3_H +#define HEADER_SSL3_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* TLS_EMPTY_RENEGOTIATION_INFO_SCSV from RFC 5746. */ +#define SSL3_CK_SCSV 0x030000FF + +/* TLS_FALLBACK_SCSV from draft-ietf-tls-downgrade-scsv-03. */ +#define SSL3_CK_FALLBACK_SCSV 0x03005600 + +#define SSL3_CK_RSA_NULL_MD5 0x03000001 +#define SSL3_CK_RSA_NULL_SHA 0x03000002 +#define SSL3_CK_RSA_RC4_40_MD5 0x03000003 +#define SSL3_CK_RSA_RC4_128_MD5 0x03000004 +#define SSL3_CK_RSA_RC4_128_SHA 0x03000005 +#define SSL3_CK_RSA_RC2_40_MD5 0x03000006 +#define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 +#define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 +#define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 +#define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A + +#define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B +#define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C +#define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D +#define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E +#define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F +#define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 + +#define SSL3_CK_EDH_DSS_DES_40_CBC_SHA 0x03000011 +#define SSL3_CK_EDH_DSS_DES_64_CBC_SHA 0x03000012 +#define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA 0x03000013 +#define SSL3_CK_EDH_RSA_DES_40_CBC_SHA 0x03000014 +#define SSL3_CK_EDH_RSA_DES_64_CBC_SHA 0x03000015 +#define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA 0x03000016 + +#define SSL3_CK_ADH_RC4_40_MD5 0x03000017 +#define SSL3_CK_ADH_RC4_128_MD5 0x03000018 +#define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 +#define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A +#define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B + +/* VRS Additional Kerberos5 entries + */ +#define SSL3_CK_KRB5_DES_64_CBC_SHA 0x0300001E +#define SSL3_CK_KRB5_DES_192_CBC3_SHA 0x0300001F +#define SSL3_CK_KRB5_RC4_128_SHA 0x03000020 +#define SSL3_CK_KRB5_IDEA_128_CBC_SHA 0x03000021 +#define SSL3_CK_KRB5_DES_64_CBC_MD5 0x03000022 +#define SSL3_CK_KRB5_DES_192_CBC3_MD5 0x03000023 +#define SSL3_CK_KRB5_RC4_128_MD5 0x03000024 +#define SSL3_CK_KRB5_IDEA_128_CBC_MD5 0x03000025 + +#define SSL3_CK_KRB5_DES_40_CBC_SHA 0x03000026 +#define SSL3_CK_KRB5_RC2_40_CBC_SHA 0x03000027 +#define SSL3_CK_KRB5_RC4_40_SHA 0x03000028 +#define SSL3_CK_KRB5_DES_40_CBC_MD5 0x03000029 +#define SSL3_CK_KRB5_RC2_40_CBC_MD5 0x0300002A +#define SSL3_CK_KRB5_RC4_40_MD5 0x0300002B + +#define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" +#define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" +#define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" +#define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" +#define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" +#define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" +#define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" +#define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" +#define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" +#define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" + +#define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" +#define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" +#define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" +#define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" +#define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" +#define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" + +#define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" +#define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" +#define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" +#define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" +#define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" +#define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" + +#define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" +#define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" +#define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" +#define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" +#define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" + +#define SSL3_TXT_KRB5_DES_64_CBC_SHA "KRB5-DES-CBC-SHA" +#define SSL3_TXT_KRB5_DES_192_CBC3_SHA "KRB5-DES-CBC3-SHA" +#define SSL3_TXT_KRB5_RC4_128_SHA "KRB5-RC4-SHA" +#define SSL3_TXT_KRB5_IDEA_128_CBC_SHA "KRB5-IDEA-CBC-SHA" +#define SSL3_TXT_KRB5_DES_64_CBC_MD5 "KRB5-DES-CBC-MD5" +#define SSL3_TXT_KRB5_DES_192_CBC3_MD5 "KRB5-DES-CBC3-MD5" +#define SSL3_TXT_KRB5_RC4_128_MD5 "KRB5-RC4-MD5" +#define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 "KRB5-IDEA-CBC-MD5" + +#define SSL3_TXT_KRB5_DES_40_CBC_SHA "EXP-KRB5-DES-CBC-SHA" +#define SSL3_TXT_KRB5_RC2_40_CBC_SHA "EXP-KRB5-RC2-CBC-SHA" +#define SSL3_TXT_KRB5_RC4_40_SHA "EXP-KRB5-RC4-SHA" +#define SSL3_TXT_KRB5_DES_40_CBC_MD5 "EXP-KRB5-DES-CBC-MD5" +#define SSL3_TXT_KRB5_RC2_40_CBC_MD5 "EXP-KRB5-RC2-CBC-MD5" +#define SSL3_TXT_KRB5_RC4_40_MD5 "EXP-KRB5-RC4-MD5" + +#define SSL3_SSL_SESSION_ID_LENGTH 32 +#define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 + +#define SSL3_MASTER_SECRET_SIZE 48 +#define SSL3_RANDOM_SIZE 32 +#define SSL3_SEQUENCE_SIZE 8 +#define SSL3_SESSION_ID_SIZE 32 +#define SSL3_CIPHER_VALUE_SIZE 2 + +#define SSL3_RT_HEADER_LENGTH 5 +#define SSL3_HM_HEADER_LENGTH 4 + +#define SSL3_ALIGN_PAYLOAD 8 + +/* This is the maximum MAC (digest) size used by the SSL library. + * Currently maximum of 20 is used by SHA1, but we reserve for + * future extension for 512-bit hashes. + */ + +#define SSL3_RT_MAX_MD_SIZE 64 + +/* Maximum block size used in all ciphersuites. Currently 16 for AES. + */ + +#define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 + +#define SSL3_RT_MAX_EXTRA (16384) + +/* Maximum plaintext length: defined by SSL/TLS standards */ +#define SSL3_RT_MAX_PLAIN_LENGTH 16384 +/* Maximum compression overhead: defined by SSL/TLS standards */ +#define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 + +/* The standards give a maximum encryption overhead of 1024 bytes. + * In practice the value is lower than this. The overhead is the maximum + * number of padding bytes (256) plus the mac size. + */ +#define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) + +/* OpenSSL currently only uses a padding length of at most one block so + * the send overhead is smaller. + */ + +#define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \ + (SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE) + +/* If compression isn't used don't include the compression overhead */ +#define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH +#define SSL3_RT_MAX_ENCRYPTED_LENGTH \ + (SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH) +#define SSL3_RT_MAX_PACKET_SIZE \ + (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) + +#define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" +#define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" + +#define SSL3_VERSION 0x0300 +#define SSL3_VERSION_MAJOR 0x03 +#define SSL3_VERSION_MINOR 0x00 + +#define SSL3_RT_CHANGE_CIPHER_SPEC 20 +#define SSL3_RT_ALERT 21 +#define SSL3_RT_HANDSHAKE 22 +#define SSL3_RT_APPLICATION_DATA 23 +#define TLS1_RT_HEARTBEAT 24 + +#define SSL3_AL_WARNING 1 +#define SSL3_AL_FATAL 2 + +#define SSL3_AD_CLOSE_NOTIFY 0 +#define SSL3_AD_UNEXPECTED_MESSAGE 10 /* fatal */ +#define SSL3_AD_BAD_RECORD_MAC 20 /* fatal */ +#define SSL3_AD_DECOMPRESSION_FAILURE 30 /* fatal */ +#define SSL3_AD_HANDSHAKE_FAILURE 40 /* fatal */ +#define SSL3_AD_NO_CERTIFICATE 41 +#define SSL3_AD_BAD_CERTIFICATE 42 +#define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 +#define SSL3_AD_CERTIFICATE_REVOKED 44 +#define SSL3_AD_CERTIFICATE_EXPIRED 45 +#define SSL3_AD_CERTIFICATE_UNKNOWN 46 +#define SSL3_AD_ILLEGAL_PARAMETER 47 /* fatal */ + +#define TLS1_HB_REQUEST 1 +#define TLS1_HB_RESPONSE 2 + +#ifndef OPENSSL_NO_SSL_INTERN + +typedef struct ssl3_record_st { +/*r */ int type; /* type of record */ +/*rw*/ unsigned int length; /* How many bytes available */ +/*r */ unsigned int off; /* read/write offset into 'buf' */ +/*rw*/ unsigned char *data; /* pointer to the record data */ +/*rw*/ unsigned char *input; /* where the decode bytes are */ +/*r */ unsigned long epoch; /* epoch number, needed by DTLS1 */ +/*r */ unsigned char seq_num[8]; /* sequence number, needed by DTLS1 */ +} SSL3_RECORD; + +typedef struct ssl3_buffer_st { + unsigned char *buf; /* at least SSL3_RT_MAX_PACKET_SIZE bytes, + * see ssl3_setup_buffers() */ + size_t len; /* buffer size */ + int offset; /* where to 'copy from' */ + int left; /* how many bytes left */ +} SSL3_BUFFER; + +#endif + +#define SSL3_CT_RSA_SIGN 1 +#define SSL3_CT_DSS_SIGN 2 +#define SSL3_CT_RSA_FIXED_DH 3 +#define SSL3_CT_DSS_FIXED_DH 4 +#define SSL3_CT_RSA_EPHEMERAL_DH 5 +#define SSL3_CT_DSS_EPHEMERAL_DH 6 +#define SSL3_CT_FORTEZZA_DMS 20 +/* SSL3_CT_NUMBER is used to size arrays and it must be large + * enough to contain all of the cert types defined either for + * SSLv3 and TLSv1. + */ +#define SSL3_CT_NUMBER 11 + + +#define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 +#define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 +#define SSL3_FLAGS_POP_BUFFER 0x0004 +#define TLS1_FLAGS_TLS_PADDING_BUG 0x0 +#define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 +#define TLS1_FLAGS_KEEP_HANDSHAKE 0x0020 +#define SSL3_FLAGS_CCS_OK 0x0080 + +#ifndef OPENSSL_NO_SSL_INTERN + +struct ssl3_state_internal_st; + +typedef struct ssl3_state_st { + long flags; + + unsigned char server_random[SSL3_RANDOM_SIZE]; + unsigned char client_random[SSL3_RANDOM_SIZE]; + + SSL3_BUFFER rbuf; /* read IO goes into here */ + SSL3_BUFFER wbuf; /* write IO goes into here */ + + /* we allow one fatal and one warning alert to be outstanding, + * send close alert via the warning alert */ + int alert_dispatch; + unsigned char send_alert[2]; + + struct { + int new_mac_secret_size; + } tmp; + + struct ssl3_state_internal_st *internal; +} SSL3_STATE; + +#endif + +/* SSLv3 */ +/*client */ +/* extra state */ +#define SSL3_ST_CW_FLUSH (0x100|SSL_ST_CONNECT) +/* write to server */ +#define SSL3_ST_CW_CLNT_HELLO_A (0x110|SSL_ST_CONNECT) +#define SSL3_ST_CW_CLNT_HELLO_B (0x111|SSL_ST_CONNECT) +/* read from server */ +#define SSL3_ST_CR_SRVR_HELLO_A (0x120|SSL_ST_CONNECT) +#define SSL3_ST_CR_SRVR_HELLO_B (0x121|SSL_ST_CONNECT) +#define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT) +#define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_A (0x130|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_B (0x131|SSL_ST_CONNECT) +#define SSL3_ST_CR_KEY_EXCH_A (0x140|SSL_ST_CONNECT) +#define SSL3_ST_CR_KEY_EXCH_B (0x141|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_REQ_A (0x150|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_REQ_B (0x151|SSL_ST_CONNECT) +#define SSL3_ST_CR_SRVR_DONE_A (0x160|SSL_ST_CONNECT) +#define SSL3_ST_CR_SRVR_DONE_B (0x161|SSL_ST_CONNECT) +/* write to server */ +#define SSL3_ST_CW_CERT_A (0x170|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_B (0x171|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_C (0x172|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_D (0x173|SSL_ST_CONNECT) +#define SSL3_ST_CW_KEY_EXCH_A (0x180|SSL_ST_CONNECT) +#define SSL3_ST_CW_KEY_EXCH_B (0x181|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_VRFY_A (0x190|SSL_ST_CONNECT) +#define SSL3_ST_CW_CERT_VRFY_B (0x191|SSL_ST_CONNECT) +#define SSL3_ST_CW_CHANGE_A (0x1A0|SSL_ST_CONNECT) +#define SSL3_ST_CW_CHANGE_B (0x1A1|SSL_ST_CONNECT) +#define SSL3_ST_CW_NEXT_PROTO_A (0x200|SSL_ST_CONNECT) +#define SSL3_ST_CW_NEXT_PROTO_B (0x201|SSL_ST_CONNECT) +#define SSL3_ST_CW_FINISHED_A (0x1B0|SSL_ST_CONNECT) +#define SSL3_ST_CW_FINISHED_B (0x1B1|SSL_ST_CONNECT) +/* read from server */ +#define SSL3_ST_CR_CHANGE_A (0x1C0|SSL_ST_CONNECT) +#define SSL3_ST_CR_CHANGE_B (0x1C1|SSL_ST_CONNECT) +#define SSL3_ST_CR_FINISHED_A (0x1D0|SSL_ST_CONNECT) +#define SSL3_ST_CR_FINISHED_B (0x1D1|SSL_ST_CONNECT) +#define SSL3_ST_CR_SESSION_TICKET_A (0x1E0|SSL_ST_CONNECT) +#define SSL3_ST_CR_SESSION_TICKET_B (0x1E1|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_STATUS_A (0x1F0|SSL_ST_CONNECT) +#define SSL3_ST_CR_CERT_STATUS_B (0x1F1|SSL_ST_CONNECT) + +/* server */ +/* extra state */ +#define SSL3_ST_SW_FLUSH (0x100|SSL_ST_ACCEPT) +/* read from client */ +/* Do not change the number values, they do matter */ +#define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CLNT_HELLO_B (0x111|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CLNT_HELLO_C (0x112|SSL_ST_ACCEPT) +/* write to client */ +#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT) +#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT) +#define SSL3_ST_SW_HELLO_REQ_A (0x120|SSL_ST_ACCEPT) +#define SSL3_ST_SW_HELLO_REQ_B (0x121|SSL_ST_ACCEPT) +#define SSL3_ST_SW_HELLO_REQ_C (0x122|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SRVR_HELLO_A (0x130|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SRVR_HELLO_B (0x131|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_A (0x140|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_B (0x141|SSL_ST_ACCEPT) +#define SSL3_ST_SW_KEY_EXCH_A (0x150|SSL_ST_ACCEPT) +#define SSL3_ST_SW_KEY_EXCH_B (0x151|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_REQ_A (0x160|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_REQ_B (0x161|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SRVR_DONE_A (0x170|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SRVR_DONE_B (0x171|SSL_ST_ACCEPT) +/* read from client */ +#define SSL3_ST_SR_CERT_A (0x180|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CERT_B (0x181|SSL_ST_ACCEPT) +#define SSL3_ST_SR_KEY_EXCH_A (0x190|SSL_ST_ACCEPT) +#define SSL3_ST_SR_KEY_EXCH_B (0x191|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CERT_VRFY_A (0x1A0|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CERT_VRFY_B (0x1A1|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CHANGE_A (0x1B0|SSL_ST_ACCEPT) +#define SSL3_ST_SR_CHANGE_B (0x1B1|SSL_ST_ACCEPT) +#define SSL3_ST_SR_NEXT_PROTO_A (0x210|SSL_ST_ACCEPT) +#define SSL3_ST_SR_NEXT_PROTO_B (0x211|SSL_ST_ACCEPT) +#define SSL3_ST_SR_FINISHED_A (0x1C0|SSL_ST_ACCEPT) +#define SSL3_ST_SR_FINISHED_B (0x1C1|SSL_ST_ACCEPT) +/* write to client */ +#define SSL3_ST_SW_CHANGE_A (0x1D0|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CHANGE_B (0x1D1|SSL_ST_ACCEPT) +#define SSL3_ST_SW_FINISHED_A (0x1E0|SSL_ST_ACCEPT) +#define SSL3_ST_SW_FINISHED_B (0x1E1|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SESSION_TICKET_A (0x1F0|SSL_ST_ACCEPT) +#define SSL3_ST_SW_SESSION_TICKET_B (0x1F1|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_STATUS_A (0x200|SSL_ST_ACCEPT) +#define SSL3_ST_SW_CERT_STATUS_B (0x201|SSL_ST_ACCEPT) + +#define SSL3_MT_HELLO_REQUEST 0 +#define SSL3_MT_CLIENT_HELLO 1 +#define SSL3_MT_SERVER_HELLO 2 +#define SSL3_MT_NEWSESSION_TICKET 4 +#define SSL3_MT_CERTIFICATE 11 +#define SSL3_MT_SERVER_KEY_EXCHANGE 12 +#define SSL3_MT_CERTIFICATE_REQUEST 13 +#define SSL3_MT_SERVER_DONE 14 +#define SSL3_MT_CERTIFICATE_VERIFY 15 +#define SSL3_MT_CLIENT_KEY_EXCHANGE 16 +#define SSL3_MT_FINISHED 20 +#define SSL3_MT_CERTIFICATE_STATUS 22 + +#define SSL3_MT_NEXT_PROTO 67 + +#define DTLS1_MT_HELLO_VERIFY_REQUEST 3 + +#define SSL3_MT_CCS 1 + +/* These are used when changing over to a new cipher */ +#define SSL3_CC_READ 0x01 +#define SSL3_CC_WRITE 0x02 +#define SSL3_CC_CLIENT 0x10 +#define SSL3_CC_SERVER 0x20 +#define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) +#define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ) +#define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ) +#define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/stack.h b/src/3rdparty/win32_include/openssl/stack.h new file mode 100644 index 000000000..6bea6348f --- /dev/null +++ b/src/3rdparty/win32_include/openssl/stack.h @@ -0,0 +1,107 @@ +/* $OpenBSD: stack.h,v 1.9 2014/06/12 15:49:30 deraadt Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_STACK_H +#define HEADER_STACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stack_st { + int num; + char **data; + int sorted; + + int num_alloc; + int (*comp)(const void *, const void *); +} _STACK; /* Use STACK_OF(...) instead */ + +#define M_sk_num(sk) ((sk) ? (sk)->num:-1) +#define M_sk_value(sk,n) ((sk) ? (sk)->data[n] : NULL) + +int sk_num(const _STACK *); +void *sk_value(const _STACK *, int); + +void *sk_set(_STACK *, int, void *); + +_STACK *sk_new(int (*cmp)(const void *, const void *)); +_STACK *sk_new_null(void); +void sk_free(_STACK *); +void sk_pop_free(_STACK *st, void (*func)(void *)); +int sk_insert(_STACK *sk, void *data, int where); +void *sk_delete(_STACK *st, int loc); +void *sk_delete_ptr(_STACK *st, void *p); +int sk_find(_STACK *st, void *data); +int sk_find_ex(_STACK *st, void *data); +int sk_push(_STACK *st, void *data); +int sk_unshift(_STACK *st, void *data); +void *sk_shift(_STACK *st); +void *sk_pop(_STACK *st); +void sk_zero(_STACK *st); +int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void *, const void *)))( + const void *, const void *); +_STACK *sk_dup(_STACK *st); +void sk_sort(_STACK *st); +int sk_is_sorted(const _STACK *st); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/tls1.h b/src/3rdparty/win32_include/openssl/tls1.h new file mode 100644 index 000000000..d06a1969b --- /dev/null +++ b/src/3rdparty/win32_include/openssl/tls1.h @@ -0,0 +1,755 @@ +/* $OpenBSD: tls1.h,v 1.29 2017/03/25 14:15:11 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * + * Portions of the attached software ("Contribution") are developed by + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. + * + * The Contribution is licensed pursuant to the OpenSSL open source + * license provided above. + * + * ECC cipher suite support in OpenSSL originally written by + * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories. + * + */ +/* ==================================================================== + * Copyright 2005 Nokia. All rights reserved. + * + * The portions of the attached software ("Contribution") is developed by + * Nokia Corporation and is licensed pursuant to the OpenSSL open source + * license. + * + * The Contribution, originally written by Mika Kousa and Pasi Eronen of + * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites + * support (see RFC 4279) to OpenSSL. + * + * No patent licenses or other rights except those expressly stated in + * the OpenSSL open source license shall be deemed granted or received + * expressly, by implication, estoppel, or otherwise. + * + * No assurances are provided by Nokia that the Contribution does not + * infringe the patent or other intellectual property rights of any third + * party or that the license provides you with all the necessary rights + * to make use of the Contribution. + * + * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN + * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA + * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY + * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR + * OTHERWISE. + */ + +#ifndef HEADER_TLS1_H +#define HEADER_TLS1_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 0 + +#define TLS1_2_VERSION 0x0303 +#define TLS1_2_VERSION_MAJOR 0x03 +#define TLS1_2_VERSION_MINOR 0x03 + +#define TLS1_1_VERSION 0x0302 +#define TLS1_1_VERSION_MAJOR 0x03 +#define TLS1_1_VERSION_MINOR 0x02 + +#define TLS1_VERSION 0x0301 +#define TLS1_VERSION_MAJOR 0x03 +#define TLS1_VERSION_MINOR 0x01 + +#define TLS1_get_version(s) \ + ((s->version >> 8) == TLS1_VERSION_MAJOR ? s->version : 0) + +#define TLS1_get_client_version(s) \ + ((s->client_version >> 8) == TLS1_VERSION_MAJOR ? s->client_version : 0) + +/* + * TLS Alert codes. + * + * https://www.iana.org/assignments/tls-parameters/#tls-parameters-6 + */ + +#define TLS1_AD_DECRYPTION_FAILED 21 +#define TLS1_AD_RECORD_OVERFLOW 22 +#define TLS1_AD_UNKNOWN_CA 48 /* fatal */ +#define TLS1_AD_ACCESS_DENIED 49 /* fatal */ +#define TLS1_AD_DECODE_ERROR 50 /* fatal */ +#define TLS1_AD_DECRYPT_ERROR 51 +#define TLS1_AD_EXPORT_RESTRICTION 60 /* fatal */ +#define TLS1_AD_PROTOCOL_VERSION 70 /* fatal */ +#define TLS1_AD_INSUFFICIENT_SECURITY 71 /* fatal */ +#define TLS1_AD_INTERNAL_ERROR 80 /* fatal */ +/* Code 86 from RFC 7507. */ +#define TLS1_AD_INAPPROPRIATE_FALLBACK 86 /* fatal */ +#define TLS1_AD_USER_CANCELLED 90 +#define TLS1_AD_NO_RENEGOTIATION 100 +/* Codes 110-114 from RFC 3546. */ +#define TLS1_AD_UNSUPPORTED_EXTENSION 110 +#define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 +#define TLS1_AD_UNRECOGNIZED_NAME 112 +#define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 +#define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 +/* Code 115 from RFC 4279. */ +#define TLS1_AD_UNKNOWN_PSK_IDENTITY 115 /* fatal */ + +/* + * TLS ExtensionType values. + * + * https://www.iana.org/assignments/tls-extensiontype-values/ + */ + +/* ExtensionType values from RFC 3546, RFC 4366 and RFC 6066. */ +#define TLSEXT_TYPE_server_name 0 +#define TLSEXT_TYPE_max_fragment_length 1 +#define TLSEXT_TYPE_client_certificate_url 2 +#define TLSEXT_TYPE_trusted_ca_keys 3 +#define TLSEXT_TYPE_truncated_hmac 4 +#define TLSEXT_TYPE_status_request 5 + +/* ExtensionType values from RFC 4681. */ +#define TLSEXT_TYPE_user_mapping 6 + +/* ExtensionType values from RFC 5878. */ +#define TLSEXT_TYPE_client_authz 7 +#define TLSEXT_TYPE_server_authz 8 + +/* ExtensionType values from RFC 6091. */ +#define TLSEXT_TYPE_cert_type 9 + +/* ExtensionType values from RFC 4492. */ +#define TLSEXT_TYPE_elliptic_curves 10 +#define TLSEXT_TYPE_ec_point_formats 11 + +/* ExtensionType value from RFC 5054. */ +#define TLSEXT_TYPE_srp 12 + +/* ExtensionType values from RFC 5246. */ +#define TLSEXT_TYPE_signature_algorithms 13 + +/* ExtensionType value from RFC 5764. */ +#define TLSEXT_TYPE_use_srtp 14 + +/* ExtensionType value from RFC 5620. */ +#define TLSEXT_TYPE_heartbeat 15 + +/* ExtensionType value from RFC 7301. */ +#define TLSEXT_TYPE_application_layer_protocol_negotiation 16 + +/* ExtensionType value from RFC 7685. */ +#define TLSEXT_TYPE_padding 21 + +/* ExtensionType value from RFC 4507. */ +#define TLSEXT_TYPE_session_ticket 35 + +/* Temporary extension type */ +#define TLSEXT_TYPE_renegotiate 0xff01 + +/* This is not an IANA defined extension number */ +#define TLSEXT_TYPE_next_proto_neg 13172 + +/* NameType value from RFC 3546. */ +#define TLSEXT_NAMETYPE_host_name 0 +/* status request value from RFC 3546 */ +#define TLSEXT_STATUSTYPE_ocsp 1 + +/* ECPointFormat values from RFC 4492. */ +#define TLSEXT_ECPOINTFORMAT_first 0 +#define TLSEXT_ECPOINTFORMAT_uncompressed 0 +#define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime 1 +#define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 2 +#define TLSEXT_ECPOINTFORMAT_last 2 + +/* Signature and hash algorithms from RFC 5246. */ + +#define TLSEXT_signature_anonymous 0 +#define TLSEXT_signature_rsa 1 +#define TLSEXT_signature_dsa 2 +#define TLSEXT_signature_ecdsa 3 +/* FIXME IANA */ +#define TLSEXT_signature_gostr01 237 +#define TLSEXT_signature_gostr12_256 238 +#define TLSEXT_signature_gostr12_512 239 + +#define TLSEXT_hash_none 0 +#define TLSEXT_hash_md5 1 +#define TLSEXT_hash_sha1 2 +#define TLSEXT_hash_sha224 3 +#define TLSEXT_hash_sha256 4 +#define TLSEXT_hash_sha384 5 +#define TLSEXT_hash_sha512 6 +/* FIXME IANA */ +#define TLSEXT_hash_gost94 237 +#define TLSEXT_hash_streebog_256 238 +#define TLSEXT_hash_streebog_512 239 + +#define TLSEXT_MAXLEN_host_name 255 + +const char *SSL_get_servername(const SSL *s, const int type); +int SSL_get_servername_type(const SSL *s); +/* SSL_export_keying_material exports a value derived from the master secret, + * as specified in RFC 5705. It writes |olen| bytes to |out| given a label and + * optional context. (Since a zero length context is allowed, the |use_context| + * flag controls whether a context is included.) + * + * It returns 1 on success and zero otherwise. + */ +int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, + const char *label, size_t llen, const unsigned char *p, size_t plen, + int use_context); + +#define SSL_set_tlsext_host_name(s,name) \ +SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name) + +#define SSL_set_tlsext_debug_callback(ssl, cb) \ +SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,(void (*)(void))cb) + +#define SSL_set_tlsext_debug_arg(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0, (void *)arg) + +#define SSL_set_tlsext_status_type(ssl, type) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type, NULL) + +#define SSL_get_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +#define SSL_set_tlsext_status_exts(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg) + +#define SSL_get_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +#define SSL_set_tlsext_status_ids(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg) + +#define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \ +SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0, (void *)arg) + +#define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \ +SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen, (void *)arg) + +#define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \ +SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,(void (*)(void))cb) + +#define SSL_TLSEXT_ERR_OK 0 +#define SSL_TLSEXT_ERR_ALERT_WARNING 1 +#define SSL_TLSEXT_ERR_ALERT_FATAL 2 +#define SSL_TLSEXT_ERR_NOACK 3 + +#define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \ +SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0, (void *)arg) + +#define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_GET_TLSEXT_TICKET_KEYS,(keylen),(keys)) +#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_set_tlsext_status_cb(ssl, cb) \ +SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,(void (*)(void))cb) + +#define SSL_CTX_set_tlsext_status_arg(ssl, 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) + +/* PSK ciphersuites from RFC 4279. */ +#define TLS1_CK_PSK_WITH_RC4_128_SHA 0x0300008A +#define TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008B +#define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C +#define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D + +/* Additional TLS ciphersuites from expired Internet Draft + * draft-ietf-tls-56-bit-ciphersuites-01.txt + * (available if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see + * s3_lib.c). We actually treat them like SSL 3.0 ciphers, which we probably + * shouldn't. Note that the first two are actually not in the IDs. */ +#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 0x03000060 /* not in ID */ +#define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 0x03000061 /* not in ID */ +#define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA 0x03000062 +#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA 0x03000063 +#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA 0x03000064 +#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA 0x03000065 +#define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA 0x03000066 + +/* AES ciphersuites from RFC 3268. */ + +#define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F +#define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 +#define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 +#define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 +#define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 +#define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 + +#define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 +#define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 +#define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 +#define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 +#define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 +#define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A + +/* TLS v1.2 ciphersuites */ +#define TLS1_CK_RSA_WITH_NULL_SHA256 0x0300003B +#define TLS1_CK_RSA_WITH_AES_128_SHA256 0x0300003C +#define TLS1_CK_RSA_WITH_AES_256_SHA256 0x0300003D +#define TLS1_CK_DH_DSS_WITH_AES_128_SHA256 0x0300003E +#define TLS1_CK_DH_RSA_WITH_AES_128_SHA256 0x0300003F +#define TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 0x03000040 + +/* Camellia ciphersuites from RFC 4132. */ +#define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 +#define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 +#define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 +#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 +#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 +#define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 + +/* TLS v1.2 ciphersuites */ +#define TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 0x03000067 +#define TLS1_CK_DH_DSS_WITH_AES_256_SHA256 0x03000068 +#define TLS1_CK_DH_RSA_WITH_AES_256_SHA256 0x03000069 +#define TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 0x0300006A +#define TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 0x0300006B +#define TLS1_CK_ADH_WITH_AES_128_SHA256 0x0300006C +#define TLS1_CK_ADH_WITH_AES_256_SHA256 0x0300006D + +/* Camellia ciphersuites from RFC 4132. */ +#define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 +#define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 +#define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 +#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 +#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 +#define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 + +/* SEED ciphersuites from RFC 4162. */ +#define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 +#define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 +#define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 +#define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 +#define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A +#define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B + +/* TLS v1.2 GCM ciphersuites from RFC 5288. */ +#define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 0x0300009C +#define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 0x0300009D +#define TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 0x0300009E +#define TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 0x0300009F +#define TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 0x030000A0 +#define TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 0x030000A1 +#define TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 0x030000A2 +#define TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 0x030000A3 +#define TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 0x030000A4 +#define TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 0x030000A5 +#define TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 0x030000A6 +#define TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 0x030000A7 + +/* TLS 1.2 Camellia SHA-256 ciphersuites from RFC5932 */ +#define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BA +#define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 0x030000BB +#define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BC +#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 0x030000BD +#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BE +#define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA256 0x030000BF + +#define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C0 +#define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 0x030000C1 +#define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C2 +#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 0x030000C3 +#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C4 +#define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA256 0x030000C5 + +/* ECC ciphersuites from RFC 4492. */ +#define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 +#define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 +#define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 +#define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 +#define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 + +#define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 +#define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 +#define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 +#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 +#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A + +#define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B +#define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C +#define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D +#define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E +#define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F + +#define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 +#define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 +#define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 +#define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 +#define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 + +#define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 +#define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 +#define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 +#define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 +#define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 + +/* SRP ciphersuites from RFC 5054. */ +#define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA 0x0300C01A +#define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA 0x0300C01B +#define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA 0x0300C01C +#define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA 0x0300C01D +#define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA 0x0300C01E +#define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA 0x0300C01F +#define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA 0x0300C020 +#define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA 0x0300C021 +#define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA 0x0300C022 + +/* ECDH HMAC based ciphersuites from RFC 5289. */ +#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 0x0300C023 +#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 0x0300C024 +#define TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 0x0300C025 +#define TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 0x0300C026 +#define TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 0x0300C027 +#define TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 0x0300C028 +#define TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 0x0300C029 +#define TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 0x0300C02A + +/* ECDH GCM based ciphersuites from RFC 5289. */ +#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02B +#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02C +#define TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02D +#define TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02E +#define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0x0300C02F +#define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0x0300C030 +#define TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 0x0300C031 +#define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032 + +/* ChaCha20-Poly1305 based ciphersuites. */ +#define TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD 0x0300CC13 +#define TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD 0x0300CC14 +#define TLS1_CK_DHE_RSA_CHACHA20_POLY1305_OLD 0x0300CC15 +#define TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305 0x0300CCA8 +#define TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305 0x0300CCA9 +#define TLS1_CK_DHE_RSA_CHACHA20_POLY1305 0x0300CCAA + +#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5" +#define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5" +#define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DES-CBC-SHA" +#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA "EXP1024-DHE-DSS-DES-CBC-SHA" +#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA "EXP1024-RC4-SHA" +#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA "EXP1024-DHE-DSS-RC4-SHA" +#define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" + +/* AES ciphersuites from RFC 3268. */ +#define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" +#define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" +#define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" +#define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" +#define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" +#define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" + +#define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" +#define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" +#define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" +#define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" +#define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" +#define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" + +/* ECC ciphersuites from draft-ietf-tls-ecc-01.txt (Mar 15, 2001) */ +#define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" +#define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" +#define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" +#define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" +#define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" + +#define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" + +#define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" +#define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" +#define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" +#define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" +#define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" + +#define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" + +#define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" +#define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" +#define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" +#define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" +#define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" + +/* PSK ciphersuites from RFC 4279. */ +#define TLS1_TXT_PSK_WITH_RC4_128_SHA "PSK-RC4-SHA" +#define TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA "PSK-3DES-EDE-CBC-SHA" +#define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA" +#define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA" + +/* SRP ciphersuite from RFC 5054. */ +#define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA" +#define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA" +#define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "SRP-DSS-3DES-EDE-CBC-SHA" +#define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA "SRP-AES-128-CBC-SHA" +#define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "SRP-RSA-AES-128-CBC-SHA" +#define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "SRP-DSS-AES-128-CBC-SHA" +#define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA "SRP-AES-256-CBC-SHA" +#define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "SRP-RSA-AES-256-CBC-SHA" +#define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "SRP-DSS-AES-256-CBC-SHA" + +/* Camellia ciphersuites from RFC 4132. */ +#define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" +#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" +#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" +#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" +#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" +#define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" + +#define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" +#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" +#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" +#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" +#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" +#define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" + +/* TLS 1.2 Camellia SHA-256 ciphersuites from RFC5932 */ +#define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA256 "CAMELLIA128-SHA256" +#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 "DH-DSS-CAMELLIA128-SHA256" +#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 "DH-RSA-CAMELLIA128-SHA256" +#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 "DHE-DSS-CAMELLIA128-SHA256" +#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "DHE-RSA-CAMELLIA128-SHA256" +#define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA256 "ADH-CAMELLIA128-SHA256" + +#define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA256 "CAMELLIA256-SHA256" +#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 "DH-DSS-CAMELLIA256-SHA256" +#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 "DH-RSA-CAMELLIA256-SHA256" +#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 "DHE-DSS-CAMELLIA256-SHA256" +#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 "DHE-RSA-CAMELLIA256-SHA256" +#define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA256 "ADH-CAMELLIA256-SHA256" + +/* SEED ciphersuites from RFC 4162. */ +#define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" +#define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" +#define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" +#define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" +#define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" +#define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" + +/* TLS v1.2 ciphersuites. */ +#define TLS1_TXT_RSA_WITH_NULL_SHA256 "NULL-SHA256" +#define TLS1_TXT_RSA_WITH_AES_128_SHA256 "AES128-SHA256" +#define TLS1_TXT_RSA_WITH_AES_256_SHA256 "AES256-SHA256" +#define TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 "DH-DSS-AES128-SHA256" +#define TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 "DH-RSA-AES128-SHA256" +#define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 "DHE-DSS-AES128-SHA256" +#define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 "DHE-RSA-AES128-SHA256" +#define TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 "DH-DSS-AES256-SHA256" +#define TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 "DH-RSA-AES256-SHA256" +#define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 "DHE-DSS-AES256-SHA256" +#define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 "DHE-RSA-AES256-SHA256" +#define TLS1_TXT_ADH_WITH_AES_128_SHA256 "ADH-AES128-SHA256" +#define TLS1_TXT_ADH_WITH_AES_256_SHA256 "ADH-AES256-SHA256" + +/* TLS v1.2 GCM ciphersuites from RFC 5288. */ +#define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 "AES128-GCM-SHA256" +#define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 "AES256-GCM-SHA384" +#define TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 "DHE-RSA-AES128-GCM-SHA256" +#define TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 "DHE-RSA-AES256-GCM-SHA384" +#define TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 "DH-RSA-AES128-GCM-SHA256" +#define TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 "DH-RSA-AES256-GCM-SHA384" +#define TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 "DHE-DSS-AES128-GCM-SHA256" +#define TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 "DHE-DSS-AES256-GCM-SHA384" +#define TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 "DH-DSS-AES128-GCM-SHA256" +#define TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 "DH-DSS-AES256-GCM-SHA384" +#define TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 "ADH-AES128-GCM-SHA256" +#define TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 "ADH-AES256-GCM-SHA384" + +/* ECDH HMAC based ciphersuites from RFC 5289. */ + +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 "ECDHE-ECDSA-AES128-SHA256" +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 "ECDHE-ECDSA-AES256-SHA384" +#define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 "ECDH-ECDSA-AES128-SHA256" +#define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 "ECDH-ECDSA-AES256-SHA384" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 "ECDHE-RSA-AES128-SHA256" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 "ECDHE-RSA-AES256-SHA384" +#define TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 "ECDH-RSA-AES128-SHA256" +#define TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 "ECDH-RSA-AES256-SHA384" + +/* ECDH GCM based ciphersuites from RFC 5289. */ +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "ECDHE-ECDSA-AES128-GCM-SHA256" +#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "ECDHE-ECDSA-AES256-GCM-SHA384" +#define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 "ECDH-ECDSA-AES128-GCM-SHA256" +#define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 "ECDH-ECDSA-AES256-GCM-SHA384" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "ECDHE-RSA-AES128-GCM-SHA256" +#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "ECDHE-RSA-AES256-GCM-SHA384" +#define TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 "ECDH-RSA-AES128-GCM-SHA256" +#define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384" + +/* ChaCha20-Poly1305 based ciphersuites. */ +#define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_OLD "ECDHE-RSA-CHACHA20-POLY1305-OLD" +#define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_OLD "ECDHE-ECDSA-CHACHA20-POLY1305-OLD" +#define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305_OLD "DHE-RSA-CHACHA20-POLY1305-OLD" +#define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 "ECDHE-RSA-CHACHA20-POLY1305" +#define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "ECDHE-ECDSA-CHACHA20-POLY1305" +#define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 "DHE-RSA-CHACHA20-POLY1305" + +#define TLS_CT_RSA_SIGN 1 +#define TLS_CT_DSS_SIGN 2 +#define TLS_CT_RSA_FIXED_DH 3 +#define TLS_CT_DSS_FIXED_DH 4 +#define TLS_CT_ECDSA_SIGN 64 +#define TLS_CT_RSA_FIXED_ECDH 65 +#define TLS_CT_ECDSA_FIXED_ECDH 66 +#define TLS_CT_GOST94_SIGN 21 +#define TLS_CT_GOST01_SIGN 22 +#define TLS_CT_GOST12_256_SIGN 238 /* FIXME: IANA */ +#define TLS_CT_GOST12_512_SIGN 239 /* FIXME: IANA */ +/* when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see + * comment there) */ +#define TLS_CT_NUMBER 11 + +#define TLS1_FINISH_MAC_LENGTH 12 + +#define TLS_MD_MAX_CONST_SIZE 20 +#define TLS_MD_CLIENT_FINISH_CONST "client finished" +#define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 +#define TLS_MD_SERVER_FINISH_CONST "server finished" +#define TLS_MD_SERVER_FINISH_CONST_SIZE 15 +#define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +#define TLS_MD_KEY_EXPANSION_CONST "key expansion" +#define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 +#define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" +#define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16 +#define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +#define TLS_MD_IV_BLOCK_CONST "IV block" +#define TLS_MD_IV_BLOCK_CONST_SIZE 8 +#define TLS_MD_MASTER_SECRET_CONST "master secret" +#define TLS_MD_MASTER_SECRET_CONST_SIZE 13 + +/* TLS Session Ticket extension struct. */ +struct tls_session_ticket_ext_st { + unsigned short length; + void *data; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ts.h b/src/3rdparty/win32_include/openssl/ts.h new file mode 100644 index 000000000..a8d2281b7 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ts.h @@ -0,0 +1,836 @@ +/* $OpenBSD: ts.h,v 1.8 2016/12/27 16:05:57 jsing Exp $ */ +/* Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL + * project 2002, 2003, 2004. + */ +/* ==================================================================== + * Copyright (c) 2006 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_TS_H +#define HEADER_TS_H + +#include + +#ifndef OPENSSL_NO_BUFFER +#include +#endif +#ifndef OPENSSL_NO_EVP +#include +#endif +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include +#include + +#ifndef OPENSSL_NO_RSA +#include +#endif + +#ifndef OPENSSL_NO_DSA +#include +#endif + +#ifndef OPENSSL_NO_DH +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* +MessageImprint ::= SEQUENCE { + hashAlgorithm AlgorithmIdentifier, + hashedMessage OCTET STRING } +*/ + +typedef struct TS_msg_imprint_st { + X509_ALGOR *hash_algo; + ASN1_OCTET_STRING *hashed_msg; +} TS_MSG_IMPRINT; + +/* +TimeStampReq ::= SEQUENCE { + version INTEGER { v1(1) }, + messageImprint MessageImprint, + --a hash algorithm OID and the hash value of the data to be + --time-stamped + reqPolicy TSAPolicyId OPTIONAL, + nonce INTEGER OPTIONAL, + certReq BOOLEAN DEFAULT FALSE, + extensions [0] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_req_st { + ASN1_INTEGER *version; + TS_MSG_IMPRINT *msg_imprint; + ASN1_OBJECT *policy_id; /* OPTIONAL */ + ASN1_INTEGER *nonce; /* OPTIONAL */ + ASN1_BOOLEAN cert_req; /* DEFAULT FALSE */ + STACK_OF(X509_EXTENSION) *extensions; /* [0] OPTIONAL */ +} TS_REQ; + +/* +Accuracy ::= SEQUENCE { + seconds INTEGER OPTIONAL, + millis [0] INTEGER (1..999) OPTIONAL, + micros [1] INTEGER (1..999) OPTIONAL } +*/ + +typedef struct TS_accuracy_st { + ASN1_INTEGER *seconds; + ASN1_INTEGER *millis; + ASN1_INTEGER *micros; +} TS_ACCURACY; + +/* +TSTInfo ::= SEQUENCE { + version INTEGER { v1(1) }, + policy TSAPolicyId, + messageImprint MessageImprint, + -- MUST have the same value as the similar field in + -- TimeStampReq + serialNumber INTEGER, + -- Time-Stamping users MUST be ready to accommodate integers + -- up to 160 bits. + genTime GeneralizedTime, + accuracy Accuracy OPTIONAL, + ordering BOOLEAN DEFAULT FALSE, + nonce INTEGER OPTIONAL, + -- MUST be present if the similar field was present + -- in TimeStampReq. In that case it MUST have the same value. + tsa [0] GeneralName OPTIONAL, + extensions [1] IMPLICIT Extensions OPTIONAL } +*/ + +typedef struct TS_tst_info_st { + ASN1_INTEGER *version; + ASN1_OBJECT *policy_id; + TS_MSG_IMPRINT *msg_imprint; + ASN1_INTEGER *serial; + ASN1_GENERALIZEDTIME *time; + TS_ACCURACY *accuracy; + ASN1_BOOLEAN ordering; + ASN1_INTEGER *nonce; + GENERAL_NAME *tsa; + STACK_OF(X509_EXTENSION) *extensions; +} TS_TST_INFO; + +/* +PKIStatusInfo ::= SEQUENCE { + status PKIStatus, + statusString PKIFreeText OPTIONAL, + failInfo PKIFailureInfo OPTIONAL } + +From RFC 1510 - section 3.1.1: +PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String + -- text encoded as UTF-8 String (note: each UTF8String SHOULD + -- include an RFC 1766 language tag to indicate the language + -- of the contained text) +*/ + +/* Possible values for status. See ts_resp_print.c && ts_resp_verify.c. */ + +#define TS_STATUS_GRANTED 0 +#define TS_STATUS_GRANTED_WITH_MODS 1 +#define TS_STATUS_REJECTION 2 +#define TS_STATUS_WAITING 3 +#define TS_STATUS_REVOCATION_WARNING 4 +#define TS_STATUS_REVOCATION_NOTIFICATION 5 + +/* Possible values for failure_info. See ts_resp_print.c && ts_resp_verify.c */ + +#define TS_INFO_BAD_ALG 0 +#define TS_INFO_BAD_REQUEST 2 +#define TS_INFO_BAD_DATA_FORMAT 5 +#define TS_INFO_TIME_NOT_AVAILABLE 14 +#define TS_INFO_UNACCEPTED_POLICY 15 +#define TS_INFO_UNACCEPTED_EXTENSION 16 +#define TS_INFO_ADD_INFO_NOT_AVAILABLE 17 +#define TS_INFO_SYSTEM_FAILURE 25 + +typedef struct TS_status_info_st { + ASN1_INTEGER *status; + STACK_OF(ASN1_UTF8STRING) *text; + ASN1_BIT_STRING *failure_info; +} TS_STATUS_INFO; + +DECLARE_STACK_OF(ASN1_UTF8STRING) + +/* +TimeStampResp ::= SEQUENCE { + status PKIStatusInfo, + timeStampToken TimeStampToken OPTIONAL } +*/ + +typedef struct TS_resp_st { + TS_STATUS_INFO *status_info; + PKCS7 *token; + TS_TST_INFO *tst_info; +} TS_RESP; + +/* The structure below would belong to the ESS component. */ + +/* +IssuerSerial ::= SEQUENCE { + issuer GeneralNames, + serialNumber CertificateSerialNumber + } +*/ + +typedef struct ESS_issuer_serial { + STACK_OF(GENERAL_NAME) *issuer; + ASN1_INTEGER *serial; +} ESS_ISSUER_SERIAL; + +/* +ESSCertID ::= SEQUENCE { + certHash Hash, + issuerSerial IssuerSerial OPTIONAL +} +*/ + +typedef struct ESS_cert_id { + ASN1_OCTET_STRING *hash; /* Always SHA-1 digest. */ + ESS_ISSUER_SERIAL *issuer_serial; +} ESS_CERT_ID; + +DECLARE_STACK_OF(ESS_CERT_ID) + +/* +SigningCertificate ::= SEQUENCE { + certs SEQUENCE OF ESSCertID, + policies SEQUENCE OF PolicyInformation OPTIONAL +} +*/ + +typedef struct ESS_signing_cert { + STACK_OF(ESS_CERT_ID) *cert_ids; + STACK_OF(POLICYINFO) *policy_info; +} ESS_SIGNING_CERT; + + +TS_REQ *TS_REQ_new(void); +void TS_REQ_free(TS_REQ *a); +int i2d_TS_REQ(const TS_REQ *a, unsigned char **pp); +TS_REQ *d2i_TS_REQ(TS_REQ **a, const unsigned char **pp, long length); + +TS_REQ *TS_REQ_dup(TS_REQ *a); + +TS_REQ *d2i_TS_REQ_fp(FILE *fp, TS_REQ **a); +int i2d_TS_REQ_fp(FILE *fp, TS_REQ *a); +TS_REQ *d2i_TS_REQ_bio(BIO *fp, TS_REQ **a); +int i2d_TS_REQ_bio(BIO *fp, TS_REQ *a); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_new(void); +void TS_MSG_IMPRINT_free(TS_MSG_IMPRINT *a); +int i2d_TS_MSG_IMPRINT(const TS_MSG_IMPRINT *a, unsigned char **pp); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT **a, + const unsigned char **pp, long length); + +TS_MSG_IMPRINT *TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT *a); + +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT *a); +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_bio(BIO *fp, TS_MSG_IMPRINT *a); + +TS_RESP *TS_RESP_new(void); +void TS_RESP_free(TS_RESP *a); +int i2d_TS_RESP(const TS_RESP *a, unsigned char **pp); +TS_RESP *d2i_TS_RESP(TS_RESP **a, const unsigned char **pp, long length); +TS_TST_INFO *PKCS7_to_TS_TST_INFO(PKCS7 *token); +TS_RESP *TS_RESP_dup(TS_RESP *a); + +TS_RESP *d2i_TS_RESP_fp(FILE *fp, TS_RESP **a); +int i2d_TS_RESP_fp(FILE *fp, TS_RESP *a); +TS_RESP *d2i_TS_RESP_bio(BIO *fp, TS_RESP **a); +int i2d_TS_RESP_bio(BIO *fp, TS_RESP *a); + +TS_STATUS_INFO *TS_STATUS_INFO_new(void); +void TS_STATUS_INFO_free(TS_STATUS_INFO *a); +int i2d_TS_STATUS_INFO(const TS_STATUS_INFO *a, unsigned char **pp); +TS_STATUS_INFO *d2i_TS_STATUS_INFO(TS_STATUS_INFO **a, + const unsigned char **pp, long length); +TS_STATUS_INFO *TS_STATUS_INFO_dup(TS_STATUS_INFO *a); + +TS_TST_INFO *TS_TST_INFO_new(void); +void TS_TST_INFO_free(TS_TST_INFO *a); +int i2d_TS_TST_INFO(const TS_TST_INFO *a, unsigned char **pp); +TS_TST_INFO *d2i_TS_TST_INFO(TS_TST_INFO **a, const unsigned char **pp, + long length); +TS_TST_INFO *TS_TST_INFO_dup(TS_TST_INFO *a); + +TS_TST_INFO *d2i_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO *a); +TS_TST_INFO *d2i_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_bio(BIO *fp, TS_TST_INFO *a); + +TS_ACCURACY *TS_ACCURACY_new(void); +void TS_ACCURACY_free(TS_ACCURACY *a); +int i2d_TS_ACCURACY(const TS_ACCURACY *a, unsigned char **pp); +TS_ACCURACY *d2i_TS_ACCURACY(TS_ACCURACY **a, const unsigned char **pp, + long length); +TS_ACCURACY *TS_ACCURACY_dup(TS_ACCURACY *a); + +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_new(void); +void ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL *a); +int i2d_ESS_ISSUER_SERIAL(const ESS_ISSUER_SERIAL *a, + unsigned char **pp); +ESS_ISSUER_SERIAL *d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL **a, + const unsigned char **pp, long length); +ESS_ISSUER_SERIAL *ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL *a); + +ESS_CERT_ID *ESS_CERT_ID_new(void); +void ESS_CERT_ID_free(ESS_CERT_ID *a); +int i2d_ESS_CERT_ID(const ESS_CERT_ID *a, unsigned char **pp); +ESS_CERT_ID *d2i_ESS_CERT_ID(ESS_CERT_ID **a, const unsigned char **pp, + long length); +ESS_CERT_ID *ESS_CERT_ID_dup(ESS_CERT_ID *a); + +ESS_SIGNING_CERT *ESS_SIGNING_CERT_new(void); +void ESS_SIGNING_CERT_free(ESS_SIGNING_CERT *a); +int i2d_ESS_SIGNING_CERT(const ESS_SIGNING_CERT *a, + unsigned char **pp); +ESS_SIGNING_CERT *d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT **a, + const unsigned char **pp, long length); +ESS_SIGNING_CERT *ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT *a); + +void ERR_load_TS_strings(void); + +int TS_REQ_set_version(TS_REQ *a, long version); +long TS_REQ_get_version(const TS_REQ *a); + +int TS_REQ_set_msg_imprint(TS_REQ *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_REQ_get_msg_imprint(TS_REQ *a); + +int TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT *a, X509_ALGOR *alg); +X509_ALGOR *TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT *a); + +int TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT *a, unsigned char *d, int len); +ASN1_OCTET_STRING *TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT *a); + +int TS_REQ_set_policy_id(TS_REQ *a, ASN1_OBJECT *policy); +ASN1_OBJECT *TS_REQ_get_policy_id(TS_REQ *a); + +int TS_REQ_set_nonce(TS_REQ *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_REQ_get_nonce(const TS_REQ *a); + +int TS_REQ_set_cert_req(TS_REQ *a, int cert_req); +int TS_REQ_get_cert_req(const TS_REQ *a); + +STACK_OF(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ *a); +void TS_REQ_ext_free(TS_REQ *a); +int TS_REQ_get_ext_count(TS_REQ *a); +int TS_REQ_get_ext_by_NID(TS_REQ *a, int nid, int lastpos); +int TS_REQ_get_ext_by_OBJ(TS_REQ *a, ASN1_OBJECT *obj, int lastpos); +int TS_REQ_get_ext_by_critical(TS_REQ *a, int crit, int lastpos); +X509_EXTENSION *TS_REQ_get_ext(TS_REQ *a, int loc); +X509_EXTENSION *TS_REQ_delete_ext(TS_REQ *a, int loc); +int TS_REQ_add_ext(TS_REQ *a, X509_EXTENSION *ex, int loc); +void *TS_REQ_get_ext_d2i(TS_REQ *a, int nid, int *crit, int *idx); + +/* Function declarations for TS_REQ defined in ts/ts_req_print.c */ + +int TS_REQ_print_bio(BIO *bio, TS_REQ *a); + +/* Function declarations for TS_RESP defined in ts/ts_resp_utils.c */ + +int TS_RESP_set_status_info(TS_RESP *a, TS_STATUS_INFO *info); +TS_STATUS_INFO *TS_RESP_get_status_info(TS_RESP *a); + +/* Caller loses ownership of PKCS7 and TS_TST_INFO objects. */ +void TS_RESP_set_tst_info(TS_RESP *a, PKCS7 *p7, TS_TST_INFO *tst_info); +PKCS7 *TS_RESP_get_token(TS_RESP *a); +TS_TST_INFO *TS_RESP_get_tst_info(TS_RESP *a); + +int TS_TST_INFO_set_version(TS_TST_INFO *a, long version); +long TS_TST_INFO_get_version(const TS_TST_INFO *a); + +int TS_TST_INFO_set_policy_id(TS_TST_INFO *a, ASN1_OBJECT *policy_id); +ASN1_OBJECT *TS_TST_INFO_get_policy_id(TS_TST_INFO *a); + +int TS_TST_INFO_set_msg_imprint(TS_TST_INFO *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_TST_INFO_get_msg_imprint(TS_TST_INFO *a); + +int TS_TST_INFO_set_serial(TS_TST_INFO *a, const ASN1_INTEGER *serial); +const ASN1_INTEGER *TS_TST_INFO_get_serial(const TS_TST_INFO *a); + +int TS_TST_INFO_set_time(TS_TST_INFO *a, const ASN1_GENERALIZEDTIME *gtime); +const ASN1_GENERALIZEDTIME *TS_TST_INFO_get_time(const TS_TST_INFO *a); + +int TS_TST_INFO_set_accuracy(TS_TST_INFO *a, TS_ACCURACY *accuracy); +TS_ACCURACY *TS_TST_INFO_get_accuracy(TS_TST_INFO *a); + +int TS_ACCURACY_set_seconds(TS_ACCURACY *a, const ASN1_INTEGER *seconds); +const ASN1_INTEGER *TS_ACCURACY_get_seconds(const TS_ACCURACY *a); + +int TS_ACCURACY_set_millis(TS_ACCURACY *a, const ASN1_INTEGER *millis); +const ASN1_INTEGER *TS_ACCURACY_get_millis(const TS_ACCURACY *a); + +int TS_ACCURACY_set_micros(TS_ACCURACY *a, const ASN1_INTEGER *micros); +const ASN1_INTEGER *TS_ACCURACY_get_micros(const TS_ACCURACY *a); + +int TS_TST_INFO_set_ordering(TS_TST_INFO *a, int ordering); +int TS_TST_INFO_get_ordering(const TS_TST_INFO *a); + +int TS_TST_INFO_set_nonce(TS_TST_INFO *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_TST_INFO_get_nonce(const TS_TST_INFO *a); + +int TS_TST_INFO_set_tsa(TS_TST_INFO *a, GENERAL_NAME *tsa); +GENERAL_NAME *TS_TST_INFO_get_tsa(TS_TST_INFO *a); + +STACK_OF(X509_EXTENSION) *TS_TST_INFO_get_exts(TS_TST_INFO *a); +void TS_TST_INFO_ext_free(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_count(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_by_NID(TS_TST_INFO *a, int nid, int lastpos); +int TS_TST_INFO_get_ext_by_OBJ(TS_TST_INFO *a, ASN1_OBJECT *obj, int lastpos); +int TS_TST_INFO_get_ext_by_critical(TS_TST_INFO *a, int crit, int lastpos); +X509_EXTENSION *TS_TST_INFO_get_ext(TS_TST_INFO *a, int loc); +X509_EXTENSION *TS_TST_INFO_delete_ext(TS_TST_INFO *a, int loc); +int TS_TST_INFO_add_ext(TS_TST_INFO *a, X509_EXTENSION *ex, int loc); +void *TS_TST_INFO_get_ext_d2i(TS_TST_INFO *a, int nid, int *crit, int *idx); + +/* Declarations related to response generation, defined in ts/ts_resp_sign.c. */ + +/* Optional flags for response generation. */ + +/* Don't include the TSA name in response. */ +#define TS_TSA_NAME 0x01 + +/* Set ordering to true in response. */ +#define TS_ORDERING 0x02 + +/* + * Include the signer certificate and the other specified certificates in + * the ESS signing certificate attribute beside the PKCS7 signed data. + * Only the signer certificates is included by default. + */ +#define TS_ESS_CERT_ID_CHAIN 0x04 + +/* Forward declaration. */ +struct TS_resp_ctx; + +/* This must return a unique number less than 160 bits long. */ +typedef ASN1_INTEGER *(*TS_serial_cb)(struct TS_resp_ctx *, void *); + +/* This must return the seconds and microseconds since Jan 1, 1970 in + the sec and usec variables allocated by the caller. + Return non-zero for success and zero for failure. */ +typedef int (*TS_time_cb)(struct TS_resp_ctx *, void *, time_t *sec, long *usec); + +/* This must process the given extension. + * It can modify the TS_TST_INFO object of the context. + * Return values: !0 (processed), 0 (error, it must set the + * status info/failure info of the response). + */ +typedef int (*TS_extension_cb)(struct TS_resp_ctx *, X509_EXTENSION *, void *); + +typedef struct TS_resp_ctx { + X509 *signer_cert; + EVP_PKEY *signer_key; + STACK_OF(X509) *certs; /* Certs to include in signed data. */ + STACK_OF(ASN1_OBJECT) *policies; /* Acceptable policies. */ + ASN1_OBJECT *default_policy; /* It may appear in policies, too. */ + STACK_OF(EVP_MD) *mds; /* Acceptable message digests. */ + ASN1_INTEGER *seconds; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *millis; /* accuracy, 0 means not specified. */ + ASN1_INTEGER *micros; /* accuracy, 0 means not specified. */ + unsigned clock_precision_digits; /* fraction of seconds in + time stamp token. */ + unsigned flags; /* Optional info, see values above. */ + + /* Callback functions. */ + TS_serial_cb serial_cb; + void *serial_cb_data; /* User data for serial_cb. */ + + TS_time_cb time_cb; + void *time_cb_data; /* User data for time_cb. */ + + TS_extension_cb extension_cb; + void *extension_cb_data; /* User data for extension_cb. */ + + /* These members are used only while creating the response. */ + TS_REQ *request; + TS_RESP *response; + TS_TST_INFO *tst_info; +} TS_RESP_CTX; + +DECLARE_STACK_OF(EVP_MD) + +/* Creates a response context that can be used for generating responses. */ +TS_RESP_CTX *TS_RESP_CTX_new(void); +void TS_RESP_CTX_free(TS_RESP_CTX *ctx); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_cert(TS_RESP_CTX *ctx, X509 *signer); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_key(TS_RESP_CTX *ctx, EVP_PKEY *key); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_def_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *def_policy); + +/* No additional certs are included in the response by default. */ +int TS_RESP_CTX_set_certs(TS_RESP_CTX *ctx, STACK_OF(X509) *certs); + +/* Adds a new acceptable policy, only the default policy + is accepted by default. */ +int TS_RESP_CTX_add_policy(TS_RESP_CTX *ctx, ASN1_OBJECT *policy); + +/* Adds a new acceptable message digest. Note that no message digests + are accepted by default. The md argument is shared with the caller. */ +int TS_RESP_CTX_add_md(TS_RESP_CTX *ctx, const EVP_MD *md); + +/* Accuracy is not included by default. */ +int TS_RESP_CTX_set_accuracy(TS_RESP_CTX *ctx, + int secs, int millis, int micros); + +/* Clock precision digits, i.e. the number of decimal digits: + '0' means sec, '3' msec, '6' usec, and so on. Default is 0. */ +int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, + unsigned clock_precision_digits); +/* At most we accept usec precision. */ +#define TS_MAX_CLOCK_PRECISION_DIGITS 6 + +/* No flags are set by default. */ +void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); + +/* Default callback always returns a constant. */ +void TS_RESP_CTX_set_serial_cb(TS_RESP_CTX *ctx, TS_serial_cb cb, void *data); + +/* Default callback rejects all extensions. The extension callback is called + * when the TS_TST_INFO object is already set up and not signed yet. */ +/* FIXME: extension handling is not tested yet. */ +void TS_RESP_CTX_set_extension_cb(TS_RESP_CTX *ctx, + TS_extension_cb cb, void *data); + +/* The following methods can be used in the callbacks. */ +int TS_RESP_CTX_set_status_info(TS_RESP_CTX *ctx, + int status, const char *text); + +/* Sets the status info only if it is still TS_STATUS_GRANTED. */ +int TS_RESP_CTX_set_status_info_cond(TS_RESP_CTX *ctx, + int status, const char *text); + +int TS_RESP_CTX_add_failure_info(TS_RESP_CTX *ctx, int failure); + +/* The get methods below can be used in the extension callback. */ +TS_REQ *TS_RESP_CTX_get_request(TS_RESP_CTX *ctx); + +TS_TST_INFO *TS_RESP_CTX_get_tst_info(TS_RESP_CTX *ctx); + +/* + * Creates the signed TS_TST_INFO and puts it in TS_RESP. + * In case of errors it sets the status info properly. + * Returns NULL only in case of memory allocation/fatal error. + */ +TS_RESP *TS_RESP_create_response(TS_RESP_CTX *ctx, BIO *req_bio); + +/* + * Declarations related to response verification, + * they are defined in ts/ts_resp_verify.c. + */ + +int TS_RESP_verify_signature(PKCS7 *token, STACK_OF(X509) *certs, + X509_STORE *store, X509 **signer_out); + +/* Context structure for the generic verify method. */ + +/* Verify the signer's certificate and the signature of the response. */ +#define TS_VFY_SIGNATURE (1u << 0) +/* Verify the version number of the response. */ +#define TS_VFY_VERSION (1u << 1) +/* Verify if the policy supplied by the user matches the policy of the TSA. */ +#define TS_VFY_POLICY (1u << 2) +/* Verify the message imprint provided by the user. This flag should not be + specified with TS_VFY_DATA. */ +#define TS_VFY_IMPRINT (1u << 3) +/* Verify the message imprint computed by the verify method from the user + provided data and the MD algorithm of the response. This flag should not be + specified with TS_VFY_IMPRINT. */ +#define TS_VFY_DATA (1u << 4) +/* Verify the nonce value. */ +#define TS_VFY_NONCE (1u << 5) +/* Verify if the TSA name field matches the signer certificate. */ +#define TS_VFY_SIGNER (1u << 6) +/* Verify if the TSA name field equals to the user provided name. */ +#define TS_VFY_TSA_NAME (1u << 7) + +/* You can use the following convenience constants. */ +#define TS_VFY_ALL_IMPRINT (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_IMPRINT \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) +#define TS_VFY_ALL_DATA (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_DATA \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) + +typedef struct TS_verify_ctx { + /* Set this to the union of TS_VFY_... flags you want to carry out. */ + unsigned flags; + + /* Must be set only with TS_VFY_SIGNATURE. certs is optional. */ + X509_STORE *store; + STACK_OF(X509) *certs; + + /* Must be set only with TS_VFY_POLICY. */ + ASN1_OBJECT *policy; + + /* Must be set only with TS_VFY_IMPRINT. If md_alg is NULL, + the algorithm from the response is used. */ + X509_ALGOR *md_alg; + unsigned char *imprint; + unsigned imprint_len; + + /* Must be set only with TS_VFY_DATA. */ + BIO *data; + + /* Must be set only with TS_VFY_TSA_NAME. */ + ASN1_INTEGER *nonce; + + /* Must be set only with TS_VFY_TSA_NAME. */ + GENERAL_NAME *tsa_name; +} TS_VERIFY_CTX; + +int TS_RESP_verify_response(TS_VERIFY_CTX *ctx, TS_RESP *response); +int TS_RESP_verify_token(TS_VERIFY_CTX *ctx, PKCS7 *token); + +/* + * Declarations related to response verification context, + * they are defined in ts/ts_verify_ctx.c. + */ + +/* Set all fields to zero. */ +TS_VERIFY_CTX *TS_VERIFY_CTX_new(void); +void TS_VERIFY_CTX_init(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_free(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_cleanup(TS_VERIFY_CTX *ctx); + +/* + * If ctx is NULL, it allocates and returns a new object, otherwise + * it returns ctx. It initialises all the members as follows: + * flags = TS_VFY_ALL_IMPRINT & ~(TS_VFY_TSA_NAME | TS_VFY_SIGNATURE) + * certs = NULL + * store = NULL + * policy = policy from the request or NULL if absent (in this case + * TS_VFY_POLICY is cleared from flags as well) + * md_alg = MD algorithm from request + * imprint, imprint_len = imprint from request + * data = NULL + * nonce, nonce_len = nonce from the request or NULL if absent (in this case + * TS_VFY_NONCE is cleared from flags as well) + * tsa_name = NULL + * Important: after calling this method TS_VFY_SIGNATURE should be added! + */ +TS_VERIFY_CTX *TS_REQ_to_TS_VERIFY_CTX(TS_REQ *req, TS_VERIFY_CTX *ctx); + +/* Function declarations for TS_RESP defined in ts/ts_resp_print.c */ + +int TS_RESP_print_bio(BIO *bio, TS_RESP *a); +int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a); +int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a); + +/* Common utility functions defined in ts/ts_lib.c */ + +int TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num); +int TS_OBJ_print_bio(BIO *bio, const ASN1_OBJECT *obj); +int TS_ext_print_bio(BIO *bio, const STACK_OF(X509_EXTENSION) *extensions); +int TS_X509_ALGOR_print_bio(BIO *bio, const X509_ALGOR *alg); +int TS_MSG_IMPRINT_print_bio(BIO *bio, TS_MSG_IMPRINT *msg); + +/* Function declarations for handling configuration options, + defined in ts/ts_conf.c */ + +X509 *TS_CONF_load_cert(const char *file); +STACK_OF(X509) *TS_CONF_load_certs(const char *file); +EVP_PKEY *TS_CONF_load_key(const char *file, const char *pass); +const char *TS_CONF_get_tsa_section(CONF *conf, const char *section); +int TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb, + TS_RESP_CTX *ctx); +int TS_CONF_set_crypto_device(CONF *conf, const char *section, + const char *device); +int TS_CONF_set_default_engine(const char *name); +int TS_CONF_set_signer_cert(CONF *conf, const char *section, + const char *cert, TS_RESP_CTX *ctx); +int TS_CONF_set_certs(CONF *conf, const char *section, const char *certs, + TS_RESP_CTX *ctx); +int TS_CONF_set_signer_key(CONF *conf, const char *section, + const char *key, const char *pass, TS_RESP_CTX *ctx); +int TS_CONF_set_def_policy(CONF *conf, const char *section, + const char *policy, TS_RESP_CTX *ctx); +int TS_CONF_set_policies(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_digests(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_accuracy(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_clock_precision_digits(CONF *conf, const char *section, + TS_RESP_CTX *ctx); +int TS_CONF_set_ordering(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_tsa_name(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_ess_cert_id_chain(CONF *conf, const char *section, + TS_RESP_CTX *ctx); + +/* -------------------------------------------------- */ +/* 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. + */ +void ERR_load_TS_strings(void); + +/* Error codes for the TS functions. */ + +/* Function codes. */ +#define TS_F_D2I_TS_RESP 147 +#define TS_F_DEF_SERIAL_CB 110 +#define TS_F_DEF_TIME_CB 111 +#define TS_F_ESS_ADD_SIGNING_CERT 112 +#define TS_F_ESS_CERT_ID_NEW_INIT 113 +#define TS_F_ESS_SIGNING_CERT_NEW_INIT 114 +#define TS_F_INT_TS_RESP_VERIFY_TOKEN 149 +#define TS_F_PKCS7_TO_TS_TST_INFO 148 +#define TS_F_TS_ACCURACY_SET_MICROS 115 +#define TS_F_TS_ACCURACY_SET_MILLIS 116 +#define TS_F_TS_ACCURACY_SET_SECONDS 117 +#define TS_F_TS_CHECK_IMPRINTS 100 +#define TS_F_TS_CHECK_NONCES 101 +#define TS_F_TS_CHECK_POLICY 102 +#define TS_F_TS_CHECK_SIGNING_CERTS 103 +#define TS_F_TS_CHECK_STATUS_INFO 104 +#define TS_F_TS_COMPUTE_IMPRINT 145 +#define TS_F_TS_CONF_SET_DEFAULT_ENGINE 146 +#define TS_F_TS_GET_STATUS_TEXT 105 +#define TS_F_TS_MSG_IMPRINT_SET_ALGO 118 +#define TS_F_TS_REQ_SET_MSG_IMPRINT 119 +#define TS_F_TS_REQ_SET_NONCE 120 +#define TS_F_TS_REQ_SET_POLICY_ID 121 +#define TS_F_TS_RESP_CREATE_RESPONSE 122 +#define TS_F_TS_RESP_CREATE_TST_INFO 123 +#define TS_F_TS_RESP_CTX_ADD_FAILURE_INFO 124 +#define TS_F_TS_RESP_CTX_ADD_MD 125 +#define TS_F_TS_RESP_CTX_ADD_POLICY 126 +#define TS_F_TS_RESP_CTX_NEW 127 +#define TS_F_TS_RESP_CTX_SET_ACCURACY 128 +#define TS_F_TS_RESP_CTX_SET_CERTS 129 +#define TS_F_TS_RESP_CTX_SET_DEF_POLICY 130 +#define TS_F_TS_RESP_CTX_SET_SIGNER_CERT 131 +#define TS_F_TS_RESP_CTX_SET_STATUS_INFO 132 +#define TS_F_TS_RESP_GET_POLICY 133 +#define TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION 134 +#define TS_F_TS_RESP_SET_STATUS_INFO 135 +#define TS_F_TS_RESP_SET_TST_INFO 150 +#define TS_F_TS_RESP_SIGN 136 +#define TS_F_TS_RESP_VERIFY_SIGNATURE 106 +#define TS_F_TS_RESP_VERIFY_TOKEN 107 +#define TS_F_TS_TST_INFO_SET_ACCURACY 137 +#define TS_F_TS_TST_INFO_SET_MSG_IMPRINT 138 +#define TS_F_TS_TST_INFO_SET_NONCE 139 +#define TS_F_TS_TST_INFO_SET_POLICY_ID 140 +#define TS_F_TS_TST_INFO_SET_SERIAL 141 +#define TS_F_TS_TST_INFO_SET_TIME 142 +#define TS_F_TS_TST_INFO_SET_TSA 143 +#define TS_F_TS_VERIFY 108 +#define TS_F_TS_VERIFY_CERT 109 +#define TS_F_TS_VERIFY_CTX_NEW 144 + +/* Reason codes. */ +#define TS_R_BAD_PKCS7_TYPE 132 +#define TS_R_BAD_TYPE 133 +#define TS_R_CERTIFICATE_VERIFY_ERROR 100 +#define TS_R_COULD_NOT_SET_ENGINE 127 +#define TS_R_COULD_NOT_SET_TIME 115 +#define TS_R_D2I_TS_RESP_INT_FAILED 128 +#define TS_R_DETACHED_CONTENT 134 +#define TS_R_ESS_ADD_SIGNING_CERT_ERROR 116 +#define TS_R_ESS_SIGNING_CERTIFICATE_ERROR 101 +#define TS_R_INVALID_NULL_POINTER 102 +#define TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE 117 +#define TS_R_MESSAGE_IMPRINT_MISMATCH 103 +#define TS_R_NONCE_MISMATCH 104 +#define TS_R_NONCE_NOT_RETURNED 105 +#define TS_R_NO_CONTENT 106 +#define TS_R_NO_TIME_STAMP_TOKEN 107 +#define TS_R_PKCS7_ADD_SIGNATURE_ERROR 118 +#define TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR 119 +#define TS_R_PKCS7_TO_TS_TST_INFO_FAILED 129 +#define TS_R_POLICY_MISMATCH 108 +#define TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 120 +#define TS_R_RESPONSE_SETUP_ERROR 121 +#define TS_R_SIGNATURE_FAILURE 109 +#define TS_R_THERE_MUST_BE_ONE_SIGNER 110 +#define TS_R_TIME_SYSCALL_ERROR 122 +#define TS_R_TOKEN_NOT_PRESENT 130 +#define TS_R_TOKEN_PRESENT 131 +#define TS_R_TSA_NAME_MISMATCH 111 +#define TS_R_TSA_UNTRUSTED 112 +#define TS_R_TST_INFO_SETUP_ERROR 123 +#define TS_R_TS_DATASIGN 124 +#define TS_R_UNACCEPTABLE_POLICY 125 +#define TS_R_UNSUPPORTED_MD_ALGORITHM 126 +#define TS_R_UNSUPPORTED_VERSION 113 +#define TS_R_WRONG_CONTENT_TYPE 114 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/txt_db.h b/src/3rdparty/win32_include/openssl/txt_db.h new file mode 100644 index 000000000..56b6b4248 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/txt_db.h @@ -0,0 +1,112 @@ +/* $OpenBSD: txt_db.h,v 1.9 2014/07/10 22:45:58 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_TXT_DB_H +#define HEADER_TXT_DB_H + +#include + +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include + +#define DB_ERROR_OK 0 +#define DB_ERROR_MALLOC 1 +#define DB_ERROR_INDEX_CLASH 2 +#define DB_ERROR_INDEX_OUT_OF_RANGE 3 +#define DB_ERROR_NO_INDEX 4 +#define DB_ERROR_INSERT_INDEX_CLASH 5 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OPENSSL_STRING *OPENSSL_PSTRING; +DECLARE_SPECIAL_STACK_OF(OPENSSL_PSTRING, OPENSSL_STRING) + +typedef struct txt_db_st { + int num_fields; + STACK_OF(OPENSSL_PSTRING) *data; + LHASH_OF(OPENSSL_STRING) **index; + int (**qual)(OPENSSL_STRING *); + long error; + long arg1; + long arg2; + OPENSSL_STRING *arg_row; +} TXT_DB; + +#ifndef OPENSSL_NO_BIO +TXT_DB *TXT_DB_read(BIO *in, int num); +long TXT_DB_write(BIO *out, TXT_DB *db); +#else +TXT_DB *TXT_DB_read(char *in, int num); +long TXT_DB_write(char *out, TXT_DB *db); +#endif +int TXT_DB_create_index(TXT_DB *db, int field, int (*qual)(OPENSSL_STRING *), + LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp); +void TXT_DB_free(TXT_DB *db); +OPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx, OPENSSL_STRING *value); +int TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/ui.h b/src/3rdparty/win32_include/openssl/ui.h new file mode 100644 index 000000000..b6b0075e4 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ui.h @@ -0,0 +1,384 @@ +/* $OpenBSD: ui.h,v 1.9 2014/07/10 22:45:58 jsing Exp $ */ +/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL + * project 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_H +#define HEADER_UI_H + +#include + +#ifndef OPENSSL_NO_DEPRECATED +#include +#endif +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Declared already in ossl_typ.h */ +/* typedef struct ui_st UI; */ +/* typedef struct ui_method_st UI_METHOD; */ + + +/* All the following functions return -1 or NULL on error and in some cases + (UI_process()) -2 if interrupted or in some other way cancelled. + When everything is fine, they return 0, a positive value or a non-NULL + pointer, all depending on their purpose. */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/* The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is usefull when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +#define UI_INPUT_FLAG_ECHO 0x01 +/* Use a default password. Where that password is found is completely + up to the application, it might for example be in the user data set + with UI_add_user_data(). It is not recommended to have more than + one input in each UI being marked with this flag, or the application + might get confused. */ +#define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/* The user of these routines may want to define flags of their own. The core + UI won't look at those, but will pass them on to the method routines. They + must use higher bits so they don't get confused with the UI bits above. + UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + example of use is this: + + #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + +*/ +#define UI_INPUT_FLAG_USER_BASE 16 + + +/* The following function helps construct a prompt. object_desc is a + textual short description of the object, for example "pass phrase", + and object_name is the name of the object (might be a card name or + a file name. + The returned string shall always be allocated on the heap with + malloc(), and need to be free'd with free(). + + If the ui_method doesn't contain a pointer to a user-defined prompt + constructor, a default string is built, looking like this: + + "Enter {object_desc} for {object_name}:" + + So, if object_desc has the value "pass phrase" and object_name has + the value "foo.key", the resulting string is: + + "Enter pass phrase for foo.key:" +*/ +char *UI_construct_prompt(UI *ui_method, const char *object_desc, + const char *object_name); + + +/* The following function is used to store a pointer to user-specific data. + Any previous such pointer will be returned and replaced. + + For callback purposes, this function makes a lot more sense than using + ex_data, since the latter requires that different parts of OpenSSL or + applications share the same ex_data index. + + Note that the UI_OpenSSL() method completely ignores the user data. + Other methods may not, however. */ +void *UI_add_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* Give a user interface parametrised control commands. This can be used to + send down an integer, a data pointer or a function pointer, as well as + be used to get information from a UI. */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f)(void)); + +/* The commands */ +/* Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + OpenSSL error stack before printing any info or added error messages and + before any prompting. */ +#define UI_CTRL_PRINT_ERRORS 1 +/* Check if a UI_process() is possible to do again with the same instance of + a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + if not. */ +#define UI_CTRL_IS_REDOABLE 2 + + +/* Some methods may use extra data */ +#define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg) +#define UI_get_app_data(s) UI_get_ex_data(s,0) +int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int UI_set_ex_data(UI *r, int idx, void *arg); +void *UI_get_ex_data(UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + + +/* ---------- For method writers ---------- */ +/* A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called wth all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* The UI_STRING type is the data structure that contains all the needed info + about a string or a prompt, including test data for a verification prompt. +*/ +typedef struct ui_string_st UI_STRING; +DECLARE_STACK_OF(UI_STRING) + +/* The different types of strings that are currently supported. + This is only needed by method authors. */ +enum UI_string_types { + UIT_NONE = 0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ +}; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener)(UI *ui)); +int UI_method_set_writer(UI_METHOD *method, int (*writer)(UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher)(UI *ui)); +int UI_method_set_reader(UI_METHOD *method, int (*reader)(UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer)(UI *ui)); +int UI_method_set_prompt_constructor(UI_METHOD *method, char *(*prompt_constructor)(UI* ui, const char* object_desc, const char* object_name)); +int (*UI_method_get_opener(UI_METHOD *method))(UI*); +int (*UI_method_get_writer(UI_METHOD *method))(UI*, UI_STRING*); +int (*UI_method_get_flusher(UI_METHOD *method))(UI*); +int (*UI_method_get_reader(UI_METHOD *method))(UI*, UI_STRING*); +int (*UI_method_get_closer(UI_METHOD *method))(UI*); +char * (*UI_method_get_prompt_constructor(UI_METHOD *method))(UI*, const char*, const char*); + +/* The following functions are helpers for method writers to access relevant + data from a UI_STRING. */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* Return the optional action string to output (the boolean promtp instruction) */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +/* Return the string to test the result against. Only useful with verifies. */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); + + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, int verify); +int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, int verify); + + +/* 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. + */ +void ERR_load_UI_strings(void); + +/* Error codes for the UI functions. */ + +/* Function codes. */ +#define UI_F_GENERAL_ALLOCATE_BOOLEAN 108 +#define UI_F_GENERAL_ALLOCATE_PROMPT 109 +#define UI_F_GENERAL_ALLOCATE_STRING 100 +#define UI_F_UI_CTRL 111 +#define UI_F_UI_DUP_ERROR_STRING 101 +#define UI_F_UI_DUP_INFO_STRING 102 +#define UI_F_UI_DUP_INPUT_BOOLEAN 110 +#define UI_F_UI_DUP_INPUT_STRING 103 +#define UI_F_UI_DUP_VERIFY_STRING 106 +#define UI_F_UI_GET0_RESULT 107 +#define UI_F_UI_NEW_METHOD 104 +#define UI_F_UI_SET_RESULT 105 + +/* Reason codes. */ +#define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS 104 +#define UI_R_INDEX_TOO_LARGE 102 +#define UI_R_INDEX_TOO_SMALL 103 +#define UI_R_NO_RESULT_BUFFER 105 +#define UI_R_RESULT_TOO_LARGE 100 +#define UI_R_RESULT_TOO_SMALL 101 +#define UI_R_UNKNOWN_CONTROL_COMMAND 106 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/ui_compat.h b/src/3rdparty/win32_include/openssl/ui_compat.h new file mode 100644 index 000000000..860e80c83 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/ui_compat.h @@ -0,0 +1,83 @@ +/* $OpenBSD: ui_compat.h,v 1.4 2014/06/12 15:49:31 deraadt Exp $ */ +/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL + * project 2001. + */ +/* ==================================================================== + * Copyright (c) 2001 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_UI_COMPAT_H +#define HEADER_UI_COMPAT_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* The following functions were previously part of the DES section, + and are provided here for backward compatibility reasons. */ + +#define des_read_pw_string(b,l,p,v) \ + _ossl_old_des_read_pw_string((b),(l),(p),(v)) +#define des_read_pw(b,bf,s,p,v) \ + _ossl_old_des_read_pw((b),(bf),(s),(p),(v)) + +int _ossl_old_des_read_pw_string(char *buf, int length, const char *prompt, int verify); +int _ossl_old_des_read_pw(char *buf, char *buff, int size, const char *prompt, int verify); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/whrlpool.h b/src/3rdparty/win32_include/openssl/whrlpool.h new file mode 100644 index 000000000..875d34f7d --- /dev/null +++ b/src/3rdparty/win32_include/openssl/whrlpool.h @@ -0,0 +1,41 @@ +/* $OpenBSD: whrlpool.h,v 1.5 2014/07/10 22:45:58 jsing Exp $ */ + +#include + +#ifndef HEADER_WHRLPOOL_H +#define HEADER_WHRLPOOL_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define WHIRLPOOL_DIGEST_LENGTH (512/8) +#define WHIRLPOOL_BBLOCK 512 +#define WHIRLPOOL_COUNTER (256/8) + +typedef struct { + union { + unsigned char c[WHIRLPOOL_DIGEST_LENGTH]; + /* double q is here to ensure 64-bit alignment */ + double q[WHIRLPOOL_DIGEST_LENGTH/sizeof(double)]; + } H; + unsigned char data[WHIRLPOOL_BBLOCK/8]; + unsigned int bitoff; + size_t bitlen[WHIRLPOOL_COUNTER/sizeof(size_t)]; + } WHIRLPOOL_CTX; + +#ifndef OPENSSL_NO_WHIRLPOOL +int WHIRLPOOL_Init (WHIRLPOOL_CTX *c); +int WHIRLPOOL_Update (WHIRLPOOL_CTX *c,const void *inp,size_t bytes); +void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX *c,const void *inp,size_t bits); +int WHIRLPOOL_Final (unsigned char *md,WHIRLPOOL_CTX *c); +unsigned char *WHIRLPOOL(const void *inp,size_t bytes,unsigned char *md); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/3rdparty/win32_include/openssl/x509.h b/src/3rdparty/win32_include/openssl/x509.h new file mode 100644 index 000000000..294932585 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/x509.h @@ -0,0 +1,1378 @@ +/* $OpenBSD: x509.h,v 1.26 2016/12/27 16:05:57 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * ECDH support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#ifndef HEADER_X509_H +#define HEADER_X509_H + +#include + +#ifndef OPENSSL_NO_BUFFER +#include +#endif +#ifndef OPENSSL_NO_EVP +#include +#endif +#ifndef OPENSSL_NO_BIO +#include +#endif +#include +#include +#include + +#ifndef OPENSSL_NO_EC +#include +#endif + +#ifndef OPENSSL_NO_ECDSA +#include +#endif + +#ifndef OPENSSL_NO_ECDH +#include +#endif + +#ifndef OPENSSL_NO_DEPRECATED +#ifndef OPENSSL_NO_RSA +#include +#endif +#ifndef OPENSSL_NO_DSA +#include +#endif +#ifndef OPENSSL_NO_DH +#include +#endif +#endif + +#ifndef OPENSSL_NO_SHA +#include +#endif +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) +#ifndef LIBRESSL_INTERNAL +#ifdef _MSC_VER +#pragma message("Warning, overriding WinCrypt defines") +#else +#warning overriding WinCrypt defines +#endif +#endif +#undef X509_NAME +#undef X509_CERT_PAIR +#undef X509_EXTENSIONS +#endif + +#define X509_FILETYPE_PEM 1 +#define X509_FILETYPE_ASN1 2 +#define X509_FILETYPE_DEFAULT 3 + +#define X509v3_KU_DIGITAL_SIGNATURE 0x0080 +#define X509v3_KU_NON_REPUDIATION 0x0040 +#define X509v3_KU_KEY_ENCIPHERMENT 0x0020 +#define X509v3_KU_DATA_ENCIPHERMENT 0x0010 +#define X509v3_KU_KEY_AGREEMENT 0x0008 +#define X509v3_KU_KEY_CERT_SIGN 0x0004 +#define X509v3_KU_CRL_SIGN 0x0002 +#define X509v3_KU_ENCIPHER_ONLY 0x0001 +#define X509v3_KU_DECIPHER_ONLY 0x8000 +#define X509v3_KU_UNDEF 0xffff + +typedef struct X509_objects_st + { + int nid; + int (*a2i)(void); + int (*i2a)(void); + } X509_OBJECTS; + +struct X509_algor_st + { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; + } /* X509_ALGOR */; + + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st + { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; + } X509_VAL; + +struct X509_pubkey_st + { + X509_ALGOR *algor; + ASN1_BIT_STRING *public_key; + EVP_PKEY *pkey; + }; + +typedef struct X509_sig_st + { + X509_ALGOR *algor; + ASN1_OCTET_STRING *digest; + } X509_SIG; + +typedef struct X509_name_entry_st + { + ASN1_OBJECT *object; + ASN1_STRING *value; + int set; + int size; /* temp variable */ + } X509_NAME_ENTRY; + +DECLARE_STACK_OF(X509_NAME_ENTRY) + +/* we always keep X509_NAMEs in 2 forms. */ +struct X509_name_st + { + STACK_OF(X509_NAME_ENTRY) *entries; + int modified; /* true if 'bytes' needs to be built */ +#ifndef OPENSSL_NO_BUFFER + BUF_MEM *bytes; +#else + char *bytes; +#endif +/* unsigned long hash; Keep the hash around for lookups */ + unsigned char *canon_enc; + int canon_enclen; + } /* X509_NAME */; + +DECLARE_STACK_OF(X509_NAME) + +#define X509_EX_V_NETSCAPE_HACK 0x8000 +#define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st + { + ASN1_OBJECT *object; + ASN1_BOOLEAN critical; + ASN1_OCTET_STRING *value; + } X509_EXTENSION; + +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; + +DECLARE_STACK_OF(X509_EXTENSION) + +/* a sequence of these are used */ +typedef struct x509_attributes_st + { + ASN1_OBJECT *object; + int single; /* 0 for a set, 1 for a single item (which is wrong) */ + union { + char *ptr; +/* 0 */ STACK_OF(ASN1_TYPE) *set; +/* 1 */ ASN1_TYPE *single; + } value; + } X509_ATTRIBUTE; + +DECLARE_STACK_OF(X509_ATTRIBUTE) + + +typedef struct X509_req_info_st + { + ASN1_ENCODING enc; + ASN1_INTEGER *version; + X509_NAME *subject; + X509_PUBKEY *pubkey; + /* d=2 hl=2 l= 0 cons: cont: 00 */ + STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ + } X509_REQ_INFO; + +typedef struct X509_req_st + { + X509_REQ_INFO *req_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; + } X509_REQ; + +typedef struct x509_cinf_st + { + ASN1_INTEGER *version; /* [ 0 ] default of v1 */ + ASN1_INTEGER *serialNumber; + X509_ALGOR *signature; + X509_NAME *issuer; + X509_VAL *validity; + X509_NAME *subject; + X509_PUBKEY *key; + ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */ + ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */ + STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */ + ASN1_ENCODING enc; + } X509_CINF; + +/* This stuff is certificate "auxiliary info" + * it contains details which are useful in certificate + * stores and databases. When used this is tagged onto + * the end of the certificate itself + */ + +typedef struct x509_cert_aux_st + { + STACK_OF(ASN1_OBJECT) *trust; /* trusted uses */ + STACK_OF(ASN1_OBJECT) *reject; /* rejected uses */ + ASN1_UTF8STRING *alias; /* "friendly name" */ + ASN1_OCTET_STRING *keyid; /* key id of private key */ + STACK_OF(X509_ALGOR) *other; /* other unspecified info */ + } X509_CERT_AUX; + +struct x509_st + { + X509_CINF *cert_info; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int valid; + int references; + char *name; + CRYPTO_EX_DATA ex_data; + /* These contain copies of various extension values */ + long ex_pathlen; + long ex_pcpathlen; + unsigned long ex_flags; + unsigned long ex_kusage; + unsigned long ex_xkusage; + unsigned long ex_nscert; + ASN1_OCTET_STRING *skid; + AUTHORITY_KEYID *akid; + X509_POLICY_CACHE *policy_cache; + STACK_OF(DIST_POINT) *crldp; + STACK_OF(GENERAL_NAME) *altname; + NAME_CONSTRAINTS *nc; +#ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +#endif + X509_CERT_AUX *aux; + } /* X509 */; + +DECLARE_STACK_OF(X509) + +/* This is used for a table of trust checking functions */ + +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust)(struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; + +DECLARE_STACK_OF(X509_TRUST) + +typedef struct x509_cert_pair_st { + X509 *forward; + X509 *reverse; +} X509_CERT_PAIR; + +/* standard trust ids */ + +#define X509_TRUST_DEFAULT -1 /* Only valid in purpose settings */ + +#define X509_TRUST_COMPAT 1 +#define X509_TRUST_SSL_CLIENT 2 +#define X509_TRUST_SSL_SERVER 3 +#define X509_TRUST_EMAIL 4 +#define X509_TRUST_OBJECT_SIGN 5 +#define X509_TRUST_OCSP_SIGN 6 +#define X509_TRUST_OCSP_REQUEST 7 +#define X509_TRUST_TSA 8 + +/* Keep these up to date! */ +#define X509_TRUST_MIN 1 +#define X509_TRUST_MAX 8 + + +/* trust_flags values */ +#define X509_TRUST_DYNAMIC 1 +#define X509_TRUST_DYNAMIC_NAME 2 + +/* check_trust return codes */ + +#define X509_TRUST_TRUSTED 1 +#define X509_TRUST_REJECTED 2 +#define X509_TRUST_UNTRUSTED 3 + +/* Flags for X509_print_ex() */ + +#define X509_FLAG_COMPAT 0 +#define X509_FLAG_NO_HEADER 1L +#define X509_FLAG_NO_VERSION (1L << 1) +#define X509_FLAG_NO_SERIAL (1L << 2) +#define X509_FLAG_NO_SIGNAME (1L << 3) +#define X509_FLAG_NO_ISSUER (1L << 4) +#define X509_FLAG_NO_VALIDITY (1L << 5) +#define X509_FLAG_NO_SUBJECT (1L << 6) +#define X509_FLAG_NO_PUBKEY (1L << 7) +#define X509_FLAG_NO_EXTENSIONS (1L << 8) +#define X509_FLAG_NO_SIGDUMP (1L << 9) +#define X509_FLAG_NO_AUX (1L << 10) +#define X509_FLAG_NO_ATTRIBUTES (1L << 11) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +#define XN_FLAG_SEP_MASK (0xf << 16) + +#define XN_FLAG_COMPAT 0 /* Traditional SSLeay: use old X509_NAME_print */ +#define XN_FLAG_SEP_COMMA_PLUS (1 << 16) /* RFC2253 ,+ */ +#define XN_FLAG_SEP_CPLUS_SPC (2 << 16) /* ,+ spaced: more readable */ +#define XN_FLAG_SEP_SPLUS_SPC (3 << 16) /* ;+ spaced */ +#define XN_FLAG_SEP_MULTILINE (4 << 16) /* One line per field */ + +#define XN_FLAG_DN_REV (1 << 20) /* Reverse DN order */ + +/* How the field name is shown */ + +#define XN_FLAG_FN_MASK (0x3 << 21) + +#define XN_FLAG_FN_SN 0 /* Object short name */ +#define XN_FLAG_FN_LN (1 << 21) /* Object long name */ +#define XN_FLAG_FN_OID (2 << 21) /* Always use OIDs */ +#define XN_FLAG_FN_NONE (3 << 21) /* No field names */ + +#define XN_FLAG_SPC_EQ (1 << 23) /* Put spaces round '=' */ + +/* This determines if we dump fields we don't recognise: + * RFC2253 requires this. + */ + +#define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +#define XN_FLAG_FN_ALIGN (1 << 25) /* Align field names to 20 characters */ + +/* Complete set of RFC2253 flags */ + +#define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \ + XN_FLAG_SEP_COMMA_PLUS | \ + XN_FLAG_DN_REV | \ + XN_FLAG_FN_SN | \ + XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +#define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \ + ASN1_STRFLGS_ESC_QUOTE | \ + XN_FLAG_SEP_CPLUS_SPC | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_SN) + +/* readable multiline form */ + +#define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + XN_FLAG_SEP_MULTILINE | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_LN | \ + XN_FLAG_FN_ALIGN) + +struct x509_revoked_st + { + ASN1_INTEGER *serialNumber; + ASN1_TIME *revocationDate; + STACK_OF(X509_EXTENSION) /* optional */ *extensions; + /* Set up if indirect CRL */ + STACK_OF(GENERAL_NAME) *issuer; + /* Revocation reason */ + int reason; + int sequence; /* load sequence */ + }; + +DECLARE_STACK_OF(X509_REVOKED) + +typedef struct X509_crl_info_st + { + ASN1_INTEGER *version; + X509_ALGOR *sig_alg; + X509_NAME *issuer; + ASN1_TIME *lastUpdate; + ASN1_TIME *nextUpdate; + STACK_OF(X509_REVOKED) *revoked; + STACK_OF(X509_EXTENSION) /* [0] */ *extensions; + ASN1_ENCODING enc; + } X509_CRL_INFO; + +struct X509_crl_st + { + /* actual signature */ + X509_CRL_INFO *crl; + X509_ALGOR *sig_alg; + ASN1_BIT_STRING *signature; + int references; + int flags; + /* Copies of various extensions */ + AUTHORITY_KEYID *akid; + ISSUING_DIST_POINT *idp; + /* Convenient breakdown of IDP */ + int idp_flags; + int idp_reasons; + /* CRL and base CRL numbers for delta processing */ + ASN1_INTEGER *crl_number; + ASN1_INTEGER *base_crl_number; +#ifndef OPENSSL_NO_SHA + unsigned char sha1_hash[SHA_DIGEST_LENGTH]; +#endif + STACK_OF(GENERAL_NAMES) *issuers; + const X509_CRL_METHOD *meth; + void *meth_data; + } /* X509_CRL */; + +DECLARE_STACK_OF(X509_CRL) + +typedef struct private_key_st + { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; + + int references; + } X509_PKEY; + +#ifndef OPENSSL_NO_EVP +typedef struct X509_info_st + { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; + + int references; + } X509_INFO; + +DECLARE_STACK_OF(X509_INFO) +#endif + +/* The next 2 structures and their 8 routines were sent to me by + * Pat Richard and are used to manipulate + * Netscapes spki structures - useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st + { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ + } NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st + { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR *sig_algor; + ASN1_BIT_STRING *signature; + } NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence + { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; + } NETSCAPE_CERT_SEQUENCE; + +/* Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { +ASN1_OCTET_STRING *salt; +ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { +X509_ALGOR *keyfunc; +X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { +ASN1_TYPE *salt; /* Usually OCTET STRING but could be anything */ +ASN1_INTEGER *iter; +ASN1_INTEGER *keylength; +X509_ALGOR *prf; +} PBKDF2PARAM; + + +/* PKCS#8 private key info structure */ + +struct pkcs8_priv_key_info_st + { + int broken; /* Flag for various broken formats */ +#define PKCS8_OK 0 +#define PKCS8_NO_OCTET 1 +#define PKCS8_EMBEDDED_PARAM 2 +#define PKCS8_NS_DB 3 +#define PKCS8_NEG_PRIVKEY 4 + ASN1_INTEGER *version; + X509_ALGOR *pkeyalg; + ASN1_TYPE *pkey; /* Should be OCTET STRING but some are broken */ + STACK_OF(X509_ATTRIBUTE) *attributes; + }; + +#ifdef __cplusplus +} +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define X509_EXT_PACK_UNKNOWN 1 +#define X509_EXT_PACK_STRING 2 + +#define X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version) +/* #define X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */ +#define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore) +#define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter) +#define X509_extract_key(x) X509_get_pubkey(x) /*****/ +#define X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version) +#define X509_REQ_get_subject_name(x) ((x)->req_info->subject) +#define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +#define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) +#define X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm)) + +#define X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version) +#define X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate) +#define X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate) +#define X509_CRL_get_issuer(x) ((x)->crl->issuer) +#define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) + +void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); +X509_CRL_METHOD *X509_CRL_METHOD_new( + int (*crl_init)(X509_CRL *crl), + int (*crl_free)(X509_CRL *crl), + int (*crl_lookup)(X509_CRL *crl, X509_REVOKED **ret, + ASN1_INTEGER *ser, X509_NAME *issuer), + int (*crl_verify)(X509_CRL *crl, EVP_PKEY *pk)); +void X509_CRL_METHOD_free(X509_CRL_METHOD *m); + +void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); +void *X509_CRL_get_meth_data(X509_CRL *crl); + +/* This one is only used so that a binary form can output, as in + * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) */ +#define X509_get_X509_PUBKEY(x) ((x)->cert_info->key) + + +const char *X509_verify_cert_error_string(long n); + +#ifndef OPENSSL_NO_EVP +int X509_verify(X509 *a, EVP_PKEY *r); + +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI * NETSCAPE_SPKI_b64_decode(const char *str, int len); +char * NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_dump(BIO *bp,const ASN1_STRING *sig, int indent); +int X509_signature_print(BIO *bp,X509_ALGOR *alg, ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_CRL_digest(const X509_CRL *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data,const EVP_MD *type, + unsigned char *md, unsigned int *len); +#endif + +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp,X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp,X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp,X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp,X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp,X509_REQ *req); +#ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_fp(FILE *fp,RSA **rsa); +int i2d_RSAPrivateKey_fp(FILE *fp,RSA *rsa); +RSA *d2i_RSAPublicKey_fp(FILE *fp,RSA **rsa); +int i2d_RSAPublicKey_fp(FILE *fp,RSA *rsa); +RSA *d2i_RSA_PUBKEY_fp(FILE *fp,RSA **rsa); +int i2d_RSA_PUBKEY_fp(FILE *fp,RSA *rsa); +#endif +#ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa); +int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa); +#endif +#ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey); +#endif +X509_SIG *d2i_PKCS8_fp(FILE *fp,X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp,X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); + +#ifndef OPENSSL_NO_BIO +X509 *d2i_X509_bio(BIO *bp,X509 **x509); +int i2d_X509_bio(BIO *bp,X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp,X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp,X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp,X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp,X509_REQ *req); +#ifndef OPENSSL_NO_RSA +RSA *d2i_RSAPrivateKey_bio(BIO *bp,RSA **rsa); +int i2d_RSAPrivateKey_bio(BIO *bp,RSA *rsa); +RSA *d2i_RSAPublicKey_bio(BIO *bp,RSA **rsa); +int i2d_RSAPublicKey_bio(BIO *bp,RSA *rsa); +RSA *d2i_RSA_PUBKEY_bio(BIO *bp,RSA **rsa); +int i2d_RSA_PUBKEY_bio(BIO *bp,RSA *rsa); +#endif +#ifndef OPENSSL_NO_DSA +DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); +DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); +#endif +#ifndef OPENSSL_NO_EC +EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); +EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); +#endif +X509_SIG *d2i_PKCS8_bio(BIO *bp,X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp,X509_SIG *p8); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); +#endif + +X509 *X509_dup(X509 *x509); +X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa); +X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex); +X509_CRL *X509_CRL_dup(X509_CRL *crl); +X509_REQ *X509_REQ_dup(X509_REQ *req); +X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn); +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval); +void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, + X509_ALGOR *algor); +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); +X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); + +int X509_cmp_time(const ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(const ASN1_TIME *s); +ASN1_TIME * X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME * X509_time_adj_ex(ASN1_TIME *s, + int offset_day, long offset_sec, time_t *t); +ASN1_TIME * X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char * X509_get_default_cert_area(void ); +const char * X509_get_default_cert_dir(void ); +const char * X509_get_default_cert_file(void ); +const char * X509_get_default_cert_dir_env(void ); +const char * X509_get_default_cert_file_env(void ); +const char * X509_get_default_private_dir(void ); + +X509_REQ * X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 * X509_REQ_to_X509(X509_REQ *r, int days,EVP_PKEY *pkey); + +X509_ALGOR *X509_ALGOR_new(void); +void X509_ALGOR_free(X509_ALGOR *a); +X509_ALGOR *d2i_X509_ALGOR(X509_ALGOR **a, const unsigned char **in, long len); +int i2d_X509_ALGOR(X509_ALGOR *a, unsigned char **out); +extern const ASN1_ITEM X509_ALGOR_it; +X509_ALGORS *d2i_X509_ALGORS(X509_ALGORS **a, const unsigned char **in, long len); +int i2d_X509_ALGORS(X509_ALGORS *a, unsigned char **out); +extern const ASN1_ITEM X509_ALGORS_it; +X509_VAL *X509_VAL_new(void); +void X509_VAL_free(X509_VAL *a); +X509_VAL *d2i_X509_VAL(X509_VAL **a, const unsigned char **in, long len); +int i2d_X509_VAL(X509_VAL *a, unsigned char **out); +extern const ASN1_ITEM X509_VAL_it; + +X509_PUBKEY *X509_PUBKEY_new(void); +void X509_PUBKEY_free(X509_PUBKEY *a); +X509_PUBKEY *d2i_X509_PUBKEY(X509_PUBKEY **a, const unsigned char **in, long len); +int i2d_X509_PUBKEY(X509_PUBKEY *a, unsigned char **out); +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); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, + STACK_OF(X509) *chain); +int i2d_PUBKEY(EVP_PKEY *a,unsigned char **pp); +EVP_PKEY * d2i_PUBKEY(EVP_PKEY **a,const unsigned char **pp, + long length); +#ifndef OPENSSL_NO_RSA +int i2d_RSA_PUBKEY(RSA *a,unsigned char **pp); +RSA * d2i_RSA_PUBKEY(RSA **a,const unsigned char **pp, + long length); +#endif +#ifndef OPENSSL_NO_DSA +int i2d_DSA_PUBKEY(DSA *a,unsigned char **pp); +DSA * d2i_DSA_PUBKEY(DSA **a,const unsigned char **pp, + long length); +#endif +#ifndef OPENSSL_NO_EC +int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp); +EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, + long length); +#endif + +X509_SIG *X509_SIG_new(void); +void X509_SIG_free(X509_SIG *a); +X509_SIG *d2i_X509_SIG(X509_SIG **a, const unsigned char **in, long len); +int i2d_X509_SIG(X509_SIG *a, unsigned char **out); +extern const ASN1_ITEM X509_SIG_it; +X509_REQ_INFO *X509_REQ_INFO_new(void); +void X509_REQ_INFO_free(X509_REQ_INFO *a); +X509_REQ_INFO *d2i_X509_REQ_INFO(X509_REQ_INFO **a, const unsigned char **in, long len); +int i2d_X509_REQ_INFO(X509_REQ_INFO *a, unsigned char **out); +extern const ASN1_ITEM X509_REQ_INFO_it; +X509_REQ *X509_REQ_new(void); +void X509_REQ_free(X509_REQ *a); +X509_REQ *d2i_X509_REQ(X509_REQ **a, const unsigned char **in, long len); +int i2d_X509_REQ(X509_REQ *a, unsigned char **out); +extern const ASN1_ITEM X509_REQ_it; + +X509_ATTRIBUTE *X509_ATTRIBUTE_new(void); +void X509_ATTRIBUTE_free(X509_ATTRIBUTE *a); +X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **a, const unsigned char **in, long len); +int i2d_X509_ATTRIBUTE(X509_ATTRIBUTE *a, unsigned char **out); +extern const ASN1_ITEM X509_ATTRIBUTE_it; +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +X509_EXTENSION *X509_EXTENSION_new(void); +void X509_EXTENSION_free(X509_EXTENSION *a); +X509_EXTENSION *d2i_X509_EXTENSION(X509_EXTENSION **a, const unsigned char **in, long len); +int i2d_X509_EXTENSION(X509_EXTENSION *a, unsigned char **out); +extern const ASN1_ITEM X509_EXTENSION_it; +X509_EXTENSIONS *d2i_X509_EXTENSIONS(X509_EXTENSIONS **a, const unsigned char **in, long len); +int i2d_X509_EXTENSIONS(X509_EXTENSIONS *a, unsigned char **out); +extern const ASN1_ITEM X509_EXTENSIONS_it; + +X509_NAME_ENTRY *X509_NAME_ENTRY_new(void); +void X509_NAME_ENTRY_free(X509_NAME_ENTRY *a); +X509_NAME_ENTRY *d2i_X509_NAME_ENTRY(X509_NAME_ENTRY **a, const unsigned char **in, long len); +int i2d_X509_NAME_ENTRY(X509_NAME_ENTRY *a, unsigned char **out); +extern const ASN1_ITEM X509_NAME_ENTRY_it; + +X509_NAME *X509_NAME_new(void); +void X509_NAME_free(X509_NAME *a); +X509_NAME *d2i_X509_NAME(X509_NAME **a, const unsigned char **in, long len); +int i2d_X509_NAME(X509_NAME *a, unsigned char **out); +extern const ASN1_ITEM X509_NAME_it; + +int X509_NAME_set(X509_NAME **xn, X509_NAME *name); + +X509_CINF *X509_CINF_new(void); +void X509_CINF_free(X509_CINF *a); +X509_CINF *d2i_X509_CINF(X509_CINF **a, const unsigned char **in, long len); +int i2d_X509_CINF(X509_CINF *a, unsigned char **out); +extern const ASN1_ITEM X509_CINF_it; + +X509 *X509_new(void); +void X509_free(X509 *a); +X509 *d2i_X509(X509 **a, const unsigned char **in, long len); +int i2d_X509(X509 *a, unsigned char **out); +extern const ASN1_ITEM X509_it; +X509_CERT_AUX *X509_CERT_AUX_new(void); +void X509_CERT_AUX_free(X509_CERT_AUX *a); +X509_CERT_AUX *d2i_X509_CERT_AUX(X509_CERT_AUX **a, const unsigned char **in, long len); +int i2d_X509_CERT_AUX(X509_CERT_AUX *a, unsigned char **out); +extern const ASN1_ITEM X509_CERT_AUX_it; + +X509_CERT_PAIR *X509_CERT_PAIR_new(void); +void X509_CERT_PAIR_free(X509_CERT_PAIR *a); +X509_CERT_PAIR *d2i_X509_CERT_PAIR(X509_CERT_PAIR **a, const unsigned char **in, long len); +int i2d_X509_CERT_PAIR(X509_CERT_PAIR *a, unsigned char **out); +extern const ASN1_ITEM X509_CERT_PAIR_it; + +int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +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); + +int X509_alias_set1(X509 *x, unsigned char *name, int len); +int X509_keyid_set1(X509 *x, unsigned char *id, int len); +unsigned char * X509_alias_get0(X509 *x, int *len); +unsigned char * X509_keyid_get0(X509 *x, int *len); +int (*X509_TRUST_set_default(int (*trust)(int , X509 *, int)))(int, X509 *, int); +int X509_TRUST_set(int *t, int trust); +int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); + +X509_REVOKED *X509_REVOKED_new(void); +void X509_REVOKED_free(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); +int i2d_X509_CRL(X509_CRL *a, unsigned char **out); +extern const ASN1_ITEM X509_CRL_it; + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); +int X509_CRL_get0_by_serial(X509_CRL *crl, + X509_REVOKED **ret, ASN1_INTEGER *serial); +int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); + +X509_PKEY * X509_PKEY_new(void ); +void X509_PKEY_free(X509_PKEY *a); + +NETSCAPE_SPKI *NETSCAPE_SPKI_new(void); +void NETSCAPE_SPKI_free(NETSCAPE_SPKI *a); +NETSCAPE_SPKI *d2i_NETSCAPE_SPKI(NETSCAPE_SPKI **a, const unsigned char **in, long len); +int i2d_NETSCAPE_SPKI(NETSCAPE_SPKI *a, unsigned char **out); +extern const ASN1_ITEM NETSCAPE_SPKI_it; +NETSCAPE_SPKAC *NETSCAPE_SPKAC_new(void); +void NETSCAPE_SPKAC_free(NETSCAPE_SPKAC *a); +NETSCAPE_SPKAC *d2i_NETSCAPE_SPKAC(NETSCAPE_SPKAC **a, const unsigned char **in, long len); +int i2d_NETSCAPE_SPKAC(NETSCAPE_SPKAC *a, unsigned char **out); +extern const ASN1_ITEM NETSCAPE_SPKAC_it; +NETSCAPE_CERT_SEQUENCE *NETSCAPE_CERT_SEQUENCE_new(void); +void NETSCAPE_CERT_SEQUENCE_free(NETSCAPE_CERT_SEQUENCE *a); +NETSCAPE_CERT_SEQUENCE *d2i_NETSCAPE_CERT_SEQUENCE(NETSCAPE_CERT_SEQUENCE **a, const unsigned char **in, long len); +int i2d_NETSCAPE_CERT_SEQUENCE(NETSCAPE_CERT_SEQUENCE *a, unsigned char **out); +extern const ASN1_ITEM NETSCAPE_CERT_SEQUENCE_it; + +#ifndef OPENSSL_NO_EVP +X509_INFO * X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char * X509_NAME_oneline(X509_NAME *a,char *buf,int size); + +int ASN1_item_digest(const ASN1_ITEM *it,const EVP_MD *type,void *data, + unsigned char *md,unsigned int *len); + +int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature,void *data,EVP_PKEY *pkey); + +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, + void *data, EVP_PKEY *pkey, const EVP_MD *type); +int ASN1_item_sign_ctx(const ASN1_ITEM *it, + X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, void *asn, EVP_MD_CTX *ctx); +#endif + +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); +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_set_notAfter(X509 *x, const ASN1_TIME *tm); +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); +int X509_certificate_type(X509 *x,EVP_PKEY *pubkey /* optional */); + +int X509_REQ_set_version(X509_REQ *x,long version); +int X509_REQ_set_subject_name(X509_REQ *req,X509_NAME *name); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY * X509_REQ_get_pubkey(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int * X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts, + int nid); +int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, + int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +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_set_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); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); + +int X509_REQ_check_private_key(X509_REQ *x509,EVP_PKEY *pkey); + +int X509_check_private_key(X509 *x509,EVP_PKEY *pkey); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +#ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +#endif + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +unsigned long X509_NAME_hash(X509_NAME *x); +unsigned long X509_NAME_hash_old(X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +int X509_print_ex_fp(FILE *bp,X509 *x, unsigned long nmflag, unsigned long cflag); +int X509_print_fp(FILE *bp,X509 *x); +int X509_CRL_print_fp(FILE *bp,X509_CRL *x); +int X509_REQ_print_fp(FILE *bp,X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, unsigned long flags); + +#ifndef OPENSSL_NO_BIO +int X509_NAME_print(BIO *bp, X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, unsigned long flags); +int X509_print_ex(BIO *bp,X509 *x, unsigned long nmflag, unsigned long cflag); +int X509_print(BIO *bp,X509 *x); +int X509_ocspid_print(BIO *bp,X509 *x); +int X509_CERT_AUX_print(BIO *bp,X509_CERT_AUX *x, int indent); +int X509_CRL_print(BIO *bp,X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, unsigned long cflag); +int X509_REQ_print(BIO *bp,X509_REQ *req); +#endif + +int X509_NAME_entry_count(X509_NAME *name); +int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, + char *buf,int len); +int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, + char *buf,int len); + +/* NOTE: you should be passsing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. */ +int X509_NAME_get_index_by_NID(X509_NAME *name,int nid,int lastpos); +int X509_NAME_get_index_by_OBJ(X509_NAME *name,ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name,X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type, + unsigned char *bytes, int len, int loc, int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + unsigned char *bytes, int len, int loc, int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, const unsigned char *bytes, int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type,unsigned char *bytes, int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + ASN1_OBJECT *obj, int type,const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, + ASN1_OBJECT *obj); +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 X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + ASN1_OBJECT *obj,int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); + +int X509_get_ext_count(X509 *x); +int X509_get_ext_by_NID(X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(X509 *x,ASN1_OBJECT *obj,int lastpos); +int X509_get_ext_by_critical(X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void * X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(X509_CRL *x); +int X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(X509_CRL *x,ASN1_OBJECT *obj,int lastpos); +int X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void * X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x,ASN1_OBJECT *obj,int lastpos); +int X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void * X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + ASN1_OBJECT *obj,int crit,ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex,ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, + ASN1_OCTET_STRING *data); +ASN1_OBJECT * X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x, + int nid, int type, + const unsigned char *bytes, int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x, + const char *attrname, int type, + const unsigned char *bytes, int len); +void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, + ASN1_OBJECT *obj, int lastpos, int type); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, int atrtype, const void *data, int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, const unsigned char *bytes, int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, + int atrtype, void *data); +int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, + int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +int X509_verify_cert(X509_STORE_CTX *ctx); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk,X509_NAME *name, + ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk,X509_NAME *name); + +PBEPARAM *PBEPARAM_new(void); +void PBEPARAM_free(PBEPARAM *a); +PBEPARAM *d2i_PBEPARAM(PBEPARAM **a, const unsigned char **in, long len); +int i2d_PBEPARAM(PBEPARAM *a, unsigned char **out); +extern const ASN1_ITEM PBEPARAM_it; +PBE2PARAM *PBE2PARAM_new(void); +void PBE2PARAM_free(PBE2PARAM *a); +PBE2PARAM *d2i_PBE2PARAM(PBE2PARAM **a, const unsigned char **in, long len); +int i2d_PBE2PARAM(PBE2PARAM *a, unsigned char **out); +extern const ASN1_ITEM PBE2PARAM_it; +PBKDF2PARAM *PBKDF2PARAM_new(void); +void PBKDF2PARAM_free(PBKDF2PARAM *a); +PBKDF2PARAM *d2i_PBKDF2PARAM(PBKDF2PARAM **a, const unsigned char **in, long len); +int i2d_PBKDF2PARAM(PBKDF2PARAM *a, unsigned char **out); +extern const ASN1_ITEM PBKDF2PARAM_it; + +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen); + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, + const unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid); + +X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen); + +/* PKCS#8 utilities */ + +PKCS8_PRIV_KEY_INFO *PKCS8_PRIV_KEY_INFO_new(void); +void PKCS8_PRIV_KEY_INFO_free(PKCS8_PRIV_KEY_INFO *a); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO(PKCS8_PRIV_KEY_INFO **a, const unsigned char **in, long len); +int i2d_PKCS8_PRIV_KEY_INFO(PKCS8_PRIV_KEY_INFO *a, unsigned char **out); +extern const ASN1_ITEM PKCS8_PRIV_KEY_INFO_it; + +EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken); +PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken); + +int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, + int version, int ptype, void *pval, + unsigned char *penc, int penclen); +int PKCS8_pkey_get0(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, + PKCS8_PRIV_KEY_INFO *p8); + +int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, + int ptype, void *pval, + unsigned char *penc, int penclen); +int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, + X509_PUBKEY *pub); + +int X509_check_trust(X509 *x, int id, int flags); +int X509_TRUST_get_count(void); +X509_TRUST * X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), + char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(X509_TRUST *xp); +char *X509_TRUST_get0_name(X509_TRUST *xp); +int X509_TRUST_get_trust(X509_TRUST *xp); + +int X509_up_ref(X509 *x); + +/* 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. + */ +void ERR_load_X509_strings(void); + +/* Error codes for the X509 functions. */ + +/* Function codes. */ +#define X509_F_ADD_CERT_DIR 100 +#define X509_F_BY_FILE_CTRL 101 +#define X509_F_CHECK_POLICY 145 +#define X509_F_DIR_CTRL 102 +#define X509_F_GET_CERT_BY_SUBJECT 103 +#define X509_F_NETSCAPE_SPKI_B64_DECODE 129 +#define X509_F_NETSCAPE_SPKI_B64_ENCODE 130 +#define X509_F_X509AT_ADD1_ATTR 135 +#define X509_F_X509V3_ADD_EXT 104 +#define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 136 +#define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 137 +#define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 140 +#define X509_F_X509_ATTRIBUTE_GET0_DATA 139 +#define X509_F_X509_ATTRIBUTE_SET1_DATA 138 +#define X509_F_X509_CHECK_PRIVATE_KEY 128 +#define X509_F_X509_CRL_PRINT_FP 147 +#define X509_F_X509_EXTENSION_CREATE_BY_NID 108 +#define X509_F_X509_EXTENSION_CREATE_BY_OBJ 109 +#define X509_F_X509_GET_PUBKEY_PARAMETERS 110 +#define X509_F_X509_LOAD_CERT_CRL_FILE 132 +#define X509_F_X509_LOAD_CERT_FILE 111 +#define X509_F_X509_LOAD_CRL_FILE 112 +#define X509_F_X509_NAME_ADD_ENTRY 113 +#define X509_F_X509_NAME_ENTRY_CREATE_BY_NID 114 +#define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT 131 +#define X509_F_X509_NAME_ENTRY_SET_OBJECT 115 +#define X509_F_X509_NAME_ONELINE 116 +#define X509_F_X509_NAME_PRINT 117 +#define X509_F_X509_PRINT_EX_FP 118 +#define X509_F_X509_PUBKEY_GET 119 +#define X509_F_X509_PUBKEY_SET 120 +#define X509_F_X509_REQ_CHECK_PRIVATE_KEY 144 +#define X509_F_X509_REQ_PRINT_EX 121 +#define X509_F_X509_REQ_PRINT_FP 122 +#define X509_F_X509_REQ_TO_X509 123 +#define X509_F_X509_STORE_ADD_CERT 124 +#define X509_F_X509_STORE_ADD_CRL 125 +#define X509_F_X509_STORE_CTX_GET1_ISSUER 146 +#define X509_F_X509_STORE_CTX_INIT 143 +#define X509_F_X509_STORE_CTX_NEW 142 +#define X509_F_X509_STORE_CTX_PURPOSE_INHERIT 134 +#define X509_F_X509_TO_X509_REQ 126 +#define X509_F_X509_TRUST_ADD 133 +#define X509_F_X509_TRUST_SET 141 +#define X509_F_X509_VERIFY_CERT 127 + +/* Reason codes. */ +#define X509_R_BAD_X509_FILETYPE 100 +#define X509_R_BASE64_DECODE_ERROR 118 +#define X509_R_CANT_CHECK_DH_KEY 114 +#define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 +#define X509_R_ERR_ASN1_LIB 102 +#define X509_R_INVALID_DIRECTORY 113 +#define X509_R_INVALID_FIELD_NAME 119 +#define X509_R_INVALID_TRUST 123 +#define X509_R_KEY_TYPE_MISMATCH 115 +#define X509_R_KEY_VALUES_MISMATCH 116 +#define X509_R_LOADING_CERT_DIR 103 +#define X509_R_LOADING_DEFAULTS 104 +#define X509_R_METHOD_NOT_SUPPORTED 124 +#define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 +#define X509_R_PUBLIC_KEY_DECODE_ERROR 125 +#define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 +#define X509_R_SHOULD_RETRY 106 +#define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 +#define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 +#define X509_R_UNKNOWN_KEY_TYPE 117 +#define X509_R_UNKNOWN_NID 109 +#define X509_R_UNKNOWN_PURPOSE_ID 121 +#define X509_R_UNKNOWN_TRUST_ID 120 +#define X509_R_UNSUPPORTED_ALGORITHM 111 +#define X509_R_WRONG_LOOKUP_TYPE 112 +#define X509_R_WRONG_TYPE 122 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/openssl/x509_vfy.h b/src/3rdparty/win32_include/openssl/x509_vfy.h new file mode 100644 index 000000000..b58d49d2e --- /dev/null +++ b/src/3rdparty/win32_include/openssl/x509_vfy.h @@ -0,0 +1,582 @@ +/* $OpenBSD: x509_vfy.h,v 1.18 2016/12/21 15:15:45 jsing Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#ifndef HEADER_X509_H +#include +/* openssl/x509.h ends up #include-ing this file at about the only + * appropriate moment. */ +#endif + +#ifndef HEADER_X509_VFY_H +#define HEADER_X509_VFY_H + +#include + +#ifndef OPENSSL_NO_LHASH +#include +#endif +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct x509_file_st + { + int num_paths; /* number of paths to files or directories */ + int num_alloced; + char **paths; /* the list of paths or directories */ + int *path_type; + } X509_CERT_FILE_CTX; + +/*******************************/ +/* +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +#define X509_LU_RETRY -1 +#define X509_LU_FAIL 0 +#define X509_LU_X509 1 +#define X509_LU_CRL 2 +#define X509_LU_PKEY 3 + +typedef struct x509_object_st + { + /* one of the above types */ + int type; + union { + char *ptr; + X509 *x509; + X509_CRL *crl; + EVP_PKEY *pkey; + } data; + } X509_OBJECT; + +typedef struct x509_lookup_st X509_LOOKUP; + +DECLARE_STACK_OF(X509_LOOKUP) +DECLARE_STACK_OF(X509_OBJECT) + +/* This is a static that defines the function interface */ +typedef struct x509_lookup_method_st + { + const char *name; + int (*new_item)(X509_LOOKUP *ctx); + void (*free)(X509_LOOKUP *ctx); + int (*init)(X509_LOOKUP *ctx); + int (*shutdown)(X509_LOOKUP *ctx); + int (*ctrl)(X509_LOOKUP *ctx,int cmd,const char *argc,long argl, + char **ret); + int (*get_by_subject)(X509_LOOKUP *ctx,int type,X509_NAME *name, + X509_OBJECT *ret); + int (*get_by_issuer_serial)(X509_LOOKUP *ctx,int type,X509_NAME *name, + ASN1_INTEGER *serial,X509_OBJECT *ret); + int (*get_by_fingerprint)(X509_LOOKUP *ctx,int type, + unsigned char *bytes,int len, + X509_OBJECT *ret); + int (*get_by_alias)(X509_LOOKUP *ctx,int type,char *str,int len, + X509_OBJECT *ret); + } X509_LOOKUP_METHOD; + +typedef struct X509_VERIFY_PARAM_ID_st X509_VERIFY_PARAM_ID; + +/* This structure hold all parameters associated with a verify operation + * by including an X509_VERIFY_PARAM structure in related structures the + * parameters used can be customized + */ + +typedef struct X509_VERIFY_PARAM_st + { + char *name; + time_t check_time; /* Time to use */ + unsigned long inh_flags; /* Inheritance flags */ + unsigned long flags; /* Various verify flags */ + int purpose; /* purpose to check untrusted certificates */ + int trust; /* trust setting to check */ + int depth; /* Verify depth */ + STACK_OF(ASN1_OBJECT) *policies; /* Permissible policies */ + X509_VERIFY_PARAM_ID *id; /* opaque ID data */ +} X509_VERIFY_PARAM; + +DECLARE_STACK_OF(X509_VERIFY_PARAM) + +/* This is used to hold everything. It is used for all certificate + * validation. Once we have a certificate chain, the 'verify' + * function is then called to actually check the cert chain. */ +struct x509_store_st + { + /* The following is a cache of trusted certs */ + int cache; /* if true, stash any hits */ + STACK_OF(X509_OBJECT) *objs; /* Cache of all objects */ + + /* These are external lookup methods */ + STACK_OF(X509_LOOKUP) *get_cert_methods; + + X509_VERIFY_PARAM *param; + + /* Callbacks for various operations */ + int (*verify)(X509_STORE_CTX *ctx); /* called to verify a certificate */ + int (*verify_cb)(int ok,X509_STORE_CTX *ctx); /* error callback */ + int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); /* get issuers cert from ctx */ + int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */ + int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */ + int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */ + int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */ + int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */ + STACK_OF(X509) * (*lookup_certs)(X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) * (*lookup_crls)(X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup)(X509_STORE_CTX *ctx); + + CRYPTO_EX_DATA ex_data; + int references; + } /* X509_STORE */; + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +#define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func)) +#define X509_STORE_set_verify_func(ctx,func) ((ctx)->verify=(func)) + +/* This is the functions plus an instance of the local variables. */ +struct x509_lookup_st + { + int init; /* have we been started */ + int skip; /* don't use us. */ + X509_LOOKUP_METHOD *method; /* the functions */ + char *method_data; /* method data */ + + X509_STORE *store_ctx; /* who owns us */ + } /* X509_LOOKUP */; + +/* This is a used when verifying cert chains. Since the + * gathering of the cert chain can take some time (and have to be + * 'retried', this needs to be kept and passed around. */ +struct x509_store_ctx_st /* X509_STORE_CTX */ + { + X509_STORE *ctx; + int current_method; /* used when looking up certs */ + + /* The following are set by the caller */ + X509 *cert; /* The cert to check */ + STACK_OF(X509) *untrusted; /* chain of X509s - untrusted - passed in */ + STACK_OF(X509_CRL) *crls; /* set of CRLs passed in */ + + X509_VERIFY_PARAM *param; + void *other_ctx; /* Other info for use with get_issuer() */ + + /* Callbacks for various operations */ + int (*verify)(X509_STORE_CTX *ctx); /* called to verify a certificate */ + int (*verify_cb)(int ok,X509_STORE_CTX *ctx); /* error callback */ + int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); /* get issuers cert from ctx */ + int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */ + int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */ + int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */ + int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */ + int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */ + int (*check_policy)(X509_STORE_CTX *ctx); + STACK_OF(X509) * (*lookup_certs)(X509_STORE_CTX *ctx, X509_NAME *nm); + STACK_OF(X509_CRL) * (*lookup_crls)(X509_STORE_CTX *ctx, X509_NAME *nm); + int (*cleanup)(X509_STORE_CTX *ctx); + + /* The following is built up */ + int valid; /* if 0, rebuild chain */ + int last_untrusted; /* index of last untrusted cert */ + STACK_OF(X509) *chain; /* chain of X509s - built up and trusted */ + X509_POLICY_TREE *tree; /* Valid policy tree */ + + int explicit_policy; /* Require explicit policy value */ + + /* When something goes wrong, this is why */ + int error_depth; + int error; + X509 *current_cert; + X509 *current_issuer; /* cert currently being tested as valid issuer */ + X509_CRL *current_crl; /* current CRL */ + + int current_crl_score; /* score of current CRL */ + unsigned int current_reasons; /* Reason mask */ + + X509_STORE_CTX *parent; /* For CRL path validation: parent context */ + + CRYPTO_EX_DATA ex_data; + } /* X509_STORE_CTX */; + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +#define X509_STORE_CTX_set_app_data(ctx,data) \ + X509_STORE_CTX_set_ex_data(ctx,0,data) +#define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx,0) + +#define X509_L_FILE_LOAD 1 +#define X509_L_ADD_DIR 2 +#define X509_L_MEM 3 + +#define X509_LOOKUP_load_file(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL) + +#define X509_LOOKUP_add_dir(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL) + +#define X509_LOOKUP_add_mem(x,iov,type) \ + X509_LOOKUP_ctrl((x),X509_L_MEM,(const char *)(iov),\ + (long)(type),NULL) + +#define X509_V_OK 0 +#define X509_V_ERR_UNSPECIFIED 1 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +#define X509_V_ERR_UNABLE_TO_GET_CRL 3 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +#define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +#define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +#define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +#define X509_V_ERR_CERT_NOT_YET_VALID 9 +#define X509_V_ERR_CERT_HAS_EXPIRED 10 +#define X509_V_ERR_CRL_NOT_YET_VALID 11 +#define X509_V_ERR_CRL_HAS_EXPIRED 12 +#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +#define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +#define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +#define X509_V_ERR_OUT_OF_MEM 17 +#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +#define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +#define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +#define X509_V_ERR_CERT_REVOKED 23 +#define X509_V_ERR_INVALID_CA 24 +#define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +#define X509_V_ERR_INVALID_PURPOSE 26 +#define X509_V_ERR_CERT_UNTRUSTED 27 +#define X509_V_ERR_CERT_REJECTED 28 +/* These are 'informational' when looking for issuer cert */ +#define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +#define X509_V_ERR_AKID_SKID_MISMATCH 30 +#define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +#define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 + +#define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +#define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +#define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +#define X509_V_ERR_INVALID_NON_CA 37 +#define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +#define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +#define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 + +#define X509_V_ERR_INVALID_EXTENSION 41 +#define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +#define X509_V_ERR_NO_EXPLICIT_POLICY 43 +#define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +#define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 + +#define X509_V_ERR_UNNESTED_RESOURCE 46 + +#define X509_V_ERR_PERMITTED_VIOLATION 47 +#define X509_V_ERR_EXCLUDED_VIOLATION 48 +#define X509_V_ERR_SUBTREE_MINMAX 49 +#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +#define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +#define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 + +/* The application is not happy */ +#define X509_V_ERR_APPLICATION_VERIFICATION 50 + +/* Host, email and IP check errors */ +#define X509_V_ERR_HOSTNAME_MISMATCH 62 +#define X509_V_ERR_EMAIL_MISMATCH 63 +#define X509_V_ERR_IP_ADDRESS_MISMATCH 64 + +/* Caller error */ +#define X509_V_ERR_INVALID_CALL 65 +/* Issuer lookup error */ +#define X509_V_ERR_STORE_LOOKUP 66 + +/* Certificate verify flags */ + +/* Send issuer+subject checks to verify_cb */ +#define X509_V_FLAG_CB_ISSUER_CHECK 0x1 +/* Use check time instead of current time */ +#define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +#define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +#define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +#define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +#define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +#define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +#define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +#define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +#define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +#define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +#define X509_V_FLAG_NOTIFY_POLICY 0x800 +/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ +#define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 +/* Delta CRL support */ +#define X509_V_FLAG_USE_DELTAS 0x2000 +/* Check selfsigned CA signature */ +#define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +#define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Allow partial chains if at least one certificate is in trusted store */ +#define X509_V_FLAG_PARTIAL_CHAIN 0x80000 + +/* If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.0.2b. Setting this flag + * will force the behaviour to match that of previous versions. */ +#define X509_V_FLAG_NO_ALT_CHAINS 0x100000 + +/* Do not check certificate or CRL validity against current time. */ +#define X509_V_FLAG_NO_CHECK_TIME 0x200000 + +#define X509_VP_FLAG_DEFAULT 0x1 +#define X509_VP_FLAG_OVERWRITE 0x2 +#define X509_VP_FLAG_RESET_FLAGS 0x4 +#define X509_VP_FLAG_LOCKED 0x8 +#define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +#define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, + X509_NAME *name); +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); +void X509_OBJECT_free_contents(X509_OBJECT *a); +X509_STORE *X509_STORE_new(void ); +void X509_STORE_free(X509_STORE *v); + +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); +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); + +void X509_STORE_set_verify_cb(X509_STORE *ctx, + int (*verify_cb)(int, X509_STORE_CTX *)); + +X509_STORE_CTX *X509_STORE_CTX_new(void); + +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); +void X509_STORE_CTX_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); + +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); +X509_LOOKUP_METHOD *X509_LOOKUP_mem(void); + +int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); +int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); + +int X509_STORE_get_by_subject(X509_STORE_CTX *vs,int type,X509_NAME *name, + X509_OBJECT *ret); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); + +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); + + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, + X509_OBJECT *ret); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name, + ASN1_INTEGER *serial, X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type, + unsigned char *bytes, int len, X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, + int len, X509_OBJECT *ret); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +int X509_STORE_load_locations (X509_STORE *ctx, + const char *file, const char *dir); +int X509_STORE_load_mem(X509_STORE *ctx, void *buf, int len); +int X509_STORE_set_default_paths(X509_STORE *ctx); + +int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx,int idx,void *data); +void * X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx,int idx); +int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx,int s); +int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx); +X509 * X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx); +X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx); +X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *c,X509 *x); +void X509_STORE_CTX_set_chain(X509_STORE_CTX *c,STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c,STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +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); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +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_add0_table(X509_VERIFY_PARAM *param); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, + unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL * + X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, int i); + +STACK_OF(X509_POLICY_NODE) * + X509_policy_tree_get0_policies(const X509_POLICY_TREE *tree); + +STACK_OF(X509_POLICY_NODE) * + X509_policy_tree_get0_user_policies(const X509_POLICY_TREE *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) * + X509_policy_node_get0_qualifiers(const X509_POLICY_NODE *node); +const X509_POLICY_NODE * + X509_policy_node_get0_parent(const X509_POLICY_NODE *node); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/3rdparty/win32_include/openssl/x509v3.h b/src/3rdparty/win32_include/openssl/x509v3.h new file mode 100644 index 000000000..0a8f66f91 --- /dev/null +++ b/src/3rdparty/win32_include/openssl/x509v3.h @@ -0,0 +1,979 @@ +/* $OpenBSD: x509v3.h,v 1.21 2016/12/30 16:19:24 jsing Exp $ */ +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project 1999. + */ +/* ==================================================================== + * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +#ifndef HEADER_X509V3_H +#define HEADER_X509V3_H + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void * (*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE)(void *); +typedef void * (*X509V3_EXT_D2I)(void *, const unsigned char ** , long); +typedef int (*X509V3_EXT_I2D)(void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) * + (*X509V3_EXT_I2V)(const struct v3_ext_method *method, void *ext, + STACK_OF(CONF_VALUE) *extlist); +typedef void * (*X509V3_EXT_V2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, + STACK_OF(CONF_VALUE) *values); +typedef char * (*X509V3_EXT_I2S)(const struct v3_ext_method *method, void *ext); +typedef void * (*X509V3_EXT_S2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R)(const struct v3_ext_method *method, void *ext, + BIO *out, int indent); +typedef void * (*X509V3_EXT_R2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { +int ext_nid; +int ext_flags; +/* If this is set the following four fields are ignored */ +ASN1_ITEM_EXP *it; +/* Old style ASN1 calls */ +X509V3_EXT_NEW ext_new; +X509V3_EXT_FREE ext_free; +X509V3_EXT_D2I d2i; +X509V3_EXT_I2D i2d; + +/* The following pair is used for string extensions */ +X509V3_EXT_I2S i2s; +X509V3_EXT_S2I s2i; + +/* The following pair is used for multi-valued extensions */ +X509V3_EXT_I2V i2v; +X509V3_EXT_V2I v2i; + +/* The following are used for raw extensions */ +X509V3_EXT_I2R i2r; +X509V3_EXT_R2I r2i; + +void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { +char * (*get_string)(void *db, char *section, char *value); +STACK_OF(CONF_VALUE) * (*get_section)(void *db, char *section); +void (*free_string)(void *db, char * string); +void (*free_section)(void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info */ +struct v3_ext_ctx { +#define CTX_TEST 0x1 +int flags; +X509 *issuer_cert; +X509 *subject_cert; +X509_REQ *subject_req; +X509_CRL *crl; +X509V3_CONF_METHOD *db_meth; +void *db; +/* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +DECLARE_STACK_OF(X509V3_EXT_METHOD) + +/* ext_flags values */ +#define X509V3_EXT_DYNAMIC 0x1 +#define X509V3_EXT_CTX_DEP 0x2 +#define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { +int ca; +ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + + +typedef struct PKEY_USAGE_PERIOD_st { +ASN1_GENERALIZEDTIME *notBefore; +ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { +ASN1_OBJECT *type_id; +ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { + +#define GEN_OTHERNAME 0 +#define GEN_EMAIL 1 +#define GEN_DNS 2 +#define GEN_X400 3 +#define GEN_DIRNAME 4 +#define GEN_EDIPARTY 5 +#define GEN_URI 6 +#define GEN_IPADD 7 +#define GEN_RID 8 + +int type; +union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_TYPE *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5;/* rfc822Name, dNSName, uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ +} d; +} GENERAL_NAME; + +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; + +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; + +DECLARE_STACK_OF(GENERAL_NAME) + +DECLARE_STACK_OF(ACCESS_DESCRIPTION) + +typedef struct DIST_POINT_NAME_st { +int type; +union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; +} name; +/* If relativename then this contains the full distribution point name */ +X509_NAME *dpname; +} DIST_POINT_NAME; +/* All existing reasons */ +#define CRLDP_ALL_REASONS 0x807f + +#define CRL_REASON_NONE -1 +#define CRL_REASON_UNSPECIFIED 0 +#define CRL_REASON_KEY_COMPROMISE 1 +#define CRL_REASON_CA_COMPROMISE 2 +#define CRL_REASON_AFFILIATION_CHANGED 3 +#define CRL_REASON_SUPERSEDED 4 +#define CRL_REASON_CESSATION_OF_OPERATION 5 +#define CRL_REASON_CERTIFICATE_HOLD 6 +#define CRL_REASON_REMOVE_FROM_CRL 8 +#define CRL_REASON_PRIVILEGE_WITHDRAWN 9 +#define CRL_REASON_AA_COMPROMISE 10 + +struct DIST_POINT_st { +DIST_POINT_NAME *distpoint; +ASN1_BIT_STRING *reasons; +GENERAL_NAMES *CRLissuer; +int dp_reasons; +}; + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +DECLARE_STACK_OF(DIST_POINT) + +struct AUTHORITY_KEYID_st { +ASN1_OCTET_STRING *keyid; +GENERAL_NAMES *issuer; +ASN1_INTEGER *serial; +}; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +DECLARE_STACK_OF(SXNETID) + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +DECLARE_STACK_OF(POLICYQUALINFO) + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +DECLARE_STACK_OF(POLICYINFO) + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +DECLARE_STACK_OF(POLICY_MAPPING) + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +DECLARE_STACK_OF(GENERAL_SUBTREE) + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st + { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; + } PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st + { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; + } PROXY_CERT_INFO_EXTENSION; + +PROXY_POLICY *PROXY_POLICY_new(void); +void PROXY_POLICY_free(PROXY_POLICY *a); +PROXY_POLICY *d2i_PROXY_POLICY(PROXY_POLICY **a, const unsigned char **in, long len); +int i2d_PROXY_POLICY(PROXY_POLICY *a, unsigned char **out); +extern const ASN1_ITEM PROXY_POLICY_it; +PROXY_CERT_INFO_EXTENSION *PROXY_CERT_INFO_EXTENSION_new(void); +void PROXY_CERT_INFO_EXTENSION_free(PROXY_CERT_INFO_EXTENSION *a); +PROXY_CERT_INFO_EXTENSION *d2i_PROXY_CERT_INFO_EXTENSION(PROXY_CERT_INFO_EXTENSION **a, const unsigned char **in, long len); +int i2d_PROXY_CERT_INFO_EXTENSION(PROXY_CERT_INFO_EXTENSION *a, unsigned char **out); +extern const ASN1_ITEM PROXY_CERT_INFO_EXTENSION_it; + +struct ISSUING_DIST_POINT_st + { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; + }; + +/* Values in idp_flags field */ +/* IDP present */ +#define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +#define IDP_INVALID 0x2 +/* onlyuser true */ +#define IDP_ONLYUSER 0x4 +/* onlyCA true */ +#define IDP_ONLYCA 0x8 +/* onlyattr true */ +#define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +#define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +#define IDP_REASONS 0x40 + +#define X509V3_conf_err(val) ERR_asprintf_error_data( \ + "section:%s,name:%s,value:%s", val->section, \ + val->name, val->value); + +#define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) +#define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +#define EXT_BITSTRING(nid, table) { nid, 0, &ASN1_BIT_STRING_it, \ + 0,0,0,0, \ + 0,0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table} + +#define EXT_IA5STRING(nid) { nid, 0, &ASN1_IA5STRING_it, \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0,0,0,0, \ + NULL} + +#define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + + +/* X509_PURPOSE stuff */ + +#define EXFLAG_BCONS 0x1 +#define EXFLAG_KUSAGE 0x2 +#define EXFLAG_XKUSAGE 0x4 +#define EXFLAG_NSCERT 0x8 + +#define EXFLAG_CA 0x10 +/* Really self issued not necessarily self signed */ +#define EXFLAG_SI 0x20 +#define EXFLAG_SS 0x20 +#define EXFLAG_V1 0x40 +#define EXFLAG_INVALID 0x80 +#define EXFLAG_SET 0x100 +#define EXFLAG_CRITICAL 0x200 +#define EXFLAG_PROXY 0x400 + +#define EXFLAG_INVALID_POLICY 0x800 +#define EXFLAG_FRESHEST 0x1000 + +#define KU_DIGITAL_SIGNATURE 0x0080 +#define KU_NON_REPUDIATION 0x0040 +#define KU_KEY_ENCIPHERMENT 0x0020 +#define KU_DATA_ENCIPHERMENT 0x0010 +#define KU_KEY_AGREEMENT 0x0008 +#define KU_KEY_CERT_SIGN 0x0004 +#define KU_CRL_SIGN 0x0002 +#define KU_ENCIPHER_ONLY 0x0001 +#define KU_DECIPHER_ONLY 0x8000 + +#define NS_SSL_CLIENT 0x80 +#define NS_SSL_SERVER 0x40 +#define NS_SMIME 0x20 +#define NS_OBJSIGN 0x10 +#define NS_SSL_CA 0x04 +#define NS_SMIME_CA 0x02 +#define NS_OBJSIGN_CA 0x01 +#define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) + +#define XKU_SSL_SERVER 0x1 +#define XKU_SSL_CLIENT 0x2 +#define XKU_SMIME 0x4 +#define XKU_CODE_SIGN 0x8 +#define XKU_SGC 0x10 +#define XKU_OCSP_SIGN 0x20 +#define XKU_TIMESTAMP 0x40 +#define XKU_DVCS 0x80 + +#define X509_PURPOSE_DYNAMIC 0x1 +#define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose)(const struct x509_purpose_st *, + const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +#define X509_PURPOSE_SSL_CLIENT 1 +#define X509_PURPOSE_SSL_SERVER 2 +#define X509_PURPOSE_NS_SSL_SERVER 3 +#define X509_PURPOSE_SMIME_SIGN 4 +#define X509_PURPOSE_SMIME_ENCRYPT 5 +#define X509_PURPOSE_CRL_SIGN 6 +#define X509_PURPOSE_ANY 7 +#define X509_PURPOSE_OCSP_HELPER 8 +#define X509_PURPOSE_TIMESTAMP_SIGN 9 + +#define X509_PURPOSE_MIN 1 +#define X509_PURPOSE_MAX 9 + +/* Flags for X509V3_EXT_print() */ + +#define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +#define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +#define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +#define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +#define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +#define X509V3_ADD_OP_MASK 0xfL +#define X509V3_ADD_DEFAULT 0L +#define X509V3_ADD_APPEND 1L +#define X509V3_ADD_REPLACE 2L +#define X509V3_ADD_REPLACE_EXISTING 3L +#define X509V3_ADD_KEEP_EXISTING 4L +#define X509V3_ADD_DELETE 5L +#define X509V3_ADD_SILENT 0x10 + +DECLARE_STACK_OF(X509_PURPOSE) + +BASIC_CONSTRAINTS *BASIC_CONSTRAINTS_new(void); +void BASIC_CONSTRAINTS_free(BASIC_CONSTRAINTS *a); +BASIC_CONSTRAINTS *d2i_BASIC_CONSTRAINTS(BASIC_CONSTRAINTS **a, const unsigned char **in, long len); +int i2d_BASIC_CONSTRAINTS(BASIC_CONSTRAINTS *a, unsigned char **out); +extern const ASN1_ITEM BASIC_CONSTRAINTS_it; + +SXNET *SXNET_new(void); +void SXNET_free(SXNET *a); +SXNET *d2i_SXNET(SXNET **a, const unsigned char **in, long len); +int i2d_SXNET(SXNET *a, unsigned char **out); +extern const ASN1_ITEM SXNET_it; +SXNETID *SXNETID_new(void); +void SXNETID_free(SXNETID *a); +SXNETID *d2i_SXNETID(SXNETID **a, const unsigned char **in, long len); +int i2d_SXNETID(SXNETID *a, unsigned char **out); +extern const ASN1_ITEM SXNETID_it; + +int SXNET_add_id_asc(SXNET **psx, char *zone, char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, char *user, int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, char *user, int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +AUTHORITY_KEYID *AUTHORITY_KEYID_new(void); +void AUTHORITY_KEYID_free(AUTHORITY_KEYID *a); +AUTHORITY_KEYID *d2i_AUTHORITY_KEYID(AUTHORITY_KEYID **a, const unsigned char **in, long len); +int i2d_AUTHORITY_KEYID(AUTHORITY_KEYID *a, unsigned char **out); +extern const ASN1_ITEM AUTHORITY_KEYID_it; + +PKEY_USAGE_PERIOD *PKEY_USAGE_PERIOD_new(void); +void PKEY_USAGE_PERIOD_free(PKEY_USAGE_PERIOD *a); +PKEY_USAGE_PERIOD *d2i_PKEY_USAGE_PERIOD(PKEY_USAGE_PERIOD **a, const unsigned char **in, long len); +int i2d_PKEY_USAGE_PERIOD(PKEY_USAGE_PERIOD *a, unsigned char **out); +extern const ASN1_ITEM PKEY_USAGE_PERIOD_it; + +GENERAL_NAME *GENERAL_NAME_new(void); +void GENERAL_NAME_free(GENERAL_NAME *a); +GENERAL_NAME *d2i_GENERAL_NAME(GENERAL_NAME **a, const unsigned char **in, long len); +int i2d_GENERAL_NAME(GENERAL_NAME *a, unsigned char **out); +extern const ASN1_ITEM GENERAL_NAME_it; +GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a); +int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); + + + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +GENERAL_NAMES *GENERAL_NAMES_new(void); +void GENERAL_NAMES_free(GENERAL_NAMES *a); +GENERAL_NAMES *d2i_GENERAL_NAMES(GENERAL_NAMES **a, const unsigned char **in, long len); +int i2d_GENERAL_NAMES(GENERAL_NAMES *a, unsigned char **out); +extern const ASN1_ITEM GENERAL_NAMES_it; + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +OTHERNAME *OTHERNAME_new(void); +void OTHERNAME_free(OTHERNAME *a); +OTHERNAME *d2i_OTHERNAME(OTHERNAME **a, const unsigned char **in, long len); +int i2d_OTHERNAME(OTHERNAME *a, unsigned char **out); +extern const ASN1_ITEM OTHERNAME_it; +EDIPARTYNAME *EDIPARTYNAME_new(void); +void EDIPARTYNAME_free(EDIPARTYNAME *a); +EDIPARTYNAME *d2i_EDIPARTYNAME(EDIPARTYNAME **a, const unsigned char **in, long len); +int i2d_EDIPARTYNAME(EDIPARTYNAME *a, unsigned char **out); +extern const ASN1_ITEM EDIPARTYNAME_it; +int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); +void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); +void *GENERAL_NAME_get0_value(GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, char *str); + +EXTENDED_KEY_USAGE *EXTENDED_KEY_USAGE_new(void); +void EXTENDED_KEY_USAGE_free(EXTENDED_KEY_USAGE *a); +EXTENDED_KEY_USAGE *d2i_EXTENDED_KEY_USAGE(EXTENDED_KEY_USAGE **a, const unsigned char **in, long len); +int i2d_EXTENDED_KEY_USAGE(EXTENDED_KEY_USAGE *a, unsigned char **out); +extern const ASN1_ITEM EXTENDED_KEY_USAGE_it; +int i2a_ACCESS_DESCRIPTION(BIO *bp, ACCESS_DESCRIPTION* a); + +CERTIFICATEPOLICIES *CERTIFICATEPOLICIES_new(void); +void CERTIFICATEPOLICIES_free(CERTIFICATEPOLICIES *a); +CERTIFICATEPOLICIES *d2i_CERTIFICATEPOLICIES(CERTIFICATEPOLICIES **a, const unsigned char **in, long len); +int i2d_CERTIFICATEPOLICIES(CERTIFICATEPOLICIES *a, unsigned char **out); +extern const ASN1_ITEM CERTIFICATEPOLICIES_it; +POLICYINFO *POLICYINFO_new(void); +void POLICYINFO_free(POLICYINFO *a); +POLICYINFO *d2i_POLICYINFO(POLICYINFO **a, const unsigned char **in, long len); +int i2d_POLICYINFO(POLICYINFO *a, unsigned char **out); +extern const ASN1_ITEM POLICYINFO_it; +POLICYQUALINFO *POLICYQUALINFO_new(void); +void POLICYQUALINFO_free(POLICYQUALINFO *a); +POLICYQUALINFO *d2i_POLICYQUALINFO(POLICYQUALINFO **a, const unsigned char **in, long len); +int i2d_POLICYQUALINFO(POLICYQUALINFO *a, unsigned char **out); +extern const ASN1_ITEM POLICYQUALINFO_it; +USERNOTICE *USERNOTICE_new(void); +void USERNOTICE_free(USERNOTICE *a); +USERNOTICE *d2i_USERNOTICE(USERNOTICE **a, const unsigned char **in, long len); +int i2d_USERNOTICE(USERNOTICE *a, unsigned char **out); +extern const ASN1_ITEM USERNOTICE_it; +NOTICEREF *NOTICEREF_new(void); +void NOTICEREF_free(NOTICEREF *a); +NOTICEREF *d2i_NOTICEREF(NOTICEREF **a, const unsigned char **in, long len); +int i2d_NOTICEREF(NOTICEREF *a, unsigned char **out); +extern const ASN1_ITEM NOTICEREF_it; + +CRL_DIST_POINTS *CRL_DIST_POINTS_new(void); +void CRL_DIST_POINTS_free(CRL_DIST_POINTS *a); +CRL_DIST_POINTS *d2i_CRL_DIST_POINTS(CRL_DIST_POINTS **a, const unsigned char **in, long len); +int i2d_CRL_DIST_POINTS(CRL_DIST_POINTS *a, unsigned char **out); +extern const ASN1_ITEM CRL_DIST_POINTS_it; +DIST_POINT *DIST_POINT_new(void); +void DIST_POINT_free(DIST_POINT *a); +DIST_POINT *d2i_DIST_POINT(DIST_POINT **a, const unsigned char **in, long len); +int i2d_DIST_POINT(DIST_POINT *a, unsigned char **out); +extern const ASN1_ITEM DIST_POINT_it; +DIST_POINT_NAME *DIST_POINT_NAME_new(void); +void DIST_POINT_NAME_free(DIST_POINT_NAME *a); +DIST_POINT_NAME *d2i_DIST_POINT_NAME(DIST_POINT_NAME **a, const unsigned char **in, long len); +int i2d_DIST_POINT_NAME(DIST_POINT_NAME *a, unsigned char **out); +extern const ASN1_ITEM DIST_POINT_NAME_it; +ISSUING_DIST_POINT *ISSUING_DIST_POINT_new(void); +void ISSUING_DIST_POINT_free(ISSUING_DIST_POINT *a); +ISSUING_DIST_POINT *d2i_ISSUING_DIST_POINT(ISSUING_DIST_POINT **a, const unsigned char **in, long len); +int i2d_ISSUING_DIST_POINT(ISSUING_DIST_POINT *a, unsigned char **out); +extern const ASN1_ITEM ISSUING_DIST_POINT_it; + +int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, X509_NAME *iname); + +int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); + +ACCESS_DESCRIPTION *ACCESS_DESCRIPTION_new(void); +void ACCESS_DESCRIPTION_free(ACCESS_DESCRIPTION *a); +ACCESS_DESCRIPTION *d2i_ACCESS_DESCRIPTION(ACCESS_DESCRIPTION **a, const unsigned char **in, long len); +int i2d_ACCESS_DESCRIPTION(ACCESS_DESCRIPTION *a, unsigned char **out); +extern const ASN1_ITEM ACCESS_DESCRIPTION_it; +AUTHORITY_INFO_ACCESS *AUTHORITY_INFO_ACCESS_new(void); +void AUTHORITY_INFO_ACCESS_free(AUTHORITY_INFO_ACCESS *a); +AUTHORITY_INFO_ACCESS *d2i_AUTHORITY_INFO_ACCESS(AUTHORITY_INFO_ACCESS **a, const unsigned char **in, long len); +int i2d_AUTHORITY_INFO_ACCESS(AUTHORITY_INFO_ACCESS *a, unsigned char **out); +extern const ASN1_ITEM AUTHORITY_INFO_ACCESS_it; + +extern const ASN1_ITEM POLICY_MAPPING_it; +POLICY_MAPPING *POLICY_MAPPING_new(void); +void POLICY_MAPPING_free(POLICY_MAPPING *a); +extern const ASN1_ITEM POLICY_MAPPINGS_it; + +extern const ASN1_ITEM GENERAL_SUBTREE_it; +GENERAL_SUBTREE *GENERAL_SUBTREE_new(void); +void GENERAL_SUBTREE_free(GENERAL_SUBTREE *a); + +extern const ASN1_ITEM NAME_CONSTRAINTS_it; +NAME_CONSTRAINTS *NAME_CONSTRAINTS_new(void); +void NAME_CONSTRAINTS_free(NAME_CONSTRAINTS *a); + +POLICY_CONSTRAINTS *POLICY_CONSTRAINTS_new(void); +void POLICY_CONSTRAINTS_free(POLICY_CONSTRAINTS *a); +extern const ASN1_ITEM POLICY_CONSTRAINTS_it; + +GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, + int gen_type, char *value, int is_nc); + +#ifdef HEADER_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, + CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc); +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name, char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section, STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + int ext_nid, char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *name, char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); +#endif + +char * X509V3_get_string(X509V3_CTX *ctx, char *name, char *section); +STACK_OF(CONF_VALUE) * X509V3_get_section(X509V3_CTX *ctx, char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free( X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char * i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint); +ASN1_INTEGER * s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value); +char * i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); +char * i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, int *idx); + + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, int crit, unsigned long flags); + +char *hex_to_string(const unsigned char *buffer, long len); +unsigned char *string_to_hex(const char *str, long *len); +int name_cmp(const char *name, const char *cmp); + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, int indent); +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); + +int X509V3_extensions_print(BIO *out, char *title, STACK_OF(X509_EXTENSION) *exts, unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_PURPOSE_set(int *p, int purpose); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid); +int X509_PURPOSE_get_count(void); +X509_PURPOSE * X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_by_sname(char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck)(const X509_PURPOSE *, const X509 *, int), + char *name, char *sname, void *arg); +char *X509_PURPOSE_get0_name(X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(X509_PURPOSE *xp); +void X509_PURPOSE_cleanup(void); +int X509_PURPOSE_get_id(X509_PURPOSE *); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); + +/* Flags for X509_check_* functions */ +/* Always check subject name for host match even if subject alt names present */ +#define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +#define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +#define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +#define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +#define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 + +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +#define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int a2i_ipadd(unsigned char *ipout, const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE)*dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); +DECLARE_STACK_OF(X509_POLICY_NODE) + + +/* 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. + */ +void ERR_load_X509V3_strings(void); + +/* Error codes for the X509V3 functions. */ + +/* Function codes. */ +#define X509V3_F_A2I_GENERAL_NAME 164 +#define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 161 +#define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 162 +#define X509V3_F_COPY_EMAIL 122 +#define X509V3_F_COPY_ISSUER 123 +#define X509V3_F_DO_DIRNAME 144 +#define X509V3_F_DO_EXT_CONF 124 +#define X509V3_F_DO_EXT_I2D 135 +#define X509V3_F_DO_EXT_NCONF 151 +#define X509V3_F_DO_I2V_NAME_CONSTRAINTS 148 +#define X509V3_F_GNAMES_FROM_SECTNAME 156 +#define X509V3_F_HEX_TO_STRING 111 +#define X509V3_F_I2S_ASN1_ENUMERATED 121 +#define X509V3_F_I2S_ASN1_IA5STRING 149 +#define X509V3_F_I2S_ASN1_INTEGER 120 +#define X509V3_F_I2V_AUTHORITY_INFO_ACCESS 138 +#define X509V3_F_NOTICE_SECTION 132 +#define X509V3_F_NREF_NOS 133 +#define X509V3_F_POLICY_SECTION 131 +#define X509V3_F_PROCESS_PCI_VALUE 150 +#define X509V3_F_R2I_CERTPOL 130 +#define X509V3_F_R2I_PCI 155 +#define X509V3_F_S2I_ASN1_IA5STRING 100 +#define X509V3_F_S2I_ASN1_INTEGER 108 +#define X509V3_F_S2I_ASN1_OCTET_STRING 112 +#define X509V3_F_S2I_ASN1_SKEY_ID 114 +#define X509V3_F_S2I_SKEY_ID 115 +#define X509V3_F_SET_DIST_POINT_NAME 158 +#define X509V3_F_STRING_TO_HEX 113 +#define X509V3_F_SXNET_ADD_ID_ASC 125 +#define X509V3_F_SXNET_ADD_ID_INTEGER 126 +#define X509V3_F_SXNET_ADD_ID_ULONG 127 +#define X509V3_F_SXNET_GET_ID_ASC 128 +#define X509V3_F_SXNET_GET_ID_ULONG 129 +#define X509V3_F_V2I_ASIDENTIFIERS 163 +#define X509V3_F_V2I_ASN1_BIT_STRING 101 +#define X509V3_F_V2I_AUTHORITY_INFO_ACCESS 139 +#define X509V3_F_V2I_AUTHORITY_KEYID 119 +#define X509V3_F_V2I_BASIC_CONSTRAINTS 102 +#define X509V3_F_V2I_CRLD 134 +#define X509V3_F_V2I_EXTENDED_KEY_USAGE 103 +#define X509V3_F_V2I_GENERAL_NAMES 118 +#define X509V3_F_V2I_GENERAL_NAME_EX 117 +#define X509V3_F_V2I_IDP 157 +#define X509V3_F_V2I_IPADDRBLOCKS 159 +#define X509V3_F_V2I_ISSUER_ALT 153 +#define X509V3_F_V2I_NAME_CONSTRAINTS 147 +#define X509V3_F_V2I_POLICY_CONSTRAINTS 146 +#define X509V3_F_V2I_POLICY_MAPPINGS 145 +#define X509V3_F_V2I_SUBJECT_ALT 154 +#define X509V3_F_V3_ADDR_VALIDATE_PATH_INTERNAL 160 +#define X509V3_F_V3_GENERIC_EXTENSION 116 +#define X509V3_F_X509V3_ADD1_I2D 140 +#define X509V3_F_X509V3_ADD_VALUE 105 +#define X509V3_F_X509V3_EXT_ADD 104 +#define X509V3_F_X509V3_EXT_ADD_ALIAS 106 +#define X509V3_F_X509V3_EXT_CONF 107 +#define X509V3_F_X509V3_EXT_I2D 136 +#define X509V3_F_X509V3_EXT_NCONF 152 +#define X509V3_F_X509V3_GET_SECTION 142 +#define X509V3_F_X509V3_GET_STRING 143 +#define X509V3_F_X509V3_GET_VALUE_BOOL 110 +#define X509V3_F_X509V3_PARSE_LIST 109 +#define X509V3_F_X509_PURPOSE_ADD 137 +#define X509V3_F_X509_PURPOSE_SET 141 + +/* Reason codes. */ +#define X509V3_R_BAD_IP_ADDRESS 118 +#define X509V3_R_BAD_OBJECT 119 +#define X509V3_R_BN_DEC2BN_ERROR 100 +#define X509V3_R_BN_TO_ASN1_INTEGER_ERROR 101 +#define X509V3_R_DIRNAME_ERROR 149 +#define X509V3_R_DISTPOINT_ALREADY_SET 160 +#define X509V3_R_DUPLICATE_ZONE_ID 133 +#define X509V3_R_ERROR_CONVERTING_ZONE 131 +#define X509V3_R_ERROR_CREATING_EXTENSION 144 +#define X509V3_R_ERROR_IN_EXTENSION 128 +#define X509V3_R_EXPECTED_A_SECTION_NAME 137 +#define X509V3_R_EXTENSION_EXISTS 145 +#define X509V3_R_EXTENSION_NAME_ERROR 115 +#define X509V3_R_EXTENSION_NOT_FOUND 102 +#define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED 103 +#define X509V3_R_EXTENSION_VALUE_ERROR 116 +#define X509V3_R_ILLEGAL_EMPTY_EXTENSION 151 +#define X509V3_R_ILLEGAL_HEX_DIGIT 113 +#define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG 152 +#define X509V3_R_INVALID_MULTIPLE_RDNS 161 +#define X509V3_R_INVALID_ASNUMBER 162 +#define X509V3_R_INVALID_ASRANGE 163 +#define X509V3_R_INVALID_BOOLEAN_STRING 104 +#define X509V3_R_INVALID_EXTENSION_STRING 105 +#define X509V3_R_INVALID_INHERITANCE 165 +#define X509V3_R_INVALID_IPADDRESS 166 +#define X509V3_R_INVALID_NAME 106 +#define X509V3_R_INVALID_NULL_ARGUMENT 107 +#define X509V3_R_INVALID_NULL_NAME 108 +#define X509V3_R_INVALID_NULL_VALUE 109 +#define X509V3_R_INVALID_NUMBER 140 +#define X509V3_R_INVALID_NUMBERS 141 +#define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 +#define X509V3_R_INVALID_OPTION 138 +#define X509V3_R_INVALID_POLICY_IDENTIFIER 134 +#define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 +#define X509V3_R_INVALID_PURPOSE 146 +#define X509V3_R_INVALID_SAFI 164 +#define X509V3_R_INVALID_SECTION 135 +#define X509V3_R_INVALID_SYNTAX 143 +#define X509V3_R_ISSUER_DECODE_ERROR 126 +#define X509V3_R_MISSING_VALUE 124 +#define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 +#define X509V3_R_NO_CONFIG_DATABASE 136 +#define X509V3_R_NO_ISSUER_CERTIFICATE 121 +#define X509V3_R_NO_ISSUER_DETAILS 127 +#define X509V3_R_NO_POLICY_IDENTIFIER 139 +#define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 +#define X509V3_R_NO_PUBLIC_KEY 114 +#define X509V3_R_NO_SUBJECT_DETAILS 125 +#define X509V3_R_ODD_NUMBER_OF_DIGITS 112 +#define X509V3_R_OPERATION_NOT_DEFINED 148 +#define X509V3_R_OTHERNAME_ERROR 147 +#define X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED 155 +#define X509V3_R_POLICY_PATH_LENGTH 156 +#define X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED 157 +#define X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED 158 +#define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159 +#define X509V3_R_SECTION_NOT_FOUND 150 +#define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122 +#define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123 +#define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT 111 +#define X509V3_R_UNKNOWN_EXTENSION 129 +#define X509V3_R_UNKNOWN_EXTENSION_NAME 130 +#define X509V3_R_UNKNOWN_OPTION 120 +#define X509V3_R_UNSUPPORTED_OPTION 117 +#define X509V3_R_UNSUPPORTED_TYPE 167 +#define X509V3_R_USER_TOO_LONG 132 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/3rdparty/win32_include/pqueue.h b/src/3rdparty/win32_include/pqueue.h new file mode 100644 index 000000000..cdda4a396 --- /dev/null +++ b/src/3rdparty/win32_include/pqueue.h @@ -0,0 +1,93 @@ +/* $OpenBSD: pqueue.h,v 1.4 2016/11/04 18:28:58 guenther Exp $ */ + +/* + * DTLS implementation written by Nagendra Modadugu + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + */ +/* ==================================================================== + * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +#ifndef HEADER_PQUEUE_H +#define HEADER_PQUEUE_H + +__BEGIN_HIDDEN_DECLS + +typedef struct _pqueue *pqueue; + +typedef struct _pitem { + unsigned char priority[8]; /* 64-bit value in big-endian encoding */ + void *data; + struct _pitem *next; +} pitem; + +typedef struct _pitem *piterator; + +pitem *pitem_new(unsigned char *prio64be, void *data); +void pitem_free(pitem *item); + +pqueue pqueue_new(void); +void pqueue_free(pqueue pq); + +pitem *pqueue_insert(pqueue pq, pitem *item); +pitem *pqueue_peek(pqueue pq); +pitem *pqueue_pop(pqueue pq); +pitem *pqueue_find(pqueue pq, unsigned char *prio64be); +pitem *pqueue_iterator(pqueue pq); +pitem *pqueue_next(piterator *iter); + +int pqueue_size(pqueue pq); + +__END_HIDDEN_DECLS + +#endif /* ! HEADER_PQUEUE_H */ diff --git a/src/3rdparty/win32_include/tls.h b/src/3rdparty/win32_include/tls.h new file mode 100644 index 000000000..1292cb6e7 --- /dev/null +++ b/src/3rdparty/win32_include/tls.h @@ -0,0 +1,212 @@ +/* $OpenBSD: tls.h,v 1.47 2017/01/31 16:18:57 beck 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. + */ + +#ifndef HEADER_TLS_H +#define HEADER_TLS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#ifndef LIBRESSL_INTERNAL +#include +typedef SSIZE_T ssize_t; +#endif +#endif + +#include + +#include +#include + +#define TLS_API 20170126 + +#define TLS_PROTOCOL_TLSv1_0 (1 << 1) +#define TLS_PROTOCOL_TLSv1_1 (1 << 2) +#define TLS_PROTOCOL_TLSv1_2 (1 << 3) +#define TLS_PROTOCOL_TLSv1 \ + (TLS_PROTOCOL_TLSv1_0|TLS_PROTOCOL_TLSv1_1|TLS_PROTOCOL_TLSv1_2) + +#define TLS_PROTOCOLS_ALL TLS_PROTOCOL_TLSv1 +#define TLS_PROTOCOLS_DEFAULT TLS_PROTOCOL_TLSv1_2 + +#define TLS_WANT_POLLIN -2 +#define TLS_WANT_POLLOUT -3 + +/* RFC 6960 Section 2.3 */ +#define TLS_OCSP_RESPONSE_SUCCESSFUL 0 +#define TLS_OCSP_RESPONSE_MALFORMED 1 +#define TLS_OCSP_RESPONSE_INTERNALERROR 2 +#define TLS_OCSP_RESPONSE_TRYLATER 3 +#define TLS_OCSP_RESPONSE_SIGREQUIRED 4 +#define TLS_OCSP_RESPONSE_UNAUTHORIZED 5 + +/* RFC 6960 Section 2.2 */ +#define TLS_OCSP_CERT_GOOD 0 +#define TLS_OCSP_CERT_REVOKED 1 +#define TLS_OCSP_CERT_UNKNOWN 2 + +/* RFC 5280 Section 5.3.1 */ +#define TLS_CRL_REASON_UNSPECIFIED 0 +#define TLS_CRL_REASON_KEY_COMPROMISE 1 +#define TLS_CRL_REASON_CA_COMPROMISE 2 +#define TLS_CRL_REASON_AFFILIATION_CHANGED 3 +#define TLS_CRL_REASON_SUPERSEDED 4 +#define TLS_CRL_REASON_CESSATION_OF_OPERATION 5 +#define TLS_CRL_REASON_CERTIFICATE_HOLD 6 +#define TLS_CRL_REASON_REMOVE_FROM_CRL 8 +#define TLS_CRL_REASON_PRIVILEGE_WITHDRAWN 9 +#define TLS_CRL_REASON_AA_COMPROMISE 10 + +#define TLS_MAX_SESSION_ID_LENGTH 32 +#define TLS_TICKET_KEY_SIZE 48 + +struct tls; +struct tls_config; + +typedef ssize_t (*tls_read_cb)(struct tls *_ctx, void *_buf, size_t _buflen, + void *_cb_arg); +typedef ssize_t (*tls_write_cb)(struct tls *_ctx, const void *_buf, + size_t _buflen, void *_cb_arg); + +int tls_init(void); + +const char *tls_config_error(struct tls_config *_config); +const char *tls_error(struct tls *_ctx); + +struct tls_config *tls_config_new(void); +void tls_config_free(struct tls_config *_config); + +int tls_config_add_keypair_file(struct tls_config *_config, + const char *_cert_file, const char *_key_file); +int tls_config_add_keypair_mem(struct tls_config *_config, const uint8_t *_cert, + size_t _cert_len, const uint8_t *_key, size_t _key_len); +int tls_config_add_keypair_ocsp_file(struct tls_config *_config, + const char *_cert_file, const char *_key_file, + const char *_ocsp_staple_file); +int tls_config_add_keypair_ocsp_mem(struct tls_config *_config, const uint8_t *_cert, + size_t _cert_len, const uint8_t *_key, size_t _key_len, + const uint8_t *_staple, size_t _staple_len); +int tls_config_set_alpn(struct tls_config *_config, const char *_alpn); +int 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); +int tls_config_set_ca_mem(struct tls_config *_config, const uint8_t *_ca, + size_t _len); +int tls_config_set_cert_file(struct tls_config *_config, + const char *_cert_file); +int tls_config_set_cert_mem(struct tls_config *_config, const uint8_t *_cert, + size_t _len); +int tls_config_set_ciphers(struct tls_config *_config, const char *_ciphers); +int tls_config_set_dheparams(struct tls_config *_config, const char *_params); +int tls_config_set_ecdhecurve(struct tls_config *_config, const char *_name); +int tls_config_set_key_file(struct tls_config *_config, const char *_key_file); +int tls_config_set_key_mem(struct tls_config *_config, const uint8_t *_key, + size_t _len); +int tls_config_set_keypair_file(struct tls_config *_config, + const char *_cert_file, const char *_key_file); +int tls_config_set_keypair_mem(struct tls_config *_config, const uint8_t *_cert, + size_t _cert_len, const uint8_t *_key, size_t _key_len); +int tls_config_set_keypair_ocsp_file(struct tls_config *_config, + const char *_cert_file, const char *_key_file, const char *_staple_file); +int tls_config_set_keypair_ocsp_mem(struct tls_config *_config, const uint8_t *_cert, + size_t _cert_len, const uint8_t *_key, size_t _key_len, + const uint8_t *_staple, size_t staple_len); +int tls_config_set_ocsp_staple_mem(struct tls_config *_config, + const uint8_t *_staple, size_t _len); +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_verify_depth(struct tls_config *_config, int _verify_depth); + +void tls_config_prefer_ciphers_client(struct tls_config *_config); +void tls_config_prefer_ciphers_server(struct tls_config *_config); + +void tls_config_insecure_noverifycert(struct tls_config *_config); +void tls_config_insecure_noverifyname(struct tls_config *_config); +void tls_config_insecure_noverifytime(struct tls_config *_config); +void tls_config_verify(struct tls_config *_config); + +void tls_config_ocsp_require_stapling(struct tls_config *_config); +void tls_config_verify_client(struct tls_config *_config); +void tls_config_verify_client_optional(struct tls_config *_config); + +void tls_config_clear_keys(struct tls_config *_config); +int tls_config_parse_protocols(uint32_t *_protocols, const char *_protostr); + +int tls_config_set_session_id(struct tls_config *_config, + const unsigned char *_session_id, size_t _len); +int tls_config_set_session_lifetime(struct tls_config *_config, int _lifetime); +int tls_config_add_ticket_key(struct tls_config *_config, uint32_t _keyrev, + unsigned char *_key, size_t _keylen); + +struct tls *tls_client(void); +struct tls *tls_server(void); +int tls_configure(struct tls *_ctx, struct tls_config *_config); +void tls_reset(struct tls *_ctx); +void tls_free(struct tls *_ctx); + +int tls_accept_fds(struct tls *_ctx, struct tls **_cctx, int _fd_read, + int _fd_write); +int tls_accept_socket(struct tls *_ctx, struct tls **_cctx, int _socket); +int tls_accept_cbs(struct tls *_ctx, struct tls **_cctx, + tls_read_cb _read_cb, tls_write_cb _write_cb, void *_cb_arg); +int tls_connect(struct tls *_ctx, const char *_host, const char *_port); +int tls_connect_fds(struct tls *_ctx, int _fd_read, int _fd_write, + const char *_servername); +int tls_connect_servername(struct tls *_ctx, const char *_host, + const char *_port, const char *_servername); +int tls_connect_socket(struct tls *_ctx, int _s, const char *_servername); +int tls_connect_cbs(struct tls *_ctx, tls_read_cb _read_cb, + tls_write_cb _write_cb, void *_cb_arg, const char *_servername); +int tls_handshake(struct tls *_ctx); +ssize_t tls_read(struct tls *_ctx, void *_buf, size_t _buflen); +ssize_t tls_write(struct tls *_ctx, const void *_buf, size_t _buflen); +int tls_close(struct tls *_ctx); + +int tls_peer_cert_provided(struct tls *_ctx); +int tls_peer_cert_contains_name(struct tls *_ctx, const char *_name); + +const char *tls_peer_cert_hash(struct tls *_ctx); +const char *tls_peer_cert_issuer(struct tls *_ctx); +const char *tls_peer_cert_subject(struct tls *_ctx); +time_t tls_peer_cert_notbefore(struct tls *_ctx); +time_t tls_peer_cert_notafter(struct tls *_ctx); + +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); +const char *tls_conn_version(struct tls *_ctx); + +uint8_t *tls_load_file(const char *_file, size_t *_len, char *_password); + +int tls_ocsp_process_response(struct tls *_ctx, const unsigned char *_response, + size_t _size); +int tls_peer_ocsp_cert_status(struct tls *_ctx); +int tls_peer_ocsp_crl_reason(struct tls *_ctx); +time_t tls_peer_ocsp_next_update(struct tls *_ctx); +int tls_peer_ocsp_response_status(struct tls *_ctx); +const char *tls_peer_ocsp_result(struct tls *_ctx); +time_t tls_peer_ocsp_revocation_time(struct tls *_ctx); +time_t tls_peer_ocsp_this_update(struct tls *_ctx); +const char *tls_peer_ocsp_url(struct tls *_ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_TLS_H */ diff --git a/src/3rdparty/win32_lib/crypto-41.lib b/src/3rdparty/win32_lib/crypto-41.lib new file mode 100644 index 0000000000000000000000000000000000000000..db72fbdc8c9f80c281d6cafef37f05376ea91251 GIT binary patch literal 775230 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 OziK0if5s&c(DPr@+D^6r literal 0 HcmV?d00001 diff --git a/src/3rdparty/win32_lib/ssl-43.lib b/src/3rdparty/win32_lib/ssl-43.lib new file mode 100644 index 0000000000000000000000000000000000000000..3b0d95afdb87c080829e1786d670f183129c1964 GIT binary patch literal 62120 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 gG{@Anlq|K`8!%t^yTqN8$-?^0hRhZIBl`Tzg` literal 0 HcmV?d00001 diff --git a/src/3rdparty/win32_lib/tls-15.lib b/src/3rdparty/win32_lib/tls-15.lib new file mode 100644 index 0000000000000000000000000000000000000000..0dcdd768416f69c89c2ce107917d7a8c19fb3a7a GIT binary patch literal 20472 zcmd5@O>7)R7JhcZ5=;mogzz66FeEXF6FW2h$*+?*!A_i?H34zTWHN5!Stc{HGvlxz z#Bx9gA;f_LM}*iF2Tq6sLLec85C??N9`?iuAr34jPKeX8UsYF4y{@V*cQc8!BYm#! zs`u)vs;-|`ugcpFmRptO!vlK;lfTiz)ab<6zCvMdGG4zHrY6+mr2!)P2hsM6L_1$5 z8vcZ67vdzYA{6)`#_sb(5+5T3Mz$)vg%H@YLE&|Tz}|HVFCrB9CB`VYB)&!njLj;1 zg%H>`qwoPjpfIBF9zvivr0_06V0@FpD+mRCi!o6nl0f+NZ{bBF%G?icY$AH90sq%PY8h{mlVE52u!1X5?>$$j_y); z2O)3_JQ6P;6!9nzgdA6bO(mfRIrIn~Qol0|TGiX~RhsZ(7or&z+tsUAI>Xf65f zNXZY}ivGG%MLV=R$O;BH`rJEVtTGso83D8kI&Z`C*+jSGyH0MXge$+FXuW z?UEj$V#ZLNqv@AeEvI(W!pBY2$jV7eI61Y^wac|;J)vwOz4Dc^J2HhzH$F|v9)(KD zKlW5&v)oyB3J0b*-p_D@SlCJ43rBDo%GybG*Id#03ZE-n5rzu}a_9Ibmmg3cn zDv-dizM33>LX{_ZbulCP8^iL>RsHL|IQvIumC~Gn?jaBNWFq^cXHd`y$XyZj- z607GFDvZo1y**^IoP(mc)vWS3>E6! zwDN_p=piiQZcI`V#Wh0m#Ys1&v?vN>;s{r+YfNi7%bM2FzRHMfdAysuwz$=pl?Bmp zMw%IMj`e2DHrrlXF4q^^%jIX(S7xs!=W4yGnks%WDYZs0pq%Yp<8N2 z?PdeEVcha5Nk+FB3ByG!f@r}`8J1qj^n}zzpZ;>Wtp=-6i{pIK)pmPDTQ){s$NDtt zjZS%~7T(Uy+(R(mS&C1y9{sITT4^qpJF2G`)kKm{S9dXCa(hbcB&X!D zQd522P(xM5`ZcaLDrGUzmdx71Rjp)S9-ZZCJEhi%B%kg|OU>_wQ$`tCd$4@*3 zt6w}KQAP1+(zFFH<{tfQQlD*A^%sgC^LyzgyI#7-;Y+!=o#^GAM4!N4G60{^Rp1BU z{BEL;fvqD%Zvh+j5WNnp+e`E!@C$Hpl;~?y=sjSlNc1kSX`JX4 z;5VQ)f&76dC!q^WPZ50t4DTm;8`yGy=nY`~L87&Xh+akb62f1B+F_!ffJ;Y+z6ECB zJNg3Hb(H8GVEr+o7l5CEh2un@0mJZ9y$x(QLDT`h17=PVy$@`DjOaC>f0n2P{0KZX zNAwLaeTwKqV8?0b1DoejErRDo~NeX@VwciuTh1I!K4;Fdd<3I!edrIL*)rI!TYwEX~m= zI!*H^^jSJb=jqS1K#%|5mv0TmLwn`seV=uEe&5&XlwHze+^K%v1bR3fKWx-7!rppiISTytGBn%xU;+QV6i4&4A zj*~Pq$!uJegniB>TOfF%}7Qwpa?x5V2DDS&5Zoj1NzOk6qgePOs($LP*iytGTw6@MR$r5{89UXfEK( zfEg2(rnV9SetzSnw{(>W;QHsa(ZJ*_b0IB-ImnF&ca1y7ff6%r?QR5LnY)o)Q$WXb z{d5?L#`DZlOODUkmoZ=Lg)*C3j8B*??Lx-5d)aa>66EK^H}iOMQcEqk;Pgq_S~(0t4`mqyEHK0w}w9W@jp)u^uZ4YUz2b* zjVwl&SDqdct~~jh#^2ZD$L`;0+IVcF3g2#d2wuAQhig^z4e)*ZN^1~K)85aO96WXL zZ#{zl0^i54^6xYae%_C#+u+|4zX4OJ?R5Lb8xbY46Tb~`fPGrtbf#KqHQJ4(&ft!P zorCjpXW>zEe}YRWiVWcWlTRD*_Xhc7NKn#B<4O}n{j}WI_xtafPH2dqC|f`28c!3+ z(k|;5SvSG6M#mI{3?is2Q#3Im{sHkv{Y37#>!;pC&=1cV{UM*#wdy5fg(-C@Q}mL4 z*-Ji_B@^ZI_mV}KWd5*T0v~St6TRf0`bCAJmt2pppXHn0k20iQ*kj!=+t?bL7-y{( zkF9@$A^yVtRtt;KEKJZ?vURapWH-p6u zU@8udLg;c&cPu4K|{4f4dM@A7)2>A5$#cy>J!v6g-%$*H+Z4-{MkRBt~Z* zv-QftK7T9T3AQzwP1*7$Z$1fUV;N6ryB%P;q08d#{iJzq z$XF4w@fP)jXnnKo;Qdp8S6I!AHg~@qFZx>*M``jzNcKy$+vEFSX(QQ{&d*-(v+n}? zxW0$^`>&1TSYV6XF z(+hiOHQQ*h3m;K0T%mTp&Ek^tg5!Vcg*`McZ?f2J-&QZYp<3T=^Cpk;uEAOxV&5EQ zS6jRwD)=?5`~++nc`Ka}+MF+%g0Z5}D6tbq@KZ;OXdyAlmg{@J4#SO@O(bN0I4 z1!{ShpHUvs_EgIh3;SWT?A<=ju6MO3R=rKKR=gpw-jl|99b5NaAE$B(_f*e7>)z+# zG!EyUSW{MbVK?3HVP(#2Mr$53j?ut3-RfcO`pFFuTZJ-m21d*SDV$a}%56V|_8)_O zPII52m%0Y_AKL=FJ=Zs-jm7@s!2s{|-+w%`8oO0>)A-qX*LcbbAoe~(9&TA~4l!<{%4>w!1qeHylS)qz_tY=PeNsFzJ&{b8iJd((KzYJ`i&xc#cUdCF^& zI6*Y$gpA%iX6sdj6!v?-zB|b-jv!6;>@gct$TA*bO!ny}qs-m5ArHcy1gH8BAx35% zGuAJ#)7YEfVrQp@BzJp;d@-X5K7HQH$nv*j$_jHA`pFn)6KBbc$UJ6i#n2bqXYt5? zkTL{}ws)?A&1E^#4Q)2AQ136=T>cJ{`>Y#?P3v<&vzRLw zjLJM_`#!~hb#zcONdwfm-C?M5w_<3ob4atAyCGOl*?;);z#AH4hh1KICxy}F{*J{I zYkM1d{}Go@-FNAUF=baJJX+H(WA`piPn;=MiSW7{^>V6vI*imjX6(0tdLDB*yH|h= zPyQJ* + +#include +#include + +#include +#include +#include +#include +#include + +#ifdef WIN32 +#define DLLEXPORT __declspec(dllexport) +#else +#define DLLEXPORT +#endif + +using namespace musik::core::sdk; +namespace al = boost::algorithm; + +static const int MAX_CACHE_FILES = 35; +static const int NOTIFY_INTERVAL_BYTES = 131072; /* 2^17 */ + +static std::mutex globalMutex; +static IEnvironment* environment; +static LruDiskCache diskCache; +static std::string cachePath; + +extern "C" DLLEXPORT void SetEnvironment(IEnvironment* environment) { + std::unique_lock lock(globalMutex); + ::environment = environment; + + if (environment) { + static char buffer[2046]; + environment->GetPath(PathData, buffer, sizeof(buffer)); + cachePath = std::string(buffer) + "/httpcache/"; + + boost::filesystem::path p(cachePath); + if (!boost::filesystem::exists(cachePath)) { + boost::filesystem::create_directories(cachePath); + } + } +} + +static bool parseHeader(std::string raw, std::string& key, std::string& value) { + al::replace_all(raw, "\r\n", ""); + + size_t splitAt = raw.find_first_of(":"); + if (splitAt != std::string::npos) { + key = boost::trim_copy(raw.substr(0, splitAt)); + value = boost::trim_copy(raw.substr(splitAt + 1)); + return true; + } + + return false; +} + +static size_t cacheId(const std::string& uri) { + return std::hash()(uri); +} + +class FileReadStream { + public: + FileReadStream(FILE* file, long maxLength) { + this->file = file; + this->maxLength = maxLength; + this->Init(); + } + + FileReadStream(const std::string& fn) { + this->file = diskCache.Open(cacheId(fn), "rb"); + this->maxLength = -1; + Init(); + } + + ~FileReadStream() { + if (this->file) { + fclose(this->file); + this->file = nullptr; + } + } + + void Init() { + this->interrupted = false; + this->length = 0; + + if (this->file) { + fseek(this->file, 0, SEEK_END); + this->length = (PositionType)ftell(this->file); + fseek(this->file, 0, SEEK_SET); + } + } + + void Interrupt() { + std::unique_lock lock(this->mutex); + this->interrupted = true; + this->underflow.notify_all(); + } + + void Add(PositionType length) { + std::unique_lock lock(this->mutex); + this->length += length; + this->underflow.notify_all(); + } + + void Completed() { + std::unique_lock lock(this->mutex); + this->maxLength = length; + } + + PositionType Read(void* buffer, PositionType readBytes) { + std::unique_lock lock(this->mutex); + while (this->Position() >= this->length && !this->Eof() && !this->interrupted) { + this->underflow.wait(lock); + } + + if (this->interrupted && this->Eof()) { + return 0; + } + + clearerr(this->file); + int available = this->length - this->Position(); + unsigned actualReadBytes = std::max(0, std::min(available, (int) readBytes)); + return (PositionType) fread(buffer, 1, actualReadBytes, this->file); + } + + bool SetPosition(PositionType position) { + std::unique_lock lock(this->mutex); + while (position > this->length && !this->Eof() && !this->interrupted) { + this->underflow.wait(lock); + } + + if (this->interrupted || this->Eof()) { + return false; + } + + return (fseek(this->file, position, SEEK_SET) == 0); + } + + PositionType Position() { + return (this->file) ? ftell(this->file) : 0; + } + + private: + bool Eof() { + return this->maxLength > 0 && this->Position() >= this->maxLength; + } + + FILE* file; + PositionType length, maxLength; + std::condition_variable underflow; + std::mutex mutex; + bool interrupted; +}; + +HttpDataStream::HttpDataStream() { + this->length = this->written = 0; + this->state = Idle; + this->writeFile = nullptr; + this->interrupted = false; +} + +HttpDataStream::~HttpDataStream() { + auto id = cacheId(this->uri); + if (this->state == Finished) { + diskCache.Finalize(id, this->Type()); + } + else if (this->state != Cached) { + diskCache.Delete(id); + } +} + +void HttpDataStream::Interrupt() { + std::unique_lock lock(this->stateMutex); + + auto reader = this->reader; + auto downloadThread = this->downloadThread; + + if (reader) { + reader->Interrupt(); + } + + if (downloadThread) { + this->interrupted = true; + } +} + +bool HttpDataStream::CanPrefetch() { + return true; +} + +bool HttpDataStream::Open(const char *uri, unsigned int options) { + std::unique_lock lock(this->stateMutex); + + diskCache.Init(cachePath, MAX_CACHE_FILES); + + this->uri = uri; + + auto id = cacheId(uri); + + if (diskCache.Cached(id)) { + FILE* file = diskCache.Open(id, "rb", this->type, this->length); + this->reader.reset(new FileReadStream(file, this->length)); + this->state = Cached; + return true; + } + + this->writeFile = diskCache.Open(id, "wb"); + + if (this->writeFile) { + this->reader.reset(new FileReadStream(uri)); + + this->curlEasy = curl_easy_init(); + + // curl_easy_setopt (this->curlEasy, CURLOPT_VERBOSE, verbose); + + curl_easy_setopt(this->curlEasy, CURLOPT_URL, uri); + curl_easy_setopt(this->curlEasy, CURLOPT_HEADER, 0); + curl_easy_setopt(this->curlEasy, CURLOPT_HTTPGET, 1); + curl_easy_setopt(this->curlEasy, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(this->curlEasy, CURLOPT_AUTOREFERER, 1); + curl_easy_setopt(this->curlEasy, CURLOPT_FAILONERROR, 1); + curl_easy_setopt(this->curlEasy, CURLOPT_NOPROGRESS, 1); + curl_easy_setopt(this->curlEasy, CURLOPT_USERAGENT, "musikcube HttpDataStream"); + curl_easy_setopt(this->curlEasy, CURLOPT_NOPROGRESS, 0); + curl_easy_setopt(this->curlEasy, CURLOPT_WRITEHEADER, this); + curl_easy_setopt(this->curlEasy, CURLOPT_WRITEDATA, this); + curl_easy_setopt(this->curlEasy, CURLOPT_XFERINFODATA, this); + curl_easy_setopt(this->curlEasy, CURLOPT_WRITEFUNCTION, &HttpDataStream::CurlWriteCallback); + curl_easy_setopt(this->curlEasy, CURLOPT_HEADERFUNCTION, &HttpDataStream::CurlHeaderCallback); + curl_easy_setopt(this->curlEasy, CURLOPT_XFERINFOFUNCTION, &HttpDataStream::CurlTransferCallback); + + // curl_easy_setopt (this->curlEasy, CURLOPT_CONNECTTIMEOUT, connecttimeout); + // curl_easy_setopt (this->curlEasy, CURLOPT_LOW_SPEED_TIME, readtimeout); + // curl_easy_setopt(this->curlEasy, CURLOPT_LOW_SPEED_LIMIT, 1); + + // if (useproxy == 1) { + // curl_easy_setopt (this->curlEasy, CURLOPT_PROXY, proxyaddress); + // if (authproxy == 1) { + // curl_easy_setopt (this->curlEasy, CURLOPT_PROXYUSERPWD, proxyuserpass); + // } + // } + + curl_easy_setopt(this->curlEasy, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(this->curlEasy, CURLOPT_SSL_VERIFYPEER, 0); + curl_easy_setopt(this->curlEasy, CURLOPT_SSL_VERIFYHOST, 0); + + /* start downloading... */ + this->state = Loading; + downloadThread.reset(new std::thread(&HttpDataStream::ThreadProc, this)); + + /* wait until headers have finished */ + startedContition.wait(lock); + + return true; + } + + return false; +} + +void HttpDataStream::ThreadProc() { + if (this->curlEasy) { + if (curl_easy_perform(this->curlEasy) == CURLE_OK) { + this->state = Finished; + } + else { + this->state = Error; + } + + if (this->reader) { + if (this->written > 0) { + this->reader->Add(this->written); + this->written = 0; + } + + this->reader->Completed(); + } + + startedContition.notify_all(); + + if (this->curlEasy) { + curl_easy_cleanup(this->curlEasy); + this->curlEasy = nullptr; + } + + if (this->writeFile) { + fclose(this->writeFile); + this->writeFile = nullptr; + } + } +} + +bool HttpDataStream::Close() { + this->Interrupt(); + this->reader.reset(); + + if (this->downloadThread) { + downloadThread->join(); + this->downloadThread.reset(); + } + + return true; +} + +void HttpDataStream::Destroy() { + this->Close(); + delete this; +} + +PositionType HttpDataStream::Read(void* buffer, PositionType readBytes) { + auto reader = this->reader; + return reader ? reader->Read(buffer, readBytes) : 0; +} + +bool HttpDataStream::SetPosition(PositionType position) { + auto reader = this->reader; + return reader ? reader->SetPosition(position) : 0; +} + +bool HttpDataStream::Seekable() { + return true; +} + +PositionType HttpDataStream::Position() { + auto reader = this->reader; + return reader ? reader->Position() : 0; +} + +bool HttpDataStream::Eof() { + auto reader = this->reader; + return !reader || reader->Position() >= (long) this->length; +} + +long HttpDataStream::Length() { + return (long) this->length; +} + +const char* HttpDataStream::Type() { + return this->type.c_str(); +} + +const char* HttpDataStream::Uri() { + return this->uri.c_str(); +} + +size_t HttpDataStream::CurlWriteCallback(char *ptr, size_t size, size_t nmemb, void *userdata) { + HttpDataStream* stream = static_cast(userdata); + + stream->startedContition.notify_all(); + + size_t total = size * nmemb; + size_t result = fwrite(ptr, size, nmemb, stream->writeFile); + stream->written += result; + + if (stream->written > NOTIFY_INTERVAL_BYTES) { + fflush(stream->writeFile); + stream->reader->Add(stream->written); + stream->written = 0; + } + + return result; +} + +size_t HttpDataStream::CurlHeaderCallback(char *buffer, size_t size, size_t nitems, void *userdata) { + HttpDataStream* stream = static_cast(userdata); + + std::string header(buffer, size * nitems); + + std::string key, value; + if (parseHeader(header, key, value)) { + if (key == "Content-Length") { + stream->length = std::atoi(value.c_str()); + } + else if (key == "Content-Type") { + stream->type = value; + } + } + + return size * nitems; +} + +int HttpDataStream::CurlTransferCallback( + void *ptr, curl_off_t downTotal, curl_off_t downNow, curl_off_t upTotal, curl_off_t upNow) +{ + HttpDataStream* stream = static_cast(ptr); + if (stream->interrupted) { + return -1; /* kill the stream */ + } + return 0; /* ok! */ +} \ No newline at end of file diff --git a/src/contrib/httpdatastream/HttpDataStream.h b/src/contrib/httpdatastream/HttpDataStream.h new file mode 100755 index 000000000..438f79e03 --- /dev/null +++ b/src/contrib/httpdatastream/HttpDataStream.h @@ -0,0 +1,98 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include + +#include +#include +#include +#include +#include +#include + +using namespace musik::core::sdk; + +class FileReadStream; + +class HttpDataStream : public IDataStream { + public: + HttpDataStream(); + virtual ~HttpDataStream(); + virtual void Destroy(); + + virtual bool Open(const char *uri, unsigned int options = 0); + virtual bool Close(); + virtual PositionType Read(void* buffer, PositionType readBytes); + virtual bool SetPosition(PositionType position); + virtual PositionType Position(); + virtual bool Eof(); + virtual long Length(); + virtual bool Seekable(); + virtual const char* Type(); + virtual const char* Uri(); + virtual void Interrupt(); + virtual bool CanPrefetch(); + + private: + enum State { + Idle, + Cached, + Loading, + Error, + Finished + }; + + void ThreadProc(); + + static size_t CurlWriteCallback(char *ptr, size_t size, size_t nmemb, void *userdata); + static size_t CurlHeaderCallback(char *buffer, size_t size, size_t nitems, void *userdata); + + static int CurlTransferCallback( + void *ptr, curl_off_t downTotal, curl_off_t downNow, curl_off_t upTotal, curl_off_t upNow); + + std::string uri, type; + size_t length; + std::string filename; + FILE* writeFile; + CURL* curlEasy; + + volatile long written; + volatile bool interrupted; + volatile State state; + + std::mutex stateMutex; + std::condition_variable startedContition; + std::shared_ptr downloadThread; + std::shared_ptr reader; +}; \ No newline at end of file diff --git a/src/contrib/httpdatastream/HttpDataStreamFactory.cpp b/src/contrib/httpdatastream/HttpDataStreamFactory.cpp new file mode 100755 index 000000000..e24bbafca --- /dev/null +++ b/src/contrib/httpdatastream/HttpDataStreamFactory.cpp @@ -0,0 +1,67 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include "HttpDataStreamFactory.h" +#include "HttpDataStream.h" + +HttpDataStreamFactory::HttpDataStreamFactory() { + +} + +HttpDataStreamFactory::~HttpDataStreamFactory() { + +} + +bool HttpDataStreamFactory::CanRead(const char *uri) { + std::string str(uri); + std::transform(str.begin(), str.end(), str.begin(), ::tolower); + return str.find("http://") == 0 || str.find("https://") == 0; +} + +IDataStream* HttpDataStreamFactory::Open(const char *uri, unsigned int options) { + HttpDataStream* stream = new HttpDataStream(); + + if (stream->Open(uri, options)) { + return stream; + } + + delete stream; + return nullptr; +} + +void HttpDataStreamFactory::Destroy() { + delete this; +} \ No newline at end of file diff --git a/src/contrib/httpdatastream/HttpDataStreamFactory.h b/src/contrib/httpdatastream/HttpDataStreamFactory.h new file mode 100755 index 000000000..0ddb941e1 --- /dev/null +++ b/src/contrib/httpdatastream/HttpDataStreamFactory.h @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include + +using namespace musik::core::sdk; + +class HttpDataStreamFactory : public IDataStreamFactory { + public: + HttpDataStreamFactory(); + ~HttpDataStreamFactory(); + + virtual bool CanRead(const char *uri); + virtual IDataStream* Open(const char *uri, unsigned int options = 0); + virtual void Destroy(); +}; \ No newline at end of file diff --git a/src/contrib/httpdatastream/LruDiskCache.cpp b/src/contrib/httpdatastream/LruDiskCache.cpp new file mode 100644 index 000000000..1edb05898 --- /dev/null +++ b/src/contrib/httpdatastream/LruDiskCache.cpp @@ -0,0 +1,312 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" + +#include "LruDiskCache.h" + +#include + +#include +#include + +const std::string PREFIX = "musikcube"; +const std::string TEMP_EXTENSION = ".tmp"; + +namespace fs = boost::filesystem; +namespace al = boost::algorithm; + +using Lock = std::unique_lock; + +static std::string tempFilename(const std::string& root, size_t id) { + return root + "/" + PREFIX + "_" + std::to_string(id) + TEMP_EXTENSION; +} + +static std::string finalFilename(const std::string& root, size_t id, std::string extension) { + al::replace_all(extension, "/", "-"); + return root + "/" + PREFIX + "_" + std::to_string(id) + "." + extension; +} + +static bool isTemp(const fs::path& path) { + return path.extension().string() == TEMP_EXTENSION; +} + +static bool isTemp(const std::string& path) { + return isTemp(fs::path(path)); +} + +static time_t touch(const std::string& path) { + try { + std::time_t now = time(nullptr); + fs::last_write_time(path, now); + } + catch (...) { + } + + return fs::last_write_time(path); +} + +static bool rm(const std::string& path) { + try { + return fs::remove(fs::path(path)); + } + catch (...) { + + } + + return false; +} + +static bool rm(const fs::path& p) { + return rm(p.string()); +} + +LruDiskCache::LruDiskCache() +: maxEntries(10) +, initialized(false) { + +} + +void LruDiskCache::Init(const std::string& root, size_t maxEntries) { + Lock lock(this->stateMutex); + + if (!this->initialized) { + this->initialized = true; + this->root = root; + this->maxEntries = maxEntries; + + this->Purge(); /* always purge partial files on startup */ + + /* index all the completed files... */ + fs::directory_iterator end; + fs::directory_iterator file(this->root); + + while (file != end) { + if (!is_directory(file->status())) { + if (!isTemp(file->path())) { + auto entry = LruDiskCache::Parse(file->path()); + if (entry) { + this->cached.push_back(entry); + } + } + } + ++file; + } + + this->SortAndPrune(); + } +} + +void LruDiskCache::Purge() { + Lock lock(stateMutex); + + fs::directory_iterator end; + fs::directory_iterator file(this->root); + + while (file != end) { + if (!is_directory(file->status())) { + if (isTemp(file->path())) { + rm(file->path()); + } + } + ++file; + } +} + +LruDiskCache::EntryPtr LruDiskCache::Parse(const fs::path& path) { + std::string fn = path.stem().string(); /* no extension */ + std::string ext = path.extension().string(); + + if (ext.size()) { + if (ext.at(0) == '.') { + ext = ext.substr(1); + } + + al::replace_all(ext, "-", "/"); + } + + std::vector parts; + boost::split(parts, fn, boost::is_any_of("_")); + + if (parts.size() == 2 && parts.at(0) == PREFIX) { + try { + auto entry = std::shared_ptr(new Entry()); + entry->id = std::stoul(parts.at(1).c_str()); + entry->path = path.string(); + entry->type = ext; + entry->time = fs::last_write_time(path); + return entry; + } + catch (...) { + /* can't parse. it's invalid. */ + } + } + + return EntryPtr(); +} + +bool LruDiskCache::Finalize(size_t id, std::string type) { + Lock lock(stateMutex); + + if (type.size() == 0) { + type = "unknown"; + } + + fs::path src(tempFilename(this->root, id)); + fs::path dst(finalFilename(this->root, id, type)); + + if (fs::exists(src)) { + if (fs::exists(dst)) { + if (!rm(dst)) { + return false; + } + } + + try { + fs::rename(src, dst); + } + catch (...) { + return false; + } + + auto entry = LruDiskCache::Parse(dst); + if (entry) { + this->cached.push_back(entry); + this->SortAndPrune(); + } + } + + return true; +} + +bool LruDiskCache::Cached(size_t id) { + Lock lock(stateMutex); + + auto end = this->cached.end(); + auto it = std::find_if(this->cached.begin(), end, [id](EntryPtr entry) { + return entry->id == id; + }); + + return it != end; +} + +FILE* LruDiskCache::Open(size_t id, const std::string& mode) { + std::string type; + size_t len; + return this->Open(id, mode, type, len); +} + +FILE* LruDiskCache::Open(size_t id, const std::string& mode, std::string& type, size_t& len) { + Lock lock(stateMutex); + + auto end = this->cached.end(); + auto it = std::find_if(this->cached.begin(), end, [id](EntryPtr entry) { + return entry->id == id; + }); + + FILE* result = nullptr; + + if (it != end) { + result = fopen((*it)->path.c_str(), mode.c_str()); + + if (result) { + type = (*it)->type; + fseek(result, 0, SEEK_END); + len = (size_t) ftell(result); + fseek(result, 0, SEEK_SET); + } + + this->Touch(id); + } + + /* open the file and return it regardless of cache status. */ + return result ? result : fopen(tempFilename(this->root, id).c_str(), mode.c_str()); +} + +void LruDiskCache::Delete(size_t id) { + Lock lock(stateMutex); + + auto it = this->cached.begin(); + while (it != this->cached.end()) { + if ((*it)->id == id) { + rm((*it)->path); + return; + } + else { + ++it; + } + } + + rm(tempFilename(this->root, id)); +} + +void LruDiskCache::SortAndPrune() { + Lock lock(this->stateMutex); + + std::sort( /* sort by access time */ + this->cached.begin(), + this->cached.end(), + [](EntryPtr e1, EntryPtr e2) { + return e1->time > e2->time; + }); + + /* prune old entries */ + int count = (int) this->cached.size(); + int extras = count - this->maxEntries; + for (int i = 0; i < extras; i++) { + auto entry = this->cached.back(); + if (rm(entry->path)) { + this->cached.pop_back(); + } + } +} + +void LruDiskCache::Touch(size_t id) { + Lock lock(this->stateMutex); + + auto end = this->cached.end(); + auto it = std::find_if(this->cached.begin(), end, [id](EntryPtr entry) { + return entry->id == id; + }); + + if (it != end) { + auto e = (*it); + fs::path p(e->path); + if (boost::filesystem::exists(p)) { + e->time = touch(p.string()); + this->SortAndPrune(); + return; + } + } +} \ No newline at end of file diff --git a/src/contrib/httpdatastream/LruDiskCache.h b/src/contrib/httpdatastream/LruDiskCache.h new file mode 100644 index 000000000..32e2af6db --- /dev/null +++ b/src/contrib/httpdatastream/LruDiskCache.h @@ -0,0 +1,78 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include + +#include + +class LruDiskCache { + public: + LruDiskCache(); + + void Purge(); + + bool Finalize(size_t id, std::string type); + FILE* Open(size_t id, const std::string& mode); + FILE* Open(size_t id, const std::string& mode, std::string& type, size_t& len); + bool Cached(size_t id); + void Delete(size_t id); + void Touch(size_t id); + + void Init(const std::string& root, size_t maxEntries); + + private: + struct Entry { + size_t id; + std::string path; + std::string type; + std::time_t time; + }; + + using EntryPtr = std::shared_ptr; + using EntryList = std::vector; + + void SortAndPrune(); + + static std::shared_ptr Parse(const boost::filesystem::path& path); + + std::recursive_mutex stateMutex; + + bool initialized; + size_t maxEntries; + EntryList cached; + std::string root; +}; \ No newline at end of file diff --git a/src/contrib/httpdatastream/RingBuffer.h b/src/contrib/httpdatastream/RingBuffer.h new file mode 100644 index 000000000..7bf843811 --- /dev/null +++ b/src/contrib/httpdatastream/RingBuffer.h @@ -0,0 +1,132 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "stdafx.h" +#include + +class RingBuffer { + public: + RingBuffer(int capacity) { + this->capacity = capacity; + this->data = new char[capacity]; + this->read = this->write = 0; + this->absoluteOffset = 0; + } + + ~RingBuffer() { + delete[] data; + } + + bool setReadOffset(unsigned int absolute) { + std::unique_lock lock(mutex); + if (absolute >= this->absoluteOffset && absolute <= this->absoluteOffset + size()) { + read = (absolute - this->absoluteOffset); + return true; + } + return false; + } + + unsigned int size() { + std::unique_lock lock(mutex); + return write - read; + } + + unsigned int avail() { + std::unique_lock lock(mutex); + return capacity - size(); + } + + bool empty() { + std::unique_lock lock(mutex); + return write == read; + } + + bool full() { + std::unique_lock lock(mutex); + return size() == capacity; + } + + void clear() { + std::unique_lock lock(mutex); + this->read = this->write = 0; + } + + void put(char* src, unsigned int len) { + std::unique_lock lock(mutex); + + int from = mask(write); + int to = from + len; + if (to > capacity) { + int firstChunk = capacity - write; + memcpy(&data[from], src, firstChunk); + memcpy(&data[0], src + firstChunk, len - firstChunk); + } + else { + memcpy(&data[from], src, len); + } + + write += len; + } + + unsigned int get(char* dst, unsigned int len) { + std::unique_lock lock(mutex); + + len = (size() < len ? size() : len); + int from = mask(read); + int to = from + len; + if (to > capacity) { + int firstChunk = capacity - read; + memcpy(dst, &data[from], firstChunk); + memcpy(dst + firstChunk, data, len - firstChunk); + } + else { + memcpy(dst, data + from, len); + } + + read += len; + return len; + } + + private: + unsigned int mask(int val) { + return val & (capacity - 1); + } + + char* data; + unsigned int capacity, read, write; + unsigned int absoluteOffset; + std::recursive_mutex mutex; +}; \ No newline at end of file diff --git a/src/contrib/httpdatastream/httpdatastream.vcproj b/src/contrib/httpdatastream/httpdatastream.vcproj new file mode 100644 index 000000000..d89b36ce4 --- /dev/null +++ b/src/contrib/httpdatastream/httpdatastream.vcproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/contrib/httpdatastream/httpdatastream.vcxproj b/src/contrib/httpdatastream/httpdatastream.vcxproj new file mode 100644 index 000000000..6f1d534c1 --- /dev/null +++ b/src/contrib/httpdatastream/httpdatastream.vcxproj @@ -0,0 +1,118 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {fa74d37c-8184-4596-bfe9-766c159045e1} + httpdatastream + Win32Proj + 10.0.14393.0 + + + + DynamicLibrary + Unicode + true + v141 + + + DynamicLibrary + Unicode + v141 + false + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)/bin/$(Configuration)/plugins\ + ./obj/$(Configuration)\ + $(SolutionDir)/bin/$(Configuration)/plugins\ + ./obj/$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ../../;../../3rdparty/include;../../3rdparty/win32_include;../../../../boost_1_64_0_b2;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + Level3 + EditAndContinue + $(IntDir)vc$(PlatformToolsetVersion).pdb + $(IntDir) + $(IntDir) + + + shlwapi.lib;libcurl.lib;%(AdditionalDependencies) + ../../3rdparty/win32_lib;../../../../boost_1_64_0_b2/lib32-msvc-14.1;%(AdditionalLibraryDirectories) + true + false + + + + + ../../;../../3rdparty/include;../../3rdparty/win32_include;../../../../boost_1_64_0_b2;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + Level3 + ProgramDatabase + $(IntDir)vc$(PlatformToolsetVersion).pdb + $(IntDir) + $(IntDir) + Speed + true + Full + true + + + shlwapi.lib;libcurl.lib;%(AdditionalDependencies) + ../../3rdparty/win32_lib;../../../../boost_1_64_0_b2/lib32-msvc-14.1;%(AdditionalLibraryDirectories) + false + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/contrib/httpdatastream/httpdatastream.vcxproj.filters b/src/contrib/httpdatastream/httpdatastream.vcxproj.filters new file mode 100644 index 000000000..6963c336f --- /dev/null +++ b/src/contrib/httpdatastream/httpdatastream.vcxproj.filters @@ -0,0 +1,46 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {f9e1d5f4-2b16-4312-bdba-45d853fb9b7f} + + + + + plugin + + + plugin + + + plugin + + + plugin + + + plugin + + + + + plugin + + + plugin + + + plugin + + + plugin + + + plugin + + + \ No newline at end of file diff --git a/src/contrib/httpdatastream/httpdatastream_plugin.cpp b/src/contrib/httpdatastream/httpdatastream_plugin.cpp new file mode 100644 index 000000000..de0cc7e49 --- /dev/null +++ b/src/contrib/httpdatastream/httpdatastream_plugin.cpp @@ -0,0 +1,66 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" + +#include "HttpDataStreamFactory.h" + +#include +#include + +#ifdef WIN32 + BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + return true; + } + + #define DLLEXPORT __declspec(dllexport) +#else + #define DLLEXPORT +#endif + +class HttpDataStreamPlugin : public musik::core::sdk::IPlugin { + virtual void Destroy() { delete this; }; + virtual const char* Name() { return "HTTP IDataStream"; } + virtual const char* Version() { return "0.1.0"; } + virtual const char* Author() { return "clangen"; } + virtual int SdkVersion() { return musik::core::sdk::SdkVersion; } +}; + +extern "C" DLLEXPORT IPlugin* GetPlugin() { + return new HttpDataStreamPlugin(); +} + +extern "C" DLLEXPORT IDataStreamFactory* GetDataStreamFactory() { + return new HttpDataStreamFactory(); +} diff --git a/src/contrib/httpdatastream/stdafx.cpp b/src/contrib/httpdatastream/stdafx.cpp new file mode 100644 index 000000000..83e24d2a8 --- /dev/null +++ b/src/contrib/httpdatastream/stdafx.cpp @@ -0,0 +1,35 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" \ No newline at end of file diff --git a/src/contrib/httpdatastream/stdafx.h b/src/contrib/httpdatastream/stdafx.h new file mode 100644 index 000000000..2b2db3de1 --- /dev/null +++ b/src/contrib/httpdatastream/stdafx.h @@ -0,0 +1,43 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#ifdef WIN32 +#define WIN32_LEAN_AND_MEAN +#define WINVER 0x0502 +#define _WIN32_WINNT 0x0502 +#define NOMINMAX +#include +#endif \ No newline at end of file diff --git a/src/contrib/nomaddecoder/NomadDecoder.cpp b/src/contrib/nomaddecoder/NomadDecoder.cpp index ee5b0e5fc..6ecc7ef40 100644 --- a/src/contrib/nomaddecoder/NomadDecoder.cpp +++ b/src/contrib/nomaddecoder/NomadDecoder.cpp @@ -52,7 +52,14 @@ static off_t nomadSeek(void *datasource, off_t offset, int whence) { IDataStream *stream = static_cast(datasource); if (whence == SEEK_END && stream->Length() > 0) { - stream->SetPosition(stream->Length() - offset); + /* the only time nomad ever seeks to the end is when it's trying to + determine the length in bytes. this optimization allows us to play + mp3 files over HTTP without needing to wait until the entire file + is downloaded. it also prevents unnecessary fseek() calls. */ + if (stream->Length() > 0) { + return stream->Length(); + } + return (off_t) -1; } else { PositionType pos = (whence == SEEK_SET) diff --git a/src/core/audio/PlaybackService.cpp b/src/core/audio/PlaybackService.cpp index c7246ace7..10993dca8 100755 --- a/src/core/audio/PlaybackService.cpp +++ b/src/core/audio/PlaybackService.cpp @@ -58,6 +58,8 @@ using musik::core::ILibraryPtr; using musik::core::audio::ITransport; using Editor = PlaybackService::Editor; +#undef DEBUG_USE_HTTP_URIS + #define NO_POSITION (size_t) -1 #define START_OVER (size_t) -2 @@ -291,7 +293,7 @@ void PlaybackService::ProcessMessage(IMessage &message) { return; } - if (this->GetTrackAtIndex(this->nextIndex)->Uri() == streamMessage->GetUri()) { + if (this->UriAtIndex(this->nextIndex) == streamMessage->GetUri()) { this->index = this->nextIndex; this->nextIndex = NO_POSITION; } @@ -898,9 +900,15 @@ void PlaybackService::Editor::Release() { } std::string PlaybackService::UriAtIndex(size_t index) { - auto track = this->playlist.Get(index); - if (track) { - return track->Uri(); + if (index < this->playlist.Count()) { + auto track = this->playlist.Get(index); + if (track) { +#ifdef DEBUG_USE_HTTP_URIS + return "http://localhost:7906/audio/" + std::to_string(track->GetId()); +#else + return track->Uri(); +#endif + } } return ""; } diff --git a/src/core/audio/Player.cpp b/src/core/audio/Player.cpp index acf36467d..965b8493a 100644 --- a/src/core/audio/Player.cpp +++ b/src/core/audio/Player.cpp @@ -163,13 +163,16 @@ void Player::Play() { void Player::Destroy() { { + if (this->stream) { + this->stream->Interrupt(); + } + std::unique_lock lock(this->queueMutex); if (this->state == Player::Quit && !this->thread) { return; /* already terminated (or terminating) */ } - this->stream->Interrupt(); this->state = Player::Quit; this->writeToOutputCondition.notify_all(); this->thread->detach(); diff --git a/src/core/audio/Stream.cpp b/src/core/audio/Stream.cpp index cb7d90057..bc64cd402 100644 --- a/src/core/audio/Stream.cpp +++ b/src/core/audio/Stream.cpp @@ -41,6 +41,7 @@ using namespace musik::core::audio; using namespace musik::core::sdk; +using namespace musik::core::io; static std::string TAG = "Stream"; @@ -125,7 +126,7 @@ bool Stream::OpenStream(std::string uri) { /* use our file stream abstraction to open the data at the specified URI */ - this->dataStream = musik::core::io::DataStreamFactory::OpenUri(uri.c_str()); + this->dataStream = DataStreamFactory::OpenSharedDataStream(uri.c_str()); if (!this->dataStream) { musik::debug::err(TAG, "failed to open " + uri); diff --git a/src/core/audio/Streams.cpp b/src/core/audio/Streams.cpp index 4e991f794..658b3ebd7 100644 --- a/src/core/audio/Streams.cpp +++ b/src/core/audio/Streams.cpp @@ -49,6 +49,8 @@ using musik::core::PluginFactory; using DataStreamPtr = musik::core::io::DataStreamFactory::DataStreamPtr; using DecoderFactoryList = std::vector >; using DspList = std::vector >; +using Deleter = PluginFactory::DestroyDeleter; +using DecoderPtr = std::shared_ptr; static std::mutex initLock; static DecoderFactoryList decoders; @@ -66,19 +68,19 @@ static void init() { namespace musik { namespace core { namespace audio { namespace streams { - std::shared_ptr GetDecoderForDataStream(DataStreamPtr dataStream) { + IDecoder* GetDecoderForDataStream(IDataStream* dataStream) { init(); - std::shared_ptr result; + IDecoder* decoder = nullptr; /* find a DecoderFactory we can use for this type of data*/ DecoderFactoryList::iterator factories = decoders.begin(); DecoderFactoryList::iterator end = decoders.end(); std::shared_ptr factory; - for ( ; factories != end && !factory; ++factories) { + for (; factories != end && !factory; ++factories) { if ((*factories)->CanHandle(dataStream->Type())) { - factory = (*factories); + factory = (*factories); } } @@ -87,29 +89,32 @@ namespace musik { namespace core { namespace audio { if (!factory) { /* nothing can decode this type of file */ musik::debug::err(TAG, "nothing could open " + uri); - return result; + return nullptr; } - IDecoder *decoder = factory->CreateDecoder(); + decoder = factory->CreateDecoder(); + if (!decoder) { /* shouldn't ever happen, the factory said it can handle this file */ - return result; + return nullptr; } /* ask the decoder to open the data stream. if it returns true we're good to start pulling data out of it! */ - typedef PluginFactory::DestroyDeleter Deleter; - - result.reset(decoder, Deleter()); - if (!result->Open(dataStream.get())) { + if (!decoder->Open(dataStream)) { musik::debug::err(TAG, "open ok, but decode failed " + uri); - result.reset(); - return result; + decoder->Destroy(); + return nullptr; } musik::debug::info(TAG, "about ready to play: " + uri); - return result; + return decoder; + } + + std::shared_ptr GetDecoderForDataStream(DataStreamPtr dataStream) { + auto decoder = GetDecoderForDataStream(dataStream.get()); + return decoder ? DecoderPtr(decoder, Deleter()) : DecoderPtr(); } DspList GetDspPlugins() { diff --git a/src/core/audio/Streams.h b/src/core/audio/Streams.h index 468f39911..3c5003100 100644 --- a/src/core/audio/Streams.h +++ b/src/core/audio/Streams.h @@ -49,6 +49,9 @@ namespace musik { namespace core { namespace audio { std::shared_ptr GetDecoderForDataStream(musik::core::io::DataStreamFactory::DataStreamPtr dataStream); + musik::core::sdk::IDecoder* + GetDecoderForDataStream(musik::core::sdk::IDataStream* stream); + std::vector > GetDspPlugins(); }; diff --git a/src/core/core.vcxproj b/src/core/core.vcxproj index d1153e5e1..c48bc647f 100755 --- a/src/core/core.vcxproj +++ b/src/core/core.vcxproj @@ -194,6 +194,7 @@ + diff --git a/src/core/core.vcxproj.filters b/src/core/core.vcxproj.filters index a3edaba7d..194f60891 100755 --- a/src/core/core.vcxproj.filters +++ b/src/core/core.vcxproj.filters @@ -453,5 +453,8 @@ src\sdk + + src\sdk + \ No newline at end of file diff --git a/src/core/db/Connection.h b/src/core/db/Connection.h index fb2bab8d8..9ea43b20c 100644 --- a/src/core/db/Connection.h +++ b/src/core/db/Connection.h @@ -65,7 +65,9 @@ namespace musik { namespace core { namespace db { int Close(); int Execute(const char* sql); int Execute(const wchar_t* sql); + uint64_t LastInsertedId(); + int LastModifiedRowCount(); void Interrupt(); diff --git a/src/core/io/DataStreamFactory.cpp b/src/core/io/DataStreamFactory.cpp index dfc45addf..90d04ef4c 100644 --- a/src/core/io/DataStreamFactory.cpp +++ b/src/core/io/DataStreamFactory.cpp @@ -42,6 +42,9 @@ using namespace musik::core::io; using namespace musik::core::sdk; +using DataStreamPtr = DataStreamFactory::DataStreamPtr; +using StreamDeleter = musik::core::PluginFactory::DestroyDeleter; + DataStreamFactory::DataStreamFactory() { typedef IDataStreamFactory PluginType; typedef musik::core::PluginFactory::DestroyDeleter Deleter; @@ -60,7 +63,7 @@ DataStreamFactory* DataStreamFactory::Instance() { return instance; } -DataStreamFactory::DataStreamPtr DataStreamFactory::OpenUri(const char *uri) { +IDataStream* DataStreamFactory::OpenDataStream(const char* uri) { typedef musik::core::PluginFactory::DestroyDeleter StreamDeleter; if (uri) { @@ -68,30 +71,35 @@ DataStreamFactory::DataStreamPtr DataStreamFactory::OpenUri(const char *uri) { DataStreamFactory::Instance()->dataStreamFactories.begin(); /* plugins get the first crack at the uri */ - for( ; it != DataStreamFactory::Instance()->dataStreamFactories.end(); it++) { + for (; it != DataStreamFactory::Instance()->dataStreamFactories.end(); it++) { if ((*it)->CanRead(uri)) { IDataStream* dataStream = (*it)->Open(uri); if (dataStream) { - return DataStreamPtr(dataStream, StreamDeleter()); + return dataStream; } } } /* no plugins accepted it? try to open as a local file */ - DataStreamPtr regularFile(new LocalFileStream(), StreamDeleter()); - + IDataStream* regularFile = new LocalFileStream(); if (regularFile->Open(uri)) { return regularFile; } + else { + regularFile->Destroy(); + } } - return DataStreamPtr(); + return nullptr; +} + +DataStreamPtr DataStreamFactory::OpenSharedDataStream(const char *uri) { + auto stream = OpenDataStream(uri); + return stream ? DataStreamPtr(stream, StreamDeleter()) : DataStreamPtr(); } bool DataStreamFactory::IsLocalFileStream(const char *uri) { - typedef musik::core::PluginFactory::DestroyDeleter StreamDeleter; - if (uri) { /* see if a plugin can handle this. if it can, then it's not considered to be a local file stream */ diff --git a/src/core/io/DataStreamFactory.h b/src/core/io/DataStreamFactory.h index 3b47caca1..0f9d8c79e 100644 --- a/src/core/io/DataStreamFactory.h +++ b/src/core/io/DataStreamFactory.h @@ -43,7 +43,10 @@ namespace musik { namespace core { namespace io { class DataStreamFactory { public: typedef std::shared_ptr DataStreamPtr; - static DataStreamPtr OpenUri(const char *uri); + + static DataStreamPtr OpenSharedDataStream(const char *uri); + static musik::core::sdk::IDataStream* OpenDataStream(const char* uri); + static bool IsLocalFileStream(const char *uri); private: diff --git a/src/core/library/LocalLibrary.cpp b/src/core/library/LocalLibrary.cpp index 87e58375b..584876408 100644 --- a/src/core/library/LocalLibrary.cpp +++ b/src/core/library/LocalLibrary.cpp @@ -254,6 +254,7 @@ static void upgradeV1toV2(db::Connection &db) { /* ensure each track has an external_id */ { db::ScopedTransaction transaction(db); + uint64_t id; db::Statement update("UPDATE tracks SET external_id=? WHERE id=?", db); diff --git a/src/core/plugin/Plugins.cpp b/src/core/plugin/Plugins.cpp index 0cd7a8f8a..adfb36afc 100644 --- a/src/core/plugin/Plugins.cpp +++ b/src/core/plugin/Plugins.cpp @@ -36,14 +36,47 @@ #include "Plugins.h" #include "PluginFactory.h" +#include #include + +#include +#include + #include + #include +#include using namespace musik::core; +using namespace musik::core::audio; using namespace musik::core::db::local; +using namespace musik::core::io; using namespace musik::core::sdk; +static class Environment : public IEnvironment { + public: + virtual size_t GetPath(PathType type, char* dst, int size) override { + std::string path; + switch (type) { + case PathUserHome: path = GetHomeDirectory(); break; + case PathData: path = GetDataDirectory(); break; + case PathApplication: path = GetApplicationDirectory(); break; + case PathPlugins: path = GetPluginDirectory(); break; + } + return CopyString(path, dst, size); + } + + virtual IDataStream* GetDataStream(const char* uri) override { + return DataStreamFactory::OpenDataStream(uri); + } + + virtual IDecoder* GetDecoder(IDataStream* stream) override { + return streams::GetDecoderForDataStream(stream); + } +} environment; + +typedef void(*SetEnvironment)(IEnvironment*); + typedef void(*SetSimpleDataProvider)(ISimpleDataProvider*); LocalSimpleDataProvider* dataProvider = nullptr; @@ -74,6 +107,13 @@ namespace musik { namespace core { namespace plugin { [indexerNotifier](musik::core::sdk::IPlugin* plugin, SetIndexerNotifier func) { func(indexerNotifier); }); + + /* environment */ + PluginFactory::Instance().QueryFunction( + "SetEnvironment", + [](musik::core::sdk::IPlugin* plugin, SetEnvironment func) { + func(&environment); + }); } void UninstallDependencies() { @@ -96,6 +136,13 @@ namespace musik { namespace core { namespace plugin { [](musik::core::sdk::IPlugin* plugin, SetIndexerNotifier func) { func(nullptr); }); + + /* environment */ + PluginFactory::Instance().QueryFunction( + "SetEnvironment", + [](musik::core::sdk::IPlugin* plugin, SetEnvironment func) { + func(nullptr); + }); } } } } diff --git a/src/core/sdk/IEnvironment.h b/src/core/sdk/IEnvironment.h new file mode 100644 index 000000000..6e25125ab --- /dev/null +++ b/src/core/sdk/IEnvironment.h @@ -0,0 +1,50 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007-2016 musikcube team +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// * Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "constants.h" +#include "IDataStream.h" +#include "IDecoder.h" + +namespace musik { namespace core { namespace sdk { + + class IEnvironment { + public: + virtual size_t GetPath(PathType type, char* dst, int size) = 0; + virtual IDataStream* GetDataStream(const char* uri) = 0; + virtual IDecoder* GetDecoder(IDataStream* stream) = 0; + }; + +} } } diff --git a/src/core/sdk/constants.h b/src/core/sdk/constants.h index 680b5235d..0c6cbf972 100644 --- a/src/core/sdk/constants.h +++ b/src/core/sdk/constants.h @@ -85,6 +85,13 @@ namespace musik { TimeChangeScrub }; + enum PathType { + PathUserHome, + PathData, + PathApplication, + PathPlugins + }; + enum class Capability : int { Prebuffer = 0x01 }; diff --git a/src/musikbox/Main.cpp b/src/musikbox/Main.cpp index 2555cbeac..98d3c48ae 100644 --- a/src/musikbox/Main.cpp +++ b/src/musikbox/Main.cpp @@ -90,11 +90,10 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmd _main(0, 0); } -int _main(int argc, wchar_t* argv[]) +int _main(int argc, wchar_t* argv[]) { #else -int main(int argc, char* argv[]) +int main(int argc, char* argv[]) { #endif -{ srand((unsigned int) time(0)); /* the following allows boost::filesystem to use utf8 on Windows */ diff --git a/src/musikbox/musikbox.vcxproj b/src/musikbox/musikbox.vcxproj index cbd3374d5..6490e962c 100755 --- a/src/musikbox/musikbox.vcxproj +++ b/src/musikbox/musikbox.vcxproj @@ -61,7 +61,7 @@ Disabled ./;../;../3rdparty/include;../3rdparty/win32_include;../../../boost_1_64_0_b2;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;CURL_STATICLIB;_DEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug @@ -74,27 +74,28 @@ true - ../../../boost_1_64_0_b2/lib32-msvc-14.1;%(AdditionalLibraryDirectories) + ../../../boost_1_64_0_b2/lib32-msvc-14.1;../3rdparty/win32_lib;%(AdditionalLibraryDirectories) %(IgnoreSpecificDefaultLibraries) true Windows MachineX86 - pdh.lib;psapi.lib;%(AdditionalDependencies) + pdh.lib;psapi.lib;Ws2_32.lib;wldap32.lib;libcurl.lib;crypto-41.lib;ssl-43.lib;tls-15.lib;%(AdditionalDependencies) false if not exist "$(TargetDir)themes" mkdir "$(TargetDir)themes" xcopy "$(ProjectDir)data\themes\*" "$(TargetDir)themes\" /Y /e if not exist "$(TargetDir)locales" mkdir "$(TargetDir)locales" -xcopy "$(ProjectDir)data\locales\*" "$(TargetDir)locales\" /Y /e +xcopy "$(ProjectDir)data\locales\*" "$(TargetDir)locales\" /Y /e +xcopy "$(SolutionDir)src\3rdparty\win32_bin\*" "$(TargetDir)" /Y /e ./;../;../3rdparty/include;../3rdparty/win32_include;../../../boost_1_64_0_b2;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;CURL_STATICLIB;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded Use Level3 @@ -109,7 +110,7 @@ xcopy "$(ProjectDir)data\locales\*" "$(TargetDir)locales\" /Y /e true - ../../../boost_1_64_0_b2/lib32-msvc-14.1;%(AdditionalLibraryDirectories) + ../../../boost_1_64_0_b2/lib32-msvc-14.1;../3rdparty/win32_lib;%(AdditionalLibraryDirectories) %(IgnoreSpecificDefaultLibraries) false Windows @@ -120,14 +121,15 @@ xcopy "$(ProjectDir)data\locales\*" "$(TargetDir)locales\" /Y /e MachineX86 - pdh.lib;psapi.lib;%(AdditionalDependencies) + pdh.lib;psapi.lib;Ws2_32.lib;wldap32.lib;libcurl.lib;crypto-41.lib;ssl-43.lib;tls-15.lib;%(AdditionalDependencies) true if not exist "$(TargetDir)themes" mkdir "$(TargetDir)themes" xcopy "$(ProjectDir)data\themes\*" "$(TargetDir)themes\" /Y /e if not exist "$(TargetDir)locales" mkdir "$(TargetDir)locales" -xcopy "$(ProjectDir)data\locales\*" "$(TargetDir)locales\" /Y /e +xcopy "$(ProjectDir)data\locales\*" "$(TargetDir)locales\" /Y /e +xcopy "$(SolutionDir)src\3rdparty\win32_bin\*" "$(TargetDir)" /Y /e