mirror of
https://github.com/curl/curl.git
synced 2025-01-12 13:55:11 +08:00
3f8fc25720
Aka "jumbo" or "amalgamation" builds. It means to compile all sources per target as a single C source. This is experimental. You can enable it by passing `-DCMAKE_UNITY_BUILD=ON` to cmake. It requires CMake 3.16 or newer. It makes builds (much) faster, allows for better optimizations and tends to promote less ambiguous code. Also add a new AppVeyor CI job and convert an existing one to use "unity" mode (one MSVC, one MinGW), and enable it for one macOS CI job. Fix related issues: - add missing include guard to `easy_lock.h`. - rename static variables and functions (and a macro) with names reused across sources, or shadowed by local variables. - add an `#undef` after use. - add a missing `#undef` before use. - move internal definitions from `ftp.h` to `ftp.c`. - `curl_memory.h` fixes to make it work when included repeatedly. - stop building/linking curlx bits twice for a static-mode curl tool. These caused doubly defined symbols in unity builds. - silence missing extern declarations compiler warning for ` _CRT_glob`. - fix extern declarations for `tool_freq` and `tool_isVistaOrGreater`. - fix colliding static symbols in debug mode: `debugtime()` and `statename`. - rename `ssl_backend_data` structure to unique names for each TLS-backend, along with the `ssl_connect_data` struct member referencing them. This required adding casts for each access. - add workaround for missing `[P]UNICODE_STRING` types in certain Windows builds when compiling `lib/ldap.c`. To support "unity" builds, we had to enable `SCHANNEL_USE_BLACKLISTS` for Schannel (a Windows `schannel.h` option) _globally_. This caused an indirect inclusion of Windows `schannel.h` from `ldap.c` via `winldap.h` to have it enabled as well. This requires `[P]UNICODE_STRING` types, which is apperantly not defined automatically (as seen with both MSVS and mingw-w64). This patch includes `<subauth.h>` to fix it. Ref: https://github.com/curl/curl/runs/13987772013 Ref: https://dev.azure.com/daniel0244/curl/_build/results?buildId=15827&view=logs&jobId=2c9f582d-e278-56b6-4354-f38a4d851906&j=2c9f582d-e278-56b6-4354-f38a4d851906&t=90509b00-34fa-5a81-35d7-5ed9569d331c - tweak unity builds to compile `lib/memdebug.c` separately in memory trace builds to avoid PP confusion. - force-disable unity for test programs. - do not compile and link libcurl sources to libtests _twice_ when libcurl is built in static mode. KNOWN ISSUES: - running tests with unity builds may fail in cases. - some build configurations/env may not compile in unity mode. E.g.: https://ci.appveyor.com/project/curlorg/curl/builds/47230972/job/51wfesgnfuauwl8q#L250 Ref: https://github.com/libssh2/libssh2/issues/1034 Ref: https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html Ref: https://en.wikipedia.org/wiki/Unity_build Closes #11095
143 lines
4.5 KiB
C
143 lines
4.5 KiB
C
#ifndef HEADER_CURL_SCHANNEL_INT_H
|
|
#define HEADER_CURL_SCHANNEL_INT_H
|
|
/***************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* Copyright (C) Marc Hoersken, <info@marc-hoersken.de>, et al.
|
|
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, 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.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.
|
|
*
|
|
* SPDX-License-Identifier: curl
|
|
*
|
|
***************************************************************************/
|
|
#include "curl_setup.h"
|
|
|
|
#ifdef USE_SCHANNEL
|
|
|
|
#ifdef __MINGW32__
|
|
#ifdef __MINGW64_VERSION_MAJOR
|
|
#define HAS_MANUAL_VERIFY_API
|
|
#endif
|
|
#else
|
|
#ifdef CERT_CHAIN_REVOCATION_CHECK_CHAIN
|
|
#define HAS_MANUAL_VERIFY_API
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(CryptStringToBinary) && defined(CRYPT_STRING_HEX) \
|
|
&& !defined(DISABLE_SCHANNEL_CLIENT_CERT)
|
|
#define HAS_CLIENT_CERT_PATH
|
|
#endif
|
|
|
|
#ifndef SCH_CREDENTIALS_VERSION
|
|
|
|
#define SCH_CREDENTIALS_VERSION 0x00000005
|
|
|
|
typedef enum _eTlsAlgorithmUsage
|
|
{
|
|
TlsParametersCngAlgUsageKeyExchange,
|
|
TlsParametersCngAlgUsageSignature,
|
|
TlsParametersCngAlgUsageCipher,
|
|
TlsParametersCngAlgUsageDigest,
|
|
TlsParametersCngAlgUsageCertSig
|
|
} eTlsAlgorithmUsage;
|
|
|
|
typedef struct _CRYPTO_SETTINGS
|
|
{
|
|
eTlsAlgorithmUsage eAlgorithmUsage;
|
|
UNICODE_STRING strCngAlgId;
|
|
DWORD cChainingModes;
|
|
PUNICODE_STRING rgstrChainingModes;
|
|
DWORD dwMinBitLength;
|
|
DWORD dwMaxBitLength;
|
|
} CRYPTO_SETTINGS, * PCRYPTO_SETTINGS;
|
|
|
|
typedef struct _TLS_PARAMETERS
|
|
{
|
|
DWORD cAlpnIds;
|
|
PUNICODE_STRING rgstrAlpnIds;
|
|
DWORD grbitDisabledProtocols;
|
|
DWORD cDisabledCrypto;
|
|
PCRYPTO_SETTINGS pDisabledCrypto;
|
|
DWORD dwFlags;
|
|
} TLS_PARAMETERS, * PTLS_PARAMETERS;
|
|
|
|
typedef struct _SCH_CREDENTIALS
|
|
{
|
|
DWORD dwVersion;
|
|
DWORD dwCredFormat;
|
|
DWORD cCreds;
|
|
PCCERT_CONTEXT* paCred;
|
|
HCERTSTORE hRootStore;
|
|
|
|
DWORD cMappers;
|
|
struct _HMAPPER **aphMappers;
|
|
|
|
DWORD dwSessionLifespan;
|
|
DWORD dwFlags;
|
|
DWORD cTlsParameters;
|
|
PTLS_PARAMETERS pTlsParameters;
|
|
} SCH_CREDENTIALS, * PSCH_CREDENTIALS;
|
|
|
|
#define SCH_CRED_MAX_SUPPORTED_PARAMETERS 16
|
|
#define SCH_CRED_MAX_SUPPORTED_ALPN_IDS 16
|
|
#define SCH_CRED_MAX_SUPPORTED_CRYPTO_SETTINGS 16
|
|
#define SCH_CRED_MAX_SUPPORTED_CHAINING_MODES 16
|
|
|
|
#endif /* SCH_CREDENTIALS_VERSION */
|
|
|
|
struct Curl_schannel_cred {
|
|
CredHandle cred_handle;
|
|
TimeStamp time_stamp;
|
|
TCHAR *sni_hostname;
|
|
#ifdef HAS_CLIENT_CERT_PATH
|
|
HCERTSTORE client_cert_store;
|
|
#endif
|
|
int refcount;
|
|
};
|
|
|
|
struct Curl_schannel_ctxt {
|
|
CtxtHandle ctxt_handle;
|
|
TimeStamp time_stamp;
|
|
};
|
|
|
|
struct schannel_ssl_backend_data {
|
|
struct Curl_schannel_cred *cred;
|
|
struct Curl_schannel_ctxt *ctxt;
|
|
SecPkgContext_StreamSizes stream_sizes;
|
|
size_t encdata_length, decdata_length;
|
|
size_t encdata_offset, decdata_offset;
|
|
unsigned char *encdata_buffer, *decdata_buffer;
|
|
/* encdata_is_incomplete: if encdata contains only a partial record that
|
|
can't be decrypted without another recv() (that is, status is
|
|
SEC_E_INCOMPLETE_MESSAGE) then set this true. after an recv() adds
|
|
more bytes into encdata then set this back to false. */
|
|
bool encdata_is_incomplete;
|
|
unsigned long req_flags, ret_flags;
|
|
CURLcode recv_unrecoverable_err; /* schannel_recv had an unrecoverable err */
|
|
bool recv_sspi_close_notify; /* true if connection closed by close_notify */
|
|
bool recv_connection_closed; /* true if connection closed, regardless how */
|
|
bool recv_renegotiating; /* true if recv is doing renegotiation */
|
|
bool use_alpn; /* true if ALPN is used for this connection */
|
|
#ifdef HAS_MANUAL_VERIFY_API
|
|
bool use_manual_cred_validation; /* true if manual cred validation is used */
|
|
#endif
|
|
};
|
|
|
|
#endif /* USE_SCHANNEL */
|
|
#endif /* HEADER_CURL_SCHANNEL_INT_H */
|