Attention is currently required from: plaisthos.
Hello plaisthos,
I'd like you to do a code review.
Please visit
http://gerrit.openvpn.net/c/openvpn/+/1453?usp=email
to review the following change.
Change subject: Remove NTLM support
......................................................................
Remove NTLM support
Since Microsoft has abandonded this I think it is time
for us to do the same for OpenVPN 2.8.
Leaves a stub ntlm_support in to make cross-branch
t_client.rc easier to maintain.
Change-Id: I1f5724476862935284f620c54afa510eea03e3f9
Signed-off-by: Frank Lichtenheld <[email protected]>
---
M CMakeLists.txt
M config.h.cmake.in
M configure.ac
M doc/doxygen/openvpn.doxyfile.in
M doc/man-sections/proxy-options.rst
M src/openvpn/Makefile.am
D src/openvpn/ntlm.c
D src/openvpn/ntlm.h
M src/openvpn/options.c
M src/openvpn/proxy.c
M src/openvpn/proxy.h
M src/openvpn/syshead.h
M tests/Makefile.am
M tests/ntlm_support.c
14 files changed, 9 insertions(+), 625 deletions(-)
git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/53/1453/1
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bdad173..f96103c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -506,8 +506,6 @@
src/openvpn/multi.h
src/openvpn/multi_io.h
src/openvpn/multi_io.c
- src/openvpn/ntlm.c
- src/openvpn/ntlm.h
src/openvpn/occ.c
src/openvpn/occ.h
src/openvpn/openvpn.c
diff --git a/config.h.cmake.in b/config.h.cmake.in
index 01bbadc..cb0169d 100644
--- a/config.h.cmake.in
+++ b/config.h.cmake.in
@@ -35,9 +35,6 @@
/* Enable dns-updown script hook */
#cmakedefine ENABLE_DNS_UPDOWN
-/* Enable NTLMv2 proxy support */
-#define ENABLE_NTLM 1
-
/* Enable management server capability */
#define ENABLE_MANAGEMENT 1
diff --git a/configure.ac b/configure.ac
index f363e0f..50a3cea 100644
--- a/configure.ac
+++ b/configure.ac
@@ -102,13 +102,6 @@
)
AC_ARG_ENABLE(
- [ntlm],
- [AS_HELP_STRING([--disable-ntlm], [disable NTLMv2 proxy support
@<:@default=yes@:>@])],
- ,
- [enable_ntlm="yes"]
-)
-
-AC_ARG_ENABLE(
[plugins],
[AS_HELP_STRING([--disable-plugins], [disable plug-in support
@<:@default=yes@:>@])],
,
@@ -1201,7 +1194,6 @@
test "${enable_fragment}" = "yes" && AC_DEFINE([ENABLE_FRAGMENT], [1], [Enable
internal fragmentation support])
test "${enable_port_share}" = "yes" && AC_DEFINE([ENABLE_PORT_SHARE], [1],
[Enable TCP Server port sharing])
test "${enable_dns_updown_by_default}" = "yes" &&
AC_DEFINE([ENABLE_DNS_UPDOWN_BY_DEFAULT], [1], [Enable dns-updown hook by
default])
-test "${enable_ntlm}" = "yes" && AC_DEFINE([ENABLE_NTLM], [1], [Enable NTLMv2
proxy support])
test "${enable_crypto_ofb_cfb}" = "yes" && AC_DEFINE([ENABLE_OFB_CFB_MODE],
[1], [Enable OFB and CFB cipher modes])
OPTIONAL_CRYPTO_CFLAGS="${OPTIONAL_CRYPTO_CFLAGS} ${CRYPTO_CFLAGS}"
OPTIONAL_CRYPTO_LIBS="${OPTIONAL_CRYPTO_LIBS} ${CRYPTO_LIBS}"
diff --git a/doc/doxygen/openvpn.doxyfile.in b/doc/doxygen/openvpn.doxyfile.in
index bdbc608..5b8e262 100644
--- a/doc/doxygen/openvpn.doxyfile.in
+++ b/doc/doxygen/openvpn.doxyfile.in
@@ -2212,7 +2212,6 @@
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
PREDEFINED = _WIN32 \
- NTLM \
USE_LZO \
ENABLE_FRAGMENT \
P2MP \
diff --git a/doc/man-sections/proxy-options.rst
b/doc/man-sections/proxy-options.rst
index 38c4578..7123838 100644
--- a/doc/man-sections/proxy-options.rst
+++ b/doc/man-sections/proxy-options.rst
@@ -7,7 +7,7 @@
``--http-proxy-user-pass`` option (See `INLINE FILE SUPPORT`_).
The last optional argument is an ``auth-method`` which should be one
- of :code:`none`, :code:`basic`, or :code:`ntlm2`.
+ of :code:`none`, :code:`basic`.
HTTP Digest authentication is supported as well, but only via the
:code:`auto` or :code:`auto-nct` flags (below). This must replace
@@ -31,8 +31,6 @@
http-proxy proxy.example.net 3128 authfile.txt
# basic authentication, ask user for credentials
http-proxy proxy.example.net 3128 stdin
- # NTLM authentication, load credentials from file
- http-proxy proxy.example.net 3128 authfile.txt ntlm2
# determine which authentication is required, ask user for credentials
http-proxy proxy.example.net 3128 auto
# determine which authentication is required, but reject basic
@@ -47,9 +45,8 @@
password
</http-proxy-user-pass>
- Note that support for NTLMv1 proxies was removed with OpenVPN 2.7.
- :code:`ntlm` now is an alias for :code:`ntlm2`; i.e. OpenVPN will always
- attempt to use NTLMv2 authentication.
+ Note that support for NTLMv1 proxies was removed with OpenVPN 2.7
+ and support for NTLMv2 proxies was removed with OpenVPN 2.8.
--http-proxy-user-pass userpass
Overwrite the username/password information for ``--http-proxy``. If
specified
diff --git a/src/openvpn/Makefile.am b/src/openvpn/Makefile.am
index db87dfc..8443807 100644
--- a/src/openvpn/Makefile.am
+++ b/src/openvpn/Makefile.am
@@ -99,7 +99,6 @@
networking_iproute2.c networking_iproute2.h \
networking_sitnl.c networking_sitnl.h \
networking.h \
- ntlm.c ntlm.h \
occ.c occ.h \
openssl_compat.h \
pkcs11.c pkcs11.h pkcs11_backend.h \
diff --git a/src/openvpn/ntlm.c b/src/openvpn/ntlm.c
deleted file mode 100644
index 8e913dc..0000000
--- a/src/openvpn/ntlm.c
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * ntlm proxy support for OpenVPN
- *
- * Copyright (C) 2004 William Preston
- *
- * *NTLMv2 support and domain name parsing by Miroslav Zajic, Nextsoft s.r.o.*
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "syshead.h"
-
-#if NTLM
-
-#include "common.h"
-#include "buffer.h"
-#include "misc.h"
-#include "socket.h"
-#include "fdmisc.h"
-#include "proxy.h"
-#include "ntlm.h"
-#include "base64.h"
-#include "crypto.h"
-
-#include "memdbg.h"
-
-
-/* 64bit datatype macros */
-#ifdef _MSC_VER
-/* MS compilers */
-#define UINTEGER64 __int64
-#define UINT64(c) c##Ui64
-#else
-/* Non MS compilers */
-#define UINTEGER64 unsigned long long
-#define UINT64(c) c##LL
-#endif
-
-
-static void
-gen_md4_hash(const uint8_t *data, int data_len, uint8_t *result)
-{
- /* result is 16 byte md4 hash */
- uint8_t md[MD4_DIGEST_LENGTH];
-
- md_full("MD4", data, data_len, md);
- memcpy(result, md, MD4_DIGEST_LENGTH);
-}
-
-static void
-gen_hmac_md5(const uint8_t *data, int data_len, const uint8_t *key, uint8_t
*result)
-{
- hmac_ctx_t *hmac_ctx = hmac_ctx_new();
-
- hmac_ctx_init(hmac_ctx, key, "MD5");
- hmac_ctx_update(hmac_ctx, data, data_len);
- hmac_ctx_final(hmac_ctx, result);
- hmac_ctx_cleanup(hmac_ctx);
- hmac_ctx_free(hmac_ctx);
-}
-
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
-
-static void
-gen_timestamp(uint8_t *timestamp)
-{
- /* Copies 8 bytes long timestamp into "timestamp" buffer.
- * Timestamp is Little-endian, 64-bit signed value representing the
- * number of tenths of a microsecond since January 1, 1601.
- */
-
- UINTEGER64 timestamp_ull;
-
- timestamp_ull = openvpn_time(NULL);
- timestamp_ull = (timestamp_ull + UINT64(11644473600)) * UINT64(10000000);
-
- /* store little endian value */
- timestamp[0] = timestamp_ull & UINT64(0xFF);
- timestamp[1] = (timestamp_ull >> 8) & UINT64(0xFF);
- timestamp[2] = (timestamp_ull >> 16) & UINT64(0xFF);
- timestamp[3] = (timestamp_ull >> 24) & UINT64(0xFF);
- timestamp[4] = (timestamp_ull >> 32) & UINT64(0xFF);
- timestamp[5] = (timestamp_ull >> 40) & UINT64(0xFF);
- timestamp[6] = (timestamp_ull >> 48) & UINT64(0xFF);
- timestamp[7] = (timestamp_ull >> 56) & UINT64(0xFF);
-}
-
-static void
-gen_nonce(unsigned char *nonce)
-{
- /* Generates 8 random bytes to be used as client nonce */
- int i;
-
- for (i = 0; i < 8; i++)
- {
- nonce[i] = (unsigned char)get_random();
- }
-}
-
-static void
-my_strupr(char *str)
-{
- /* converts string to uppercase in place */
-
- while (*str)
- {
- *str = toupper(*str);
- str++;
- }
-}
-
-/**
- * This function expects a null-terminated string in src and will
- * copy it (including the terminating NUL byte),
- * alternating it with 0 to dst.
- *
- * This basically will transform a ASCII string into valid UTF-16.
- * Characters that are 8bit in src, will get the same treatment, resulting in
- * invalid or wrong unicode code points.
- *
- * @note the function will blindly assume that dst has double
- * the space of src.
- * @return the length of the number of bytes written to dst
- */
-static int
-unicodize(char *dst, const char *src)
-{
- /* not really unicode... */
- int i = 0;
- do
- {
- dst[i++] = *src;
- dst[i++] = 0;
- } while (*src++);
-
- return i;
-}
-
-static void
-add_security_buffer(int sb_offset, void *data, int length, unsigned char
*msg_buf, int *msg_bufpos,
- size_t msg_bufsize)
-{
- if (*msg_bufpos + length > msg_bufsize)
- {
- msg(M_WARN, "NTLM: security buffer too big for message buffer");
- return;
- }
- /* Adds security buffer data to a message and sets security buffer's
- * offset and length */
- msg_buf[sb_offset] = (unsigned char)length;
- msg_buf[sb_offset + 2] = msg_buf[sb_offset];
- msg_buf[sb_offset + 4] = (unsigned char)(*msg_bufpos & 0xff);
- msg_buf[sb_offset + 5] = (unsigned char)((*msg_bufpos >> 8) & 0xff);
- memcpy(&msg_buf[*msg_bufpos], data, msg_buf[sb_offset]);
- *msg_bufpos += length;
-}
-
-const char *
-ntlm_phase_1(const struct http_proxy_info *p, struct gc_arena *gc)
-{
- struct buffer out = alloc_buf_gc(96, gc);
- /* try a minimal NTLM handshake
- *
- * https://davenport.sourceforge.net/ntlm.html
- *
- * This message contains only the NTLMSSP signature,
- * the NTLM message type,
- * and the minimal set of flags (Negotiate NTLM and Negotiate OEM).
- *
- */
- buf_printf(&out, "%s", "TlRMTVNTUAABAAAAAgIAAA==");
- return (BSTR(&out));
-}
-
-const char *
-ntlm_phase_3(const struct http_proxy_info *p, const char *phase_2, struct
gc_arena *gc)
-{
- /* NTLM handshake
- *
- * https://davenport.sourceforge.net/ntlm.html
- *
- */
-
- char pwbuf[sizeof(p->up.password) * 2]; /* for unicode password */
- uint8_t phase3[464];
-
- uint8_t md4_hash[MD4_DIGEST_LENGTH + 5];
- uint8_t challenge[8];
- int i, ret_val;
-
- uint8_t ntlmv2_response[256];
- char userdomain_u[256]; /* for uppercase unicode username and domain */
- char userdomain[128]; /* the same as previous but ascii */
- uint8_t ntlmv2_hash[MD5_DIGEST_LENGTH];
- uint8_t ntlmv2_hmacmd5[16];
- uint8_t *ntlmv2_blob = ntlmv2_response + 16; /* inside ntlmv2_response,
length: 128 */
- int ntlmv2_blob_size = 0;
- int phase3_bufpos = 0x40; /* offset to next security
buffer data to be added */
- size_t len;
-
- char domain[128];
- char username[128];
- char *separator;
-
- ASSERT(strlen(p->up.username) > 0);
- ASSERT(strlen(p->up.password) > 0);
-
- /* username parsing */
- separator = strchr(p->up.username, '\\');
- if (separator == NULL)
- {
- strncpy(username, p->up.username, sizeof(username) - 1);
- username[sizeof(username) - 1] = 0;
- domain[0] = 0;
- }
- else
- {
- strncpy(username, separator + 1, sizeof(username) - 1);
- username[sizeof(username) - 1] = 0;
- len = separator - p->up.username;
- if (len > sizeof(domain) - 1)
- {
- len = sizeof(domain) - 1;
- }
- strncpy(domain, p->up.username, len);
- domain[len] = 0;
- }
-
-
- /* fill 1st 16 bytes with md4 hash, disregard terminating null */
- int unicode_len = unicodize(pwbuf, p->up.password) - 2;
- gen_md4_hash((uint8_t *)pwbuf, unicode_len, md4_hash);
-
- /* pad to 21 bytes */
- memset(md4_hash + MD4_DIGEST_LENGTH, 0, 5);
-
- /* If the decoded challenge is shorter than required by the protocol,
- * the missing bytes will be NULL, as buf2 is known to be zeroed
- * when this decode happens.
- */
- uint8_t buf2[512]; /* decoded reply from proxy */
- CLEAR(buf2);
- ret_val = openvpn_base64_decode(phase_2, buf2, -1);
- if (ret_val < 0)
- {
- msg(M_WARN, "NTLM: base64 decoding of phase 2 response failed");
- return NULL;
- }
-
- /* extract the challenge from bytes 24-31 */
- for (i = 0; i < 8; i++)
- {
- challenge[i] = buf2[i + 24];
- }
-
- /* Generate NTLMv2 response */
- int tib_len;
-
- /* NTLMv2 hash */
- strcpy(userdomain, username);
- my_strupr(userdomain);
- if (strlen(username) + strlen(domain) < sizeof(userdomain))
- {
- strcat(userdomain, domain);
- }
- else
- {
- msg(M_INFO, "NTLM: Username or domain too long");
- }
- unicodize(userdomain_u, userdomain);
- gen_hmac_md5((uint8_t *)userdomain_u, 2 * strlen(userdomain), md4_hash,
ntlmv2_hash);
-
- /* NTLMv2 Blob */
- memset(ntlmv2_blob, 0, 128); /* Clear blob buffer */
- ntlmv2_blob[0x00] = 1; /* Signature */
- ntlmv2_blob[0x01] = 1; /* Signature */
- ntlmv2_blob[0x04] = 0; /* Reserved */
- gen_timestamp(&ntlmv2_blob[0x08]); /* 64-bit Timestamp */
- gen_nonce(&ntlmv2_blob[0x10]); /* 64-bit Client Nonce */
- ntlmv2_blob[0x18] = 0; /* Unknown, zero should work */
-
- /* Add target information block to the blob */
-
- /* Check for Target Information block */
- /* The NTLM spec instructs to interpret these 4 consecutive bytes as a
- * 32bit long integer. However, no endianness is specified.
- * The code here and that found in other NTLM implementations point
- * towards the assumption that the byte order on the wire has to
- * match the order on the sending and receiving hosts. Probably NTLM has
- * been thought to be always running on x86_64/i386 machine thus
- * implying Little-Endian everywhere.
- *
- * This said, in case of future changes, we should keep in mind that the
- * byte order on the wire for the NTLM header is LE.
- */
- const size_t hoff = 0x14;
- unsigned long flags =
- buf2[hoff] | (buf2[hoff + 1] << 8) | (buf2[hoff + 2] << 16) |
(buf2[hoff + 3] << 24);
- if ((flags & 0x00800000) == 0x00800000)
- {
- tib_len = buf2[0x28]; /* Get Target Information block size */
- if (tib_len + 0x1c + 16 > sizeof(ntlmv2_response))
- {
- msg(M_WARN, "NTLM: target information buffer too long for response
(len=%d)", tib_len);
- return NULL;
- }
-
- {
- uint8_t *tib_ptr;
- uint8_t tib_pos = buf2[0x2c];
- if (tib_pos + tib_len > sizeof(buf2))
- {
- msg(M_ERR,
- "NTLM: phase 2 response from server too long (need %d
bytes at offset %u)",
- tib_len, tib_pos);
- return NULL;
- }
- /* Get Target Information block pointer */
- tib_ptr = buf2 + tib_pos;
- /* Copy Target Information block into the blob */
- memcpy(&ntlmv2_blob[0x1c], tib_ptr, tib_len);
- }
- }
- else
- {
- tib_len = 0;
- }
-
- /* Unknown, zero works */
- ntlmv2_blob[0x1c + tib_len] = 0;
-
- /* Get blob length */
- ntlmv2_blob_size = 0x20 + tib_len;
-
- /* Add challenge from message 2 */
- memcpy(&ntlmv2_response[8], challenge, 8);
-
- /* hmac-md5 */
- gen_hmac_md5(&ntlmv2_response[8], ntlmv2_blob_size + 8, ntlmv2_hash,
ntlmv2_hmacmd5);
-
- /* Add hmac-md5 result to the blob.
- * Note: This overwrites challenge previously written at
- * ntlmv2_response[8..15] */
- memcpy(ntlmv2_response, ntlmv2_hmacmd5, MD5_DIGEST_LENGTH);
-
- memset(phase3, 0, sizeof(phase3)); /* clear reply */
-
- strcpy((char *)phase3, "NTLMSSP\0"); /* signature */
- phase3[8] = 3; /* type 3 */
-
- /* NTLMv2 response */
- add_security_buffer(0x14, ntlmv2_response, ntlmv2_blob_size + 16, phase3,
&phase3_bufpos,
- sizeof(phase3));
-
- /* username in ascii */
- add_security_buffer(0x24, username, strlen(username), phase3,
&phase3_bufpos, sizeof(phase3));
-
- /* Set domain. If <domain> is empty, default domain will be used
- * (i.e. proxy's domain) */
- add_security_buffer(0x1c, domain, strlen(domain), phase3, &phase3_bufpos,
sizeof(phase3));
-
- /* other security buffers will be empty */
- phase3[0x10] = phase3_bufpos; /* lm not used */
- phase3[0x30] = phase3_bufpos; /* no workstation name supplied */
- phase3[0x38] = phase3_bufpos; /* no session key */
-
- /* flags */
- phase3[0x3c] = 0x02; /* negotiate oem */
- phase3[0x3d] = 0x02; /* negotiate ntlm */
-
- return ((const char *)make_base64_string2((unsigned char *)phase3,
phase3_bufpos, gc));
-}
-
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic pop
-#endif
-#endif /* if NTLM */
diff --git a/src/openvpn/ntlm.h b/src/openvpn/ntlm.h
deleted file mode 100644
index b0a6821..0000000
--- a/src/openvpn/ntlm.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef NTLM_H
-#define NTLM_H
-
-#if NTLM
-
-const char *ntlm_phase_1(const struct http_proxy_info *p, struct gc_arena *gc);
-
-const char *ntlm_phase_3(const struct http_proxy_info *p, const char *phase_2,
struct gc_arena *gc);
-
-#endif
-
-#endif
diff --git a/src/openvpn/options.c b/src/openvpn/options.c
index 34af0d3..dabb75b 100644
--- a/src/openvpn/options.c
+++ b/src/openvpn/options.c
@@ -158,8 +158,7 @@
" through an HTTP proxy at address s and port p.\n"
" If proxy authentication is required,\n"
" up is a file containing username/password on 2 lines,
or\n"
- " 'stdin' to prompt from console. Add auth='ntlm2' if\n"
- " the proxy requires NTLM authentication.\n"
+ " 'stdin' to prompt from console.\n"
"--http-proxy s p 'auto[-nct]' : Like the above directive, but
automatically\n"
" determine auth method and query for username/password\n"
" if needed. auto-nct disables weak proxy auth
methods.\n"
diff --git a/src/openvpn/proxy.c b/src/openvpn/proxy.c
index ff6ea5a..957a4f2 100644
--- a/src/openvpn/proxy.c
+++ b/src/openvpn/proxy.c
@@ -35,7 +35,6 @@
#include "proxy.h"
#include "base64.h"
#include "httpdigest.h"
-#include "ntlm.h"
#include "memdbg.h"
#include "forward.h"
@@ -348,14 +347,6 @@
ret = HTTP_AUTH_DIGEST;
}
#endif
-#if NTLM
- else if (!strncmp(buf + 20, "NTLM", 4))
- {
- msg(D_PROXY, "PROXY AUTH NTLM: '%s'", buf);
- *data = NULL;
- ret = HTTP_AUTH_NTLM2;
- }
-#endif
}
}
}
@@ -511,40 +502,20 @@
{
p->auth_method = HTTP_AUTH_BASIC;
}
-#if NTLM
- else if (!strcmp(o->auth_method_string, "ntlm"))
- {
- msg(M_WARN,
- "NTLM v1 authentication has been removed in OpenVPN 2.7. Will
try to use NTLM v2 authentication.");
- p->auth_method = HTTP_AUTH_NTLM2;
- }
- else if (!strcmp(o->auth_method_string, "ntlm2"))
- {
- p->auth_method = HTTP_AUTH_NTLM2;
- }
-#endif
else
{
msg(M_FATAL, "ERROR: unknown HTTP authentication method: '%s'",
o->auth_method_string);
}
}
- /* When basic or NTLMv2 authentication is requested, get credentials now.
+ /* When basic authentication is requested, get credentials now.
* In case of "auto" negotiation credentials will be retrieved later once
* we know whether we need any. */
- if (p->auth_method == HTTP_AUTH_BASIC || p->auth_method == HTTP_AUTH_NTLM2)
+ if (p->auth_method == HTTP_AUTH_BASIC)
{
get_user_pass_http(p, p->options.first_time);
}
-#if !NTLM
- if (p->auth_method == HTTP_AUTH_NTLM2)
- {
- msg(M_FATAL,
- "Sorry, this version of " PACKAGE_NAME " was built without NTLM
Proxy support.");
- }
-#endif
-
p->defined = true;
return p;
}
@@ -638,8 +609,7 @@
volatile int *signal_received = &sig_info->signal_received;
/* get user/pass if not previously given */
- if (p->auth_method == HTTP_AUTH_BASIC || p->auth_method == HTTP_AUTH_DIGEST
- || p->auth_method == HTTP_AUTH_NTLM2)
+ if (p->auth_method == HTTP_AUTH_BASIC || p->auth_method ==
HTTP_AUTH_DIGEST)
{
get_user_pass_http(p, false);
@@ -692,25 +662,6 @@
}
break;
-#if NTLM
- case HTTP_AUTH_NTLM2:
- /* keep-alive connection */
- snprintf(buf, sizeof(buf), "Proxy-Connection: Keep-Alive");
- if (!send_line_crlf(sd, buf))
- {
- goto error;
- }
-
- snprintf(buf, sizeof(buf), "Proxy-Authorization: NTLM %s",
ntlm_phase_1(p, &gc));
- msg(D_PROXY, "Attempting NTLM Proxy-Authorization phase 1");
- dmsg(D_SHOW_KEYS, "Send to HTTP proxy: '%s'", buf);
- if (!send_line_crlf(sd, buf))
- {
- goto error;
- }
- break;
-#endif
-
default:
ASSERT(0);
}
@@ -749,112 +700,6 @@
{
processed = true;
}
- else if (p->auth_method == HTTP_AUTH_NTLM2 && !processed) /* check for
NTLM */
- {
-#if NTLM
- /* look for the phase 2 response */
- char buf2[512];
- while (true)
- {
- if (!recv_line(sd, buf, sizeof(buf),
-
get_server_poll_remaining_time(server_poll_timeout), true, NULL,
- signal_received))
- {
- goto error;
- }
- chomp(buf);
- msg(D_PROXY, "HTTP proxy returned: '%s'", buf);
-
- char get[80];
- CLEAR(buf2);
- snprintf(get, sizeof(get), "%%*s NTLM %%%zus", sizeof(buf2) -
1);
- nparms = sscanf(buf, get, buf2);
-
- /* check for "Proxy-Authenticate: NTLM TlRM..." */
- if (nparms == 1)
- {
- /* parse buf2 */
- msg(D_PROXY, "auth string: '%s'", buf2);
- break;
- }
- }
- /* if we are here then auth string was got */
- msg(D_PROXY, "Received NTLM Proxy-Authorization phase 2 response");
-
- /* receive and discard everything else */
- while (recv_line(sd, NULL, 0, 2, true, NULL, signal_received))
- {
- }
-
- /* now send the phase 3 reply */
-
- /* format HTTP CONNECT message */
- snprintf(buf, sizeof(buf), "CONNECT %s:%s HTTP/%s", host, port,
- p->options.http_version);
-
- msg(D_PROXY, "Send to HTTP proxy: '%s'", buf);
-
- /* send HTTP CONNECT message to proxy */
- if (!send_line_crlf(sd, buf))
- {
- goto error;
- }
-
- /* keep-alive connection */
- snprintf(buf, sizeof(buf), "Proxy-Connection: Keep-Alive");
- if (!send_line_crlf(sd, buf))
- {
- goto error;
- }
-
- /* send HOST etc, */
- if (!add_proxy_headers(p, sd, host))
- {
- goto error;
- }
-
- msg(D_PROXY, "Attempting NTLM Proxy-Authorization phase 3");
- {
- const char *np3 = ntlm_phase_3(p, buf2, &gc);
- if (!np3)
- {
- msg(D_PROXY,
- "NTLM Proxy-Authorization phase 3 failed: received
corrupted data from proxy server");
- goto error;
- }
- snprintf(buf, sizeof(buf), "Proxy-Authorization: NTLM %s",
np3);
- }
-
- msg(D_PROXY, "Send to HTTP proxy: '%s'", buf);
- if (!send_line_crlf(sd, buf))
- {
- goto error;
- }
- /* ok so far... */
- /* send empty CR, LF */
- if (!send_crlf(sd))
- {
- goto error;
- }
-
- /* receive reply from proxy */
- if (!recv_line(sd, buf, sizeof(buf),
-
get_server_poll_remaining_time(server_poll_timeout), true, NULL,
- signal_received))
- {
- goto error;
- }
-
- /* remove trailing CR, LF */
- chomp(buf);
-
- msg(D_PROXY, "HTTP proxy returned: '%s'", buf);
-
- /* parse return string */
- nparms = sscanf(buf, "%*s %d", &status);
- processed = true;
-#endif /* if NTLM */
- }
#if PROXY_DIGEST_AUTH
else if (p->auth_method == HTTP_AUTH_DIGEST && !processed)
{
diff --git a/src/openvpn/proxy.h b/src/openvpn/proxy.h
index d14725c..238a32e 100644
--- a/src/openvpn/proxy.h
+++ b/src/openvpn/proxy.h
@@ -31,7 +31,7 @@
#define HTTP_AUTH_BASIC 1
#define HTTP_AUTH_DIGEST 2
/* #define HTTP_AUTH_NTLM 3 removed in OpenVPN 2.7 */
-#define HTTP_AUTH_NTLM2 4
+/* #define HTTP_AUTH_NTLM2 4 removed in OpenVPN 2.8 */
#define HTTP_AUTH_N 5 /* number of HTTP_AUTH methods */
struct http_custom_header
diff --git a/src/openvpn/syshead.h b/src/openvpn/syshead.h
index 627ba92..82452f3 100644
--- a/src/openvpn/syshead.h
+++ b/src/openvpn/syshead.h
@@ -488,13 +488,6 @@
#endif
/*
- * Should we include NTLM proxy functionality
- */
-#ifdef ENABLE_NTLM
-#define NTLM 1
-#endif
-
-/*
* Should we include proxy digest auth functionality
*/
#define PROXY_DIGEST_AUTH 1
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4b4bcaa..005ac35 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -49,12 +49,4 @@
ntlm_support_CFLAGS = -I$(top_srcdir)/src/openvpn -I$(top_srcdir)/src/compat
-I$(top_srcdir)/tests/unit_tests/openvpn -DNO_CMOCKA @TEST_CFLAGS@
ntlm_support_LDFLAGS = @TEST_LDFLAGS@ -L$(top_srcdir)/src/openvpn
$(OPTIONAL_CRYPTO_LIBS)
ntlm_support_SOURCES = ntlm_support.c \
- unit_tests/openvpn/mock_msg.c unit_tests/openvpn/mock_msg.h \
- $(top_srcdir)/src/openvpn/buffer.c \
- $(top_srcdir)/src/openvpn/crypto.c \
- $(top_srcdir)/src/openvpn/crypto_epoch.c \
- $(top_srcdir)/src/openvpn/crypto_openssl.c \
- $(top_srcdir)/src/openvpn/crypto_mbedtls.c \
- $(top_srcdir)/src/openvpn/otime.c \
- $(top_srcdir)/src/openvpn/packet_id.c \
- $(top_srcdir)/src/openvpn/platform.c
+ unit_tests/openvpn/mock_msg.c unit_tests/openvpn/mock_msg.h
diff --git a/tests/ntlm_support.c b/tests/ntlm_support.c
index 7007051..61e5090 100644
--- a/tests/ntlm_support.c
+++ b/tests/ntlm_support.c
@@ -26,30 +26,10 @@
#include "syshead.h"
-#include "crypto.h"
#include "error.h"
int
main(void)
{
-#ifdef NTLM
-#if defined(ENABLE_CRYPTO_OPENSSL)
- provider_t *legacy = crypto_load_provider("legacy");
- provider_t *def = crypto_load_provider("default");
-#endif
- if (!md_valid("MD4"))
- {
- msg(M_FATAL, "MD4 not supported");
- }
- if (!md_valid("MD5"))
- {
- msg(M_FATAL, "MD5 not supported");
- }
-#if defined(ENABLE_CRYPTO_OPENSSL)
- crypto_unload_provider("legacy", legacy);
- crypto_unload_provider("default", def);
-#endif
-#else /* ifdef NTLM */
msg(M_FATAL, "NTLM support not compiled in");
-#endif
}
--
To view, visit http://gerrit.openvpn.net/c/openvpn/+/1453?usp=email
To unsubscribe, or for help writing mail filters, visit
http://gerrit.openvpn.net/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: I1f5724476862935284f620c54afa510eea03e3f9
Gerrit-Change-Number: 1453
Gerrit-PatchSet: 1
Gerrit-Owner: flichtenheld <[email protected]>
Gerrit-Reviewer: plaisthos <[email protected]>
Gerrit-CC: openvpn-devel <[email protected]>
Gerrit-Attention: plaisthos <[email protected]>
_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel