annotate src/protocols/yahoo/yahoo_crypt.c @ 13253:87a7c3077c19

[gaim-migrate @ 15619] More cleaning up of oscar. Renamed some functions to be more clear. Got rid of some stuff that wasn't used. Inlined some small things in conn.c that were only used once. The goals of all this are 1. Non-blocking I/O for all connections 2. p2p stuff won't use the same struct as oscar connections, because that's stupid 3. The oscar PRPL should be less scary committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 12 Feb 2006 21:27:04 +0000
parents 4aafa0c63898
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12416
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
1 /* One way encryption based on MD5 sum.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
2 Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
3 This file is part of the GNU C Library.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
5
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
6 The GNU C Library is free software; you can redistribute it and/or
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
7 modify it under the terms of the GNU Lesser General Public
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
8 License as published by the Free Software Foundation; either
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
9 version 2.1 of the License, or (at your option) any later version.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
10
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
11 The GNU C Library is distributed in the hope that it will be useful,
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
14 Lesser General Public License for more details.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
15
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
16 You should have received a copy of the GNU Lesser General Public
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
17 License along with the GNU C Library; if not, write to the Free
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
19 02111-1307 USA. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
20
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
21 /* warmenhoven took this file and made it work with the md5.[ch] we
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
22 * already had. isn't that lovely. people should just use linux or
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
23 * freebsd, crypt works properly on those systems. i hate solaris */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
24
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
25 #include <string.h>
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
26 #include <stdlib.h>
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
27 #include <glib.h>
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
28
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
29 #include "cipher.h"
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
30 #include "yahoo_crypt.h"
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
31
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
32 /* Define our magic string to mark salt for MD5 "encryption"
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
33 replacement. This is meant to be the same as for other MD5 based
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
34 encryption implementations. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
35 static const char md5_salt_prefix[] = "$1$";
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
36
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
37 /* Table with characters for base64 transformation. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
38 static const char b64t[64] =
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
39 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
40
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
41 char *yahoo_crypt(const char *key, const char *salt)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
42 {
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
43 GaimCipher *cipher;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
44 GaimCipherContext *context1, *context2;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
45 guchar digest[16];
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
46 static char *buffer = NULL;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
47 static int buflen = 0;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
48 int needed = 3 + strlen (salt) + 1 + 26 + 1;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
49
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
50 size_t salt_len;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
51 size_t key_len;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
52 size_t cnt;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
53
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
54 char *cp;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
55
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
56 if (buflen < needed) {
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
57 buflen = needed;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
58 if ((buffer = g_realloc(buffer, buflen)) == NULL)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
59 return NULL;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
60 }
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
61
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
62 cipher = gaim_ciphers_find_cipher("md5");
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
63 context1 = gaim_cipher_context_new(cipher, NULL);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
64 context2 = gaim_cipher_context_new(cipher, NULL);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
65
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
66 /* Find beginning of salt string. The prefix should normally always
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
67 * be present. Just in case it is not.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
68 */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
69 if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
70 /* Skip salt prefix. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
71 salt += sizeof (md5_salt_prefix) - 1;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
72
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
73 salt_len = MIN (strcspn (salt, "$"), 8);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
74 key_len = strlen (key);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
75
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
76 /* Add the key string. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
77 gaim_cipher_context_append(context1, (const guchar *)key, key_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
78
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
79 /* Because the SALT argument need not always have the salt prefix we
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
80 * add it separately.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
81 */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
82 gaim_cipher_context_append(context1, (const guchar *)md5_salt_prefix,
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
83 sizeof(md5_salt_prefix) - 1);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
84
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
85 /* The last part is the salt string. This must be at most 8
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
86 * characters and it ends at the first `$' character (for
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
87 * compatibility which existing solutions).
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
88 */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
89 gaim_cipher_context_append(context1, (const guchar *)salt, salt_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
90
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
91 /* Compute alternate MD5 sum with input KEY, SALT, and KEY. The
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
92 * final result will be added to the first context.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
93 */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
94
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
95 /* Add key. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
96 gaim_cipher_context_append(context2, (const guchar *)key, key_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
97
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
98 /* Add salt. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
99 gaim_cipher_context_append(context2, (const guchar *)salt, salt_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
100
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
101 /* Add key again. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
102 gaim_cipher_context_append(context2, (const guchar *)key, key_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
103
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
104 /* Now get result of this (16 bytes) and add it to the other context. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
105 gaim_cipher_context_digest(context2, sizeof(digest), digest, NULL);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
106
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
107 /* Add for any character in the key one byte of the alternate sum. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
108 for (cnt = key_len; cnt > 16; cnt -= 16)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
109 gaim_cipher_context_append(context1, digest, 16);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
110 gaim_cipher_context_append(context1, digest, cnt);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
111
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
112 /* For the following code we need a NUL byte. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
113 digest[0] = '\0';
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
114
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
115 /* The original implementation now does something weird: for every 1
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
116 * bit in the key the first 0 is added to the buffer, for every 0
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
117 * bit the first character of the key. This does not seem to be
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
118 * what was intended but we have to follow this to be compatible.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
119 */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
120 for (cnt = key_len; cnt > 0; cnt >>= 1)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
121 gaim_cipher_context_append(context1,
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
122 (cnt & 1) != 0 ? digest : (guchar *)key, 1);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
123
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
124 /* Create intermediate result. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
125 gaim_cipher_context_digest(context1, sizeof(digest), digest, NULL);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
126
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
127 /* Now comes another weirdness. In fear of password crackers here
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
128 * comes a quite long loop which just processes the output of the
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
129 * previous round again. We cannot ignore this here.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
130 */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
131 for (cnt = 0; cnt < 1000; ++cnt) {
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
132 /* New context. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
133 gaim_cipher_context_reset(context2, NULL);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
134
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
135 /* Add key or last result. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
136 if ((cnt & 1) != 0)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
137 gaim_cipher_context_append(context2, (const guchar *)key, key_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
138 else
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
139 gaim_cipher_context_append(context2, digest, 16);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
140
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
141 /* Add salt for numbers not divisible by 3. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
142 if (cnt % 3 != 0)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
143 gaim_cipher_context_append(context2, (const guchar *)salt, salt_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
144
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
145 /* Add key for numbers not divisible by 7. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
146 if (cnt % 7 != 0)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
147 gaim_cipher_context_append(context2, (const guchar *)key, key_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
148
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
149 /* Add key or last result. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
150 if ((cnt & 1) != 0)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
151 gaim_cipher_context_append(context2, digest, 16);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
152 else
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
153 gaim_cipher_context_append(context2, (const guchar *)key, key_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
154
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
155 /* Create intermediate result. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
156 gaim_cipher_context_digest(context2, sizeof(digest), digest, NULL);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
157 }
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
158
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
159 /* Now we can construct the result string. It consists of three parts. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
160 strncpy(buffer, md5_salt_prefix, MAX (0, buflen));
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
161 cp = buffer + strlen(buffer);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
162 buflen -= sizeof (md5_salt_prefix);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
163
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
164 strncpy(cp, salt, MIN ((size_t) buflen, salt_len));
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
165 cp = cp + strlen(cp);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
166 buflen -= MIN ((size_t) buflen, salt_len);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
167
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
168 if (buflen > 0) {
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
169 *cp++ = '$';
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
170 --buflen;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
171 }
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
172
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
173 #define b64_from_24bit(B2, B1, B0, N) \
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
174 do { \
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
175 unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
176 int n = (N); \
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
177 while (n-- > 0 && buflen > 0) { \
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
178 *cp++ = b64t[w & 0x3f]; \
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
179 --buflen; \
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
180 w >>= 6; \
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
181 }\
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
182 } while (0)
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
183
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
184 b64_from_24bit (digest[0], digest[6], digest[12], 4);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
185 b64_from_24bit (digest[1], digest[7], digest[13], 4);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
186 b64_from_24bit (digest[2], digest[8], digest[14], 4);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
187 b64_from_24bit (digest[3], digest[9], digest[15], 4);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
188 b64_from_24bit (digest[4], digest[10], digest[5], 4);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
189 b64_from_24bit (0, 0, digest[11], 2);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
190 if (buflen <= 0) {
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
191 g_free(buffer);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
192 buffer = NULL;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
193 } else
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
194 *cp = '\0'; /* Terminate the string. */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
195
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
196 /* Clear the buffer for the intermediate result so that people
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
197 * attaching to processes or reading core dumps cannot get any
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
198 * information. We do it in this way to clear correct_words[]
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
199 * inside the MD5 implementation as well.
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
200 */
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
201 gaim_cipher_context_reset(context1, NULL);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
202 gaim_cipher_context_digest(context1, sizeof(digest), digest, NULL);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
203 gaim_cipher_context_destroy(context1);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
204 gaim_cipher_context_destroy(context2);
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
205
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
206 return buffer;
4aafa0c63898 [gaim-migrate @ 14723]
Richard Laager <rlaager@wiktel.com>
parents:
diff changeset
207 }