libpurple/ntlm.c

Tue, 19 Jun 2007 22:47:12 +0000

author
Sadrul Habib Chowdhury <sadrul@pidgin.im>
date
Tue, 19 Jun 2007 22:47:12 +0000
changeset 18265
9f26190d7f46
parent 15884
4de1981757fc
child 19859
71d37b57eff2
permissions
-rw-r--r--

Move the define in internal.h instead.
This requires all .c files to include internal.h before including the other
headers.
Perhaps we should add the define in CFLAGS instead, when necessary.

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

mercurial