25 Commits
0.3.0 ... 0.4.0

Author SHA1 Message Date
Sergey Abramchuk
f4f98ddf88 Merge branch 'release/0.4.0' 2019-11-03 15:03:04 +03:00
Sergey Abramchuk
b04a285210 Update readme file 2019-11-03 15:02:14 +03:00
Sergey Abramchuk
2d1fdfb019 Update version number in the Podfile 2019-11-03 15:00:03 +03:00
Sergey Abramchuk
ad77627ca9 Bump version number 2019-11-03 14:55:00 +03:00
Sergey Abramchuk
d8a55bc358 Merge branch 'feature/update-dependencies' into develop 2019-11-03 11:16:36 +03:00
Sergey Abramchuk
76e5488aa1 Fix get/set settings test 2019-11-03 11:13:43 +03:00
Sergey Abramchuk
c3ed67b67d Reset tun without any conditions and drop idea to override remote server 2019-11-03 11:05:14 +03:00
Sergey Abramchuk
f9d506ffca Reset packet flow within resetTun method 2019-11-03 11:04:12 +03:00
Sergey Abramchuk
ef93e5adc9 Fix missing symbols for arm archs 2019-11-02 13:13:31 +03:00
Sergey Abramchuk
3db23628cb Disable Catalyst support 2019-11-02 11:26:59 +03:00
Sergey Abramchuk
7331ae5fad Add new properties to the OpenVPNCOnfiguration 2019-11-02 10:29:21 +03:00
Sergey Abramchuk
aa396dad2d Add new OpenVPN events and errors 2019-10-26 10:20:37 +03:00
Sergey Abramchuk
29bd59f78f Merge commit 'f44694ce5f781924b6094c4c18f8bf83a3da7857' into feature/update-dependencies 2019-10-25 20:20:11 +03:00
Sergey Abramchuk
f44694ce5f Squashed 'Sources/OpenVPNAdapter/Libraries/Vendors/asio/' changes from 90f32660cd..8d4c8c3ce4
8d4c8c3ce4 asio version 1.14.0 released
30336a0873 Revision history.
2a1f68845a On Windows, ensure global object destructors are run.
6f55aeecd0 Fix move-based async_accept between sockets with different executor types.
c1c068c6ad The executor is copied, not moved, when the I/O object moves.
37c8d91d21 Add runtime detection of native I/O executors when using polymorphic wrapper.

git-subtree-dir: Sources/OpenVPNAdapter/Libraries/Vendors/asio
git-subtree-split: 8d4c8c3ce43c866f609d2eda9a43fe5b334620be
2019-10-25 20:20:10 +03:00
Sergey Abramchuk
238abab032 Merge commit '688ce110819545502762729feaa505b67e2fe58e' into feature/update-dependencies 2019-10-25 20:14:12 +03:00
Sergey Abramchuk
688ce11081 Squashed 'Sources/OpenVPNAdapter/Libraries/Vendors/openvpn/' changes from 7db7a009b0..29e060ffb3
29e060ffb3 CryptoAlgs: Don't report any digests for ciphers not using them
87d40ed8da ovpncli.cpp: socket_protect implementation for agent-enabled builds
12763bbbb8 win/client/tunsetup.hpp: implement add_bypass_route() method
c445361969 vcxprox: add missing file
0d7143c4bf transport: enable socket_protect call for all platforms
a6cae41285 cliopt.hpp: disable remote list bypass for agent-enabled build
3166957e2e add error codes for better error management at profile parsing time

git-subtree-dir: Sources/OpenVPNAdapter/Libraries/Vendors/openvpn
git-subtree-split: 29e060ffb34b8a4067d8d01f6506bdb2d220df02
2019-10-25 20:14:12 +03:00
Sergey Abramchuk
3980fb9be5 Merge commit '8e87aecebf66f50957e35966c547d77a6fb526ab' into feature/update-dependencies 2019-10-12 15:50:03 +03:00
Sergey Abramchuk
8e87aecebf Squashed 'Sources/OpenVPNAdapter/Libraries/Vendors/openvpn/' changes from 275cf80efb..7db7a009b0
7db7a009b0 proto: Client complains about stub compressors
390154d0e4 Update Build instructions for OSX
1b92069834 deps: Update to mbedtls-2.7.12
8cab79540d compression: Extend compression alert to include server pushes
67b4641a99 CompressContext: Add is_any_stub() method
cdf9e7bece compression: Issue an Event if compression is activated
fa38064403 build script: added a new PROF type "auto" that tries to automatically determine the local platform
7ce7b52b7c MTRand: added OPENVPN_INSECURE_RANDOM compile flag that allows MTRand to masquerade as a secure RNG
85e7e49f72 MTRand: added constructor accepting an initialization seed
1fa3229a10 IPv4, IPv6: added #include <openvpn/common/hash.hpp>
48e9217d26 vcxproj: add missing header file
d2a2601b2f Wintun: unmap ring buffers
e320bc63ff openssl: Improve OpenSSLContext fencing against multiple declarations
2f8fe2d318 openssl: Missing inline keyword in a couple of compat functions
32b984c0ff enum_dir: use a function template
725ee04593 VPNServerNetblock::Netblock::to_string(): show prefix_len
409d1c52b8 ManClientInstance::Send::describe_user(): added bool show_userprop parameter
e05fc16b20 string::indent(): try to fix all the corner cases
4e1645ea80 RunContext: mark virtual Stop* async_stop() with override attribute
e8b31c5454 cli: advertise "openurl" as supported SSO method
80b45731eb ICMPv6: added DEST_UNREACH code
679003094d AsioTimerSafe: refactor to allow as drop-in replacement for AsioTimer
f7845578f1 RunContext: check for halt in timer closure
84483eda25 AsioPolySock: add support for socket shutdown
1b3402aec3 tcplinkcommon.hpp: added missing include
2e26c7565c time: added nanotime_t typedef
c3c8ab7f6b string: added additional detail to split() comment
95ce4f22c8 string: added to_delim() method then redefined first_line() method to use it
448218b1e1 string: added add_leading() method
e3b0bf4f5c MSF iterator: allow conversion from ordinary iterator and added exists() method
11412ac50a AsioPolySock: in remote_endpoint_str() method, test for alt_routing_enabled()
9fb4e705f9 Added TimeSkew to skew a time duration by a random flux
7496383002 write_binary_atomic: reduce the length of the temporary filename
b31d9c0191 auth-token-user: increase size limit to 340 chars
c82644c03a Added BufferLineIterator
115cb656b6 RandomAPI: added randbyte() and randbool() methods
4fa8348689 RunContext: ASIO SIGNAL message now shows signal name rather than number
ebfce58513 Added StaticBuffer, a constant-length Buffer for writing that cannot be extended
c8f9cb88a4 string::split(): call reserve() on return vector
f15e566065 read_binary_unix_fast: should return an int (i.e. errno), not a bool
60501b4513 random: factor out rand32_distribute() from RandomAPI::randrange32()
90123495a5 wintun: get device interfaces list only once
ec790df73b wintun: read packets in bulk
0f85d3f729 wintun: use correct io_context when performing initial read
a6151cdeab wintun: use auto-reset events
29acfd95f3 libs: update ASIO to 1.14.0
438a0ef287 Remove outdated and unused android build files
e9df57969f Merge remote-tracking branch 'origin/released'
44725ad094 ssl: Fix building with OpenSSL 1.0.2
efe3f1f635 version: Reset version reference for git master
8c79c06d94 Make tls-crypt/tls-cryptv2 compile with multiple compilation units
4d18aaeb88 Fix LLVM warnings reported during OS X build
8c9496bb4d Use const_cast for SSL_session_reused
33be562a39 Add missing override keywords to openssl/sslctx.hpp
2c5435a000 dcocli: use compile time define for Tun methods instead of hardcoded iproute
7c39088f00 Allow overriding reported HW_ADDR and support IV_PLAT_VER
7bb1ea19ee Move sending IV_UI_VER and IV_SSO to build_peer_info
23959fa705 Add reporting of IV_SSL_VER
63ab5b5e46 Only initialise static member in OpenSSLContext once
ecebb40304 Merge remote-tracking branch 'origin/qa'
52c9702502 wintun: replace volatiles with atomics
d720c7104c appveyor: install Strawberry perl
60a253a7ef appveyor: update to VS2019
48f2b5100b wintun: support for privilege separation
6f266be3d8 wintun: ring buffers support
baa1ce2ccf vcxproj: bump VS version to 2019
98bfd037e3 tun/win: factor out ClientConfig into separate header
aeb5ce0ad7 wintun: open device with SetupAPI
3998d303ce Finalizing the OpenVPN 3 Core library 3.3 release
728733aee7 deps/mbedtls: rebase "enable unsupported critical extensions" patch
43e36ca45a lib-version: update to mbedtls-2.7.11
4dbcd85e50 openssl/cipher.hpp: add missing include <compat.hpp>
69d72ed64f DCOTransport: Fix server side specific trunk handling
ff732e3b5d Fix OpenVPN Core build with OpenSSL 1.1.0
0da42f393f Do not use deprecated OpenSSL 1.1.0 methods
35062c0b60 travis.yml: update environment
47046cf6d2 Merge branch 'qa'
6933c395a4 [OVPN3-423] cliconnect.hpp: fix reconnect on Windows after sleep
462c36c813 random_subnet(): added comment
ac1d447156 IP::Addr::from_byte_string(): fixed bug for IPv6 case
d6eaea3468 string::split(): minor implementation tweaks
ca15b7cdf4 hexstr: added dump_hex() variant accepting void *
0e61a2afd7 SessionIDType::find_weak: added conflict parameter
089aec00b1 DCOTransport: new routing code for trunk links
5befbd430f build: added CAP=1 -- build with libcap
eb85ada21e signals: added trivial signal_name() function
f89013ef92 RunContext: don't try to catch SIGQUIT by default
e0ee540135 SessionIDType: added hash() method
f0e1f8aa42 logging: added basic components for logrotate
fbb0c81f29 UMask: added UMaskDaemon, a umask context object appropriate for daemons
1c7bac90d9 build script: when building with DEBUG=1 on Linux, use -ggdb instead of -g
73cce80e43 OpenSSL: added openssl_reseed_rng() function
25780cf798 OpenSSL: fixed some memory leaks in CipherContextGCM and TokenEncrypt
168dba95f5 OpenSSL: define OPENSSL_SERVER_SNI when OpenSSL version is at least 1.1
84e78d8fed SNI: added OpenVPN client support for SNI (currently OpenSSL only)
310766b270 build: added MTLS_DIST setting
4eaa46a879 MbedTLS: added MBEDTLS_DISABLE_NAME_CONSTRAINTS preprocessor flag
16226d1b05 OpenSSLSign: updated for OpenSSL 1.1
aed0678c96 SSL: added SNI::Metadata, an abstract base class for packaging app-specific SNI metadata in AuthCert
001b731fe2 SNI: create SNI namespace and rename SNIHandlerBase -> SNI::HandlerBase
4bd5869305 README.rst: Make Windows-specific build steps up to date.
ac365ee977 wintun: support for 0.4
9245056a2a wintun: support for 0.3
b73d484950 mbedtls: throw exception on unsupported SSL:Const::PEER_CERT_OPTIONAL option
1d6bae4b5b tcplinkcommon: bubble up real exception error
c18c8bd156 tcpcli: ensure SSL Factory survives as long as TLS link
4192193087 tls: parse and load TLS specific CA
2a19b7fcff win/tuncli.hpp: fix Wintun padding calculation
44cb9f44da appveyor: make ReleaseOpenSSL default configuration
5485de19a2 win/impersonate: refactor impersonate logic
29a655147b win/tunsetup.hpp: remove unneeded parameter
61794b0efd win: link OpenSSL dynamically
e569b84465 win/tuncli.hpp: fix indentation
374c57e708 frame_init.hpp: tweak wintun read buf size
c3c45c9b38 tun: added Error::TUN_HALT for tun_error() signaling
acd7af5e9a RandomAPI: added randrange32() method
c1a7f8cc68 std::clamp() is useful but only available in C++17 and up, so we add our own clamp()
f8c71ef1ce Minor change to Error::INACTIVE_TIMEOUT handler
3202ab5fce OpenSSLSign: renamed OpenSSLPKI::X509Base to OpenSSLPKI::X509 to conform to changes in OpenSSLPKI
8d767febb5 ReachabilityBase: added virtual destructor
6a4826965f MbedTLS: update json_override() prototype
bee0d8d187 SSL: added SSLConst::SEND_CLIENT_CA_LIST server-side flag and implemented for OpenSSL
5eb39c1dea AuthCert: save the SNI name
3b34449d0e SSLAPI: auth_cert() can now be const
a672e91631 SNI server-side: support additional JSON configuration settings
95e761f3cc OpenSSL PKI cleanup
d5eb77c53c AuthCert::Fail cleanup
6e98b9aadc SSLAPI: move PKType from SSLConfigAPI into standalone header to avoid dependency inversion
bbae814864 OpenSSL: added SNI implementation
5def1d23ab OpenSSLContext: in constructor, removed redundant if statement
1a0747e783 OpenSSLContext: in constructor, consolidate sslopt fixed flags
eef9868816 OpenSSLContext::SSL::ssl_handshake_details(): include leaf-cert CN in details
f9631cd90f AuthCert::Fail: use std::string for the reason string (instead of const char *)
a17b77641f OpenSSLPKI::X509: copy constructor doesn't need erase() and define X509::Ptr
78cae5bb52 OpenSSLPKI::DH: copy constructor doesn't need erase()
c0d43a4153 RCPtr: added static_pointer_cast() method
34a3f264f5 [OVPN-314] Add support for signalling SSO support via IV_SSO
7d112eb3e5 cli: enable utf8 console output
980ef1eff8 win/call.hpp: re-encode command output to utf8
fddb440e99 unicode.hpp: customize utf16 conversion routine
4d7c12ac4d [OVPN3-405] Support for non-ASCII profile path on Windows

git-subtree-dir: Sources/OpenVPNAdapter/Libraries/Vendors/openvpn
git-subtree-split: 7db7a009b0b4eca0fc3733c99c50aff7f7c2556f
2019-10-12 15:50:02 +03:00
Sergey Abramchuk
828011bbd3 Update mbedTLS library 2019-10-12 15:24:52 +03:00
Sergey Abramchuk
a6e3758c68 Add macOS generated items to the gitignore 2019-10-12 13:00:26 +03:00
Sergey Abramchuk
fb23b2a92e Define TUNNEL_CONFIGURATION_TIMEOUT macro 2019-09-26 13:21:24 +03:00
Sergey Abramchuk
7faa96b809 OpenVPNClient should be responsible for copying of config 2019-09-26 13:17:06 +03:00
Sergey Abramchuk
8d167952b1 Reset tunnel depending on tunPersist settings 2019-09-26 13:01:20 +03:00
Sergey Abramchuk
d1f794ae57 Expose tunPersist setting 2019-09-26 10:35:53 +03:00
Sergey Abramchuk
96cf2d1804 Merge tag '0.3.0' into develop
no message
2019-06-29 10:39:58 +03:00
196 changed files with 3989 additions and 1451 deletions

30
.gitignore vendored
View File

@@ -48,3 +48,33 @@ playground.xcworkspace
# Carthage/Checkouts # Carthage/Checkouts
Carthage/Build Carthage/Build
## macOS generated
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

View File

@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>0.3.0</string> <string>0.4.0</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string> <string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key> <key>NSPrincipalClass</key>

View File

@@ -3,7 +3,7 @@ Pod::Spec.new do |s|
# ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.name = "OpenVPNAdapter" s.name = "OpenVPNAdapter"
s.version = "0.3.0" s.version = "0.4.0"
s.summary = "Objective-C wrapper for OpenVPN library. Compatible with iOS and macOS." s.summary = "Objective-C wrapper for OpenVPN library. Compatible with iOS and macOS."
s.description = <<-DESC s.description = <<-DESC
OpenVPNAdapter is an Objective-C framework that allows to easily configure and establish VPN connection using OpenVPN protocol. OpenVPNAdapter is an Objective-C framework that allows to easily configure and establish VPN connection using OpenVPN protocol.

View File

@@ -1137,6 +1137,7 @@
SDKROOT = iphoneos; SDKROOT = iphoneos;
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
SUPPORTS_MACCATALYST = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0; SWIFT_VERSION = 4.0;
@@ -1185,6 +1186,7 @@
SDKROOT = iphoneos; SDKROOT = iphoneos;
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
SUPPORTS_MACCATALYST = NO;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 4.0; SWIFT_VERSION = 4.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";

View File

@@ -33,7 +33,7 @@ To install OpenVPNAdapter with Cocoapods, add the following lines to your `Podfi
```ruby ```ruby
target 'Your Target Name' do target 'Your Target Name' do
use_frameworks! use_frameworks!
pod 'OpenVPNAdapter', :git => 'https://github.com/ss-abramchuk/OpenVPNAdapter.git', :tag => '0.3.0' pod 'OpenVPNAdapter', :git => 'https://github.com/ss-abramchuk/OpenVPNAdapter.git', :tag => '0.4.0'
end end
``` ```
@@ -177,6 +177,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
// Additional parameters as key:value pairs may be provided here // Additional parameters as key:value pairs may be provided here
] ]
// Add this line if you want to keep TUN interface active during pauses or reconnections
configuration.tunPersist = true
// Apply OpenVPN configuration // Apply OpenVPN configuration
let properties: OpenVPNProperties let properties: OpenVPNProperties
do { do {

View File

@@ -1,4 +1,4 @@
asio version 1.13.0 asio version 1.14.0
Released Tuesday, 12 March 2019. Released Sunday, 14 April 2019.
See doc/index.html for API documentation and a tutorial. See doc/index.html for API documentation and a tutorial.

View File

@@ -1,4 +1,4 @@
AC_INIT(asio, [1.13.0]) AC_INIT(asio, [1.14.0])
AC_CONFIG_SRCDIR(include/asio.hpp) AC_CONFIG_SRCDIR(include/asio.hpp)
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
AM_INIT_AUTOMAKE([tar-ustar]) AM_INIT_AUTOMAKE([tar-ustar])

View File

@@ -24,8 +24,34 @@
#include "asio/detail/push_options.hpp" #include "asio/detail/push_options.hpp"
namespace asio { namespace asio {
class executor;
namespace detail { namespace detail {
inline bool is_native_io_executor(const io_context::executor_type&)
{
return true;
}
template <typename Executor>
inline bool is_native_io_executor(const Executor&,
typename enable_if<!is_same<Executor, executor>::value>::type* = 0)
{
return false;
}
template <typename Executor>
inline bool is_native_io_executor(const Executor& ex,
typename enable_if<is_same<Executor, executor>::value>::type* = 0)
{
#if !defined (ASIO_NO_TYPEID)
return ex.target_type() == typeid(io_context::executor_type);
#else // !defined (ASIO_NO_TYPEID)
return false;
#endif // !defined (ASIO_NO_TYPEID)
}
template <typename IoObjectService, template <typename IoObjectService,
typename Executor = io_context::executor_type> typename Executor = io_context::executor_type>
class io_object_impl class io_object_impl
@@ -46,8 +72,7 @@ public:
// Construct an I/O object using an executor. // Construct an I/O object using an executor.
explicit io_object_impl(const executor_type& ex) explicit io_object_impl(const executor_type& ex)
: service_(&asio::use_service<IoObjectService>(ex.context())), : service_(&asio::use_service<IoObjectService>(ex.context())),
implementation_executor_(ex, implementation_executor_(ex, (is_native_io_executor)(ex))
is_same<Executor, io_context::executor_type>::value)
{ {
service_->construct(implementation_); service_->construct(implementation_);
} }
@@ -68,9 +93,7 @@ public:
// Move-construct an I/O object. // Move-construct an I/O object.
io_object_impl(io_object_impl&& other) io_object_impl(io_object_impl&& other)
: service_(&other.get_service()), : service_(&other.get_service()),
implementation_executor_( implementation_executor_(other.get_implementation_executor())
ASIO_MOVE_CAST(implementation_executor_type)(
other.implementation_executor_))
{ {
service_->move_construct(implementation_, other.implementation_); service_->move_construct(implementation_, other.implementation_);
} }

View File

@@ -151,8 +151,10 @@ private:
template <typename Protocol, typename PeerIoExecutor, template <typename Protocol, typename PeerIoExecutor,
typename Handler, typename IoExecutor> typename Handler, typename IoExecutor>
class reactive_socket_move_accept_op : class reactive_socket_move_accept_op :
private Protocol::socket, private Protocol::socket::template rebind_executor<PeerIoExecutor>::other,
public reactive_socket_accept_op_base<typename Protocol::socket, Protocol> public reactive_socket_accept_op_base<
typename Protocol::socket::template rebind_executor<PeerIoExecutor>::other,
Protocol>
{ {
public: public:
ASIO_DEFINE_HANDLER_PTR(reactive_socket_move_accept_op); ASIO_DEFINE_HANDLER_PTR(reactive_socket_move_accept_op);
@@ -161,8 +163,8 @@ public:
socket_type socket, socket_ops::state_type state, socket_type socket, socket_ops::state_type state,
const Protocol& protocol, typename Protocol::endpoint* peer_endpoint, const Protocol& protocol, typename Protocol::endpoint* peer_endpoint,
Handler& handler, const IoExecutor& io_ex) Handler& handler, const IoExecutor& io_ex)
: Protocol::socket(peer_io_ex), : peer_socket_type(peer_io_ex),
reactive_socket_accept_op_base<typename Protocol::socket, Protocol>( reactive_socket_accept_op_base<peer_socket_type, Protocol>(
socket, state, *this, protocol, peer_endpoint, socket, state, *this, protocol, peer_endpoint,
&reactive_socket_move_accept_op::do_complete), &reactive_socket_move_accept_op::do_complete),
handler_(ASIO_MOVE_CAST(Handler)(handler)), handler_(ASIO_MOVE_CAST(Handler)(handler)),
@@ -194,9 +196,9 @@ public:
// to ensure that any owning sub-object remains valid until after we have // to ensure that any owning sub-object remains valid until after we have
// deallocated the memory here. // deallocated the memory here.
detail::move_binder2<Handler, detail::move_binder2<Handler,
asio::error_code, typename Protocol::socket> asio::error_code, peer_socket_type>
handler(0, ASIO_MOVE_CAST(Handler)(o->handler_), o->ec_, handler(0, ASIO_MOVE_CAST(Handler)(o->handler_), o->ec_,
ASIO_MOVE_CAST(typename Protocol::socket)(*o)); ASIO_MOVE_CAST(peer_socket_type)(*o));
p.h = asio::detail::addressof(handler.handler_); p.h = asio::detail::addressof(handler.handler_);
p.reset(); p.reset();
@@ -211,6 +213,9 @@ public:
} }
private: private:
typedef typename Protocol::socket::template
rebind_executor<PeerIoExecutor>::other peer_socket_type;
Handler handler_; Handler handler_;
IoExecutor io_executor_; IoExecutor io_executor_;
}; };

View File

@@ -35,7 +35,7 @@ struct win_global_impl
static win_global_impl instance_; static win_global_impl instance_;
static static_mutex mutex_; static static_mutex mutex_;
static T* ptr_; T* ptr_;
static tss_ptr<T> tss_ptr_; static tss_ptr<T> tss_ptr_;
}; };
@@ -45,9 +45,6 @@ win_global_impl<T> win_global_impl<T>::instance_ = { 0 };
template <typename T> template <typename T>
static_mutex win_global_impl<T>::mutex_ = ASIO_STATIC_MUTEX_INIT; static_mutex win_global_impl<T>::mutex_ = ASIO_STATIC_MUTEX_INIT;
template <typename T>
T* win_global_impl<T>::ptr_ = 0;
template <typename T> template <typename T>
tss_ptr<T> win_global_impl<T>::tss_ptr_; tss_ptr<T> win_global_impl<T>::tss_ptr_;
@@ -58,9 +55,9 @@ T& win_global()
{ {
win_global_impl<T>::mutex_.init(); win_global_impl<T>::mutex_.init();
static_mutex::scoped_lock lock(win_global_impl<T>::mutex_); static_mutex::scoped_lock lock(win_global_impl<T>::mutex_);
if (win_global_impl<T>::ptr_ == 0) if (win_global_impl<T>::instance_.ptr_ == 0)
win_global_impl<T>::ptr_ = new T; win_global_impl<T>::instance_.ptr_ = new T;
win_global_impl<T>::tss_ptr_ = win_global_impl<T>::ptr_; win_global_impl<T>::tss_ptr_ = win_global_impl<T>::instance_.ptr_;
} }
return *win_global_impl<T>::tss_ptr_; return *win_global_impl<T>::tss_ptr_;

View File

@@ -262,9 +262,9 @@ public:
// to ensure that any owning sub-object remains valid until after we have // to ensure that any owning sub-object remains valid until after we have
// deallocated the memory here. // deallocated the memory here.
detail::move_binder2<Handler, detail::move_binder2<Handler,
asio::error_code, typename Protocol::socket> asio::error_code, peer_socket_type>
handler(0, ASIO_MOVE_CAST(Handler)(o->handler_), ec, handler(0, ASIO_MOVE_CAST(Handler)(o->handler_), ec,
ASIO_MOVE_CAST(typename Protocol::socket)(o->peer_)); ASIO_MOVE_CAST(peer_socket_type)(o->peer_));
p.h = asio::detail::addressof(handler.handler_); p.h = asio::detail::addressof(handler.handler_);
p.reset(); p.reset();
@@ -279,10 +279,13 @@ public:
} }
private: private:
typedef typename Protocol::socket::template
rebind_executor<PeerIoExecutor>::other peer_socket_type;
win_iocp_socket_service_base& socket_service_; win_iocp_socket_service_base& socket_service_;
socket_type socket_; socket_type socket_;
socket_holder new_socket_; socket_holder new_socket_;
typename Protocol::socket peer_; peer_socket_type peer_;
Protocol protocol_; Protocol protocol_;
typename Protocol::endpoint* peer_endpoint_; typename Protocol::endpoint* peer_endpoint_;
unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2]; unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2];

View File

@@ -18,6 +18,6 @@
// ASIO_VERSION % 100 is the sub-minor version // ASIO_VERSION % 100 is the sub-minor version
// ASIO_VERSION / 100 % 1000 is the minor version // ASIO_VERSION / 100 % 1000 is the minor version
// ASIO_VERSION / 100000 is the major version // ASIO_VERSION / 100000 is the major version
#define ASIO_VERSION 101300 // 1.13.0 #define ASIO_VERSION 101400 // 1.14.0
#endif // ASIO_VERSION_HPP #endif // ASIO_VERSION_HPP

View File

@@ -7,6 +7,21 @@
[section:history Revision History] [section:history Revision History]
[heading Asio 1.14.0]
* Improved I/O object performance by adding runtime detection of native I/O
executors when using the polymorphic executor wrapper.
* Changed I/O object move constructors so that the executor is copied, not
moved. This ensures that the moved-from I/O object is left in the same state
as if constructed with a valid executor but without a resource.
* On Windows, fixed an issue where global object destructors were not being
run.
* Fixed move-based `async_accept` between sockets with different executor
types.
[heading Asio 1.13.0] [heading Asio 1.13.0]
* Added custom I/O executor support to I/O objects. * Added custom I/O executor support to I/O objects.

View File

@@ -729,6 +729,17 @@ struct move_accept_handler
private: private:
move_accept_handler(const move_accept_handler&) {} move_accept_handler(const move_accept_handler&) {}
}; };
struct move_accept_ioc_handler
{
move_accept_ioc_handler() {}
void operator()(const asio::error_code&,
asio::basic_stream_socket<asio::ip::tcp,
asio::io_context::executor_type>) {}
move_accept_ioc_handler(move_accept_handler&&) {}
private:
move_accept_ioc_handler(const move_accept_handler&) {}
};
#endif // defined(ASIO_HAS_MOVE) #endif // defined(ASIO_HAS_MOVE)
void test() void test()
@@ -913,8 +924,12 @@ void test()
#if defined(ASIO_HAS_MOVE) #if defined(ASIO_HAS_MOVE)
acceptor1.async_accept(move_accept_handler()); acceptor1.async_accept(move_accept_handler());
acceptor1.async_accept(ioc, move_accept_handler()); acceptor1.async_accept(ioc, move_accept_handler());
acceptor1.async_accept(ioc_ex, move_accept_handler());
acceptor1.async_accept(ioc_ex, move_accept_ioc_handler());
acceptor1.async_accept(peer_endpoint, move_accept_handler()); acceptor1.async_accept(peer_endpoint, move_accept_handler());
acceptor1.async_accept(ioc, peer_endpoint, move_accept_handler()); acceptor1.async_accept(ioc, peer_endpoint, move_accept_handler());
acceptor1.async_accept(ioc_ex, peer_endpoint, move_accept_handler());
acceptor1.async_accept(ioc_ex, peer_endpoint, move_accept_ioc_handler());
#endif // defined(ASIO_HAS_MOVE) #endif // defined(ASIO_HAS_MOVE)
} }
catch (std::exception&) catch (std::exception&)

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_AESNI_H #ifndef MBEDTLS_AESNI_H
#define MBEDTLS_AESNI_H #define MBEDTLS_AESNI_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "aes.h" #include "aes.h"
#define MBEDTLS_AESNI_AES 0x02000000u #define MBEDTLS_AESNI_AES 0x02000000u

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_ASN1_WRITE_H #ifndef MBEDTLS_ASN1_WRITE_H
#define MBEDTLS_ASN1_WRITE_H #define MBEDTLS_ASN1_WRITE_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "asn1.h" #include "asn1.h"
#define MBEDTLS_ASN1_CHK_ADD(g, f) do { if( ( ret = f ) < 0 ) return( ret ); else \ #define MBEDTLS_ASN1_CHK_ADD(g, f) do { if( ( ret = f ) < 0 ) return( ret ); else \
@@ -183,24 +189,27 @@ int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start,
const char *text, size_t text_len ); const char *text, size_t text_len );
/** /**
* \brief Write a bitstring tag (MBEDTLS_ASN1_BIT_STRING) and * \brief Write a bitstring tag (#MBEDTLS_ASN1_BIT_STRING) and
* value in ASN.1 format * value in ASN.1 format.
* Note: function works backwards in data buffer
* *
* \param p reference to current position pointer * \note This function works backwards in data buffer.
* \param start start of the buffer (for bounds-checking)
* \param buf the bitstring
* \param bits the total number of bits in the bitstring
* *
* \return the length written or a negative error code * \param p The reference to the current position pointer.
* \param start The start of the buffer, for bounds-checking.
* \param buf The bitstring to write.
* \param bits The total number of bits in the bitstring.
*
* \return The number of bytes written to \p p on success.
* \return A negative error code on failure.
*/ */
int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start, int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start,
const unsigned char *buf, size_t bits ); const unsigned char *buf, size_t bits );
/** /**
* \brief Write an octet string tag (MBEDTLS_ASN1_OCTET_STRING) and * \brief Write an octet string tag (#MBEDTLS_ASN1_OCTET_STRING)
* value in ASN.1 format * and value in ASN.1 format.
* Note: function works backwards in data buffer *
* \note This function works backwards in data buffer.
* *
* \param p reference to current position pointer * \param p reference to current position pointer
* \param start start of the buffer (for bounds-checking) * \param start start of the buffer (for bounds-checking)

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_BASE64_H #ifndef MBEDTLS_BASE64_H
#define MBEDTLS_BASE64_H #define MBEDTLS_BASE64_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include <stddef.h> #include <stddef.h>
#define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */ #define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */

View File

@@ -38,6 +38,12 @@
#ifndef MBEDTLS_BN_MUL_H #ifndef MBEDTLS_BN_MUL_H
#define MBEDTLS_BN_MUL_H #define MBEDTLS_BN_MUL_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "bignum.h" #include "bignum.h"
#if defined(MBEDTLS_HAVE_ASM) #if defined(MBEDTLS_HAVE_ASM)
@@ -170,19 +176,19 @@
#define MULADDC_INIT \ #define MULADDC_INIT \
asm( \ asm( \
"xorq %%r8, %%r8 \n\t" "xorq %%r8, %%r8\n"
#define MULADDC_CORE \ #define MULADDC_CORE \
"movq (%%rsi), %%rax \n\t" \ "movq (%%rsi), %%rax\n" \
"mulq %%rbx \n\t" \ "mulq %%rbx\n" \
"addq $8, %%rsi \n\t" \ "addq $8, %%rsi\n" \
"addq %%rcx, %%rax \n\t" \ "addq %%rcx, %%rax\n" \
"movq %%r8, %%rcx \n\t" \ "movq %%r8, %%rcx\n" \
"adcq $0, %%rdx \n\t" \ "adcq $0, %%rdx\n" \
"nop \n\t" \ "nop \n" \
"addq %%rax, (%%rdi) \n\t" \ "addq %%rax, (%%rdi)\n" \
"adcq %%rdx, %%rcx \n\t" \ "adcq %%rdx, %%rcx\n" \
"addq $8, %%rdi \n\t" "addq $8, %%rdi\n"
#define MULADDC_STOP \ #define MULADDC_STOP \
: "+c" (c), "+D" (d), "+S" (s) \ : "+c" (c), "+D" (d), "+S" (s) \
@@ -734,7 +740,7 @@
"sw $10, %2 \n\t" \ "sw $10, %2 \n\t" \
: "=m" (c), "=m" (d), "=m" (s) \ : "=m" (c), "=m" (d), "=m" (s) \
: "m" (s), "m" (d), "m" (c), "m" (b) \ : "m" (s), "m" (d), "m" (c), "m" (b) \
: "$9", "$10", "$11", "$12", "$13", "$14", "$15" \ : "$9", "$10", "$11", "$12", "$13", "$14", "$15", "lo", "hi" \
); );
#endif /* MIPS */ #endif /* MIPS */

View File

@@ -34,6 +34,12 @@
#ifndef MBEDTLS_CCM_H #ifndef MBEDTLS_CCM_H
#define MBEDTLS_CCM_H #define MBEDTLS_CCM_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "cipher.h" #include "cipher.h"
#define MBEDTLS_ERR_CCM_BAD_INPUT -0x000D /**< Bad input parameters to the function. */ #define MBEDTLS_ERR_CCM_BAD_INPUT -0x000D /**< Bad input parameters to the function. */

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_CERTS_H #ifndef MBEDTLS_CERTS_H
#define MBEDTLS_CERTS_H #define MBEDTLS_CERTS_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include <stddef.h> #include <stddef.h>
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -107,7 +107,7 @@
#error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites" #error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites"
#endif #endif
#if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || ( \ #if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || ( \
!defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && \
!defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && \
!defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && \
@@ -118,10 +118,15 @@
!defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) && \
!defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) && \
!defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) && \
!defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) ) ) !defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) && \
!defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) ) )
#error "MBEDTLS_ECP_C defined, but not all prerequisites" #error "MBEDTLS_ECP_C defined, but not all prerequisites"
#endif #endif
#if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_ASN1_PARSE_C)
#error "MBEDTLS_PK_PARSE_C defined, but not all prerequesites"
#endif
#if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) && \ #if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) && \
!defined(MBEDTLS_SHA256_C)) !defined(MBEDTLS_SHA256_C))
#error "MBEDTLS_ENTROPY_C defined, but not all prerequisites" #error "MBEDTLS_ENTROPY_C defined, but not all prerequisites"
@@ -667,7 +672,7 @@
/* /*
* Avoid warning from -pedantic. This is a convenient place for this * Avoid warning from -pedantic. This is a convenient place for this
* workaround since this is included by every single file before the * workaround since this is included by every single file before the
* #if defined(MBEDTLS_xxx_C) that results in emtpy translation units. * #if defined(MBEDTLS_xxx_C) that results in empty translation units.
*/ */
typedef int mbedtls_iso_c_forbids_empty_translation_units; typedef int mbedtls_iso_c_forbids_empty_translation_units;

View File

@@ -26,6 +26,12 @@
#ifndef MBEDTLS_CMAC_H #ifndef MBEDTLS_CMAC_H
#define MBEDTLS_CMAC_H #define MBEDTLS_CMAC_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "cipher.h" #include "cipher.h"
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -25,6 +25,12 @@
* This file is part of mbed TLS (https://tls.mbed.org) * This file is part of mbed TLS (https://tls.mbed.org)
*/ */
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if ! defined(MBEDTLS_DEPRECATED_REMOVED)
#if defined(MBEDTLS_DEPRECATED_WARNING) #if defined(MBEDTLS_DEPRECATED_WARNING)

View File

@@ -112,7 +112,7 @@
* \def MBEDTLS_HAVE_TIME_DATE * \def MBEDTLS_HAVE_TIME_DATE
* *
* System has time.h and time(), gmtime() and the clock is correct. * System has time.h and time(), gmtime() and the clock is correct.
* The time needs to be correct (not necesarily very accurate, but at least * The time needs to be correct (not necessarily very accurate, but at least
* the date should be correct). This is used to verify the validity period of * the date should be correct). This is used to verify the validity period of
* X.509 certificates. * X.509 certificates.
* *
@@ -318,7 +318,7 @@
* \note Because of a signature change, the core AES encryption and decryption routines are * \note Because of a signature change, the core AES encryption and decryption routines are
* currently named mbedtls_aes_internal_encrypt and mbedtls_aes_internal_decrypt, * currently named mbedtls_aes_internal_encrypt and mbedtls_aes_internal_decrypt,
* respectively. When setting up alternative implementations, these functions should * respectively. When setting up alternative implementations, these functions should
* be overriden, but the wrapper functions mbedtls_aes_decrypt and mbedtls_aes_encrypt * be overridden, but the wrapper functions mbedtls_aes_decrypt and mbedtls_aes_encrypt
* must stay untouched. * must stay untouched.
* *
* \note If you use the AES_xxx_ALT macros, then is is recommended to also set * \note If you use the AES_xxx_ALT macros, then is is recommended to also set
@@ -333,6 +333,16 @@
* dependencies on them, and considering stronger message digests * dependencies on them, and considering stronger message digests
* and ciphers instead. * and ciphers instead.
* *
* \warning If both MBEDTLS_ECDSA_SIGN_ALT and MBEDTLS_ECDSA_DETERMINISTIC are
* enabled, then the deterministic ECDH signature functions pass the
* the static HMAC-DRBG as RNG to mbedtls_ecdsa_sign(). Therefore
* alternative implementations should use the RNG only for generating
* the ephemeral key and nothing else. If this is not possible, then
* MBEDTLS_ECDSA_DETERMINISTIC should be disabled and an alternative
* implementation should be provided for mbedtls_ecdsa_sign_det_ext()
* (and for mbedtls_ecdsa_sign_det() too if backward compatibility is
* desirable).
*
*/ */
//#define MBEDTLS_MD2_PROCESS_ALT //#define MBEDTLS_MD2_PROCESS_ALT
//#define MBEDTLS_MD4_PROCESS_ALT //#define MBEDTLS_MD4_PROCESS_ALT
@@ -556,6 +566,26 @@
*/ */
#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES #define MBEDTLS_REMOVE_ARC4_CIPHERSUITES
/**
* \def MBEDTLS_REMOVE_3DES_CIPHERSUITES
*
* Remove 3DES ciphersuites by default in SSL / TLS.
* This flag removes the ciphersuites based on 3DES from the default list as
* returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible
* to enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including
* them explicitly.
*
* A man-in-the-browser attacker can recover authentication tokens sent through
* a TLS connection using a 3DES based cipher suite (see "On the Practical
* (In-)Security of 64-bit Block Ciphers" by Karthikeyan Bhargavan and Gaëtan
* Leurent, see https://sweet32.info/SWEET32_CCS16.pdf). If this attack falls
* in your threat model or you are unsure, then you should keep this option
* enabled to remove 3DES based cipher suites.
*
* Comment this macro to keep 3DES in the default ciphersuite list.
*/
#define MBEDTLS_REMOVE_3DES_CIPHERSUITES
/** /**
* \def MBEDTLS_ECP_DP_SECP192R1_ENABLED * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED
* *
@@ -1188,7 +1218,7 @@
/** /**
* \def MBEDTLS_SSL_RENEGOTIATION * \def MBEDTLS_SSL_RENEGOTIATION
* *
* Disable support for TLS renegotiation. * Enable support for TLS renegotiation.
* *
* The two main uses of renegotiation are (1) refresh keys on long-lived * The two main uses of renegotiation are (1) refresh keys on long-lived
* connections and (2) client authentication after the initial handshake. * connections and (2) client authentication after the initial handshake.
@@ -1372,7 +1402,7 @@
* \def MBEDTLS_SSL_SESSION_TICKETS * \def MBEDTLS_SSL_SESSION_TICKETS
* *
* Enable support for RFC 5077 session tickets in SSL. * Enable support for RFC 5077 session tickets in SSL.
* Client-side, provides full support for session tickets (maintainance of a * Client-side, provides full support for session tickets (maintenance of a
* session store remains the responsibility of the application, though). * session store remains the responsibility of the application, though).
* Server-side, you also need to provide callbacks for writing and parsing * Server-side, you also need to provide callbacks for writing and parsing
* tickets, including authenticated encryption and key management. Example * tickets, including authenticated encryption and key management. Example
@@ -1538,7 +1568,7 @@
* *
* \warning TLS-level compression MAY REDUCE SECURITY! See for example the * \warning TLS-level compression MAY REDUCE SECURITY! See for example the
* CRIME attack. Before enabling this option, you should examine with care if * CRIME attack. Before enabling this option, you should examine with care if
* CRIME or similar exploits may be a applicable to your use case. * CRIME or similar exploits may be applicable to your use case.
* *
* \note Currently compression can't be used with DTLS. * \note Currently compression can't be used with DTLS.
* *
@@ -2734,7 +2764,7 @@
//#define MBEDTLS_PLATFORM_STD_TIME time /**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_STD_TIME time /**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */
//#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */
//#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */
/* Note: your snprintf must correclty zero-terminate the buffer! */ /* Note: your snprintf must correctly zero-terminate the buffer! */
//#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */
//#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS 0 /**< Default exit value to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS 0 /**< Default exit value to use, can be undefined */
//#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE 1 /**< Default exit value to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE 1 /**< Default exit value to use, can be undefined */
@@ -2751,7 +2781,7 @@
//#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */
//#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */
//#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */
/* Note: your snprintf must correclty zero-terminate the buffer! */ /* Note: your snprintf must correctly zero-terminate the buffer! */
//#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */
//#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */
//#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */

View File

@@ -28,6 +28,12 @@
#ifndef MBEDTLS_CTR_DRBG_H #ifndef MBEDTLS_CTR_DRBG_H
#define MBEDTLS_CTR_DRBG_H #define MBEDTLS_CTR_DRBG_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "aes.h" #include "aes.h"
#if defined(MBEDTLS_THREADING_C) #if defined(MBEDTLS_THREADING_C)
@@ -227,14 +233,37 @@ int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,
* *
* \param ctx The CTR_DRBG context. * \param ctx The CTR_DRBG context.
* \param additional The data to update the state with. * \param additional The data to update the state with.
* \param add_len Length of \p additional data. * \param add_len Length of \p additional in bytes. This must be at
* most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT.
* *
* \note If \p add_len is greater than #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT, * \return \c 0 on success.
* only the first #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT Bytes are used. * \return #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if
* The remaining Bytes are silently discarded. * \p add_len is more than
* #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT.
* \return An error from the underlying AES cipher on failure.
*/
int mbedtls_ctr_drbg_update_ret( mbedtls_ctr_drbg_context *ctx,
const unsigned char *additional,
size_t add_len );
/**
* \brief This function updates the state of the CTR_DRBG context.
*
* \warning This function cannot report errors. You should use
* mbedtls_ctr_drbg_update_ret() instead.
*
* \note If \p add_len is greater than
* #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT, only the first
* #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT Bytes are used.
* The remaining Bytes are silently discarded.
*
* \param ctx The CTR_DRBG context.
* \param additional The data to update the state with.
* \param add_len Length of \p additional data.
*/ */
void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx, void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx,
const unsigned char *additional, size_t add_len ); const unsigned char *additional,
size_t add_len );
/** /**
* \brief This function updates a CTR_DRBG instance with additional * \brief This function updates a CTR_DRBG instance with additional

View File

@@ -33,6 +33,12 @@
#ifndef MBEDTLS_ECDH_H #ifndef MBEDTLS_ECDH_H
#define MBEDTLS_ECDH_H #define MBEDTLS_ECDH_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "ecp.h" #include "ecp.h"
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -31,6 +31,12 @@
#ifndef MBEDTLS_ECDSA_H #ifndef MBEDTLS_ECDSA_H
#define MBEDTLS_ECDSA_H #define MBEDTLS_ECDSA_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "ecp.h" #include "ecp.h"
#include "md.h" #include "md.h"
@@ -101,6 +107,20 @@ int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
* Usage of the Digital Signature Algorithm (DSA) and Elliptic * Usage of the Digital Signature Algorithm (DSA) and Elliptic
* Curve Digital Signature Algorithm (ECDSA)</em>. * Curve Digital Signature Algorithm (ECDSA)</em>.
* *
*
* \warning Since the output of the internal RNG is always the same for
* the same key and message, this limits the efficiency of
* blinding and leaks information through side channels. For
* secure behavior use mbedtls_ecdsa_sign_det_ext() instead.
*
* (Optimally the blinding is a random value that is different
* on every execution. In this case the blinding is still
* random from the attackers perspective, but is the same on
* each execution. This means that this blinding does not
* prevent attackers from recovering secrets by combining
* several measurement traces, but may prevent some attacks
* that exploit relationships between secret data.)
*
* \param grp The ECP group. * \param grp The ECP group.
* \param r The first output integer. * \param r The first output integer.
* \param s The second output integer. * \param s The second output integer.
@@ -121,9 +141,56 @@ int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
* *
* \see ecp.h * \see ecp.h
*/ */
int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r,
const mbedtls_mpi *d, const unsigned char *buf, size_t blen, mbedtls_mpi *s, const mbedtls_mpi *d,
mbedtls_md_type_t md_alg ); const unsigned char *buf, size_t blen,
mbedtls_md_type_t md_alg );
/**
* \brief This function computes the ECDSA signature of a
* previously-hashed message, deterministic version.
*
* For more information, see <em>RFC-6979: Deterministic
* Usage of the Digital Signature Algorithm (DSA) and Elliptic
* Curve Digital Signature Algorithm (ECDSA)</em>.
*
* \note If the bitlength of the message hash is larger than the
* bitlength of the group order, then the hash is truncated as
* defined in <em>Standards for Efficient Cryptography Group
* (SECG): SEC1 Elliptic Curve Cryptography</em>, section
* 4.1.3, step 5.
*
* \see ecp.h
*
* \param grp The context for the elliptic curve to use.
* This must be initialized and have group parameters
* set, for example through mbedtls_ecp_group_load().
* \param r The MPI context in which to store the first part
* the signature. This must be initialized.
* \param s The MPI context in which to store the second part
* the signature. This must be initialized.
* \param d The private signing key. This must be initialized
* and setup, for example through mbedtls_ecp_gen_privkey().
* \param buf The hashed content to be signed. This must be a readable
* buffer of length \p blen Bytes. It may be \c NULL if
* \p blen is zero.
* \param blen The length of \p buf in Bytes.
* \param md_alg The hash algorithm used to hash the original data.
* \param f_rng_blind The RNG function used for blinding. This must not be
* \c NULL.
* \param p_rng_blind The RNG context to be passed to \p f_rng. This may be
* \c NULL if \p f_rng doesn't need a context parameter.
*
* \return \c 0 on success.
* \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
* error code on failure.
*/
int mbedtls_ecdsa_sign_det_ext( mbedtls_ecp_group *grp, mbedtls_mpi *r,
mbedtls_mpi *s, const mbedtls_mpi *d,
const unsigned char *buf, size_t blen,
mbedtls_md_type_t md_alg,
int (*f_rng_blind)(void *, unsigned char *,
size_t),
void *p_rng_blind );
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ #endif /* MBEDTLS_ECDSA_DETERMINISTIC */
/** /**

View File

@@ -40,6 +40,11 @@
* The payloads are serialized in a way suitable for use in TLS, but could * The payloads are serialized in a way suitable for use in TLS, but could
* also be use outside TLS. * also be use outside TLS.
*/ */
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "ecp.h" #include "ecp.h"
#include "md.h" #include "md.h"

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_ECP_H #ifndef MBEDTLS_ECP_H
#define MBEDTLS_ECP_H #define MBEDTLS_ECP_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "bignum.h" #include "bignum.h"
/* /*
@@ -595,6 +601,22 @@ int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_po
*/ */
int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d ); int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
/**
* \brief Generate a private key
*
* \param grp ECP group
* \param d Destination MPI (secret part)
* \param f_rng RNG function
* \param p_rng RNG parameter
*
* \return 0 if successful,
* or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
*/
int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp,
mbedtls_mpi *d,
int (*f_rng)(void *, unsigned char *, size_t),
void *p_rng );
/** /**
* \brief Generate a keypair with configurable base point * \brief Generate a keypair with configurable base point
* *

View File

@@ -61,6 +61,12 @@
#ifndef MBEDTLS_ECP_INTERNAL_H #ifndef MBEDTLS_ECP_INTERNAL_H
#define MBEDTLS_ECP_INTERNAL_H #define MBEDTLS_ECP_INTERNAL_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#if defined(MBEDTLS_ECP_INTERNAL_ALT) #if defined(MBEDTLS_ECP_INTERNAL_ALT)
/** /**

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_ERROR_H #ifndef MBEDTLS_ERROR_H
#define MBEDTLS_ERROR_H #define MBEDTLS_ERROR_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include <stddef.h> #include <stddef.h>
/** /**

View File

@@ -31,6 +31,12 @@
#ifndef MBEDTLS_GCM_H #ifndef MBEDTLS_GCM_H
#define MBEDTLS_GCM_H #define MBEDTLS_GCM_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "cipher.h" #include "cipher.h"
#include <stdint.h> #include <stdint.h>

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_HAVEGE_H #ifndef MBEDTLS_HAVEGE_H
#define MBEDTLS_HAVEGE_H #define MBEDTLS_HAVEGE_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include <stddef.h> #include <stddef.h>
#define MBEDTLS_HAVEGE_COLLECT_SIZE 1024 #define MBEDTLS_HAVEGE_COLLECT_SIZE 1024

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_HMAC_DRBG_H #ifndef MBEDTLS_HMAC_DRBG_H
#define MBEDTLS_HMAC_DRBG_H #define MBEDTLS_HMAC_DRBG_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "md.h" #include "md.h"
#if defined(MBEDTLS_THREADING_C) #if defined(MBEDTLS_THREADING_C)
@@ -76,7 +82,7 @@ extern "C" {
*/ */
typedef struct typedef struct
{ {
/* Working state: the key K is not stored explicitely, /* Working state: the key K is not stored explicitly,
* but is implied by the HMAC context */ * but is implied by the HMAC context */
mbedtls_md_context_t md_ctx; /*!< HMAC context (inc. K) */ mbedtls_md_context_t md_ctx; /*!< HMAC context (inc. K) */
unsigned char V[MBEDTLS_MD_MAX_SIZE]; /*!< V in the spec */ unsigned char V[MBEDTLS_MD_MAX_SIZE]; /*!< V in the spec */
@@ -195,11 +201,31 @@ void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx,
* \param additional Additional data to update state with, or NULL * \param additional Additional data to update state with, or NULL
* \param add_len Length of additional data, or 0 * \param add_len Length of additional data, or 0
* *
* \return \c 0 on success, or an error from the underlying
* hash calculation.
*
* \note Additional data is optional, pass NULL and 0 as second
* third argument if no additional data is being used.
*/
int mbedtls_hmac_drbg_update_ret( mbedtls_hmac_drbg_context *ctx,
const unsigned char *additional, size_t add_len );
/**
* \brief HMAC_DRBG update state
*
* \warning This function cannot report errors. You should use
* mbedtls_hmac_drbg_update_ret() instead.
*
* \param ctx HMAC_DRBG context
* \param additional Additional data to update state with, or NULL
* \param add_len Length of additional data, or 0
*
* \note Additional data is optional, pass NULL and 0 as second * \note Additional data is optional, pass NULL and 0 as second
* third argument if no additional data is being used. * third argument if no additional data is being used.
*/ */
void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx, void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx,
const unsigned char *additional, size_t add_len ); const unsigned char *additional,
size_t add_len );
/** /**
* \brief HMAC_DRBG reseeding (extracts data from entropy source) * \brief HMAC_DRBG reseeding (extracts data from entropy source)

View File

@@ -23,6 +23,11 @@
* *
* This file is part of mbed TLS (https://tls.mbed.org) * This file is part of mbed TLS (https://tls.mbed.org)
*/ */
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#if !defined(MBEDTLS_DEPRECATED_REMOVED) #if !defined(MBEDTLS_DEPRECATED_REMOVED)
#include "net_sockets.h" #include "net_sockets.h"

View File

@@ -25,6 +25,12 @@
#ifndef MBEDTLS_PADLOCK_H #ifndef MBEDTLS_PADLOCK_H
#define MBEDTLS_PADLOCK_H #define MBEDTLS_PADLOCK_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "aes.h" #include "aes.h"
#define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ #define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_PEM_H #ifndef MBEDTLS_PEM_H
#define MBEDTLS_PEM_H #define MBEDTLS_PEM_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include <stddef.h> #include <stddef.h>
/** /**

View File

@@ -343,6 +343,10 @@ int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options,
* *
* \note For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0. * \note For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0.
* For ECDSA, md_alg may never be MBEDTLS_MD_NONE. * For ECDSA, md_alg may never be MBEDTLS_MD_NONE.
*
* \note In order to ensure enough space for the signature, the
* \p sig buffer size must be of at least
* `max(MBEDTLS_ECDSA_MAX_LEN, MBEDTLS_MPI_MAX_SIZE)` bytes.
*/ */
int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
const unsigned char *hash, size_t hash_len, const unsigned char *hash, size_t hash_len,

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_PKCS12_H #ifndef MBEDTLS_PKCS12_H
#define MBEDTLS_PKCS12_H #define MBEDTLS_PKCS12_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "md.h" #include "md.h"
#include "cipher.h" #include "cipher.h"
#include "asn1.h" #include "asn1.h"
@@ -46,6 +52,8 @@
extern "C" { extern "C" {
#endif #endif
#if defined(MBEDTLS_ASN1_PARSE_C)
/** /**
* \brief PKCS12 Password Based function (encryption / decryption) * \brief PKCS12 Password Based function (encryption / decryption)
* for pbeWithSHAAnd128BitRC4 * for pbeWithSHAAnd128BitRC4
@@ -87,6 +95,8 @@ int mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode,
const unsigned char *input, size_t len, const unsigned char *input, size_t len,
unsigned char *output ); unsigned char *output );
#endif /* MBEDTLS_ASN1_PARSE_C */
/** /**
* \brief The PKCS#12 derivation function uses a password and a salt * \brief The PKCS#12 derivation function uses a password and a salt
* to produce pseudo-random bits for a particular "purpose". * to produce pseudo-random bits for a particular "purpose".

View File

@@ -26,6 +26,12 @@
#ifndef MBEDTLS_PKCS5_H #ifndef MBEDTLS_PKCS5_H
#define MBEDTLS_PKCS5_H #define MBEDTLS_PKCS5_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "asn1.h" #include "asn1.h"
#include "md.h" #include "md.h"
@@ -44,6 +50,8 @@
extern "C" { extern "C" {
#endif #endif
#if defined(MBEDTLS_ASN1_PARSE_C)
/** /**
* \brief PKCS#5 PBES2 function * \brief PKCS#5 PBES2 function
* *
@@ -62,6 +70,8 @@ int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode,
const unsigned char *data, size_t datalen, const unsigned char *data, size_t datalen,
unsigned char *output ); unsigned char *output );
#endif /* MBEDTLS_ASN1_PARSE_C */
/** /**
* \brief PKCS#5 PBKDF2 using HMAC * \brief PKCS#5 PBKDF2 using HMAC
* *

View File

@@ -146,13 +146,13 @@ mbedtls_rsa_context;
* \note The choice of padding mode is strictly enforced for private key * \note The choice of padding mode is strictly enforced for private key
* operations, since there might be security concerns in * operations, since there might be security concerns in
* mixing padding modes. For public key operations it is * mixing padding modes. For public key operations it is
* a default value, which can be overriden by calling specific * a default value, which can be overridden by calling specific
* \c rsa_rsaes_xxx or \c rsa_rsassa_xxx functions. * \c rsa_rsaes_xxx or \c rsa_rsassa_xxx functions.
* *
* \note The hash selected in \p hash_id is always used for OEAP * \note The hash selected in \p hash_id is always used for OEAP
* encryption. For PSS signatures, it is always used for * encryption. For PSS signatures, it is always used for
* making signatures, but can be overriden for verifying them. * making signatures, but can be overridden for verifying them.
* If set to #MBEDTLS_MD_NONE, it is always overriden. * If set to #MBEDTLS_MD_NONE, it is always overridden.
*/ */
void mbedtls_rsa_init( mbedtls_rsa_context *ctx, void mbedtls_rsa_init( mbedtls_rsa_context *ctx,
int padding, int padding,
@@ -819,6 +819,7 @@ int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx,
* *
* \note The \p sig buffer must be as large as the size * \note The \p sig buffer must be as large as the size
* of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used.
* A buffer length of #MBEDTLS_MPI_MAX_SIZE is always safe.
* *
* \note For PKCS#1 v2.1 encoding, see comments on * \note For PKCS#1 v2.1 encoding, see comments on
* mbedtls_rsa_rsassa_pss_sign() for details on * mbedtls_rsa_rsassa_pss_sign() for details on
@@ -862,6 +863,7 @@ int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx,
* *
* \note The \p sig buffer must be as large as the size * \note The \p sig buffer must be as large as the size
* of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used.
* A buffer length of #MBEDTLS_MPI_MAX_SIZE is always safe.
*/ */
int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx, int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx,
int (*f_rng)(void *, unsigned char *, size_t), int (*f_rng)(void *, unsigned char *, size_t),
@@ -902,6 +904,7 @@ int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx,
* *
* \note The \p sig buffer must be as large as the size * \note The \p sig buffer must be as large as the size
* of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used.
* A buffer length of #MBEDTLS_MPI_MAX_SIZE is always safe.
* *
* \note The \p hash_id in the RSA context is the one used for the * \note The \p hash_id in the RSA context is the one used for the
* encoding. \p md_alg in the function call is the type of hash * encoding. \p md_alg in the function call is the type of hash

View File

@@ -1611,7 +1611,7 @@ void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
* provision more than one cert/key pair (eg one ECDSA, one * provision more than one cert/key pair (eg one ECDSA, one
* RSA with SHA-256, one RSA with SHA-1). An adequate * RSA with SHA-256, one RSA with SHA-1). An adequate
* certificate will be selected according to the client's * certificate will be selected according to the client's
* advertised capabilities. In case mutliple certificates are * advertised capabilities. In case multiple certificates are
* adequate, preference is given to the one set by the first * adequate, preference is given to the one set by the first
* call to this function, then second, etc. * call to this function, then second, etc.
* *
@@ -1622,6 +1622,14 @@ void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
* whether it matches those preferences - the server can then * whether it matches those preferences - the server can then
* decide what it wants to do with it. * decide what it wants to do with it.
* *
* \note The provided \p pk_key needs to match the public key in the
* first certificate in \p own_cert, or all handshakes using
* that certificate will fail. It is your responsibility
* to ensure that; this function will not perform any check.
* You may use mbedtls_pk_check_pair() in order to perform
* this check yourself, but be aware that this function can
* be computationally expensive on some key types.
*
* \param conf SSL configuration * \param conf SSL configuration
* \param own_cert own public certificate chain * \param own_cert own public certificate chain
* \param pk_key own private key * \param pk_key own private key
@@ -2102,12 +2110,27 @@ void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
/** /**
* \brief Set the maximum fragment length to emit and/or negotiate * \brief Set the maximum fragment length to emit and/or negotiate.
* (Default: MBEDTLS_SSL_MAX_CONTENT_LEN, usually 2^14 bytes) * (Typical: #MBEDTLS_SSL_MAX_CONTENT_LEN, by default that is
* set to `2^14` bytes)
* (Server: set maximum fragment length to emit, * (Server: set maximum fragment length to emit,
* usually negotiated by the client during handshake * usually negotiated by the client during handshake)
* (Client: set maximum fragment length to emit *and* * (Client: set maximum fragment length to emit *and*
* negotiate with the server during handshake) * negotiate with the server during handshake)
* (Default: #MBEDTLS_SSL_MAX_FRAG_LEN_NONE)
*
* \note With TLS, this currently only affects ApplicationData (sent
* with \c mbedtls_ssl_read()), not handshake messages.
* With DTLS, this affects both ApplicationData and handshake.
*
* \note On the client side, the maximum fragment length extension
* *will not* be used, unless the maximum fragment length has
* been set via this function to a value different than
* #MBEDTLS_SSL_MAX_FRAG_LEN_NONE.
*
* \note This sets the maximum length for a record's payload,
* excluding record overhead that will be added to it, see
* \c mbedtls_ssl_get_record_expansion().
* *
* \param conf SSL configuration * \param conf SSL configuration
* \param mfl_code Code for maximum fragment length (allowed values: * \param mfl_code Code for maximum fragment length (allowed values:
@@ -2309,13 +2332,14 @@ size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl );
/** /**
* \brief Return the result of the certificate verification * \brief Return the result of the certificate verification
* *
* \param ssl SSL context * \param ssl The SSL context to use.
* *
* \return 0 if successful, * \return \c 0 if the certificate verification was successful.
* -1 if result is not available (eg because the handshake was * \return \c -1u if the result is not available. This may happen
* aborted too early), or * e.g. if the handshake aborts early, or a verification
* a combination of BADCERT_xxx and BADCRL_xxx flags, see * callback returned a fatal error.
* x509.h * \return A bitwise combination of \c MBEDTLS_X509_BADCERT_XXX
* and \c MBEDTLS_X509_BADCRL_XXX failure flags; see x509.h.
*/ */
uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl ); uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl );
@@ -2610,7 +2634,7 @@ void mbedtls_ssl_free( mbedtls_ssl_context *ssl );
* mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free(). * mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free().
* *
* \note You need to call mbedtls_ssl_config_defaults() unless you * \note You need to call mbedtls_ssl_config_defaults() unless you
* manually set all of the relevent fields yourself. * manually set all of the relevant fields yourself.
* *
* \param conf SSL configuration context * \param conf SSL configuration context
*/ */

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_SSL_CACHE_H #ifndef MBEDTLS_SSL_CACHE_H
#define MBEDTLS_SSL_CACHE_H #define MBEDTLS_SSL_CACHE_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "ssl.h" #include "ssl.h"
#if defined(MBEDTLS_THREADING_C) #if defined(MBEDTLS_THREADING_C)

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_SSL_CIPHERSUITES_H #ifndef MBEDTLS_SSL_CIPHERSUITES_H
#define MBEDTLS_SSL_CIPHERSUITES_H #define MBEDTLS_SSL_CIPHERSUITES_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "pk.h" #include "pk.h"
#include "cipher.h" #include "cipher.h"
#include "md.h" #include "md.h"

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_SSL_COOKIE_H #ifndef MBEDTLS_SSL_COOKIE_H
#define MBEDTLS_SSL_COOKIE_H #define MBEDTLS_SSL_COOKIE_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "ssl.h" #include "ssl.h"
#if defined(MBEDTLS_THREADING_C) #if defined(MBEDTLS_THREADING_C)

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_SSL_INTERNAL_H #ifndef MBEDTLS_SSL_INTERNAL_H
#define MBEDTLS_SSL_INTERNAL_H #define MBEDTLS_SSL_INTERNAL_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
#include "ssl.h" #include "ssl.h"
#include "cipher.h" #include "cipher.h"

View File

@@ -24,6 +24,12 @@
#ifndef MBEDTLS_SSL_TICKET_H #ifndef MBEDTLS_SSL_TICKET_H
#define MBEDTLS_SSL_TICKET_H #define MBEDTLS_SSL_TICKET_H
#if !defined(MBEDTLS_CONFIG_FILE)
#include "config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif
/* /*
* This implementation of the session ticket callbacks includes key * This implementation of the session ticket callbacks includes key
* management, rotating the keys periodically in order to preserve forward * management, rotating the keys periodically in order to preserve forward
@@ -111,14 +117,14 @@ int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx,
/** /**
* \brief Implementation of the ticket write callback * \brief Implementation of the ticket write callback
* *
* \note See \c mbedlts_ssl_ticket_write_t for description * \note See \c mbedtls_ssl_ticket_write_t for description
*/ */
mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write; mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write;
/** /**
* \brief Implementation of the ticket parse callback * \brief Implementation of the ticket parse callback
* *
* \note See \c mbedlts_ssl_ticket_parse_t for description * \note See \c mbedtls_ssl_ticket_parse_t for description
*/ */
mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse; mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse;

View File

@@ -40,16 +40,16 @@
*/ */
#define MBEDTLS_VERSION_MAJOR 2 #define MBEDTLS_VERSION_MAJOR 2
#define MBEDTLS_VERSION_MINOR 7 #define MBEDTLS_VERSION_MINOR 7
#define MBEDTLS_VERSION_PATCH 5 #define MBEDTLS_VERSION_PATCH 12
/** /**
* The single version number has the following structure: * The single version number has the following structure:
* MMNNPP00 * MMNNPP00
* Major version | Minor version | Patch version * Major version | Minor version | Patch version
*/ */
#define MBEDTLS_VERSION_NUMBER 0x02070500 #define MBEDTLS_VERSION_NUMBER 0x02070C00
#define MBEDTLS_VERSION_STRING "2.7.5" #define MBEDTLS_VERSION_STRING "2.7.12"
#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.7.5" #define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.7.12"
#if defined(MBEDTLS_VERSION_C) #if defined(MBEDTLS_VERSION_C)

View File

@@ -77,7 +77,7 @@
#define MBEDTLS_ERR_X509_ALLOC_FAILED -0x2880 /**< Allocation of memory failed. */ #define MBEDTLS_ERR_X509_ALLOC_FAILED -0x2880 /**< Allocation of memory failed. */
#define MBEDTLS_ERR_X509_FILE_IO_ERROR -0x2900 /**< Read/write of file failed. */ #define MBEDTLS_ERR_X509_FILE_IO_ERROR -0x2900 /**< Read/write of file failed. */
#define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL -0x2980 /**< Destination buffer is too small. */ #define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL -0x2980 /**< Destination buffer is too small. */
#define MBEDTLS_ERR_X509_FATAL_ERROR -0x3000 /**< A fatal error occured, eg the chain is too long or the vrfy callback failed. */ #define MBEDTLS_ERR_X509_FATAL_ERROR -0x3000 /**< A fatal error occurred, eg the chain is too long or the vrfy callback failed. */
/* \} name */ /* \} name */
/** /**
@@ -250,7 +250,7 @@ int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *se
* *
* \param to mbedtls_x509_time to check * \param to mbedtls_x509_time to check
* *
* \return 1 if the given time is in the past or an error occured, * \return 1 if the given time is in the past or an error occurred,
* 0 otherwise. * 0 otherwise.
*/ */
int mbedtls_x509_time_is_past( const mbedtls_x509_time *to ); int mbedtls_x509_time_is_past( const mbedtls_x509_time *to );
@@ -264,7 +264,7 @@ int mbedtls_x509_time_is_past( const mbedtls_x509_time *to );
* *
* \param from mbedtls_x509_time to check * \param from mbedtls_x509_time to check
* *
* \return 1 if the given time is in the future or an error occured, * \return 1 if the given time is in the future or an error occurred,
* 0 otherwise. * 0 otherwise.
*/ */
int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ); int mbedtls_x509_time_is_future( const mbedtls_x509_time *from );

View File

@@ -111,7 +111,7 @@ int mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain,
/** /**
* \brief Parse one or more CRLs and append them to the chained list * \brief Parse one or more CRLs and append them to the chained list
* *
* \note Mutliple CRLs are accepted only if using PEM format * \note Multiple CRLs are accepted only if using PEM format
* *
* \param chain points to the start of the chain * \param chain points to the start of the chain
* \param buf buffer holding the CRL data in PEM or DER format * \param buf buffer holding the CRL data in PEM or DER format
@@ -126,7 +126,7 @@ int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, s
/** /**
* \brief Load one or more CRLs and append them to the chained list * \brief Load one or more CRLs and append them to the chained list
* *
* \note Mutliple CRLs are accepted only if using PEM format * \note Multiple CRLs are accepted only if using PEM format
* *
* \param chain points to the start of the chain * \param chain points to the start of the chain
* \param path filename to read the CRLs from (in PEM or DER encoding) * \param path filename to read the CRLs from (in PEM or DER encoding)

View File

@@ -100,7 +100,7 @@ mbedtls_x509_crt;
* Build flag from an algorithm/curve identifier (pk, md, ecp) * Build flag from an algorithm/curve identifier (pk, md, ecp)
* Since 0 is always XXX_NONE, ignore it. * Since 0 is always XXX_NONE, ignore it.
*/ */
#define MBEDTLS_X509_ID_FLAG( id ) ( 1 << ( id - 1 ) ) #define MBEDTLS_X509_ID_FLAG( id ) ( 1 << ( ( id ) - 1 ) )
/** /**
* Security profile for certificate verification. * Security profile for certificate verification.
@@ -177,19 +177,34 @@ int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *bu
size_t buflen ); size_t buflen );
/** /**
* \brief Parse one or more certificates and add them * \brief Parse one DER-encoded or one or more concatenated PEM-encoded
* to the chained list. Parses permissively. If some * certificates and add them to the chained list.
* certificates can be parsed, the result is the number
* of failed certificates it encountered. If none complete
* correctly, the first error is returned.
* *
* \param chain points to the start of the chain * For CRTs in PEM encoding, the function parses permissively:
* \param buf buffer holding the certificate data in PEM or DER format * if at least one certificate can be parsed, the function
* \param buflen size of the buffer * returns the number of certificates for which parsing failed
* (including the terminating null byte for PEM data) * (hence \c 0 if all certificates were parsed successfully).
* If no certificate could be parsed, the function returns
* the first (negative) error encountered during parsing.
*
* PEM encoded certificates may be interleaved by other data
* such as human readable descriptions of their content, as
* long as the certificates are enclosed in the PEM specific
* '-----{BEGIN/END} CERTIFICATE-----' delimiters.
*
* \param chain The chain to which to add the parsed certificates.
* \param buf The buffer holding the certificate data in PEM or DER format.
* For certificates in PEM encoding, this may be a concatenation
* of multiple certificates; for DER encoding, the buffer must
* comprise exactly one certificate.
* \param buflen The size of \p buf, including the terminating \c NULL byte
* in case of PEM encoded data.
*
* \return \c 0 if all certificates were parsed successfully.
* \return The (positive) number of certificates that couldn't
* be parsed if parsing was partly successful (see above).
* \return A negative X509 or PEM error code otherwise.
* *
* \return 0 if all certificates parsed successfully, a positive number
* if partly successful or a specific X509 or PEM error code
*/ */
int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ); int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen );

View File

@@ -205,6 +205,14 @@ void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_ty
* \param key_usage key usage flags to set * \param key_usage key usage flags to set
* *
* \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED
*
* \note The <code>decipherOnly</code> flag from the Key Usage
* extension is represented by bit 8 (i.e.
* <code>0x8000</code>), which cannot typically be represented
* in an unsigned char. Therefore, the flag
* <code>decipherOnly</code> (i.e.
* #MBEDTLS_X509_KU_DECIPHER_ONLY) cannot be set using this
* function.
*/ */
int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ); int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage );

View File

@@ -1,19 +1,17 @@
dist: trusty dist: bionic
os: linux os: linux
language: cpp language: cpp
env: env:
global: global:
- secure: "dqiLqbzug/xs6F4Q9ei1pGpNf9Q6H3+iKN1W+P0TtODbCXPr/mLWdvHGVMIMqr7H7rBrIUPFPrfqd80nu3jQuQonjcHK/XyJJfmf5hUdhGAszSaixhWnGfVmn/VSV7/5+9DGAU3l9S6YZg4lvi12+cOrlblNgx8GeI5VdN/6HBSHkEqKNI56qn3Y+ugSdLeL1opmzlY58vRsCCmpBH8Ronn4tmSyi85/WZXfF43o9FGGJcygdh6QVWA1CDdNMeLTCt9ld+oToUIiFLiUrhfS1JpSvzysz2xsuEntxZaTMDYPyL4+O8Mj/scl6ejLLXzxTNa7AZOgySLBahf+F4b+yhL1deSVuu40MfxPW6XiM1jKy3KPH/GlYgM8CZQ3D1hQIq1CIUg8DgnTa06RUzevsR5DqDvz+EcPanFHE7dHGrPy9Rs/0y59dNHp3qWKjWMoSA06GerbF61XFOb4mcE29053kV8uxqIa5ZShZ/ndoLeVpQ4mZ+/XSkUybysVl0gWrKnnNNEPtqrdmKf+jlmKY0jyRPdwf425Ldn+wcbGw9ZEnkosYzqAhDBDX4OETAKLi8G0FEYECKKQcd1OX+HNvsOIyOAoLOj7H30F8UkPsjR3ysdIEmc6702ly06gDYjWmwQaCigL/1ktRKgf7ePB0HS+8fOa5SML7619kQrGrWA=" - secure: "dqiLqbzug/xs6F4Q9ei1pGpNf9Q6H3+iKN1W+P0TtODbCXPr/mLWdvHGVMIMqr7H7rBrIUPFPrfqd80nu3jQuQonjcHK/XyJJfmf5hUdhGAszSaixhWnGfVmn/VSV7/5+9DGAU3l9S6YZg4lvi12+cOrlblNgx8GeI5VdN/6HBSHkEqKNI56qn3Y+ugSdLeL1opmzlY58vRsCCmpBH8Ronn4tmSyi85/WZXfF43o9FGGJcygdh6QVWA1CDdNMeLTCt9ld+oToUIiFLiUrhfS1JpSvzysz2xsuEntxZaTMDYPyL4+O8Mj/scl6ejLLXzxTNa7AZOgySLBahf+F4b+yhL1deSVuu40MfxPW6XiM1jKy3KPH/GlYgM8CZQ3D1hQIq1CIUg8DgnTa06RUzevsR5DqDvz+EcPanFHE7dHGrPy9Rs/0y59dNHp3qWKjWMoSA06GerbF61XFOb4mcE29053kV8uxqIa5ZShZ/ndoLeVpQ4mZ+/XSkUybysVl0gWrKnnNNEPtqrdmKf+jlmKY0jyRPdwf425Ldn+wcbGw9ZEnkosYzqAhDBDX4OETAKLi8G0FEYECKKQcd1OX+HNvsOIyOAoLOj7H30F8UkPsjR3ysdIEmc6702ly06gDYjWmwQaCigL/1ktRKgf7ePB0HS+8fOa5SML7619kQrGrWA="
- PREFIX="${HOME}/opt" - PREFIX="${HOME}/opt"
- ASIO_VERSION="862aed305dcf91387535519c9549c17630339a12" - ASIO_VERSION="90f32660cd503494b3707840cfbd5434d8e9dabe"
- LZ4_VERSION="1.8.3" - LZ4_VERSION="1.8.3"
- MBEDTLS_VERSION="2.7.5" - MBEDTLS_VERSION="2.7.5"
- MBEDTLS_CFLAGS="-I${PREFIX}/include" - MBEDTLS_CFLAGS="-I${PREFIX}/include"
- MBEDTLS_LIBS="-lmbedtls -lmbedx509 -lmbedcrypto" - MBEDTLS_LIBS="-lmbedtls -lmbedx509 -lmbedcrypto"
- OPENSSL_VERSION="1.0.2l" - OPENSSL_VERSION="1.0.2s"
- OPENSSL_CFLAGS="-I${PREFIX}/include" - OPENSSL_CFLAGS="-I${PREFIX}/include"
- OPENSSL_LIBS="-lssl -lcrypto" - OPENSSL_LIBS="-lssl -lcrypto"
- COVERITY_BRANCH="master" - COVERITY_BRANCH="master"
@@ -22,9 +20,11 @@ matrix:
include: include:
- env: SSLLIB="openssl" - env: SSLLIB="openssl"
os: osx os: osx
osx_image: xcode10.2
compiler: clang compiler: clang
- env: SSLLIB="mbedtls" - env: SSLLIB="mbedtls"
os: osx os: osx
osx_image: xcode10.2
compiler: clang compiler: clang
- env: SSLLIB="openssl" RUN_COVERITY_SCAN="1" - env: SSLLIB="openssl" RUN_COVERITY_SCAN="1"
os: linux os: linux

View File

@@ -25,11 +25,11 @@ else
fi fi
LIBS="${SSL_LIBS} -llz4" LIBS="${SSL_LIBS} -llz4"
CXXFLAGS="-O3 -std=c++11 -Wall -pthread \ CXXFLAGS="-O3 -std=c++14 -Wall -pthread \
-DOPENVPN_SHOW_SESSION_TOKEN -DHAVE_LZ4 \ -DOPENVPN_SHOW_SESSION_TOKEN -DHAVE_LZ4 \
-DUSE_ASIO -DASIO_STANDALONE -DASIO_NO_DEPRECATED ${SSL_CFLAGS}" -DUSE_ASIO -DASIO_STANDALONE -DASIO_NO_DEPRECATED ${SSL_CFLAGS}"
if [[ "${CC}" == "gcc"* ]]; then if [ "${CC}" = "gcc" ]; then
CXXFLAGS="${CXXFLAGS} -fwhole-program -flto=4" CXXFLAGS="${CXXFLAGS} -fwhole-program -flto=4"
fi fi

View File

@@ -117,6 +117,7 @@ not required for Mac builds.
Build the dependencies:: Build the dependencies::
$ DL=~/Downloads
$ OSX_ONLY=1 $O3/core/scripts/mac/build-all $ OSX_ONLY=1 $O3/core/scripts/mac/build-all
Now build the OpenVPN 3 client executable:: Now build the OpenVPN 3 client executable::
@@ -125,7 +126,7 @@ Now build the OpenVPN 3 client executable::
$ . vars/vars-osx64 $ . vars/vars-osx64
$ . vars/setpath $ . vars/setpath
$ cd test/ovpncli $ cd test/ovpncli
$ MTLS=1 LZ4=1 build cli $ MTLS=1 LZ4=1 ASIO=1 build cli
This will build the OpenVPN 3 client library with a small client This will build the OpenVPN 3 client library with a small client
wrapper (``cli``). It will also statically link in all external wrapper (``cli``). It will also statically link in all external
@@ -151,8 +152,9 @@ Building the OpenVPN 3 client on Windows
Prerequisites: Prerequisites:
- Visual Studio 2017 * Visual Studio 2017
- Python 2.7 * Python 2.7
* Perl (for building openssl)
Clone the OpenVPN 3 source repo:: Clone the OpenVPN 3 source repo::
@@ -160,19 +162,19 @@ Clone the OpenVPN 3 source repo::
> c:\Temp>cd O3 > c:\Temp>cd O3
> c:\Temp\O3>git clone https://github.com/OpenVPN/openvpn3.git core > c:\Temp\O3>git clone https://github.com/OpenVPN/openvpn3.git core
Add environment variable ``O3`` with value ``c:\Temp\O3`` and reopen commmand prompt.
Download and build dependencies:: Download and build dependencies::
> c:\Temp\O3>cd core\win > c:\Temp\O3>cd core\win
> c:\Temp\O3\core\win>set O3=C:\Temp\O3 && python buildep.py > c:\Temp\O3\core\win>set STATIC=1&& set DEBUG=1&& python buildep.py
Build test client:: Now you can open project in Visual Studio. Project and solution files are
located in ``O3\core\win`` directory.
> c:\Temp\O3\core\win>set O3=C:\Temp\O3 && python build.py You can also build the test client from command prompt::
Visual Studio 2017 project and solution files are located in ``O3\core\win`` directory.
Before opening project you need to build dependencies and define OVPN3_ROOT
environmental variable (``C:\Temp\O3`` from example above).
> c:\Temp\O3\core\win>set STATIC=1&& set DEBUG=1&& python build.py
Testing Testing
------- -------

View File

@@ -1,24 +1,32 @@
version: 1.0.{build} version: 1.0.{build}
image: Visual Studio 2017 image: Visual Studio 2019
clone_folder: c:\ovpn3\core clone_folder: c:\ovpn3\core
install: install:
- pip install rfc6266 requests - pip install rfc6266 requests
- if not exist "C:\strawberry" choco install strawberryperl -y
- set PATH=C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;%PATH%
environment: environment:
MSVC_DIR: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community MSVC_DIR: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
O3: C:\ovpn3 O3: C:\ovpn3
STATIC: 1 STATIC: 1
before_build: before_build:
- cmd: cd win && python buildep.py - cmd: cd win && python buildep.py
after_build:
- cmd: copy c:\ovpn3\deps\amd64\openssl\out32dll\ssleay32.dll c:\ovpn3\core\win\x64\ReleaseOpenSSL\
- cmd: copy c:\ovpn3\deps\amd64\openssl\out32dll\libeay32.dll c:\ovpn3\core\win\x64\ReleaseOpenSSL\
platform: x64 platform: x64
configuration: Release configuration: ReleaseOpenSSL
artifacts: artifacts:
- path: win\x64\Release\cli.exe - path: win\x64\ReleaseOpenSSL\cli.exe
- path: win\x64\ReleaseOpenSSL\*.dll

View File

@@ -262,7 +262,13 @@ namespace openvpn {
bool socket_protect(int socket, IP::Addr endpoint) override bool socket_protect(int socket, IP::Addr endpoint) override
{ {
if (parent) if (parent)
return parent->socket_protect(socket, endpoint.to_string(), endpoint.is_ipv6()); {
#if defined(OPENVPN_COMMAND_AGENT) && defined(OPENVPN_PLATFORM_WIN)
return WinCommandAgent::add_bypass_route(endpoint);
#else
return parent->socket_protect(socket, endpoint.to_string(), endpoint.is_ipv6());
#endif
}
else else
return true; return true;
} }
@@ -436,7 +442,10 @@ namespace openvpn {
std::string tls_version_min_override; std::string tls_version_min_override;
std::string tls_cert_profile_override; std::string tls_cert_profile_override;
std::string gui_version; std::string gui_version;
std::string sso_methods;
bool allow_local_lan_access; bool allow_local_lan_access;
std::string hw_addr_override;
std::string platform_version;
ProtoContextOptions::Ptr proto_context_options; ProtoContextOptions::Ptr proto_context_options;
PeerInfo::Set::Ptr extra_peer_info; PeerInfo::Set::Ptr extra_peer_info;
HTTPProxyTransport::Options::Ptr http_proxy_options; HTTPProxyTransport::Options::Ptr http_proxy_options;
@@ -656,7 +665,7 @@ namespace openvpn {
catch (const std::exception& e) catch (const std::exception& e)
{ {
eval.error = true; eval.error = true;
eval.message = Unicode::utf8_printable<std::string>(e.what(), 256); eval.message = Unicode::utf8_printable<std::string>(std::string("ERR_PROFILE_GENERIC: ") + e.what(), 256);
} }
} }
@@ -689,6 +698,9 @@ namespace openvpn {
state->tls_cert_profile_override = config.tlsCertProfileOverride; state->tls_cert_profile_override = config.tlsCertProfileOverride;
state->allow_local_lan_access = config.allowLocalLanAccess; state->allow_local_lan_access = config.allowLocalLanAccess;
state->gui_version = config.guiVersion; state->gui_version = config.guiVersion;
state->sso_methods = config.ssoMethods;
state->platform_version = config.platformVersion;
state->hw_addr_override = config.hwAddrOverride;
state->alt_proxy = config.altProxy; state->alt_proxy = config.altProxy;
state->dco = config.dco; state->dco = config.dco;
state->echo = config.echo; state->echo = config.echo;
@@ -801,6 +813,11 @@ namespace openvpn {
return ret; return ret;
} }
OPENVPN_CLIENT_EXPORT bool OpenVPNClient::socket_protect(int socket, std::string remote, bool ipv6)
{
return true;
}
OPENVPN_CLIENT_EXPORT bool OpenVPNClient::parse_dynamic_challenge(const std::string& cookie, DynamicChallenge& dc) OPENVPN_CLIENT_EXPORT bool OpenVPNClient::parse_dynamic_challenge(const std::string& cookie, DynamicChallenge& dc)
{ {
try { try {
@@ -962,14 +979,17 @@ namespace openvpn {
cc.tls_version_min_override = state->tls_version_min_override; cc.tls_version_min_override = state->tls_version_min_override;
cc.tls_cert_profile_override = state->tls_cert_profile_override; cc.tls_cert_profile_override = state->tls_cert_profile_override;
cc.gui_version = state->gui_version; cc.gui_version = state->gui_version;
cc.sso_methods = state->sso_methods;
cc.hw_addr_override = state->hw_addr_override;
cc.platform_version = state->platform_version;
cc.extra_peer_info = state->extra_peer_info; cc.extra_peer_info = state->extra_peer_info;
cc.stop = state->async_stop_local(); cc.stop = state->async_stop_local();
cc.allow_local_lan_access = state->allow_local_lan_access; cc.allow_local_lan_access = state->allow_local_lan_access;
#ifdef OPENVPN_GREMLIN #ifdef OPENVPN_GREMLIN
cc.gremlin_config = state->gremlin_config; cc.gremlin_config = state->gremlin_config;
#endif #endif
#if defined(USE_TUN_BUILDER)
cc.socket_protect = &state->socket_protect; cc.socket_protect = &state->socket_protect;
#if defined(USE_TUN_BUILDER)
cc.builder = this; cc.builder = this;
#endif #endif
#if defined(OPENVPN_EXTERNAL_TUN_FACTORY) #if defined(OPENVPN_EXTERNAL_TUN_FACTORY)

View File

@@ -172,6 +172,20 @@ namespace openvpn {
// Passed to server as IV_GUI_VER. // Passed to server as IV_GUI_VER.
std::string guiVersion; std::string guiVersion;
// Set to a comma seperated list of supported SSO mechanisms that may
// be signalled via INFO_PRE to the client.
// "openurl" is to continue authentication by opening an url in a browser
// "crtext" gives a challenge response in text format that needs to
// responded via control channel. (
// Passed to the server as IV_SSO
std::string ssoMethods;
// Override the string that is passed as IV_HWADDR to the server
std::string hwAddrOverride;
// Set the string that is passed to the server as IV_PLAT_VER
std::string platformVersion;
// Use a different server than that specified in "remote" // Use a different server than that specified in "remote"
// option of profile // option of profile
std::string serverOverride; std::string serverOverride;
@@ -481,7 +495,7 @@ namespace openvpn {
// Callback to "protect" a socket from being routed through the tunnel. // Callback to "protect" a socket from being routed through the tunnel.
// Will be called from the thread executing connect(). // Will be called from the thread executing connect().
// The remote and ipv6 are the remote host this socket will connect to // The remote and ipv6 are the remote host this socket will connect to
virtual bool socket_protect(int socket, std::string remote, bool ipv6) = 0; virtual bool socket_protect(int socket, std::string remote, bool ipv6);
// Primary VPN client connect method, doesn't return until disconnect. // Primary VPN client connect method, doesn't return until disconnect.
// Should be called by a worker thread. This method will make callbacks // Should be called by a worker thread. This method will make callbacks

View File

@@ -1,11 +1,11 @@
export ASIO_VERSION=asio-1-13-0 export ASIO_VERSION=asio-1-14-0
export ASIO_CSUM=54a1208d20f2104dbd6b7a04a9262f5ab649f4b7a9faf7eac4c2294e9e104c06 export ASIO_CSUM=bdb01a649c24d73ca4a836662e7af442d935313ed6deef6b07f17f3bc5f78d7a
export LZ4_VERSION=lz4-1.8.3 export LZ4_VERSION=lz4-1.8.3
export LZ4_CSUM=33af5936ac06536805f9745e0b6d61da606a1f8b4cc5c04dd3cbaca3b9b4fc43 export LZ4_CSUM=33af5936ac06536805f9745e0b6d61da606a1f8b4cc5c04dd3cbaca3b9b4fc43
export MBEDTLS_VERSION=mbedtls-2.7.5 export MBEDTLS_VERSION=mbedtls-2.7.12
export MBEDTLS_CSUM=a1302ad9094aabb9880d2755927b466a6bac8e02b68e04dee77321f3859e9b40 export MBEDTLS_CSUM=d3a36dbc9f607747daa6875c1ab2e41f49eff5fc99d3436b4f3ac90c89f3c143
export JSONCPP_VERSION=1.8.4 export JSONCPP_VERSION=1.8.4
export JSONCPP_CSUM=c49deac9e0933bcb7044f08516861a2d560988540b23de2ac1ad443b219afdb6 export JSONCPP_CSUM=c49deac9e0933bcb7044f08516861a2d560988540b23de2ac1ad443b219afdb6

View File

@@ -1,8 +1,7 @@
From c6963e33209e7fd40d65513e06c1bbb20319abe3 Mon Sep 17 00:00:00 2001 From 076f1437fe82de0b1f0ecf9a7ca031cd94c0c579 Mon Sep 17 00:00:00 2001
From: Lev Stipakov <lev@openvpn.net> From: Lev Stipakov <lev@openvpn.net>
Date: Fri, 23 Feb 2018 17:12:49 +0200 Date: Fri, 23 Feb 2018 17:12:49 +0200
Subject: [PATCH 2/2] Enable allowing unsupported critical extensions in Subject: [PATCH] Enable allowing unsupported critical extensions in runtime
runtime
When compile time flag MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION When compile time flag MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION
is not set, certificate parsing fails if certificate contains unsupported critical extension. is not set, certificate parsing fails if certificate contains unsupported critical extension.
@@ -55,7 +54,7 @@ index 408645ece..b116736f8 100644
/** /**
diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h
index c6e453274..72374e36b 100644 index 5fd6969da..1087ea166 100644
--- a/include/mbedtls/ssl.h --- a/include/mbedtls/ssl.h
+++ b/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h
@@ -696,6 +696,10 @@ struct mbedtls_ssl_config @@ -696,6 +696,10 @@ struct mbedtls_ssl_config
@@ -69,7 +68,7 @@ index c6e453274..72374e36b 100644
#if defined(MBEDTLS_SSL_RENEGOTIATION) #if defined(MBEDTLS_SSL_RENEGOTIATION)
int renego_max_records; /*!< grace period for renegotiation */ int renego_max_records; /*!< grace period for renegotiation */
unsigned char renego_period[8]; /*!< value of the record counters unsigned char renego_period[8]; /*!< value of the record counters
@@ -2275,6 +2279,24 @@ void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, @@ -2298,6 +2302,24 @@ void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
const unsigned char period[8] ); const unsigned char period[8] );
#endif /* MBEDTLS_SSL_RENEGOTIATION */ #endif /* MBEDTLS_SSL_RENEGOTIATION */
@@ -95,7 +94,7 @@ index c6e453274..72374e36b 100644
* \brief Return the number of data bytes available to read * \brief Return the number of data bytes available to read
* *
diff --git a/include/mbedtls/x509_crt.h b/include/mbedtls/x509_crt.h diff --git a/include/mbedtls/x509_crt.h b/include/mbedtls/x509_crt.h
index ac23cffe8..2e489915f 100644 index e72231ee8..9df19e52c 100644
--- a/include/mbedtls/x509_crt.h --- a/include/mbedtls/x509_crt.h
+++ b/include/mbedtls/x509_crt.h +++ b/include/mbedtls/x509_crt.h
@@ -90,6 +90,8 @@ typedef struct mbedtls_x509_crt @@ -90,6 +90,8 @@ typedef struct mbedtls_x509_crt
@@ -220,10 +219,10 @@ index edea950f8..a756d2801 100644
static const mbedtls_oid_descriptor_t oid_ext_key_usage[] = static const mbedtls_oid_descriptor_t oid_ext_key_usage[] =
{ {
diff --git a/library/ssl_tls.c b/library/ssl_tls.c diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index ca9b8c432..dba0d5122 100644 index 1270ee9b8..2ce3f9b7d 100644
--- a/library/ssl_tls.c --- a/library/ssl_tls.c
+++ b/library/ssl_tls.c +++ b/library/ssl_tls.c
@@ -4656,6 +4656,9 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) @@ -4668,6 +4668,9 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert ); mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert );
@@ -233,7 +232,7 @@ index ca9b8c432..dba0d5122 100644
i += 3; i += 3;
while( i < ssl->in_hslen ) while( i < ssl->in_hslen )
@@ -6586,6 +6589,11 @@ void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, @@ -6626,6 +6629,11 @@ void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
} }
#endif /* MBEDTLS_SSL_RENEGOTIATION */ #endif /* MBEDTLS_SSL_RENEGOTIATION */
@@ -246,18 +245,18 @@ index ca9b8c432..dba0d5122 100644
#if defined(MBEDTLS_SSL_CLI_C) #if defined(MBEDTLS_SSL_CLI_C)
void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets ) void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )
diff --git a/library/x509_crt.c b/library/x509_crt.c diff --git a/library/x509_crt.c b/library/x509_crt.c
index 6751da0d2..149149b96 100644 index 3ad53a715..130b3ad1b 100644
--- a/library/x509_crt.c --- a/library/x509_crt.c
+++ b/library/x509_crt.c +++ b/library/x509_crt.c
@@ -530,6 +530,7 @@ static int x509_get_crt_ext( unsigned char **p, @@ -539,6 +539,7 @@ static int x509_get_crt_ext( unsigned char **p,
int ret; int ret;
size_t len; size_t len;
unsigned char *end_ext_data, *end_ext_octet; unsigned char *end_ext_data, *end_ext_octet;
+ int is_supported; + int is_supported;
if( ( ret = mbedtls_x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 ) if( *p == end )
{ return( 0 );
@@ -589,9 +590,9 @@ static int x509_get_crt_ext( unsigned char **p, @@ -593,9 +594,9 @@ static int x509_get_crt_ext( unsigned char **p,
/* /*
* Detect supported extensions * Detect supported extensions
*/ */
@@ -269,7 +268,7 @@ index 6751da0d2..149149b96 100644
{ {
/* No parser found, skip extension */ /* No parser found, skip extension */
*p = end_ext_octet; *p = end_ext_octet;
@@ -599,6 +600,10 @@ static int x509_get_crt_ext( unsigned char **p, @@ -603,6 +604,10 @@ static int x509_get_crt_ext( unsigned char **p,
#if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) #if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION)
if( is_critical ) if( is_critical )
{ {
@@ -280,7 +279,7 @@ index 6751da0d2..149149b96 100644
/* Data is marked as critical: fail */ /* Data is marked as critical: fail */
return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );
@@ -952,6 +957,7 @@ int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *bu @@ -956,6 +961,7 @@ int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *bu
prev = crt; prev = crt;
mbedtls_x509_crt_init( crt->next ); mbedtls_x509_crt_init( crt->next );
@@ -315,10 +314,10 @@ index 000000000..7e0c56134
+OwQ6w1HweApjB46bGyILpGUi9MZhvCnoLWg+cN3/wQ== +OwQ6w1HweApjB46bGyILpGUi9MZhvCnoLWg+cN3/wQ==
+-----END CERTIFICATE----- +-----END CERTIFICATE-----
diff --git a/tests/suites/test_suite_x509parse.data b/tests/suites/test_suite_x509parse.data diff --git a/tests/suites/test_suite_x509parse.data b/tests/suites/test_suite_x509parse.data
index 406cf5931..212a2825a 100644 index 0fe68cb06..e39f065e2 100644
--- a/tests/suites/test_suite_x509parse.data --- a/tests/suites/test_suite_x509parse.data
+++ b/tests/suites/test_suite_x509parse.data +++ b/tests/suites/test_suite_x509parse.data
@@ -1766,6 +1766,12 @@ X509 File parse (trailing spaces, OK) @@ -1798,6 +1798,12 @@ X509 File parse (trailing spaces, OK)
depends_on:MBEDTLS_ECDSA_C:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_SHA256_C:MBEDTLS_RSA_C depends_on:MBEDTLS_ECDSA_C:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_SHA256_C:MBEDTLS_RSA_C
x509parse_crt_file:"data_files/server7_trailing_space.crt":0 x509parse_crt_file:"data_files/server7_trailing_space.crt":0
@@ -332,10 +331,10 @@ index 406cf5931..212a2825a 100644
depends_on:MBEDTLS_X509_USE_C depends_on:MBEDTLS_X509_USE_C
x509_get_time:MBEDTLS_ASN1_UTC_TIME:"500101000000Z":0:1950:1:1:0:0:0 x509_get_time:MBEDTLS_ASN1_UTC_TIME:"500101000000Z":0:1950:1:1:0:0:0
diff --git a/tests/suites/test_suite_x509parse.function b/tests/suites/test_suite_x509parse.function diff --git a/tests/suites/test_suite_x509parse.function b/tests/suites/test_suite_x509parse.function
index 06f010828..75936010f 100644 index 584ee822b..c12a0e0ef 100644
--- a/tests/suites/test_suite_x509parse.function --- a/tests/suites/test_suite_x509parse.function
+++ b/tests/suites/test_suite_x509parse.function +++ b/tests/suites/test_suite_x509parse.function
@@ -437,6 +437,21 @@ exit: @@ -448,6 +448,21 @@ exit:
} }
/* END_CASE */ /* END_CASE */
@@ -358,5 +357,5 @@ index 06f010828..75936010f 100644
void x509parse_crt( char *crt_data, char *result_str, int result ) void x509parse_crt( char *crt_data, char *result_str, int result )
{ {
-- --
2.18.0 2.22.0.windows.1

View File

@@ -268,7 +268,7 @@ namespace openvpn {
} }
else else
{ {
a.ver = V4; a.ver = V6;
a.u.v6 = IPv6::Addr::from_byte_string(bytestr); a.u.v6 = IPv6::Addr::from_byte_string(bytestr);
} }
return a; return a;

View File

@@ -35,6 +35,7 @@
#include <openvpn/common/socktypes.hpp> #include <openvpn/common/socktypes.hpp>
#include <openvpn/common/ffs.hpp> #include <openvpn/common/ffs.hpp>
#include <openvpn/common/hexstr.hpp> #include <openvpn/common/hexstr.hpp>
#include <openvpn/common/hash.hpp>
#include <openvpn/addr/iperr.hpp> #include <openvpn/addr/iperr.hpp>
namespace openvpn { namespace openvpn {

View File

@@ -34,6 +34,7 @@
#include <openvpn/common/socktypes.hpp> #include <openvpn/common/socktypes.hpp>
#include <openvpn/common/ffs.hpp> #include <openvpn/common/ffs.hpp>
#include <openvpn/common/hexstr.hpp> #include <openvpn/common/hexstr.hpp>
#include <openvpn/common/hash.hpp>
#include <openvpn/addr/ipv4.hpp> #include <openvpn/addr/ipv4.hpp>
#include <openvpn/addr/iperr.hpp> #include <openvpn/addr/iperr.hpp>

View File

@@ -53,6 +53,7 @@ namespace openvpn {
} }
} }
// bit positions between templ.prefix_len and prefix_len are randomized
inline Route random_subnet(const Route& templ, inline Route random_subnet(const Route& templ,
const unsigned int prefix_len, const unsigned int prefix_len,
RandomAPI& prng) RandomAPI& prng)

View File

@@ -202,6 +202,8 @@ namespace openvpn {
virtual Type vtype() const = 0; virtual Type vtype() const = 0;
virtual Status vstatus(const SCNetworkReachabilityFlags flags) const = 0; virtual Status vstatus(const SCNetworkReachabilityFlags flags) const = 0;
virtual ~ReachabilityBase() {}
CF::NetworkReachability reach; CF::NetworkReachability reach;
}; };

View File

@@ -48,6 +48,12 @@
namespace openvpn { namespace openvpn {
namespace AsioPolySock { namespace AsioPolySock {
// for shutdown()
enum ShutdownFlags {
SHUTDOWN_SEND = (1<<0),
SHUTDOWN_RECV = (1<<1),
};
class Base : public RC<thread_unsafe_refcount> class Base : public RC<thread_unsafe_refcount>
{ {
public: public:
@@ -66,6 +72,8 @@ namespace openvpn {
virtual void close() = 0; virtual void close() = 0;
virtual void shutdown(const unsigned int flags) {}
virtual void tcp_nodelay() {} virtual void tcp_nodelay() {}
virtual void set_cloexec() {} virtual void set_cloexec() {}
@@ -171,6 +179,14 @@ namespace openvpn {
} }
#endif #endif
virtual void shutdown(const unsigned int flags) override
{
if (flags & SHUTDOWN_SEND)
socket.shutdown(openvpn_io::ip::tcp::socket::shutdown_send);
else if (flags & SHUTDOWN_RECV)
socket.shutdown(openvpn_io::ip::tcp::socket::shutdown_receive);
}
virtual void close() override virtual void close() override
{ {
socket.close(); socket.close();
@@ -194,7 +210,8 @@ namespace openvpn {
#if defined(OPENVPN_POLYSOCK_SUPPORTS_ALT_ROUTING) #if defined(OPENVPN_POLYSOCK_SUPPORTS_ALT_ROUTING)
virtual std::string remote_endpoint_str() const override virtual std::string remote_endpoint_str() const override
{ {
return "TCP ALT " + socket.to_string(); const char *proto = (socket.alt_routing_enabled() ? "TCP ALT " : "TCP ");
return proto + socket.to_string();
} }
virtual bool alt_routing_enabled() override virtual bool alt_routing_enabled() override
@@ -261,6 +278,14 @@ namespace openvpn {
SockOpt::set_cloexec(fd); SockOpt::set_cloexec(fd);
} }
virtual void shutdown(const unsigned int flags) override
{
if (flags & SHUTDOWN_SEND)
socket.shutdown(openvpn_io::ip::tcp::socket::shutdown_send);
else if (flags & SHUTDOWN_RECV)
socket.shutdown(openvpn_io::ip::tcp::socket::shutdown_receive);
}
virtual void close() override virtual void close() override
{ {
socket.close(); socket.close();

View File

@@ -78,7 +78,6 @@ namespace openvpn {
S_SIGINT S_SIGINT
| S_SIGTERM | S_SIGTERM
#ifndef OPENVPN_PLATFORM_WIN #ifndef OPENVPN_PLATFORM_WIN
| S_SIGQUIT
| S_SIGHUP | S_SIGHUP
| S_SIGUSR1 | S_SIGUSR1
| S_SIGUSR2 | S_SIGUSR2

View File

@@ -35,14 +35,16 @@
#include <openvpn/common/binprefix.hpp> #include <openvpn/common/binprefix.hpp>
#include <openvpn/common/to_string.hpp> #include <openvpn/common/to_string.hpp>
#include <openvpn/pki/x509track.hpp> #include <openvpn/pki/x509track.hpp>
#include <openvpn/ssl/sni_metadata.hpp>
namespace openvpn { namespace openvpn {
class OpenSSLContext; class OpenSSLContext;
class MbedTLSContext; class MbedTLSContext;
struct AuthCert : public RC<thread_unsafe_refcount> class AuthCert : public RC<thread_unsafe_refcount>
{ {
public:
// AuthCert needs to friend SSL implementation classes // AuthCert needs to friend SSL implementation classes
friend class OpenSSLContext; friend class OpenSSLContext;
friend class MbedTLSContext; friend class MbedTLSContext;
@@ -52,16 +54,18 @@ namespace openvpn {
class Fail class Fail
{ {
public: public:
// ordered by priority // Ordered by severity. If many errors are present, the
// most severe error will be returned by get_code().
enum Type { enum Type {
OK=0, // OK MUST be 0 OK=0, // OK MUST be 0
OTHER, EXPIRED, // less severe...
BAD_CERT_TYPE, BAD_CERT_TYPE,
EXPIRED, CERT_FAIL,
SNI_ERROR, // more severe...
N N
}; };
void add_fail(const size_t depth, const Type new_code, const char *reason) void add_fail(const size_t depth, const Type new_code, std::string reason)
{ {
if (new_code > code) if (new_code > code)
code = new_code; code = new_code;
@@ -69,7 +73,7 @@ namespace openvpn {
errors.emplace_back(); errors.emplace_back();
std::string& err = errors[depth]; std::string& err = errors[depth];
if (err.empty()) if (err.empty())
err = reason; err = std::move(reason);
else if (err.find(reason) == std::string::npos) else if (err.find(reason) == std::string::npos)
{ {
err += ", "; err += ", ";
@@ -111,19 +115,21 @@ namespace openvpn {
return ret; return ret;
} }
static const char *render_code(const Type code) static std::string render_code(const Type code)
{ {
switch (code) switch (code)
{ {
case OK: case OK:
return "OK"; return "OK";
case OTHER: case CERT_FAIL:
default: default:
return "CERT_FAIL"; return "CERT_FAIL";
case BAD_CERT_TYPE: case BAD_CERT_TYPE:
return "BAD_CERT_TYPE"; return "BAD_CERT_TYPE";
case EXPIRED: case EXPIRED:
return "EXPIRED"; return "EXPIRED";
case SNI_ERROR:
return "SNI_ERROR";
} }
} }
@@ -143,6 +149,11 @@ namespace openvpn {
return sn >= 0; return sn >= 0;
} }
bool sni_defined() const
{
return !sni.empty();
}
bool cn_defined() const bool cn_defined() const
{ {
return !cn.empty(); return !cn.empty();
@@ -161,7 +172,7 @@ namespace openvpn {
bool operator==(const AuthCert& other) const bool operator==(const AuthCert& other) const
{ {
return cn == other.cn && sn == other.sn && !std::memcmp(issuer_fp, other.issuer_fp, sizeof(issuer_fp)); return sni == other.sni && cn == other.cn && sn == other.sn && !std::memcmp(issuer_fp, other.issuer_fp, sizeof(issuer_fp));
} }
bool operator!=(const AuthCert& other) const bool operator!=(const AuthCert& other) const
@@ -172,6 +183,10 @@ namespace openvpn {
std::string to_string() const std::string to_string() const
{ {
std::ostringstream os; std::ostringstream os;
if (!sni.empty())
os << "SNI=" << sni << ' ';
if (sni_metadata)
os << "SNI_CN=" << sni_metadata->sni_client_name(*this) << ' ';
os << "CN=" << cn os << "CN=" << cn
<< " SN=" << sn << " SN=" << sn
<< " ISSUER_FP=" << issuer_fp_str(false); << " ISSUER_FP=" << issuer_fp_str(false);
@@ -194,6 +209,21 @@ namespace openvpn {
return cn; return cn;
} }
// Allow sni_metadata object, if it exists, to generate the client name.
// Otherwise fall back to normalize_cn().
std::string sni_client_name() const
{
if (sni_metadata)
return sni_metadata->sni_client_name(*this);
else
return normalize_cn();
}
const std::string& get_sni() const
{
return sni;
}
const std::string& get_cn() const const std::string& get_cn() const
{ {
return cn; return cn;
@@ -214,11 +244,11 @@ namespace openvpn {
return std::move(x509_track); return std::move(x509_track);
} }
void add_fail(const size_t depth, const Fail::Type new_code, const char *reason) void add_fail(const size_t depth, const Fail::Type new_code, std::string reason)
{ {
if (!fail) if (!fail)
fail.reset(new Fail()); fail.reset(new Fail());
fail->add_fail(depth, new_code, reason); fail->add_fail(depth, new_code, std::move(reason));
} }
bool is_fail() const bool is_fail() const
@@ -231,13 +261,23 @@ namespace openvpn {
return fail.get(); return fail.get();
} }
std::string fail_str() const
{
if (fail)
return fail->to_string(true);
else
return "OK";
}
private: private:
std::string sni; // SNI (server name indication)
std::string cn; // common name std::string cn; // common name
long sn; // serial number long sn; // serial number
unsigned char issuer_fp[20]; // issuer cert fingerprint unsigned char issuer_fp[20]; // issuer cert fingerprint
std::unique_ptr<Fail> fail; std::unique_ptr<Fail> fail;
std::unique_ptr<X509Track::Set> x509_track; std::unique_ptr<X509Track::Set> x509_track;
SNI::Metadata::UPtr sni_metadata;
}; };
} }

View File

@@ -0,0 +1,58 @@
// OpenVPN -- An application to securely tunnel IP networks
// over a single port, with support for SSL/TLS-based
// session authentication and key exchange,
// packet encryption, packet authentication, and
// packet compression.
//
// Copyright (C) 2012-2019 OpenVPN Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License Version 3
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program in the COPYING file.
// If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include <openvpn/buffer/buffer.hpp>
namespace openvpn {
// Iterate over the lines in a buffer by returning
// a sub-buffer for each line. Zero-copy.
class BufferLineIterator
{
public:
BufferLineIterator(const ConstBuffer& buf)
: src(buf)
{
}
// Returns a zero-length buffer at end of iteration
ConstBuffer next()
{
return src.read_alloc_buf(line_len());
}
private:
size_t line_len() const
{
const unsigned char *const data = src.c_data();
size_t i = 0;
while (i < src.size())
if (data[i++] == '\n')
break;
return i;
}
ConstBuffer src;
};
}

View File

@@ -0,0 +1,45 @@
// OpenVPN -- An application to securely tunnel IP networks
// over a single port, with support for SSL/TLS-based
// session authentication and key exchange,
// packet encryption, packet authentication, and
// packet compression.
//
// Copyright (C) 2012-2019 OpenVPN Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License Version 3
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program in the COPYING file.
// If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include <openvpn/buffer/buffer.hpp>
namespace openvpn {
// constant-length Buffer for writing that cannot be extended
template <std::size_t N>
class StaticBuffer : public Buffer
{
public:
StaticBuffer()
: Buffer(data, N, false)
{
}
StaticBuffer(const StaticBuffer&) = delete;
StaticBuffer& operator=(const StaticBuffer&) = delete;
private:
unsigned char data[N];
};
}

View File

@@ -71,12 +71,12 @@ namespace openvpn {
return buf_to_string(data); return buf_to_string(data);
} }
const size_t length() const size_t length() const
{ {
return data.size(); return data.size();
} }
const bool empty() const bool empty() const
{ {
return !length(); return !length();
} }

View File

@@ -460,6 +460,14 @@ namespace openvpn {
stop(); stop();
} }
break; break;
case Error::TUN_REGISTER_RINGS_ERROR:
{
ClientEvent::Base::Ptr ev = new ClientEvent::TunSetupFailed(client->fatal_reason());
client_options->events().add_event(std::move(ev));
client_options->stats().error(Error::TUN_REGISTER_RINGS_ERROR);
stop();
}
break;
case Error::TUN_IFACE_CREATE: case Error::TUN_IFACE_CREATE:
{ {
ClientEvent::Base::Ptr ev = new ClientEvent::TunIfaceCreate(client->fatal_reason()); ClientEvent::Base::Ptr ev = new ClientEvent::TunIfaceCreate(client->fatal_reason());
@@ -473,7 +481,7 @@ namespace openvpn {
ClientEvent::Base::Ptr ev = new ClientEvent::TunIfaceDisabled(client->fatal_reason()); ClientEvent::Base::Ptr ev = new ClientEvent::TunIfaceDisabled(client->fatal_reason());
client_options->events().add_event(std::move(ev)); client_options->events().add_event(std::move(ev));
client_options->stats().error(Error::TUN_IFACE_DISABLED); client_options->stats().error(Error::TUN_IFACE_DISABLED);
stop(); queue_restart(5000);
} }
break; break;
case Error::PROXY_ERROR: case Error::PROXY_ERROR:
@@ -529,7 +537,10 @@ namespace openvpn {
ClientEvent::Base::Ptr ev = new ClientEvent::InactiveTimeout(); ClientEvent::Base::Ptr ev = new ClientEvent::InactiveTimeout();
client_options->events().add_event(std::move(ev)); client_options->events().add_event(std::move(ev));
client_options->stats().error(Error::INACTIVE_TIMEOUT); client_options->stats().error(Error::INACTIVE_TIMEOUT);
graceful_stop();
// explicit exit notify is sent earlier by
// ClientProto::Session::inactive_callback()
stop();
} }
break; break;
case Error::TRANSPORT_ERROR: case Error::TRANSPORT_ERROR:
@@ -548,6 +559,14 @@ namespace openvpn {
queue_restart(5000); queue_restart(5000);
} }
break; break;
case Error::TUN_HALT:
{
ClientEvent::Base::Ptr ev = new ClientEvent::TunHalt(client->fatal_reason());
client_options->events().add_event(std::move(ev));
client_options->stats().error(Error::TUN_HALT);
stop();
}
break;
case Error::RELAY: case Error::RELAY:
{ {
ClientEvent::Base::Ptr ev = new ClientEvent::Relay(); ClientEvent::Base::Ptr ev = new ClientEvent::Relay();

View File

@@ -55,6 +55,7 @@ namespace openvpn {
PAUSE, PAUSE,
RESUME, RESUME,
RELAY, RELAY,
COMPRESSION_ENABLED,
UNSUPPORTED_FEATURE, UNSUPPORTED_FEATURE,
// start of nonfatal errors, must be marked by NONFATAL_ERROR_START below // start of nonfatal errors, must be marked by NONFATAL_ERROR_START below
@@ -68,6 +69,7 @@ namespace openvpn {
TLS_VERSION_MIN, TLS_VERSION_MIN,
CLIENT_HALT, CLIENT_HALT,
CLIENT_SETUP, CLIENT_SETUP,
TUN_HALT,
CONNECTION_TIMEOUT, CONNECTION_TIMEOUT,
INACTIVE_TIMEOUT, INACTIVE_TIMEOUT,
DYNAMIC_CHALLENGE, DYNAMIC_CHALLENGE,
@@ -108,6 +110,7 @@ namespace openvpn {
"PAUSE", "PAUSE",
"RESUME", "RESUME",
"RELAY", "RELAY",
"COMPRESSION_ENABLED",
"UNSUPPORTED_FEATURE", "UNSUPPORTED_FEATURE",
// nonfatal errors // nonfatal errors
@@ -121,6 +124,7 @@ namespace openvpn {
"TLS_VERSION_MIN", "TLS_VERSION_MIN",
"CLIENT_HALT", "CLIENT_HALT",
"CLIENT_SETUP", "CLIENT_SETUP",
"TUN_HALT",
"CONNECTION_TIMEOUT", "CONNECTION_TIMEOUT",
"INACTIVE_TIMEOUT", "INACTIVE_TIMEOUT",
"DYNAMIC_CHALLENGE", "DYNAMIC_CHALLENGE",
@@ -361,6 +365,11 @@ namespace openvpn {
ClientRestart(std::string reason) : ReasonBase(CLIENT_RESTART, std::move(reason)) {} ClientRestart(std::string reason) : ReasonBase(CLIENT_RESTART, std::move(reason)) {}
}; };
struct TunHalt : public ReasonBase
{
TunHalt(std::string reason) : ReasonBase(TUN_HALT, std::move(reason)) {}
};
struct RelayError : public ReasonBase struct RelayError : public ReasonBase
{ {
RelayError(std::string reason) : ReasonBase(RELAY_ERROR, std::move(reason)) {} RelayError(std::string reason) : ReasonBase(RELAY_ERROR, std::move(reason)) {}
@@ -456,6 +465,14 @@ namespace openvpn {
} }
}; };
struct CompressionEnabled : public ReasonBase
{
CompressionEnabled(std::string msg)
: ReasonBase(COMPRESSION_ENABLED, std::move(msg))
{
}
};
class Queue : public RC<thread_unsafe_refcount> class Queue : public RC<thread_unsafe_refcount>
{ {
public: public:

View File

@@ -120,8 +120,11 @@ namespace openvpn {
struct Config struct Config
{ {
std::string gui_version; std::string gui_version;
std::string sso_methods;
std::string server_override; std::string server_override;
std::string port_override; std::string port_override;
std::string hw_addr_override;
std::string platform_version;
Protocol proto_override; Protocol proto_override;
IPv6Setting ipv6; IPv6Setting ipv6;
int conn_timeout = 0; int conn_timeout = 0;
@@ -308,6 +311,13 @@ namespace openvpn {
synchronous_dns_lookup = config.synchronous_dns_lookup; synchronous_dns_lookup = config.synchronous_dns_lookup;
#ifdef OPENVPN_TLS_LINK
if (opt.exists("tls-ca"))
{
tls_ca = opt.cat("tls-ca");
}
#endif
// init transport config // init transport config
const std::string session_name = load_transport_config(); const std::string session_name = load_transport_config();
@@ -426,12 +436,14 @@ namespace openvpn {
tunconf->stop = config.stop; tunconf->stop = config.stop;
tunconf->wintun = config.wintun; tunconf->wintun = config.wintun;
if (config.tun_persist) if (config.tun_persist)
{ {
tunconf->tun_persist.reset(new TunWin::TunPersist(true, false, nullptr)); tunconf->tun_persist.reset(new TunWin::TunPersist(true, false, nullptr));
tunconf->tun_prop.remote_bypass = true; #ifndef OPENVPN_COMMAND_AGENT
/* remote_list is required by remote_bypass to work */ /* remote_list is required by remote_bypass to work */
tunconf->tun_prop.remote_list = remote_list; tunconf->tun_prop.remote_bypass = true;
} tunconf->tun_prop.remote_list = remote_list;
#endif
}
#ifdef OPENVPN_COMMAND_AGENT #ifdef OPENVPN_COMMAND_AGENT
tunconf->tun_setup_factory = WinCommandAgent::new_agent(opt); tunconf->tun_setup_factory = WinCommandAgent::new_agent(opt);
#endif #endif
@@ -534,14 +546,27 @@ namespace openvpn {
// setenv UV_ options // setenv UV_ options
pi->append_foreign_set_ptr(pcc.peerInfoUV()); pi->append_foreign_set_ptr(pcc.peerInfoUV());
// UI version
if (!config.gui_version.empty())
pi->emplace_back("IV_GUI_VER", config.gui_version);
// Supported SSO methods
if (!config.sso_methods.empty())
pi->emplace_back("IV_SSO", config.sso_methods);
// MAC address // MAC address
if (pcc.pushPeerInfo()) if (pcc.pushPeerInfo())
{ {
std::string hwaddr = get_hwaddr(); std::string hwaddr = get_hwaddr();
if (!hwaddr.empty()) if (!config.hw_addr_override.empty())
pi->emplace_back("IV_HWADDR", config.hw_addr_override);
else if (!hwaddr.empty())
pi->emplace_back("IV_HWADDR", hwaddr); pi->emplace_back("IV_HWADDR", hwaddr);
} pi->emplace_back ("IV_SSL", get_ssl_library_version());
if (!config.platform_version.empty())
pi->emplace_back("IV_PLAT_VER", config.platform_version);
}
return pi; return pi;
} }
@@ -716,7 +741,6 @@ namespace openvpn {
cp->ssl_factory = cc->new_factory(); cp->ssl_factory = cc->new_factory();
cp->load(opt, *proto_context_options, config.default_key_direction, false); cp->load(opt, *proto_context_options, config.default_key_direction, false);
cp->set_xmit_creds(!autologin || pcc.hasEmbeddedPassword() || autologin_sessions); cp->set_xmit_creds(!autologin || pcc.hasEmbeddedPassword() || autologin_sessions);
cp->gui_version = config.gui_version;
cp->force_aes_cbc_ciphersuites = config.force_aes_cbc_ciphersuites; // also used to disable proto V2 cp->force_aes_cbc_ciphersuites = config.force_aes_cbc_ciphersuites; // also used to disable proto V2
cp->extra_peer_info = build_peer_info(config, pcc, autologin_sessions); cp->extra_peer_info = build_peer_info(config, pcc, autologin_sessions);
cp->frame = frame; cp->frame = frame;
@@ -825,6 +849,7 @@ namespace openvpn {
#ifdef OPENVPN_TLS_LINK #ifdef OPENVPN_TLS_LINK
if (transport_protocol.is_tls()) if (transport_protocol.is_tls())
tcpconf->use_tls = true; tcpconf->use_tls = true;
tcpconf->tls_ca = tls_ca;
#endif #endif
#ifdef OPENVPN_GREMLIN #ifdef OPENVPN_GREMLIN
tcpconf->gremlin_config = gremlin_config; tcpconf->gremlin_config = gremlin_config;
@@ -881,6 +906,9 @@ namespace openvpn {
DCO::Ptr dco; DCO::Ptr dco;
#ifdef OPENVPN_EXTERNAL_TRANSPORT_FACTORY #ifdef OPENVPN_EXTERNAL_TRANSPORT_FACTORY
ExternalTransport::Factory* extern_transport_factory; ExternalTransport::Factory* extern_transport_factory;
#endif
#ifdef OPENVPN_TLS_LINK
std::string tls_ca;
#endif #endif
}; };
} }

View File

@@ -97,7 +97,7 @@ namespace openvpn {
if (arg1 == "GENERIC_CONFIG") if (arg1 == "GENERIC_CONFIG")
{ {
error_ = true; error_ = true;
message_ = "SERVER_LOCKED_UNSUPPORTED: server locked profiles are currently unsupported"; message_ = "ERR_PROFILE_SERVER_LOCKED_UNSUPPORTED: server locked profiles are currently unsupported";
return; return;
} }
else if (arg1 == "ALLOW_PASSWORD_SAVE") else if (arg1 == "ALLOW_PASSWORD_SAVE")
@@ -307,7 +307,7 @@ namespace openvpn {
catch (const std::exception& e) catch (const std::exception& e)
{ {
error_ = true; error_ = true;
message_ = Unicode::utf8_printable<std::string>(e.what(), 256); message_ = Unicode::utf8_printable<std::string>(std::string("ERR_PROFILE_GENERIC: ") + e.what(), 256);
} }
} }
@@ -374,7 +374,7 @@ namespace openvpn {
{ {
ParseClientConfig ret; ParseClientConfig ret;
ret.error_ = true; ret.error_ = true;
ret.message_ = Unicode::utf8_printable<std::string>(e.what(), 256); ret.message_ = Unicode::utf8_printable<std::string>(std::string("ERR_PROFILE_GENERIC: ") + e.what(), 256);
return ret; return ret;
} }
} }
@@ -558,8 +558,8 @@ namespace openvpn {
// JSON config is aimed to users, therefore we do not export the raw private // JSON config is aimed to users, therefore we do not export the raw private
// key, but only some basic info // key, but only some basic info
SSLConfigAPI::PKType priv_key_type = sslConfig->private_key_type(); PKType::Type priv_key_type = sslConfig->private_key_type();
if (priv_key_type != SSLConfigAPI::PK_NONE) if (priv_key_type != PKType::PK_NONE)
{ {
root["key"] = Json::Value(Json::objectValue); root["key"] = Json::Value(Json::objectValue);
root["key"]["type"] = Json::Value(sslConfig->private_key_type_string()); root["key"]["type"] = Json::Value(sslConfig->private_key_type_string());

View File

@@ -506,7 +506,7 @@ namespace openvpn {
{ {
const Option* o = opt.get_ptr("auth-token-user"); const Option* o = opt.get_ptr("auth-token-user");
if (o) if (o)
username = base64->decode(o->get(1, 256)); username = base64->decode(o->get(1, 340)); // 255 chars after base64 decode
} }
// auth-token // auth-token
@@ -601,6 +601,20 @@ namespace openvpn {
// send the Connected event // send the Connected event
cli_events->add_event(connected_); cli_events->add_event(connected_);
// Issue an event if compression is enabled
CompressContext::Type comp_type = Base::conf().comp_ctx.type();
if (comp_type != CompressContext::NONE
&& !CompressContext::is_any_stub(comp_type))
{
std::ostringstream msg;
msg << (proto_context_options->is_comp_asym()
? "Asymmetric compression enabled. Server may send compressed data."
: "Compression enabled.");
msg << " This may be a potential security issue.";
ClientEvent::Base::Ptr ev = new ClientEvent::CompressionEnabled(msg.str());
cli_events->add_event(std::move(ev));
}
} }
else else
OPENVPN_LOG("Options continuation..."); OPENVPN_LOG("Options continuation...");
@@ -739,6 +753,8 @@ namespace openvpn {
virtual void tun_error(const Error::Type fatal_err, const std::string& err_text) virtual void tun_error(const Error::Type fatal_err, const std::string& err_text)
{ {
if (fatal_err == Error::TUN_HALT)
send_explicit_exit_notify();
if (fatal_err != Error::UNDEF) if (fatal_err != Error::UNDEF)
{ {
fatal_ = fatal_err; fatal_ = fatal_err;

View File

@@ -759,7 +759,7 @@ namespace openvpn {
// return the current primary index (into list) and raise an exception // return the current primary index (into list) and raise an exception
// if it is undefined // if it is undefined
const size_t primary_index() const size_t primary_index() const
{ {
const size_t pri = index.primary(); const size_t pri = index.primary();
if (pri < list.size()) if (pri < list.size())
@@ -890,7 +890,7 @@ namespace openvpn {
} }
else else
e->server_port = default_port; e->server_port = default_port;
if (o.size() >= 4+adj) if (o.size() >= (size_t)(4+adj))
e->transport_protocol = Protocol::parse(o.get(3+adj, 16), Protocol::CLIENT_SUFFIX); e->transport_protocol = Protocol::parse(o.get(3+adj, 16), Protocol::CLIENT_SUFFIX);
else else
e->transport_protocol = default_proto; e->transport_protocol = default_proto;

View File

@@ -0,0 +1,39 @@
// OpenVPN -- An application to securely tunnel IP networks
// over a single port, with support for SSL/TLS-based
// session authentication and key exchange,
// packet encryption, packet authentication, and
// packet compression.
//
// Copyright (C) 2012-2019 OpenVPN Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License Version 3
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program in the COPYING file.
// If not, see <http://www.gnu.org/licenses/>.
#pragma once
// loose emulation of std::clamp for pre-C++17
namespace openvpn {
template <typename T>
T clamp(T value, T low, T high)
{
if (value < low)
return low;
else if (value > high)
return high;
else
return value;
}
}

View File

@@ -34,17 +34,52 @@
#include <openvpn/common/logrotate.hpp> #include <openvpn/common/logrotate.hpp>
#include <openvpn/common/redir.hpp> #include <openvpn/common/redir.hpp>
#include <openvpn/common/usergroup.hpp> #include <openvpn/common/usergroup.hpp>
#include <openvpn/common/logsetup.hpp>
namespace openvpn { namespace openvpn {
OPENVPN_EXCEPTION(daemon_err); OPENVPN_EXCEPTION(daemon_err);
inline void log_setup(const std::string& log_fn, class LogReopen : public LogSetup
const SetUserGroup* user_group, {
const bool log_append, public:
const int log_versions, LogReopen(const std::string& log_fn,
const bool stdin_to_dev_null, const bool combine_out_err)
const bool combine_out_err) : log_fn_(log_fn),
combine_out_err_(combine_out_err)
{
}
virtual void reopen() const override
{
try {
// open redirection log file, but don't redirect yet
RedirectStd redir(std::string(),
log_fn_,
RedirectStd::FLAGS_APPEND,
RedirectStd::MODE_USER_GROUP,
combine_out_err_);
// now do the redirect
redir.redirect();
}
catch (const std::exception& e)
{
std::cerr << "LogReopen: " << e.what() << std::endl;
}
}
private:
const std::string log_fn_;
const bool combine_out_err_;
};
inline LogSetup::Ptr log_setup(const std::string& log_fn,
const SetUserGroup* user_group,
const bool log_append,
const int log_versions,
const bool stdin_to_dev_null,
const bool combine_out_err)
{ {
if (!log_append && log_versions >= 1) if (!log_append && log_versions >= 1)
log_rotate(log_fn, log_versions); log_rotate(log_fn, log_versions);
@@ -62,6 +97,12 @@ namespace openvpn {
{ {
} }
redir.redirect(); redir.redirect();
// possibly return a LogReopen object
if (!log_versions)
return LogSetup::Ptr(new LogReopen(log_fn, combine_out_err));
else
return LogSetup::Ptr();
} }
inline void daemonize() inline void daemonize()
@@ -70,13 +111,14 @@ namespace openvpn {
throw daemon_err("daemon() failed"); throw daemon_err("daemon() failed");
} }
inline void daemonize(const std::string& log_fn, inline LogSetup::Ptr daemonize(const std::string& log_fn,
const SetUserGroup* user_group, const SetUserGroup* user_group,
const bool log_append, const bool log_append,
const int log_versions) const int log_versions)
{ {
log_setup(log_fn, user_group, log_append, log_versions, true, true); LogSetup::Ptr ret = log_setup(log_fn, user_group, log_append, log_versions, true, true);
daemonize(); daemonize();
return ret;
} }
inline void write_pid(const std::string& fn) inline void write_pid(const std::string& fn)

View File

@@ -34,13 +34,13 @@
#include <openvpn/common/size.hpp> #include <openvpn/common/size.hpp>
#include <openvpn/common/exception.hpp> #include <openvpn/common/exception.hpp>
#include <openvpn/common/uniqueptr.hpp> #include <openvpn/common/uniqueptr.hpp>
#include <openvpn/common/function.hpp>
namespace openvpn { namespace openvpn {
OPENVPN_EXCEPTION(enum_dir_error); OPENVPN_EXCEPTION(enum_dir_error);
template <typename F>
inline bool enum_dir(const std::string& dirname, inline bool enum_dir(const std::string& dirname,
Function<void(std::string fn)> func) F func)
{ {
unique_ptr_del<DIR> dir(::opendir(dirname.c_str()), [](DIR* d) { ::closedir(d); }); unique_ptr_del<DIR> dir(::opendir(dirname.c_str()), [](DIR* d) { ::closedir(d); });
if (!dir) if (!dir)

View File

@@ -23,6 +23,10 @@
#define OPENVPN_COMMON_EXTERN_H #define OPENVPN_COMMON_EXTERN_H
#ifndef OPENVPN_EXTERN #ifndef OPENVPN_EXTERN
// Remember that OPENVPN_EXTERN was not defined since something like
// #if OPENVPN_EXTERN == extern or OPENVPN_EXTERN == "" is not allowed
// in C/C++ preprocessor
#define OPENVPN_NO_EXTERN
#define OPENVPN_EXTERN #define OPENVPN_EXTERN
#endif #endif

View File

@@ -35,6 +35,10 @@
#include <openvpn/buffer/bufstr.hpp> #include <openvpn/buffer/bufstr.hpp>
#include <openvpn/buffer/buflist.hpp> #include <openvpn/buffer/buflist.hpp>
#if defined(OPENVPN_PLATFORM_WIN)
#include <openvpn/win/unicode.hpp>
#endif
namespace openvpn { namespace openvpn {
OPENVPN_UNTAGGED_EXCEPTION(file_exception); OPENVPN_UNTAGGED_EXCEPTION(file_exception);
@@ -61,7 +65,12 @@ namespace openvpn {
const std::uint64_t max_size = 0, const std::uint64_t max_size = 0,
const unsigned int buffer_flags = 0) const unsigned int buffer_flags = 0)
{ {
#if defined(OPENVPN_PLATFORM_WIN)
Win::UTF16 filenamew(Win::utf16(filename));
std::ifstream ifs(filenamew.get(), std::ios::binary);
#else
std::ifstream ifs(filename.c_str(), std::ios::binary); std::ifstream ifs(filename.c_str(), std::ios::binary);
#endif
if (!ifs) if (!ifs)
OPENVPN_THROW(open_file_error, "cannot open for read: " << filename); OPENVPN_THROW(open_file_error, "cannot open for read: " << filename);

View File

@@ -55,7 +55,7 @@ namespace openvpn {
// generate temporary filename // generate temporary filename
unsigned char data[16]; unsigned char data[16];
rng.rand_fill(data); rng.rand_fill(data);
const std::string tfn = path::join(tmpdir, '.' + path::basename(fn) + '.' + render_hex(data, sizeof(data))); const std::string tfn = path::join(tmpdir, '.' + path::basename(fn).substr(0, 64) + '.' + render_hex(data, sizeof(data)));
// write to temporary file // write to temporary file
write_binary_unix(tfn, mode, mtime_ns, buf); write_binary_unix(tfn, mode, mtime_ns, buf);

View File

@@ -158,12 +158,12 @@ namespace openvpn {
return bp; return bp;
} }
inline bool read_binary_unix_fast(const std::string& fn, inline int read_binary_unix_fast(const std::string& fn,
Buffer& out) Buffer& out)
{ {
ScopedFD fd(::open(fn.c_str(), O_RDONLY|O_CLOEXEC)); ScopedFD fd(::open(fn.c_str(), O_RDONLY|O_CLOEXEC));
if (!fd.defined()) if (!fd.defined())
return errno; return errno;
const ssize_t status = ::read(fd(), out.data_end(), out.remaining(0)); const ssize_t status = ::read(fd(), out.data_end(), out.remaining(0));
if (status < 0) if (status < 0)
return errno; return errno;

View File

@@ -279,6 +279,21 @@ namespace openvpn {
return os.str(); return os.str();
} }
/**
* Renders a combined hexadecimal and character dump of a buffer,
* with the typical 16 bytes split between hexadecimal and character
* separation per line.
*
* @param data Void pointer to the buffer to dump.
* @param size Size of the buffer to render.
*
* @return Returns a string containing a preformatted output of the
* hexadecimal dump.
*/
inline std::string dump_hex(void* data, size_t size)
{
return dump_hex((const unsigned char *)data, size);
}
/** /**
* Renders a combined hexadecimal and character dump of a std::string buffer, * Renders a combined hexadecimal and character dump of a std::string buffer,

View File

@@ -0,0 +1,36 @@
// OpenVPN -- An application to securely tunnel IP networks
// over a single port, with support for SSL/TLS-based
// session authentication and key exchange,
// packet encryption, packet authentication, and
// packet compression.
//
// Copyright (C) 2012-2019 OpenVPN Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License Version 3
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program in the COPYING file.
// If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include <openvpn/common/rc.hpp>
namespace openvpn {
class LogSetup : public RC<thread_unsafe_refcount>
{
public:
typedef RCPtr<LogSetup> Ptr;
virtual void reopen() const = 0;
};
}

View File

@@ -29,16 +29,23 @@
namespace openvpn { namespace openvpn {
namespace MSF { namespace MSF {
template <typename MAP_SET, typename ITERATOR> template <typename ITERATOR>
class Iter : public ITERATOR class Iter : public ITERATOR
{ {
public: public:
template <typename MAP_SET>
Iter(const MAP_SET& ms, ITERATOR&& iter) Iter(const MAP_SET& ms, ITERATOR&& iter)
: ITERATOR(std::move(iter)), : ITERATOR(std::move(iter)),
exists_(*this != ms.end()) exists_(*this != ms.end())
{ {
} }
Iter(ITERATOR&& iter)
: ITERATOR(std::move(iter)),
exists_(true)
{
}
explicit operator bool() const explicit operator bool() const
{ {
return exists_; return exists_;
@@ -50,11 +57,34 @@ namespace openvpn {
// Like ordinary map/set find, but returns an iterator // Like ordinary map/set find, but returns an iterator
// that defines an operator bool() method for testing if // that defines an operator bool() method for testing if
// the iterator is defined, i.e. iter != map_or_set.end() // the iterator is defined, so instead of:
//
// if (iter != map.end())
// do_stuff();
//
// you can say:
//
// if (iter)
// do_stuff();
//
template <typename MAP_SET, typename KEY> template <typename MAP_SET, typename KEY>
inline auto find(MAP_SET& ms, const KEY& k) inline auto find(MAP_SET& ms, const KEY& k)
{ {
return Iter<MAP_SET, decltype(ms.find(k))>(ms, ms.find(k)); return Iter<decltype(ms.find(k))>(ms, ms.find(k));
}
// Does key exist in map/set?
template <typename MAP_SET, typename KEY>
inline bool exists(MAP_SET& ms, const KEY& k)
{
return ms.find(k) != ms.end();
}
// Convert an ordinary, dereferenceable iterator to an MSF::Iter
template <typename ITERATOR>
inline auto iter(ITERATOR i)
{
return Iter<ITERATOR>(std::move(i));
} }
} }
} }

View File

@@ -196,6 +196,12 @@ namespace openvpn {
return px != rhs.px; return px != rhs.px;
} }
template <typename U>
RCPtr<U> static_pointer_cast() const noexcept
{
return RCPtr<U>(static_cast<U*>(px));
}
template <typename U> template <typename U>
RCPtr<U> dynamic_pointer_cast() const noexcept RCPtr<U> dynamic_pointer_cast() const noexcept
{ {

View File

@@ -37,6 +37,7 @@
#include <mutex> #include <mutex>
#include <memory> #include <memory>
#include <type_traits> // for std::is_nothrow_move_constructible #include <type_traits> // for std::is_nothrow_move_constructible
#include <utility>
#include <openvpn/common/platform.hpp> #include <openvpn/common/platform.hpp>
#include <openvpn/common/exception.hpp> #include <openvpn/common/exception.hpp>
@@ -45,10 +46,12 @@
#include <openvpn/common/stop.hpp> #include <openvpn/common/stop.hpp>
#include <openvpn/common/environ.hpp> #include <openvpn/common/environ.hpp>
#include <openvpn/common/number.hpp> #include <openvpn/common/number.hpp>
#include <openvpn/common/signal_name.hpp>
#include <openvpn/asio/asiosignal.hpp> #include <openvpn/asio/asiosignal.hpp>
#include <openvpn/time/time.hpp> #include <openvpn/time/time.hpp>
#include <openvpn/time/asiotimer.hpp> #include <openvpn/time/asiotimer.hpp>
#include <openvpn/time/timestr.hpp> #include <openvpn/time/timestr.hpp>
#include <openvpn/common/logsetup.hpp>
#ifdef ASIO_HAS_LOCAL_SOCKETS #ifdef ASIO_HAS_LOCAL_SOCKETS
#include <openvpn/common/scoped_fd.hpp> #include <openvpn/common/scoped_fd.hpp>
@@ -131,6 +134,11 @@ namespace openvpn {
async_stop_ = async_stop; async_stop_ = async_stop;
} }
void set_log_reopen(LogSetup::Ptr lr)
{
log_reopen = std::move(lr);
}
void set_thread(const unsigned int unit, std::thread* thread) void set_thread(const unsigned int unit, std::thread* thread)
{ {
while (threadlist.size() <= unit) while (threadlist.size() <= unit)
@@ -312,7 +320,7 @@ namespace openvpn {
stats = stats_arg; stats = stats_arg;
} }
virtual Stop* async_stop() virtual Stop* async_stop() override
{ {
return async_stop_; return async_stop_;
} }
@@ -342,14 +350,11 @@ namespace openvpn {
{ {
if (!error && !halt) if (!error && !halt)
{ {
OPENVPN_LOG("ASIO SIGNAL " << signum); OPENVPN_LOG("ASIO SIGNAL: " << signal_name(signum));
switch (signum) switch (signum)
{ {
case SIGINT: case SIGINT:
case SIGTERM: case SIGTERM:
#if !defined(OPENVPN_PLATFORM_WIN)
case SIGQUIT:
#endif
cancel(); cancel();
break; break;
#if !defined(OPENVPN_PLATFORM_WIN) #if !defined(OPENVPN_PLATFORM_WIN)
@@ -358,6 +363,11 @@ namespace openvpn {
OPENVPN_LOG(stats->dump()); OPENVPN_LOG(stats->dump());
signal_rearm(); signal_rearm();
break; break;
case SIGHUP:
if (log_reopen)
log_reopen->reopen();
signal_rearm();
break;
#endif #endif
default: default:
signal_rearm(); signal_rearm();
@@ -385,7 +395,7 @@ namespace openvpn {
exit_timer.expires_after(Time::Duration::seconds(n_sec)); exit_timer.expires_after(Time::Duration::seconds(n_sec));
exit_timer.async_wait([self=Ptr(this)](const openvpn_io::error_code& error) exit_timer.async_wait([self=Ptr(this)](const openvpn_io::error_code& error)
{ {
if (error) if (error || self->halt)
return; return;
OPENVPN_LOG("DEBUG EXIT"); OPENVPN_LOG("DEBUG EXIT");
self->cancel(); self->cancel();
@@ -420,6 +430,7 @@ namespace openvpn {
// logging // logging
Log::Context log_context; Log::Context log_context;
Log::Context::Wrapper log_wrap; // must be constructed after log_context Log::Context::Wrapper log_wrap; // must be constructed after log_context
LogSetup::Ptr log_reopen;
protected: protected:
volatile bool halt = false; volatile bool halt = false;

View File

@@ -115,6 +115,12 @@ namespace openvpn {
return u.dataz[0]; return u.dataz[0];
} }
template <typename HASH>
void hash(HASH& h) const
{
h(u.dataz[0]);
}
// Use a URL-safe base64 encoding. // Use a URL-safe base64 encoding.
std::string to_string() const std::string to_string() const
{ {
@@ -160,13 +166,15 @@ namespace openvpn {
} }
// Find an element in an unordered map (keyed by Session ID) // Find an element in an unordered map (keyed by Session ID)
// using weak equality. // using weak equality. If conflict is true, only return
// element that is present by weak equality, but which is
// not equal to *this by strong equality.
template <typename UNORDERED_MAP> template <typename UNORDERED_MAP>
const SessionIDType* find_weak(const UNORDERED_MAP& m) const const SessionIDType* find_weak(const UNORDERED_MAP& m, const bool conflict) const
{ {
const size_t bi = m.bucket(*this); const size_t bi = m.bucket(*this);
for (auto i = m.cbegin(bi); i != m.cend(bi); ++i) for (auto i = m.cbegin(bi); i != m.cend(bi); ++i)
if (shortform() == i->first.shortform()) if (shortform() == i->first.shortform() && (!conflict || *this != i->first))
return &i->first; return &i->first;
return nullptr; return nullptr;
} }

View File

@@ -0,0 +1,50 @@
// OpenVPN -- An application to securely tunnel IP networks
// over a single port, with support for SSL/TLS-based
// session authentication and key exchange,
// packet encryption, packet authentication, and
// packet compression.
//
// Copyright (C) 2012-2019 OpenVPN Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License Version 3
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program in the COPYING file.
// If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include <string>
#include <signal.h>
namespace openvpn {
inline std::string signal_name(const int signum)
{
switch (signum)
{
case SIGINT:
return "SIGINT";
case SIGTERM:
return "SIGTERM";
case SIGHUP:
return "SIGHUP";
case SIGUSR1:
return "SIGUSR1";
case SIGUSR2:
return "SIGUSR2";
case SIGPIPE:
return "SIGPIPE";
default:
return std::to_string(signum);
}
}
}

View File

@@ -150,6 +150,21 @@ namespace openvpn {
return false; return false;
} }
// Prepend leading characters (c) to str to obtain a minimum string length (min_len).
// Useful for adding leading zeros to numeric values or formatting tables.
inline std::string add_leading(const std::string& str, const size_t min_len, const char c)
{
if (min_len <= str.length())
return str;
size_t len = min_len - str.length();
std::string ret;
ret.reserve(min_len);
while (len--)
ret += c;
ret += str;
return ret;
}
// make sure that string ends with char c, if not append it // make sure that string ends with char c, if not append it
inline std::string add_trailing_copy(const std::string& str, const char c) inline std::string add_trailing_copy(const std::string& str, const char c)
{ {
@@ -235,16 +250,23 @@ namespace openvpn {
return str.find_first_of('\n') != std::string::npos; return str.find_first_of('\n') != std::string::npos;
} }
// return the first line (without newline) of a multi-line string // Return string up to a delimiter (without the delimiter).
inline std::string first_line(const std::string& str) // Returns the entire string if no delimiter is found.
inline std::string to_delim(const std::string& str, const char delim)
{ {
const size_t pos = str.find_first_of('\n'); const size_t pos = str.find_first_of(delim);
if (pos != std::string::npos) if (pos != std::string::npos)
return str.substr(0, pos); return str.substr(0, pos);
else else
return str; return str;
} }
// return the first line (without newline) of a multi-line string
inline std::string first_line(const std::string& str)
{
return to_delim(str, '\n');
}
// Define a common interpretation of what constitutes a space character. // Define a common interpretation of what constitutes a space character.
// Return true if c is a space char. // Return true if c is a space char.
inline bool is_space(const char c) inline bool is_space(const char c)
@@ -385,12 +407,16 @@ namespace openvpn {
// indent a multiline string // indent a multiline string
inline std::string indent(const std::string& str, const int first, const int remaining) inline std::string indent(const std::string& str, const int first, const int remaining)
{ {
std::string ret = spaces(first); std::string ret;
int n_spaces = first;
for (auto &c : str) for (auto &c : str)
{ {
if (n_spaces)
ret += spaces(n_spaces);
n_spaces = 0;
ret += c; ret += c;
if (c == '\n') if (c == '\n')
ret += spaces(remaining); n_spaces = remaining;
} }
return ret; return ret;
} }
@@ -447,7 +473,8 @@ namespace openvpn {
} }
// Split a string on sep delimiter. The size of the // Split a string on sep delimiter. The size of the
// returned string list will be at most maxsplit + 1. // returned string vector will be at least 1 and at
// most maxsplit + 1 (unless maxsplit is passed as -1).
inline std::vector<std::string> split(const std::string& str, inline std::vector<std::string> split(const std::string& str,
const char sep, const char sep,
const int maxsplit = -1) const int maxsplit = -1)
@@ -456,13 +483,16 @@ namespace openvpn {
int nterms = 0; int nterms = 0;
std::string term; std::string term;
for (auto &c : str) if (maxsplit >= 0)
ret.reserve(maxsplit + 1);
for (const auto c : str)
{ {
if (c == sep && (maxsplit < 0 || nterms < maxsplit)) if (c == sep && (maxsplit < 0 || nterms < maxsplit))
{ {
ret.push_back(std::move(term)); ret.push_back(std::move(term));
++nterms; ++nterms;
term = ""; term.clear();
} }
else else
term += c; term += c;

View File

@@ -56,5 +56,13 @@ namespace openvpn {
{ {
} }
}; };
struct UMaskDaemon : public UMask
{
UMaskDaemon()
: UMask(S_IWOTH)
{
}
};
} }
#endif #endif

View File

@@ -76,6 +76,16 @@ namespace openvpn {
} }
} }
const std::string& user() const
{
return user_name;
}
const std::string& group() const
{
return group_name;
}
void activate() const void activate() const
{ {
if (gr) if (gr)

Some files were not shown because too many files have changed in this diff Show More