libpurple/ntlm.c

Fri, 14 Nov 2008 06:45:16 +0000

author
Richard Laager <rlaager@pidgin.im>
date
Fri, 14 Nov 2008 06:45:16 +0000
branch
next.minor
changeset 24981
ceddb7033bc8
parent 22596
0854ae660ef4
child 26558
d8cf7a583b30
permissions
-rw-r--r--

propagate from branch 'im.pidgin.pidgin' (head cc1cc6c659d3878f285641153244b04df2f15eb7)
to branch 'im.pidgin.pidgin.next.minor' (head c195415b5fdfa94009870ddc8e23cf4a653ae351)

11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
1 /**
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
2 * @file ntlm.c
20147
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19985
diff changeset
3 */
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19985
diff changeset
4
66f05a854eee applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@pidgin.im>
parents: 19985
diff changeset
5 /* purple
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
6 *
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
7 * Copyright (C) 2005 Thomas Butter <butter@uni-mannheim.de>
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
8 *
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
9 * hashing done according to description of NTLM on
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
10 * http://www.innovation.ch/java/ntlm.html
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
11 *
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
12 * This program is free software; you can redistribute it and/or modify
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
13 * it under the terms of the GNU General Public License as published by
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
14 * the Free Software Foundation; either version 2 of the License, or
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
15 * (at your option) any later version.
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
16 *
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
17 * This program is distributed in the hope that it will be useful,
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
20 * GNU General Public License for more details.
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
21 *
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
22 * You should have received a copy of the GNU General Public License
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
23 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 18265
diff changeset
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
25 */
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
26
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
27 #include <glib.h>
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
28 #include <stdlib.h>
18265
9f26190d7f46 Move the define in internal.h instead.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15884
diff changeset
29 #include "internal.h"
9f26190d7f46 Move the define in internal.h instead.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15884
diff changeset
30
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
31 #include "util.h"
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
32 #include "ntlm.h"
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
33 #include "cipher.h"
22596
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
34 #include "debug.h"
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
35 #include <string.h>
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
36
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
37 #define NTLM_NEGOTIATE_NTLM2_KEY 0x00080000
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
38
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
39 struct type1_message {
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
40 guint8 protocol[8]; /* 'N', 'T', 'L', 'M', 'S', 'S', 'P', '\0' */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
41 guint32 type; /* 0x00000001 */
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
42 guint32 flags; /* 0x0000b203 */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
43
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
44 short dom_len1; /* domain string length */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
45 short dom_len2; /* domain string length */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
46 guint32 dom_off; /* domain string offset */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
47
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
48 short host_len1; /* host string length */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
49 short host_len2; /* host string length */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
50 guint32 host_off; /* host string offset (always 0x00000020) */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
51
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
52 #if 0
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
53 guint8 host[*]; /* host string (ASCII) */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
54 guint8 dom[*]; /* domain string (ASCII) */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
55 #endif
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
56 };
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
57
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
58 struct type2_message {
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
59 guint8 protocol[8]; /* 'N', 'T', 'L', 'M', 'S', 'S', 'P', '\0'*/
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
60 guint32 type; /* 0x00000002 */
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
61
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
62 short msg_len1; /* target name length */
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
63 short msg_len2; /* target name length */
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
64 guint32 msg_off; /* target name offset (always 0x00000048) */
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
65
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
66 guint32 flags; /* 0x00008201 */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
67
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
68 guint8 nonce[8]; /* nonce */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
69 guint8 context[8];
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
70 };
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
71
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
72 struct type3_message {
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
73 guint8 protocol[8]; /* 'N', 'T', 'L', 'M', 'S', 'S', 'P', '\0'*/
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
74 guint32 type; /* 0x00000003 */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
75
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
76 short lm_resp_len1; /* LanManager response length (always 0x18)*/
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
77 short lm_resp_len2; /* LanManager response length (always 0x18)*/
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
78 guint32 lm_resp_off; /* LanManager response offset */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
79
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
80 short nt_resp_len1; /* NT response length (always 0x18) */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
81 short nt_resp_len2; /* NT response length (always 0x18) */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
82 guint32 nt_resp_off; /* NT response offset */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
83
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
84 short dom_len1; /* domain string length */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
85 short dom_len2; /* domain string length */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
86 guint32 dom_off; /* domain string offset (always 0x00000040) */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
87
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
88 short user_len1; /* username string length */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
89 short user_len2; /* username string length */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
90 guint32 user_off; /* username string offset */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
91
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
92 short host_len1; /* host string length */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
93 short host_len2; /* host string length */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
94 guint32 host_off; /* host string offset */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
95
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
96 short sess_len1;
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
97 short sess_len2;
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
98 guint32 sess_off; /* message length */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
99
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
100 guint32 flags; /* 0x00008201 */
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
101 /* guint32 flags2; */ /* unknown, used in windows messenger */
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
102 /* guint32 flags3; */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
103
11829
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
104 #if 0
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
105 guint8 dom[*]; /* domain string (unicode UTF-16LE) */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
106 guint8 user[*]; /* username string (unicode UTF-16LE) */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
107 guint8 host[*]; /* host string (unicode UTF-16LE) */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
108 guint8 lm_resp[*]; /* LanManager response */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
109 guint8 nt_resp[*]; /* NT response */
8d89f3c00831 [gaim-migrate @ 14120]
Richard Laager <rlaager@pidgin.im>
parents: 11586
diff changeset
110 #endif
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
111 };
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
112
13701
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
113 /* TODO: Will this work on both little-endian and big-endian machines? */
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
114 gchar *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
115 purple_ntlm_gen_type1(const gchar *hostname, const gchar *domain)
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
116 {
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
117 int hostnamelen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
118 int domainlen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
119 unsigned char *msg;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
120 struct type1_message *tmsg;
13706
0490d9ee869a [gaim-migrate @ 16107]
Mark Doliner <markdoliner@pidgin.im>
parents: 13701
diff changeset
121 gchar *tmp;
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
122
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
123 hostnamelen = strlen(hostname);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
124 domainlen = strlen(domain);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
125 msg = g_malloc0(sizeof(struct type1_message) + hostnamelen + domainlen);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
126 tmsg = (struct type1_message*)msg;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
127 tmsg->protocol[0] = 'N';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
128 tmsg->protocol[1] = 'T';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
129 tmsg->protocol[2] = 'L';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
130 tmsg->protocol[3] = 'M';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
131 tmsg->protocol[4] = 'S';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
132 tmsg->protocol[5] = 'S';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
133 tmsg->protocol[6] = 'P';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
134 tmsg->protocol[7] = '\0';
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
135 tmsg->type = 0x00000001;
19985
b3d60f27292e This is parts 1 and 2 of patch #2910 from Vladimir (thecrux) to improve NTLM proxy handling. Specifically, it specifies that we're using Unicode strings and uses the hostname of the local machine instead of incorrectly using the proxy server's hostname for authentication. References #2910.
Daniel Atallah <datallah@pidgin.im>
parents: 19859
diff changeset
136 tmsg->flags = 0x0000b203;
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
137 tmsg->dom_len1 = tmsg->dom_len2 = domainlen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
138 tmsg->dom_off = sizeof(struct type1_message) + hostnamelen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
139 tmsg->host_len1 = tmsg->host_len2 = hostnamelen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
140 tmsg->host_off = sizeof(struct type1_message);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
141 memcpy(msg + tmsg->host_off, hostname, hostnamelen);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
142 memcpy(msg + tmsg->dom_off, domain, domainlen);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
143
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
144 tmp = purple_base64_encode(msg, sizeof(struct type1_message) + hostnamelen + domainlen);
13706
0490d9ee869a [gaim-migrate @ 16107]
Mark Doliner <markdoliner@pidgin.im>
parents: 13701
diff changeset
145 g_free(msg);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
146
13706
0490d9ee869a [gaim-migrate @ 16107]
Mark Doliner <markdoliner@pidgin.im>
parents: 13701
diff changeset
147 return tmp;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
148 }
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
149
13700
ad7bca3b4240 [gaim-migrate @ 16101]
Mark Doliner <markdoliner@pidgin.im>
parents: 13679
diff changeset
150 guint8 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
151 purple_ntlm_parse_type2(const gchar *type2, guint32 *flags)
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
152 {
11586
9e221fc0e2f8 [gaim-migrate @ 13856]
Nathan Walp <nwalp@pidgin.im>
parents: 11427
diff changeset
153 gsize retlen;
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
154 struct type2_message *tmsg;
13700
ad7bca3b4240 [gaim-migrate @ 16101]
Mark Doliner <markdoliner@pidgin.im>
parents: 13679
diff changeset
155 static guint8 nonce[8];
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
156
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
157 tmsg = (struct type2_message*)purple_base64_decode(type2, &retlen);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
158 memcpy(nonce, tmsg->nonce, 8);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
159 if (flags != NULL)
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
160 *flags = tmsg->flags;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
161 g_free(tmsg);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
162
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
163 return nonce;
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
164 }
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
165
13701
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
166 /**
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
167 * Create a 64bit DES key by taking a 56bit key and adding
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
168 * a parity bit after every 7th bit.
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
169 */
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
170 static void
13701
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
171 setup_des_key(const guint8 key_56[], guint8 *key)
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
172 {
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
173 key[0] = key_56[0];
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
174 key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1);
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
175 key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2);
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
176 key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3);
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
177 key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4);
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
178 key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5);
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
179 key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6);
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
180 key[7] = (key_56[6] << 1) & 0xFF;
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
181 }
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
182
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
183 /*
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
184 * helper function for purple cipher.c
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
185 */
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
186 static void
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
187 des_ecb_encrypt(const guint8 *plaintext, guint8 *result, const guint8 *key)
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
188 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
189 PurpleCipher *cipher;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
190 PurpleCipherContext *context;
21695
8cea10362afd purple_cipher_context_encrypt() wants a pointer to a size_t, not a gsize
Evan Schoenberg <evands@pidgin.im>
parents: 20147
diff changeset
191 size_t outlen;
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
192
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
193 cipher = purple_ciphers_find_cipher("des");
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
194 context = purple_cipher_context_new(cipher, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
195 purple_cipher_context_set_key(context, key);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
196 purple_cipher_context_encrypt(context, plaintext, 8, result, &outlen);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
197 purple_cipher_context_destroy(context);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
198 }
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
199
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
200 /*
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
201 * takes a 21 byte array and treats it as 3 56-bit DES keys. The
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
202 * 8 byte plaintext is encrypted with each key and the resulting 24
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
203 * bytes are stored in the results array.
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
204 */
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
205 static void
13701
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
206 calc_resp(guint8 *keys, const guint8 *plaintext, unsigned char *results)
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
207 {
13701
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
208 guint8 key[8];
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
209 setup_des_key(keys, key);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
210 des_ecb_encrypt(plaintext, results, key);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
211
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
212 setup_des_key(keys + 7, key);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
213 des_ecb_encrypt(plaintext, results + 8, key);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
214
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
215 setup_des_key(keys + 14, key);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
216 des_ecb_encrypt(plaintext, results + 16, key);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
217 }
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
218
13679
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
219 static void
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
220 gensesskey(char *buffer, const char *oldkey)
77a58c7c93af [gaim-migrate @ 16079]
Mark Doliner <markdoliner@pidgin.im>
parents: 13089
diff changeset
221 {
13088
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
222 int i = 0;
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
223 if(oldkey == NULL) {
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
224 for(i=0; i<16; i++) {
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
225 buffer[i] = (char)(rand() & 0xff);
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
226 }
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
227 } else {
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
228 memcpy(buffer, oldkey, 16);
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
229 }
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
230 }
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
231
13089
e1ab8bfba211 [gaim-migrate @ 15450]
Mark Doliner <markdoliner@pidgin.im>
parents: 13088
diff changeset
232 gchar *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
233 purple_ntlm_gen_type3(const gchar *username, const gchar *passw, const gchar *hostname, const gchar *domain, const guint8 *nonce, guint32 *flags)
13089
e1ab8bfba211 [gaim-migrate @ 15450]
Mark Doliner <markdoliner@pidgin.im>
parents: 13088
diff changeset
234 {
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
235 char lm_pw[14];
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
236 unsigned char lm_hpw[21];
13088
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
237 char sesskey[16];
13701
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
238 guint8 key[8];
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
239 int domainlen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
240 int usernamelen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
241 int hostnamelen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
242 int msglen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
243 struct type3_message *tmsg;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
244 int passwlen, lennt;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
245 unsigned char lm_resp[24], nt_resp[24];
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
246 unsigned char magic[] = { 0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25 };
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
247 unsigned char nt_hpw[21];
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
248 char nt_pw[128];
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
249 PurpleCipher *cipher;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
250 PurpleCipherContext *context;
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
251 char *tmp;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
252 int idx;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
253 gchar *ucs2le;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
254
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
255 domainlen = strlen(domain) * 2;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
256 usernamelen = strlen(username) * 2;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
257 hostnamelen = strlen(hostname) * 2;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
258 msglen = sizeof(struct type3_message) + domainlen +
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
259 usernamelen + hostnamelen + 0x18 + 0x18 + ((flags) ? 0x10 : 0);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
260 tmsg = g_malloc0(msglen);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
261 passwlen = strlen(passw);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
262
13089
e1ab8bfba211 [gaim-migrate @ 15450]
Mark Doliner <markdoliner@pidgin.im>
parents: 13088
diff changeset
263 /* type3 message initialization */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
264 tmsg->protocol[0] = 'N';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
265 tmsg->protocol[1] = 'T';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
266 tmsg->protocol[2] = 'L';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
267 tmsg->protocol[3] = 'M';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
268 tmsg->protocol[4] = 'S';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
269 tmsg->protocol[5] = 'S';
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
270 tmsg->protocol[6] = 'P';
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
271 tmsg->type = 0x00000003;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
272 tmsg->lm_resp_len1 = tmsg->lm_resp_len2 = 0x18;
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
273 tmsg->lm_resp_off = sizeof(struct type3_message) + domainlen + usernamelen + hostnamelen;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
274 tmsg->nt_resp_len1 = tmsg->nt_resp_len2 = 0x18;
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
275 tmsg->nt_resp_off = sizeof(struct type3_message) + domainlen + usernamelen + hostnamelen + 0x18;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
276
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
277 tmsg->dom_len1 = tmsg->dom_len2 = domainlen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
278 tmsg->dom_off = sizeof(struct type3_message);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
279
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
280 tmsg->user_len1 = tmsg->user_len2 = usernamelen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
281 tmsg->user_off = sizeof(struct type3_message) + domainlen;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
282
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
283 tmsg->host_len1 = tmsg->host_len2 = hostnamelen;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
284 tmsg->host_off = sizeof(struct type3_message) + domainlen + usernamelen;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
285
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
286 if(flags) {
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
287 tmsg->sess_off = sizeof(struct type3_message) + domainlen + usernamelen + hostnamelen + 0x18 + 0x18;
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
288 tmsg->sess_len1 = tmsg->sess_len2 = 0x0010;
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
289 }
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
290
19985
b3d60f27292e This is parts 1 and 2 of patch #2910 from Vladimir (thecrux) to improve NTLM proxy handling. Specifically, it specifies that we're using Unicode strings and uses the hostname of the local machine instead of incorrectly using the proxy server's hostname for authentication. References #2910.
Daniel Atallah <datallah@pidgin.im>
parents: 19859
diff changeset
291 tmsg->flags = 0x00008201;
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
292
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
293 tmp = (char *)tmsg + sizeof(struct type3_message);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
294
22596
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
295 ucs2le = g_convert(domain, -1, "UTF-16LE", "UTF-8", NULL, NULL, NULL);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
296 if (ucs2le != NULL) {
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
297 memcpy(tmp, ucs2le, domainlen);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
298 g_free(ucs2le);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
299 tmp += domainlen;
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
300 } else {
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
301 purple_debug_info("ntlm", "Unable to encode domain in UTF-16LE.\n");
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
302 }
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
303
22596
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
304 ucs2le = g_convert(username, -1, "UTF-16LE", "UTF-8", NULL, NULL, NULL);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
305 if (ucs2le != NULL) {
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
306 memcpy(tmp, ucs2le, usernamelen);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
307 g_free(ucs2le);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
308 tmp += usernamelen;
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
309 } else {
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
310 purple_debug_info("ntlm", "Unable to encode username in UTF-16LE.\n");
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
311 }
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
312
22596
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
313 ucs2le = g_convert(hostname, -1, "UTF-16LE", "UTF-8", NULL, NULL, NULL);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
314 if (ucs2le != NULL) {
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
315 memcpy(tmp, ucs2le, hostnamelen);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
316 g_free(ucs2le);
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
317 tmp += hostnamelen;
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
318 } else {
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
319 purple_debug_info("ntlm", "Unable to encode hostname in UTF-16LE.\n");
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
320 }
13089
e1ab8bfba211 [gaim-migrate @ 15450]
Mark Doliner <markdoliner@pidgin.im>
parents: 13088
diff changeset
321
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
322 /* LM */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
323 if (passwlen > 14)
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
324 passwlen = 14;
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
325
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
326 for (idx = 0; idx < passwlen; idx++)
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
327 lm_pw[idx] = g_ascii_toupper(passw[idx]);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
328 for (; idx < 14; idx++)
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
329 lm_pw[idx] = 0;
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
330
13701
5f9ab32a6306 [gaim-migrate @ 16102]
Mark Doliner <markdoliner@pidgin.im>
parents: 13700
diff changeset
331 setup_des_key((unsigned char*)lm_pw, key);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
332 des_ecb_encrypt(magic, lm_hpw, key);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
333
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
334 setup_des_key((unsigned char*)(lm_pw + 7), key);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
335 des_ecb_encrypt(magic, lm_hpw + 8, key);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
336
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
337 memset(lm_hpw + 16, 0, 5);
13700
ad7bca3b4240 [gaim-migrate @ 16101]
Mark Doliner <markdoliner@pidgin.im>
parents: 13679
diff changeset
338 calc_resp(lm_hpw, nonce, lm_resp);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
339 memcpy(tmp, lm_resp, 0x18);
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
340 tmp += 0x18;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
341
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
342 /* NTLM */
22596
0854ae660ef4 Further changes to use UTF-16 instead of UCS-2. Also, fix #5167 by making sure that the encoding conversion worked before using the result.
Daniel Atallah <datallah@pidgin.im>
parents: 21695
diff changeset
343 /* Convert the password to UTF-16LE */
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
344 lennt = strlen(passw);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
345 for (idx = 0; idx < lennt; idx++)
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
346 {
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
347 nt_pw[2 * idx] = passw[idx];
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
348 nt_pw[2 * idx + 1] = 0;
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
349 }
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
350
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
351 cipher = purple_ciphers_find_cipher("md4");
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
352 context = purple_cipher_context_new(cipher, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
353 purple_cipher_context_append(context, (guint8 *)nt_pw, 2 * lennt);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
354 purple_cipher_context_digest(context, 21, nt_hpw, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
355 purple_cipher_context_destroy(context);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
356
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
357 memset(nt_hpw + 16, 0, 5);
13700
ad7bca3b4240 [gaim-migrate @ 16101]
Mark Doliner <markdoliner@pidgin.im>
parents: 13679
diff changeset
358 calc_resp(nt_hpw, nonce, nt_resp);
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
359 memcpy(tmp, nt_resp, 0x18);
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
360 tmp += 0x18;
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
361
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
362 /* LCS Stuff */
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
363 if (flags) {
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
364 tmsg->flags = 0x409082d4;
13088
6254abd3dec1 [gaim-migrate @ 15449]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 13085
diff changeset
365 gensesskey(sesskey, NULL);
13085
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
366 memcpy(tmp, sesskey, 0x10);
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
367 }
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
368
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
369 /*tmsg->flags2 = 0x0a280105;
c80913901342 [gaim-migrate @ 15446]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11829
diff changeset
370 tmsg->flags3 = 0x0f000000;*/
13089
e1ab8bfba211 [gaim-migrate @ 15450]
Mark Doliner <markdoliner@pidgin.im>
parents: 13088
diff changeset
371
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
372 tmp = purple_base64_encode((guchar *)tmsg, msglen);
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
373 g_free(tmsg);
13725
b14241732980 [gaim-migrate @ 16132]
Mark Doliner <markdoliner@pidgin.im>
parents: 13706
diff changeset
374
11375
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
375 return tmp;
765ec911f25d [gaim-migrate @ 13601]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
diff changeset
376 }

mercurial