@@ -23,6 +23,13 @@
the characters mentioned above were already escaped. However, the behavior of
Mbed TLS is slightly different from OpenSSL in that it also escapes "=".
+* **`secret` has been removed**
+
+ Static key mode (non-TLS) is no longer considered "good and secure enough" for
+ today's requirements. Use TLS mode instead. If deploying a PKI CA is considered
+ "too complicated", using `--peer-fingerprint` makes TLS mode about as easy as
+ using `--secret`.
+
## Maintainer-visible changes
- The configure-time option `--enable-debug` is no longer available
@@ -144,8 +144,7 @@
Test Crypto:
-./openvpn --genkey secret key
-./openvpn --test-crypto --secret key
+./openvpn --test-crypto
Test SSL/TLS negotiations (runs for 2 minutes):
@@ -108,7 +108,7 @@
For example on Windows, use double backslashes to represent pathnames:
::
- secret "c:\\OpenVPN\\secret.key"
+ tls-auth "c:\\OpenVPN\\secret.key"
For examples of configuration files, see
@@ -119,7 +119,7 @@
#
# Sample OpenVPN configuration file for
- # using a pre-shared static key.
+ # using a p2p connection.
#
# '#' or ';' may be used to delimit comments.
@@ -133,8 +133,11 @@
# 10.1.0.2 is our remote VPN endpoint
ifconfig 10.1.0.1 10.1.0.2
- # Our pre-shared static key
- secret static.key
+ # Our TLS configuration
+ tls-client
+ key mynode.key
+ cert mynode.crt
+ ca myca.crt
--daemon progname
Become a daemon after all initialization functions are completed.
@@ -44,12 +44,10 @@
of the AEAD cipher is used instead. Note that ``alg`` still specifies
the digest used for ``tls-auth``.
- In static-key encryption mode, the HMAC key is included in the key file
- generated by ``--genkey``. In TLS mode, the HMAC key is dynamically
- generated and shared between peers via the TLS control channel. If
- OpenVPN receives a packet with a bad HMAC it will drop the packet. HMAC
- usually adds 16 or 20 bytes per packet. Set ``alg=none`` to disable
- authentication.
+ The HMAC key is dynamically generated and shared between peers via the
+ TLS control channel. If OpenVPN receives a packet with a bad HMAC it
+ will drop the packet. HMAC usually adds 16 or 20 bytes per packet. Set
+ ``alg=none`` to disable authentication.
For more information on HMAC see
https://tools.ietf.org/html/rfc2104
@@ -212,11 +210,6 @@
have been configured with ``--enable-small``
(typically used on routers or other embedded devices).
-
---allow-deprecated-insecure-static-crypto
- **DEPRECATED** This allow using OpenVPN without TLS. This is deprecated
- and will be removed in OpenVPN 2.8.
-
--tran-window n
Transition window -- our old key can live this many seconds after a new
a key renegotiation begins (default :code:`3600` seconds). This feature
@@ -70,3 +70,12 @@
Removed in OpenVPN 2.8. This option caused the Mbed TLS 3 random number
generator to be reseeded on every call. It has been removed because this
is excessive.
+
+--secret
+ Removed in OpenVPN 2.8. Static encryption without a transient key
+ (generated by DH or ECDH) has been considered problematic for many
+ years. Please use ``--peer-fingerprint`` and self-signed certificates
+ for small setups.
+
+--allow-deprecated-insecure-static-crypto
+ Removed in OpenVPN 2.8 as --secret was also removed.
@@ -48,10 +48,8 @@
OpenVPN is tightly bound to the OpenSSL library, and derives much of its
crypto capabilities from it.
-OpenVPN supports conventional encryption using a pre-shared secret key
-**(Static Key mode)** or public key security **(SSL/TLS mode)** using
-client & server certificates. OpenVPN also supports non-encrypted
-TCP/UDP tunnels.
+OpenVPN supports conventional encryption using public key security
+with TLS **(SSL/TLS mode)** using client & server certificates.
OpenVPN is designed to work with the **TUN/TAP** virtual networking
interface that exists on most platforms.
@@ -312,10 +312,6 @@
ce->tls_crypt_v2_file, R_OK, "--tls-crypt-v2");
}
- errs |=
- check_file_access_inline(options->shared_secret_file_inline, CHKACC_FILE | CHKACC_PRIVATE,
- options->shared_secret_file, R_OK, "--secret");
-
errs |= check_file_access(CHKACC_DIRPATH | CHKACC_FILEXSTWR, options->packet_id_file,
R_OK | W_OK, "--replay-persist");
@@ -872,7 +872,7 @@
* Build a struct key_type.
*/
void
-init_key_type(struct key_type *kt, const char *ciphername, const char *authname, bool tls_mode,
+init_key_type(struct key_type *kt, const char *ciphername, const char *authname,
bool warn)
{
bool aead_cipher = false;
@@ -891,9 +891,9 @@
/* check legal cipher mode */
aead_cipher = cipher_kt_mode_aead(kt->cipher);
- if (!(cipher_kt_mode_cbc(kt->cipher) || (tls_mode && aead_cipher)
+ if (!(cipher_kt_mode_cbc(kt->cipher) || aead_cipher
#ifdef ENABLE_OFB_CFB_MODE
- || (tls_mode && cipher_kt_mode_ofb_cfb(kt->cipher))
+ || cipher_kt_mode_ofb_cfb(kt->cipher)
#endif
))
{
@@ -58,16 +58,12 @@
* <tt>[ * xxx * ]</tt> = encrypted and authenticated
*
* @par
- * <b>CBC data channel cypto format</b> \n
- * In CBC mode, both TLS-mode and static key mode are supported. The IV
- * consists of random bits to provide unpredictable IVs. \n
+ * <b>CBC data channel crypto format</b> \n
+ * The IV consists of random bits to provide unpredictable IVs. \n
* <i>CBC IV format:</i> \n
* <tt> [ - random - ] </tt> \n
- * <i>CBC data channel crypto format in TLS-mode:</i> \n
+ * <i>CBC data channel crypto format:</i> \n
* <tt> [ HMAC ] [ - IV - ] [ * packet ID * ] [ * packet payload * ] </tt> \n
- * <i>CBC data channel crypto format in static key mode:</i> \n
- * <tt> [ HMAC ] [ - IV - ] [ * packet ID * ] [ * timestamp * ]
- * [ * packet payload * ] </tt>
*
* @par
* <b>CFB/OFB data channel crypto format</b> \n
@@ -109,14 +105,11 @@
*
* @par
* <b>No-crypto data channel format</b> \n
- * In no-crypto mode (\c \-\-cipher \c none is specified), both TLS-mode and
- * static key mode are supported. No encryption will be performed on the packet,
- * but packets can still be authenticated. This mode does not require an IV.\n
- * <i>No-crypto data channel crypto format in TLS-mode:</i> \n
+ * In no-crypto mode (\c \-\-cipher \c none is specified), no encryption
+ * will be performed on the packet, but packets can still be authenticated.
+ * This mode does not require an IV.\n
+ * <i>No-crypto data channel crypto format:</i> \n
* <tt> [ HMAC ] [ - packet ID - ] [ - packet payload - ] </tt> \n
- * <i>No-crypto data channel crypto format in static key mode:</i> \n
- * <tt> [ HMAC ] [ - packet ID - ] [ - timestamp - ] [ - packet payload - ] </tt>
- *
*/
#ifndef CRYPTO_H
@@ -420,11 +413,9 @@
* @param kt The struct key_type to initialize
* @param ciphername The name of the cipher to use
* @param authname The name of the HMAC digest to use
- * @param tls_mode Specifies whether we are running in TLS mode, which allows
- * more ciphers than static key mode.
* @param warn Print warnings when null cipher / auth is used.
*/
-void init_key_type(struct key_type *kt, const char *ciphername, const char *authname, bool tls_mode,
+void init_key_type(struct key_type *kt, const char *ciphername, const char *authname,
bool warn);
/*
@@ -1013,8 +1013,7 @@
printf("The following ciphers and cipher modes are available for use\n"
"with " PACKAGE_NAME ". Each cipher shown below may be used as a\n"
"parameter to the --data-ciphers (or --cipher) option. Using a\n"
- "GCM or CBC mode is recommended. In static key mode only CBC\n"
- "mode is allowed.\n\n");
+ "GCM or CBC mode is recommended.\n\n");
#endif
for (size_t i = 0; i < cipher_info_table_entries; i++)
@@ -266,12 +266,6 @@
msg(M_USAGE, "--server and --server-bridge cannot be used together");
}
- if (o->shared_secret_file)
- {
- msg(M_USAGE,
- "--server and --secret cannot be used together (you must use SSL/TLS keys)");
- }
-
if (!(o->server_flags & SF_NOPOOL) && o->ifconfig_pool_defined)
{
msg(M_USAGE,
@@ -461,12 +455,6 @@
"--server-bridge already defines an ifconfig-pool, so you can't also specify --ifconfig-pool explicitly");
}
- if (o->shared_secret_file)
- {
- msg(M_USAGE,
- "--server-bridge and --secret cannot be used together (you must use SSL/TLS keys)");
- }
-
if (dev != DEV_TYPE_TAP)
{
msg(M_USAGE, "--server-bridge directive only makes sense with --dev tap");
@@ -997,35 +997,10 @@
platform_mlockall(true);
}
- /*
- * We do not want user to use --genkey with --secret. In the transistion
- * phase we for secret.
- */
- if (options->genkey && options->genkey_type != GENKEY_SECRET && options->shared_secret_file)
- {
- msg(M_USAGE, "Using --genkey type with --secret filename is "
- "not supported. Use --genkey type filename instead.");
- }
if (options->genkey && options->genkey_type == GENKEY_SECRET)
{
int nbits_written;
const char *genkey_filename = options->genkey_filename;
- if (options->shared_secret_file && options->genkey_filename)
- {
- msg(M_USAGE, "You must provide a filename to either --genkey "
- "or --secret, not both");
- }
-
- /*
- * Copy filename from shared_secret_file to genkey_filename to support
- * the old --genkey --secret foo.file syntax.
- */
- if (options->shared_secret_file)
- {
- msg(M_WARN, "WARNING: Using --genkey --secret filename is "
- "DEPRECATED. Use --genkey secret filename instead.");
- genkey_filename = options->shared_secret_file;
- }
nbits_written = write_key_file(2, genkey_filename);
if (nbits_written < 0)
@@ -1034,7 +1009,7 @@
}
msg(D_GENKEY | M_NOPREFIX, "Randomly generated %d bit key written to %s", nbits_written,
- options->shared_secret_file);
+ genkey_filename ? genkey_filename : "stdout");
return true;
}
else if (options->genkey && options->genkey_type == GENKEY_TLS_CRYPTV2_SERVER)
@@ -1080,7 +1055,7 @@
/* sanity check on options for --mktun or --rmtun */
notnull(options->dev, "TUN/TAP device (--dev)");
if (options->ce.remote || options->ifconfig_local || options->ifconfig_remote_netmask
- || options->shared_secret_file || options->tls_server || options->tls_client)
+ || options->tls_server || options->tls_client)
{
msg(M_FATAL | M_OPTERR,
"options --mktun or --rmtun should only be used together with --dev");
@@ -3036,8 +3011,7 @@
ASSERT(!key_ctx_bi_defined(&c->c1.ks.static_key));
/* Init cipher and hash algorithm */
- init_key_type(&c->c1.ks.key_type, options->ciphername, options->authname,
- options->test_crypto, true);
+ init_key_type(&c->c1.ks.key_type, options->ciphername, options->authname, true);
generate_test_crypto_random_key(&c->c1.ks.key_type, &c->c1.ks.static_key,
"test crypto key");
@@ -3047,50 +3021,6 @@
}
/*
- * Static Key Mode (using a pre-shared key)
- */
-static void
-do_init_crypto_static(struct context *c, const unsigned int flags)
-{
- const struct options *options = &c->options;
- ASSERT(options->shared_secret_file);
-
- init_crypto_pre(c, flags);
-
- /* Initialize flags */
- if (c->options.mute_replay_warnings)
- {
- c->c2.crypto_options.flags |= CO_MUTE_REPLAY_WARNINGS;
- }
-
- /* Initialize packet ID tracking */
- packet_id_init(&c->c2.crypto_options.packet_id, options->replay_window, options->replay_time,
- "STATIC", 0);
- c->c2.crypto_options.pid_persist = &c->c1.pid_persist;
- c->c2.crypto_options.flags |= CO_PACKET_ID_LONG_FORM;
- packet_id_persist_load_obj(&c->c1.pid_persist, &c->c2.crypto_options.packet_id);
-
- if (!key_ctx_bi_defined(&c->c1.ks.static_key))
- {
- /* Get cipher & hash algorithms */
- init_key_type(&c->c1.ks.key_type, options->ciphername, options->authname,
- options->test_crypto, true);
-
- /* Read cipher and hmac keys from shared secret file */
- crypto_read_openvpn_key(&c->c1.ks.key_type, &c->c1.ks.static_key,
- options->shared_secret_file, options->shared_secret_file_inline,
- options->key_direction, "Static Key Encryption", "secret", NULL);
- }
- else
- {
- msg(M_INFO, "Re-using pre-shared static key");
- }
-
- /* Get key schedule */
- c->c2.crypto_options.key_ctx_bi = c->c1.ks.static_key;
-}
-
-/*
* Initialize the tls-auth/crypt key context
*/
static void
@@ -3229,7 +3159,7 @@
/* Do not warn if the cipher is used only in OCC */
bool warn = options->enable_ncp_fallback;
- init_key_type(&c->c1.ks.key_type, ciphername, options->authname, true, warn);
+ init_key_type(&c->c1.ks.key_type, ciphername, options->authname, warn);
/* initialize tls-auth/crypt/crypt-v2 key */
do_init_tls_wrap_key(c);
@@ -3518,41 +3448,6 @@
}
}
-/*
- * No encryption or authentication.
- */
-static void
-do_init_crypto_none(struct context *c)
-{
- ASSERT(!c->options.test_crypto);
-
- /* Initialise key_type with auth/cipher "none", so the key_type struct is
- * valid */
- init_key_type(&c->c1.ks.key_type, "none", "none", c->options.test_crypto, true);
-
- msg(M_WARN, "******* WARNING *******: All encryption and authentication features "
- "disabled -- All data will be tunnelled as clear text and will not be "
- "protected against man-in-the-middle changes. "
- "PLEASE DO RECONSIDER THIS CONFIGURATION!");
-}
-
-static void
-do_init_crypto(struct context *c, const unsigned int flags)
-{
- if (c->options.shared_secret_file)
- {
- do_init_crypto_static(c, flags);
- }
- else if (c->options.tls_server || c->options.tls_client)
- {
- do_init_crypto_tls(c, flags);
- }
- else /* no encryption or authentication. */
- {
- do_init_crypto_none(c);
- }
-}
-
static void
do_init_frame(struct context *c)
{
@@ -4609,7 +4504,7 @@
{
crypto_flags = CF_INIT_TLS_MULTI;
}
- do_init_crypto(c, crypto_flags);
+ do_init_crypto_tls(c, crypto_flags);
if (IS_SIG(c) && !child)
{
goto sig;
@@ -51,7 +51,6 @@
unsigned int
calc_packet_id_size_dc(const struct options *options, const struct key_type *kt)
{
- bool tlsmode = options->tls_server || options->tls_client;
bool epoch = options->imported_protocol_flags & CO_EPOCH_DATA_KEY_FORMAT;
/* epoch format uses a 64-bit packet id: 16 bit epoch + 48 bit per-epoch counter */
@@ -60,7 +59,7 @@
return sizeof(uint64_t);
}
- bool packet_id_long_form = !tlsmode || cipher_kt_mode_ofb_cfb(kt->cipher);
+ bool packet_id_long_form = cipher_kt_mode_ofb_cfb(kt->cipher);
return packet_id_size(packet_id_long_form);
}
@@ -72,8 +71,6 @@
/* Sum of all the overhead that reduces the usable packet size */
size_t header_size = 0;
- bool tlsmode = options->tls_server || options->tls_client;
-
/* A socks proxy adds extra header to each packet
* (we only support Socks with IPv4, this value is different for IPv6) */
if (options->ce.socks_proxy_server && proto_is_udp(options->ce.proto))
@@ -88,10 +85,7 @@
}
/* Add the opcode and peerid */
- if (tlsmode)
- {
- header_size += options->use_peer_id ? 4 : 1;
- }
+ header_size += options->use_peer_id ? 4 : 1;
unsigned int pkt_id_size = calc_packet_id_size_dc(options, kt);
@@ -156,13 +150,6 @@
{
struct key_type occ_kt;
- /* neither --secret nor TLS mode */
- if (!o->tls_client && !o->tls_server && !o->shared_secret_file)
- {
- init_key_type(&occ_kt, "none", "none", false, false);
- return frame_calculate_payload_size(frame, o, &occ_kt);
- }
-
/* o->ciphername might be BF-CBC even though the underlying SSL library
* does not support it. For this reason we workaround this corner case
* by pretending to have no encryption enabled and by manually adding
@@ -184,9 +171,7 @@
ciphername = "none";
}
- /* We pass tlsmode always true here since as we do not need to check if
- * the ciphers are actually valid for non tls in occ calucation */
- init_key_type(&occ_kt, ciphername, o->authname, true, false);
+ init_key_type(&occ_kt, ciphername, o->authname, false);
size_t payload = frame_calculate_payload_size(frame, o, &occ_kt);
overhead += frame_calculate_protocol_header_size(&occ_kt, o, true);
@@ -558,14 +558,11 @@
" server/remote. n = # of retries, default=1.\n"
"\n"
"Data Channel Encryption Options (must be compatible between peers):\n"
- "(These options are meaningful for both Static Key & TLS-mode)\n"
"--auth alg : Authenticate packets with HMAC using message\n"
" digest algorithm alg (default=%s).\n"
" (usually adds 16 or 20 bytes per packet)\n"
" Set alg=none to disable authentication.\n"
- "--cipher alg : Encrypt packets with cipher algorithm alg.\n"
- " You should usually use --data-ciphers instead.\n"
- " Set alg=none to disable encryption.\n"
+ "--cipher alg : Ignored. You should usually use --data-ciphers instead.\n"
"--data-ciphers list : List of ciphers that are allowed to be negotiated.\n"
#ifndef ENABLE_CRYPTO_MBEDTLS
"--engine [name] : Enable OpenSSL hardware crypto engine functionality.\n"
@@ -1588,16 +1585,17 @@
static void
options_postprocess_verify_ce(const struct options *options, const struct connection_entry *ce)
{
+ if (options->test_crypto)
+ {
+ return;
+ }
struct options defaults;
int dev = DEV_TYPE_UNDEF;
bool pull = false;
init_options(&defaults);
- if (!options->test_crypto)
- {
- notnull(options->dev, "TUN/TAP device (--dev)");
- }
+ notnull(options->dev, "TUN/TAP device (--dev)");
/*
* Get tun/tap/null device type
@@ -2013,27 +2011,9 @@
/*
* SSL/TLS mode sanity checks.
*/
- if (options->tls_server + options->tls_client + (options->shared_secret_file != NULL) > 1)
+ if (options->tls_server == options->tls_client)
{
- msg(M_USAGE, "specify only one of --tls-server, --tls-client, or --secret");
- }
-
- if (!options->tls_server && !options->tls_client && !options->test_crypto)
- {
- msglvl_t msglevel = M_USAGE;
- if (options->allow_deprecated_insecure_static_crypto)
- {
- msglevel = M_INFO;
- }
-
- msg(msglevel, "DEPRECATION: No tls-client or tls-server option in "
- "configuration detected. OpenVPN 2.8 will remove the "
- "functionality to run a VPN without TLS. "
- "See the examples section in the manual page for "
- "examples of a similar quick setup with peer-fingerprint. "
- "OpenVPN 2.7 allows using this configuration when using "
- "--allow-deprecated-insecure-static-crypto but you should move "
- "to a proper configuration using TLS as soon as possible.");
+ msg(M_USAGE, "OpenVPN configuration must use either --tls-server or --tls-client");
}
if (options->ssl_flags & (SSLF_CLIENT_CERT_NOT_REQUIRED | SSLF_CLIENT_CERT_OPTIONAL))
@@ -2053,188 +2033,135 @@
msg(M_USAGE, "--tls-version-min bigger than --tls-version-max");
}
- if (options->tls_server || options->tls_client)
- {
- check_ca_required(options);
+ check_ca_required(options);
#ifdef ENABLE_PKCS11
- if (!options->pkcs11_providers[0] && options->pkcs11_id)
- {
- msg(M_WARN, "Option pkcs11-id is ignored as no pkcs11-providers are specified");
- }
- else if (!options->pkcs11_providers[0] && options->pkcs11_id_management)
- {
- msg(M_WARN,
- "Option pkcs11-id-management is ignored as no pkcs11-providers are specified");
- }
+ if (!options->pkcs11_providers[0] && options->pkcs11_id)
+ {
+ msg(M_WARN, "Option pkcs11-id is ignored as no pkcs11-providers are specified");
+ }
+ else if (!options->pkcs11_providers[0] && options->pkcs11_id_management)
+ {
+ msg(M_WARN,
+ "Option pkcs11-id-management is ignored as no pkcs11-providers are specified");
+ }
- if (options->pkcs11_providers[0])
- {
- if (options->pkcs11_id_management && options->pkcs11_id != NULL)
- {
- msg(M_USAGE,
- "Parameter --pkcs11-id cannot be used when --pkcs11-id-management is also specified.");
- }
- if (!options->pkcs11_id_management && options->pkcs11_id == NULL)
- {
- msg(M_USAGE,
- "Parameter --pkcs11-id or --pkcs11-id-management should be specified.");
- }
- const char use_err[] =
- "Parameter --%s cannot be used when --pkcs11-provider is also specified.";
- MUST_BE_UNDEF(cert_file, "cert");
- MUST_BE_UNDEF(priv_key_file, "key");
- MUST_BE_UNDEF(pkcs12_file, "pkcs12");
- MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_KEY, "management-external-key");
- MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_CERT, "management-external-cert");
-#ifdef ENABLE_CRYPTOAPI
- MUST_BE_UNDEF(cryptoapi_cert, "cryptoapicert");
-#endif
- }
- else
-#endif /* ifdef ENABLE_PKCS11 */
-#ifdef ENABLE_CRYPTOAPI
- if (options->cryptoapi_cert)
- {
- const char use_err[] =
- "Parameter --%s cannot be used when --cryptoapicert is also specified.";
- MUST_BE_UNDEF(cert_file, "cert");
- MUST_BE_UNDEF(priv_key_file, "key");
- MUST_BE_UNDEF(pkcs12_file, "pkcs12");
- MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_KEY, "management-external-key");
- MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_CERT, "management-external-cert");
- }
- else
-#endif
- if (options->pkcs12_file)
- {
-#ifdef ENABLE_CRYPTO_MBEDTLS
- msg(M_USAGE, "Parameter --pkcs12 cannot be used with the mbed TLS version of OpenVPN.");
-#else
- const char use_err[] = "Parameter --%s cannot be used when --pkcs12 is also specified.";
- MUST_BE_UNDEF(ca_path, "capath");
- MUST_BE_UNDEF(cert_file, "cert");
- MUST_BE_UNDEF(priv_key_file, "key");
- MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_KEY, "management-external-key");
- MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_CERT, "management-external-cert");
-#endif /* ifdef ENABLE_CRYPTO_MBEDTLS */
- }
- else /* cert/key from none of pkcs11, pkcs12, cryptoapi */
- {
- if ((options->management_flags & MF_EXTERNAL_KEY) && options->priv_key_file)
- {
- msg(M_USAGE, "--key and --management-external-key are mutually exclusive");
- }
- if ((options->management_flags & MF_EXTERNAL_CERT))
- {
- if (options->cert_file)
- {
- msg(M_USAGE, "--cert and --management-external-cert are mutually exclusive");
- }
- else if (!(options->management_flags & MF_EXTERNAL_KEY))
- {
- msg(M_USAGE,
- "--management-external-cert must be used with --management-external-key");
- }
- }
- if (pull)
- {
- const int sum =
- ((options->cert_file != NULL) || (options->management_flags & MF_EXTERNAL_CERT))
- + ((options->priv_key_file != NULL)
- || (options->management_flags & MF_EXTERNAL_KEY));
-
- if (sum == 0)
- {
- if (!options->auth_user_pass_file)
- {
- msg(M_USAGE, "No client-side authentication method is "
- "specified. You must use either "
- "--cert/--key, --pkcs12, or "
- "--auth-user-pass");
- }
- }
- else if (sum != 2)
- {
- msg(M_USAGE, "If you use one of --cert or --key, you must use them both");
- }
- }
- else
- {
- if (!(options->management_flags & MF_EXTERNAL_CERT))
- {
- notnull(options->cert_file,
- "certificate file (--cert) or PKCS#12 file (--pkcs12)");
- }
- if (!(options->management_flags & MF_EXTERNAL_KEY))
- {
- notnull(options->priv_key_file,
- "private key file (--key) or PKCS#12 file (--pkcs12)");
- }
- }
- }
- if (ce->tls_auth_file && ce->tls_crypt_file)
- {
- msg(M_USAGE, "--tls-auth and --tls-crypt are mutually exclusive");
- }
- if (options->tls_client && ce->tls_crypt_v2_file
- && (ce->tls_auth_file || ce->tls_crypt_file))
+ if (options->pkcs11_providers[0])
+ {
+ if (options->pkcs11_id_management && options->pkcs11_id != NULL)
{
msg(M_USAGE,
- "--tls-crypt-v2, --tls-auth and --tls-crypt are mutually exclusive in client mode");
+ "Parameter --pkcs11-id cannot be used when --pkcs11-id-management is also specified.");
}
- }
- else
- {
- /*
- * Make sure user doesn't specify any TLS options
- * when in non-TLS mode.
- */
-
- const char use_err[] = "Parameter %s can only be specified in TLS-mode, "
- "i.e. where --tls-server or --tls-client is also specified.";
-
- MUST_BE_UNDEF(ca_file, "ca");
- MUST_BE_UNDEF(ca_path, "capath");
- MUST_BE_UNDEF(dh_file, "dh");
+ if (!options->pkcs11_id_management && options->pkcs11_id == NULL)
+ {
+ msg(M_USAGE,
+ "Parameter --pkcs11-id or --pkcs11-id-management should be specified.");
+ }
+ const char use_err[] =
+ "Parameter --%s cannot be used when --pkcs11-provider is also specified.";
MUST_BE_UNDEF(cert_file, "cert");
MUST_BE_UNDEF(priv_key_file, "key");
-#ifndef ENABLE_CRYPTO_MBEDTLS
MUST_BE_UNDEF(pkcs12_file, "pkcs12");
+ MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_KEY, "management-external-key");
+ MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_CERT, "management-external-cert");
+#ifdef ENABLE_CRYPTOAPI
+ MUST_BE_UNDEF(cryptoapi_cert, "cryptoapicert");
#endif
- MUST_BE_UNDEF(cipher_list, "tls-cipher");
- MUST_BE_UNDEF(cipher_list_tls13, "tls-ciphersuites");
- MUST_BE_UNDEF(tls_cert_profile, "tls-cert-profile");
- MUST_BE_UNDEF(tls_verify, "tls-verify");
- MUST_BE_UNDEF(tls_export_peer_cert_dir, "tls-export-cert");
- MUST_BE_UNDEF(verify_x509_name, "verify-x509-name");
- MUST_BE_UNDEF(tls_timeout, "tls-timeout");
- MUST_BE_UNDEF(renegotiate_bytes, "reneg-bytes");
- MUST_BE_UNDEF(renegotiate_packets, "reneg-pkts");
- MUST_BE_UNDEF(renegotiate_seconds, "reneg-sec");
- MUST_BE_UNDEF(handshake_window, "hand-window");
- MUST_BE_UNDEF(transition_window, "tran-window");
- MUST_BE_UNDEF(tls_auth_file, "tls-auth");
- MUST_BE_UNDEF(tls_crypt_file, "tls-crypt");
- MUST_BE_UNDEF(tls_crypt_v2_file, "tls-crypt-v2");
- MUST_BE_UNDEF(single_session, "single-session");
- MUST_BE_UNDEF(push_peer_info, "push-peer-info");
- MUST_BE_UNDEF(tls_exit, "tls-exit");
- MUST_BE_UNDEF(crl_file, "crl-verify");
- MUST_BE_UNDEF(ns_cert_type, "ns-cert-type");
- MUST_BE_UNDEF(remote_cert_ku[0], "remote-cert-ku");
- MUST_BE_UNDEF(remote_cert_eku, "remote-cert-eku");
-#ifdef ENABLE_PKCS11
- MUST_BE_UNDEF(pkcs11_providers[0], "pkcs11-providers");
- MUST_BE_UNDEF(pkcs11_private_mode[0], "pkcs11-private-mode");
- MUST_BE_UNDEF(pkcs11_id, "pkcs11-id");
- MUST_BE_UNDEF(pkcs11_id_management, "pkcs11-id-management");
+ }
+ else
+#endif /* ifdef ENABLE_PKCS11 */
+#ifdef ENABLE_CRYPTOAPI
+ if (options->cryptoapi_cert)
+ {
+ const char use_err[] =
+ "Parameter --%s cannot be used when --cryptoapicert is also specified.";
+ MUST_BE_UNDEF(cert_file, "cert");
+ MUST_BE_UNDEF(priv_key_file, "key");
+ MUST_BE_UNDEF(pkcs12_file, "pkcs12");
+ MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_KEY, "management-external-key");
+ MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_CERT, "management-external-cert");
+ }
+ else
#endif
-
+ if (options->pkcs12_file)
+ {
+#ifdef ENABLE_CRYPTO_MBEDTLS
+ msg(M_USAGE, "Parameter --pkcs12 cannot be used with the mbed TLS version of OpenVPN.");
+#else
+ const char use_err[] = "Parameter --%s cannot be used when --pkcs12 is also specified.";
+ MUST_BE_UNDEF(ca_path, "capath");
+ MUST_BE_UNDEF(cert_file, "cert");
+ MUST_BE_UNDEF(priv_key_file, "key");
+ MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_KEY, "management-external-key");
+ MUST_BE_FALSE(options->management_flags & MF_EXTERNAL_CERT, "management-external-cert");
+#endif /* ifdef ENABLE_CRYPTO_MBEDTLS */
+ }
+ else /* cert/key from none of pkcs11, pkcs12, cryptoapi */
+ {
+ if ((options->management_flags & MF_EXTERNAL_KEY) && options->priv_key_file)
+ {
+ msg(M_USAGE, "--key and --management-external-key are mutually exclusive");
+ }
+ if ((options->management_flags & MF_EXTERNAL_CERT))
+ {
+ if (options->cert_file)
+ {
+ msg(M_USAGE, "--cert and --management-external-cert are mutually exclusive");
+ }
+ else if (!(options->management_flags & MF_EXTERNAL_KEY))
+ {
+ msg(M_USAGE,
+ "--management-external-cert must be used with --management-external-key");
+ }
+ }
if (pull)
{
- msg(M_USAGE, use_err, "--pull");
+ const int sum =
+ ((options->cert_file != NULL) || (options->management_flags & MF_EXTERNAL_CERT))
+ + ((options->priv_key_file != NULL)
+ || (options->management_flags & MF_EXTERNAL_KEY));
+
+ if (sum == 0)
+ {
+ if (!options->auth_user_pass_file)
+ {
+ msg(M_USAGE, "No client-side authentication method is "
+ "specified. You must use either "
+ "--cert/--key, --pkcs12, or "
+ "--auth-user-pass");
+ }
+ }
+ else if (sum != 2)
+ {
+ msg(M_USAGE, "If you use one of --cert or --key, you must use them both");
+ }
+ }
+ else
+ {
+ if (!(options->management_flags & MF_EXTERNAL_CERT))
+ {
+ notnull(options->cert_file,
+ "certificate file (--cert) or PKCS#12 file (--pkcs12)");
+ }
+ if (!(options->management_flags & MF_EXTERNAL_KEY))
+ {
+ notnull(options->priv_key_file,
+ "private key file (--key) or PKCS#12 file (--pkcs12)");
+ }
}
}
+ if (ce->tls_auth_file && ce->tls_crypt_file)
+ {
+ msg(M_USAGE, "--tls-auth and --tls-crypt are mutually exclusive");
+ }
+ if (options->tls_client && ce->tls_crypt_v2_file
+ && (ce->tls_auth_file || ce->tls_crypt_file))
+ {
+ msg(M_USAGE,
+ "--tls-crypt-v2, --tls-auth and --tls-crypt are mutually exclusive in client mode");
+ }
+
+
if (options->auth_user_pass_file && !options->pull)
{
msg(M_USAGE, "--auth-user-pass requires --pull");
@@ -6960,32 +6887,6 @@
goto err;
}
}
- else if (streq(p[0], "secret") && p[1] && !p[3])
- {
- msg(M_WARN, "DEPRECATED OPTION: The option --secret is deprecated.");
- VERIFY_PERMISSION(OPT_P_GENERAL | OPT_P_INLINE);
- options->shared_secret_file = p[1];
- options->shared_secret_file_inline = is_inline;
- if (!is_inline && p[2])
- {
- int key_direction;
-
- key_direction = ascii2keydirection(msglevel, p[2]);
- if (key_direction >= 0)
- {
- options->key_direction = key_direction;
- }
- else
- {
- goto err;
- }
- }
- }
- else if (streq(p[0], "allow-deprecated-insecure-static-crypto"))
- {
- VERIFY_PERMISSION(OPT_P_GENERAL);
- options->allow_deprecated_insecure_static_crypto = true;
- }
else if (streq(p[0], "genkey") && !p[4])
{
VERIFY_PERMISSION(OPT_P_GENERAL);
@@ -569,9 +569,6 @@
struct static_challenge_info sc_info;
#endif
/* Cipher parms */
- const char *shared_secret_file;
- bool shared_secret_file_inline;
- bool allow_deprecated_insecure_static_crypto;
int key_direction;
const char *ciphername;
bool enable_ncp_fallback; /**< If defined fall back to
@@ -491,7 +491,6 @@
}
#endif
- SHOW_STR_INLINE(shared_secret_file);
SHOW_PARM(key_direction, keydirection2ascii(o->key_direction, false, true), "%s");
SHOW_STR(ciphername);
SHOW_STR(ncp_ciphers);
@@ -140,83 +140,72 @@
/*
* Crypto Options
*/
- if (o->shared_secret_file || TLS_CLIENT || TLS_SERVER)
+ struct key_type kt;
+
+ ASSERT((TLS_CLIENT == true) + (TLS_SERVER == true) <= 1);
+
+ /* Skip resolving BF-CBC to allow SSL libraries without BF-CBC
+ * to work here in the default configuration */
+ const char *ciphername = o->ciphername;
+ size_t keysize = 0;
+
+ if (strcmp(o->ciphername, "BF-CBC") == 0)
{
- struct key_type kt;
-
- ASSERT((o->shared_secret_file != NULL) + (TLS_CLIENT == true) + (TLS_SERVER == true) <= 1);
-
- /* Skip resolving BF-CBC to allow SSL libraries without BF-CBC
- * to work here in the default configuration */
- const char *ciphername = o->ciphername;
- size_t keysize = 0;
-
- if (strcmp(o->ciphername, "BF-CBC") == 0)
+ init_key_type(&kt, "none", o->authname, false);
+ keysize = 128;
+ }
+ else
+ {
+ init_key_type(&kt, o->ciphername, o->authname, false);
+ ciphername = cipher_kt_name(kt.cipher);
+ if (cipher_defined(o->ciphername))
{
- init_key_type(&kt, "none", o->authname, true, false);
- keysize = 128;
- }
- else
- {
- init_key_type(&kt, o->ciphername, o->authname, true, false);
- ciphername = cipher_kt_name(kt.cipher);
- if (cipher_defined(o->ciphername))
- {
- keysize = cipher_kt_key_size(kt.cipher) * 8;
- }
- }
- /* Only announce the cipher to our peer if we are willing to
- * support it */
- if (p2p_nopull || tls_item_in_cipher_list(ciphername, o->ncp_ciphers))
- {
- buf_printf(&out, ",cipher %s", ciphername);
- }
- buf_printf(&out, ",auth %s", md_kt_name(kt.digest));
- buf_printf(&out, ",keysize %zu", keysize);
- if (o->shared_secret_file)
- {
- buf_printf(&out, ",secret");
+ keysize = cipher_kt_key_size(kt.cipher) * 8;
}
}
+ /* Only announce the cipher to our peer if we are willing to
+ * support it */
+ if (p2p_nopull || tls_item_in_cipher_list(ciphername, o->ncp_ciphers))
+ {
+ buf_printf(&out, ",cipher %s", ciphername);
+ }
+ buf_printf(&out, ",auth %s", md_kt_name(kt.digest));
+ buf_printf(&out, ",keysize %zu", keysize);
/*
* SSL Options
*/
+ if (o->ce.tls_auth_file)
{
- if (TLS_CLIENT || TLS_SERVER)
- {
- if (o->ce.tls_auth_file)
- {
- buf_printf(&out, ",tls-auth");
- }
- /* Not adding tls-crypt here, because we won't reach this code if
- * tls-auth/tls-crypt does not match. Removing tls-auth here would
- * break stuff, so leaving that in place. */
+ buf_printf(&out, ",tls-auth");
+ }
+ /* Not adding tls-crypt here, because we won't reach this code if
+ * tls-auth/tls-crypt does not match. Removing tls-auth here would
+ * break stuff, so leaving that in place. */
- buf_printf(&out, ",key-method %d", KEY_METHOD_2);
- }
+ buf_printf(&out, ",key-method %d", KEY_METHOD_2);
- if (remote)
+
+ if (remote)
+ {
+ if (TLS_CLIENT)
{
- if (TLS_CLIENT)
- {
- buf_printf(&out, ",tls-server");
- }
- else if (TLS_SERVER)
- {
- buf_printf(&out, ",tls-client");
- }
+ buf_printf(&out, ",tls-server");
}
- else
+ else if (TLS_SERVER)
{
- if (TLS_CLIENT)
- {
- buf_printf(&out, ",tls-client");
- }
- else if (TLS_SERVER)
- {
- buf_printf(&out, ",tls-server");
- }
+ buf_printf(&out, ",tls-client");
+ }
+ }
+ else
+ {
+ if (TLS_CLIENT)
+ {
+ buf_printf(&out, ",tls-client");
+ }
+ else if (TLS_SERVER)
+ {
+ buf_printf(&out, ",tls-server");
}
}
@@ -59,7 +59,6 @@
*
* --cipher
* --auth
- * --secret
*
* SSL Options:
*
@@ -1648,7 +1648,7 @@
return true;
}
- init_key_type(&session->opt->key_type, options->ciphername, options->authname, true, true);
+ init_key_type(&session->opt->key_type, options->ciphername, options->authname, true);
bool packet_id_long_form = cipher_kt_mode_ofb_cfb(session->opt->key_type.cipher);
session->opt->crypto_flags &= ~(CO_PACKET_ID_LONG_FORM);
@@ -237,70 +237,58 @@
/* common defaults */
o.ce.tun_mtu = 1400;
o.ce.proto = PROTO_UDP;
+ o.tls_client = true;
+ o.pull = true;
- /* No crypto at all */
+ /* auth none, cipher none */
o.ciphername = "none";
o.authname = "none";
linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1400);
+ assert_int_equal(linkmtu, 1405);
- /* Static key OCC examples */
- o.shared_secret_file = "not null";
-
- /* secret, auth none, cipher none */
- o.ciphername = "none";
- o.authname = "none";
- linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1408);
-
- /* secret, cipher AES-128-CBC, auth none */
+ /* cipher AES-128-CBC, auth none */
o.ciphername = "AES-128-CBC";
o.authname = "none";
linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1440);
+ assert_int_equal(linkmtu, 1437);
- /* secret, cipher none, auth SHA256 */
+ /* cipher none, auth SHA256 */
o.ciphername = "none";
o.authname = "SHA256";
linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1440);
+ assert_int_equal(linkmtu, 1437);
- /* secret, cipher BF-CBC, auth SHA1 */
+ /* cipher BF-CBC, auth SHA1 */
o.ciphername = "BF-CBC";
o.authname = "SHA1";
linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1444);
+ assert_int_equal(linkmtu, 1441);
- /* secret, cipher BF-CBC, auth SHA1, tcp-client */
+ /* cipher BF-CBC, auth SHA1, tcp-client */
o.ce.proto = PROTO_TCP_CLIENT;
linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1446);
+ assert_int_equal(linkmtu, 1443);
o.ce.proto = PROTO_UDP;
#if defined(USE_COMP)
o.comp.alg = COMP_ALG_LZO;
- /* secret, comp-lzo yes, cipher BF-CBC, auth SHA1 */
+ /* comp-lzo yes, cipher BF-CBC, auth SHA1 */
linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1445);
+ assert_int_equal(linkmtu, 1442);
#if defined(ENABLE_FRAGMENT)
- /* secret, comp-lzo yes, cipher BF-CBC, auth SHA1, fragment 1200 */
+ /* comp-lzo yes, cipher BF-CBC, auth SHA1, fragment 1200 */
o.ce.fragment = 1200;
linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1449);
+ assert_int_equal(linkmtu, 1446);
o.ce.fragment = 0;
#endif
o.comp.alg = COMP_ALG_UNDEF;
#endif
- /* TLS mode */
- o.shared_secret_file = NULL;
- o.tls_client = true;
- o.pull = true;
-
/* tls client, cipher AES-128-CBC, auth SHA1, tls-auth */
o.authname = "SHA1";
o.ciphername = "AES-128-CBC";
@@ -315,15 +303,8 @@
linkmtu = calc_options_string_link_mtu(&o, &f);
assert_int_equal(linkmtu, 1457);
- /* tls client, cipher none, auth none */
+ /* tls client, auth none, cipher AES-256-GCM */
o.authname = "none";
- o.ciphername = "none";
-
- linkmtu = calc_options_string_link_mtu(&o, &f);
- assert_int_equal(linkmtu, 1405);
-
- /* tls client, auth SHA1, cipher AES-256-GCM */
- o.authname = "SHA1";
o.ciphername = "AES-256-GCM";
linkmtu = calc_options_string_link_mtu(&o, &f);
assert_int_equal(linkmtu, 1449);
@@ -332,12 +313,12 @@
#if defined(USE_COMP) && defined(ENABLE_FRAGMENT)
o.comp.alg = COMP_ALG_LZO;
- /* tls client, auth SHA1, cipher AES-256-GCM, fragment, comp-lzo yes */
+ /* tls client, auth none, cipher AES-256-GCM, fragment, comp-lzo yes */
o.ce.fragment = 1200;
linkmtu = calc_options_string_link_mtu(&o, &f);
assert_int_equal(linkmtu, 1454);
- /* tls client, auth SHA1, cipher AES-256-GCM, fragment, comp-lzo yes, socks */
+ /* tls client, auth none, cipher AES-256-GCM, fragment, comp-lzo yes, socks */
o.ce.socks_proxy_server = "socks.example.com";
linkmtu = calc_options_string_link_mtu(&o, &f);
assert_int_equal(linkmtu, 1464);
@@ -358,50 +339,41 @@
o.ce.tun_mtu = 1400;
o.ce.mssfix = 1000;
o.ce.proto = PROTO_UDP;
+ o.tls_client = true;
- /* No crypto at all */
+ /*auth none, cipher none */
o.ciphername = "none";
o.authname = "none";
struct key_type kt;
- init_key_type(&kt, o.ciphername, o.authname, false, false);
+ init_key_type(&kt, o.ciphername, o.authname, false);
- /* No encryption, just packet id (8) + TCP payload(20) + IP payload(20) */
+ /* No encryption, just packet id (4) + opcode (1) + TCP payload(20) + IP payload(20) */
frame_calculate_dynamic(&f, &kt, &o, NULL);
- assert_int_equal(f.mss_fix, 952);
+ assert_int_equal(f.mss_fix, 955);
- /* Static key OCC examples */
- o.shared_secret_file = "not null";
-
- /* secret, auth none, cipher none */
- o.ciphername = "none";
- o.authname = "none";
- init_key_type(&kt, o.ciphername, o.authname, false, false);
- frame_calculate_dynamic(&f, &kt, &o, NULL);
- assert_int_equal(f.mss_fix, 952);
-
- /* secret, cipher AES-128-CBC, auth none */
+ /* cipher AES-128-CBC, auth none */
o.ciphername = "AES-128-CBC";
o.authname = "none";
- init_key_type(&kt, o.ciphername, o.authname, false, false);
+ init_key_type(&kt, o.ciphername, o.authname, false);
- for (int i = 990; i <= 1010; i++)
+ for (int i = 990; i <= 1015; i++)
{
/* 992 - 1008 should end up with the same mssfix value all they
- * all result in the same CBC block size/padding and <= 991 and >=1008
+ * all result in the same CBC block size/padding and <= 992 and >=1009
* should be one block less and more respectively */
o.ce.mssfix = i;
frame_calculate_dynamic(&f, &kt, &o, NULL);
- if (i <= 991)
+ if (i <= 992)
{
- assert_int_equal(f.mss_fix, 911);
+ assert_int_equal(f.mss_fix, 915);
}
- else if (i >= 1008)
+ else if (i >= 1009)
{
- assert_int_equal(f.mss_fix, 943);
+ assert_int_equal(f.mss_fix, 947);
}
else
{
- assert_int_equal(f.mss_fix, 927);
+ assert_int_equal(f.mss_fix, 931);
}
}
#ifdef USE_COMP
@@ -410,36 +382,35 @@
/* Same but with compression added. Compression adds one byte extra to the
* payload so the payload should be reduced by compared to the no
* compression calculation before */
- for (int i = 990; i <= 1010; i++)
+ for (int i = 990; i <= 1015; i++)
{
/* 992 - 1008 should end up with the same mssfix value all they
- * all result in the same CBC block size/padding and <= 991 and >=1008
+ * all result in the same CBC block size/padding and <= 992 and >=1009
* should be one block less and more respectively */
o.ce.mssfix = i;
frame_calculate_dynamic(&f, &kt, &o, NULL);
- if (i <= 991)
+ if (i <= 992)
{
- assert_int_equal(f.mss_fix, 910);
+ assert_int_equal(f.mss_fix, 914);
}
- else if (i >= 1008)
+ else if (i >= 1009)
{
- assert_int_equal(f.mss_fix, 942);
+ assert_int_equal(f.mss_fix, 946);
}
else
{
- assert_int_equal(f.mss_fix, 926);
+ assert_int_equal(f.mss_fix, 930);
}
}
o.comp.alg = COMP_ALG_UNDEF;
#endif /* ifdef USE_COMP */
- /* tls client, auth SHA1, cipher AES-256-GCM */
+ /* auth SHA1, cipher AES-256-GCM */
o.authname = "SHA1";
o.ciphername = "AES-256-GCM";
- o.tls_client = true;
o.peer_id = 77;
o.use_peer_id = true;
- init_key_type(&kt, o.ciphername, o.authname, true, false);
+ init_key_type(&kt, o.ciphername, o.authname, false);
for (int i = 900; i <= 1200; i++)
{
@@ -685,7 +656,7 @@
data->gc = gc_new();
- init_key_type(&data->kt, "AES-128-GCM", "none", true, false);
+ init_key_type(&data->kt, "AES-128-GCM", "none", false);
/* have an epoch key that uses 0x23 for the key for all bytes */
struct epoch_key epoch1send = { .epoch = 1, .epoch_key = { 0x23 } };
@@ -907,7 +878,7 @@
struct epoch_key e17 = { .epoch = 17, .epoch_key = { 19, 12 } };
struct key_type kt = { 0 };
struct key_parameters key_parameters = { 0 };
- init_key_type(&kt, "AES-192-GCM", "none", true, false);
+ init_key_type(&kt, "AES-192-GCM", "none", false);
epoch_data_key_derive(&key_parameters, &e17, &kt);
@@ -173,7 +173,7 @@
tas.tls_wrap.opt.flags |= (CO_IGNORE_PACKET_ID | CO_PACKET_ID_LONG_FORM);
struct key_type tls_crypt_kt;
- init_key_type(&tls_crypt_kt, "none", "SHA1", true, false);
+ init_key_type(&tls_crypt_kt, "none", "SHA1", false);
crypto_read_openvpn_key(&tls_crypt_kt, &tas.tls_wrap.opt.key_ctx_bi, static_key, true,
key_direction, "Control Channel Authentication", "tls-auth", NULL);